From 441d960a464f7c4945cebe90e0af279fd83cc33b Mon Sep 17 00:00:00 2001 From: Nicholas openSUSE Software Engineer Date: Thu, 14 Nov 2024 16:51:36 -0300 Subject: [PATCH 1/3] [release-v2.10] forward port longhorn release 1.7.2 2.10.0 (#4764) --- .../longhorn-crd-102.5.1+up1.7.2.tgz | Bin 0 -> 13409 bytes .../longhorn-crd-103.4.1+up1.7.2.tgz | Bin 0 -> 13409 bytes .../longhorn-crd-104.2.1+up1.7.2.tgz | Bin 0 -> 13401 bytes assets/longhorn/longhorn-102.5.1+up1.7.2.tgz | Bin 0 -> 31991 bytes assets/longhorn/longhorn-103.4.1+up1.7.2.tgz | Bin 0 -> 31989 bytes assets/longhorn/longhorn-104.2.1+up1.7.2.tgz | Bin 0 -> 31996 bytes .../longhorn-crd/102.5.1+up1.7.2/Chart.yaml | 11 + charts/longhorn-crd/102.5.1+up1.7.2/README.md | 2 + .../102.5.1+up1.7.2/templates/_helpers.tpl | 66 + .../102.5.1+up1.7.2/templates/crds.yaml | 4400 +++++++++++++++++ .../longhorn-crd/103.4.1+up1.7.2/Chart.yaml | 11 + charts/longhorn-crd/103.4.1+up1.7.2/README.md | 2 + .../103.4.1+up1.7.2/templates/_helpers.tpl | 66 + .../103.4.1+up1.7.2/templates/crds.yaml | 4400 +++++++++++++++++ .../longhorn-crd/104.2.1+up1.7.2/Chart.yaml | 11 + charts/longhorn-crd/104.2.1+up1.7.2/README.md | 2 + .../104.2.1+up1.7.2/templates/_helpers.tpl | 66 + .../104.2.1+up1.7.2/templates/crds.yaml | 4400 +++++++++++++++++ charts/longhorn/102.5.1+up1.7.2/.helmignore | 21 + charts/longhorn/102.5.1+up1.7.2/Chart.yaml | 40 + charts/longhorn/102.5.1+up1.7.2/README.md | 50 + charts/longhorn/102.5.1+up1.7.2/app-readme.md | 27 + .../longhorn/102.5.1+up1.7.2/questions.yaml | 974 ++++ .../102.5.1+up1.7.2/templates/NOTES.txt | 5 + .../102.5.1+up1.7.2/templates/_helpers.tpl | 66 + .../templates/clusterrole.yaml | 77 + .../templates/clusterrolebinding.yaml | 49 + .../templates/daemonset-sa.yaml | 180 + .../templates/default-setting.yaml | 244 + .../templates/deployment-driver.yaml | 132 + .../templates/deployment-ui.yaml | 186 + .../102.5.1+up1.7.2/templates/ingress.yaml | 37 + ...king-image-data-source-network-policy.yaml | 27 + .../backing-image-manager-network-policy.yaml | 27 + .../instance-manager-networking.yaml | 27 + .../manager-network-policy.yaml | 35 + .../recovery-backend-network-policy.yaml | 17 + .../ui-frontend-network-policy.yaml | 46 + .../webhook-network-policy.yaml | 33 + .../templates/postupgrade-job.yaml | 56 + .../templates/preupgrade-job.yaml | 64 + .../templates/priorityclass.yaml | 9 + .../102.5.1+up1.7.2/templates/psp.yaml | 66 + .../templates/registry-secret.yaml | 13 + .../templates/serviceaccount.yaml | 40 + .../templates/servicemonitor.yaml | 40 + .../102.5.1+up1.7.2/templates/services.yaml | 47 + .../templates/storageclass.yaml | 57 + .../templates/tls-secrets.yaml | 16 + .../templates/uninstall-job.yaml | 57 + .../102.5.1+up1.7.2/templates/userroles.yaml | 53 + .../templates/validate-install-crd.yaml | 35 + .../templates/validate-psp-install.yaml | 7 + charts/longhorn/102.5.1+up1.7.2/values.yaml | 526 ++ charts/longhorn/103.4.1+up1.7.2/.helmignore | 21 + charts/longhorn/103.4.1+up1.7.2/Chart.yaml | 40 + charts/longhorn/103.4.1+up1.7.2/README.md | 50 + charts/longhorn/103.4.1+up1.7.2/app-readme.md | 27 + .../longhorn/103.4.1+up1.7.2/questions.yaml | 974 ++++ .../103.4.1+up1.7.2/templates/NOTES.txt | 5 + .../103.4.1+up1.7.2/templates/_helpers.tpl | 66 + .../templates/clusterrole.yaml | 77 + .../templates/clusterrolebinding.yaml | 49 + .../templates/daemonset-sa.yaml | 180 + .../templates/default-setting.yaml | 244 + .../templates/deployment-driver.yaml | 132 + .../templates/deployment-ui.yaml | 186 + .../103.4.1+up1.7.2/templates/ingress.yaml | 37 + ...king-image-data-source-network-policy.yaml | 27 + .../backing-image-manager-network-policy.yaml | 27 + .../instance-manager-networking.yaml | 27 + .../manager-network-policy.yaml | 35 + .../recovery-backend-network-policy.yaml | 17 + .../ui-frontend-network-policy.yaml | 46 + .../webhook-network-policy.yaml | 33 + .../templates/postupgrade-job.yaml | 56 + .../templates/preupgrade-job.yaml | 64 + .../templates/priorityclass.yaml | 9 + .../103.4.1+up1.7.2/templates/psp.yaml | 66 + .../templates/registry-secret.yaml | 13 + .../templates/serviceaccount.yaml | 40 + .../templates/servicemonitor.yaml | 40 + .../103.4.1+up1.7.2/templates/services.yaml | 47 + .../templates/storageclass.yaml | 57 + .../templates/tls-secrets.yaml | 16 + .../templates/uninstall-job.yaml | 57 + .../103.4.1+up1.7.2/templates/userroles.yaml | 53 + .../templates/validate-install-crd.yaml | 35 + .../templates/validate-psp-install.yaml | 7 + charts/longhorn/103.4.1+up1.7.2/values.yaml | 526 ++ charts/longhorn/104.2.1+up1.7.2/.helmignore | 21 + charts/longhorn/104.2.1+up1.7.2/Chart.yaml | 40 + charts/longhorn/104.2.1+up1.7.2/README.md | 50 + charts/longhorn/104.2.1+up1.7.2/app-readme.md | 27 + .../longhorn/104.2.1+up1.7.2/questions.yaml | 974 ++++ .../104.2.1+up1.7.2/templates/NOTES.txt | 5 + .../104.2.1+up1.7.2/templates/_helpers.tpl | 66 + .../templates/clusterrole.yaml | 77 + .../templates/clusterrolebinding.yaml | 49 + .../templates/daemonset-sa.yaml | 180 + .../templates/default-setting.yaml | 244 + .../templates/deployment-driver.yaml | 132 + .../templates/deployment-ui.yaml | 186 + .../104.2.1+up1.7.2/templates/ingress.yaml | 37 + ...king-image-data-source-network-policy.yaml | 27 + .../backing-image-manager-network-policy.yaml | 27 + .../instance-manager-networking.yaml | 27 + .../manager-network-policy.yaml | 35 + .../recovery-backend-network-policy.yaml | 17 + .../ui-frontend-network-policy.yaml | 46 + .../webhook-network-policy.yaml | 33 + .../templates/postupgrade-job.yaml | 56 + .../templates/preupgrade-job.yaml | 64 + .../templates/priorityclass.yaml | 9 + .../104.2.1+up1.7.2/templates/psp.yaml | 66 + .../templates/registry-secret.yaml | 13 + .../templates/serviceaccount.yaml | 40 + .../templates/servicemonitor.yaml | 40 + .../104.2.1+up1.7.2/templates/services.yaml | 47 + .../templates/storageclass.yaml | 57 + .../templates/tls-secrets.yaml | 16 + .../templates/uninstall-job.yaml | 57 + .../104.2.1+up1.7.2/templates/userroles.yaml | 53 + .../templates/validate-install-crd.yaml | 35 + .../templates/validate-psp-install.yaml | 7 + charts/longhorn/104.2.1+up1.7.2/values.yaml | 526 ++ index.yaml | 177 + release.yaml | 8 + 128 files changed, 23780 insertions(+) create mode 100644 assets/longhorn-crd/longhorn-crd-102.5.1+up1.7.2.tgz create mode 100644 assets/longhorn-crd/longhorn-crd-103.4.1+up1.7.2.tgz create mode 100644 assets/longhorn-crd/longhorn-crd-104.2.1+up1.7.2.tgz create mode 100644 assets/longhorn/longhorn-102.5.1+up1.7.2.tgz create mode 100644 assets/longhorn/longhorn-103.4.1+up1.7.2.tgz create mode 100644 assets/longhorn/longhorn-104.2.1+up1.7.2.tgz create mode 100644 charts/longhorn-crd/102.5.1+up1.7.2/Chart.yaml create mode 100644 charts/longhorn-crd/102.5.1+up1.7.2/README.md create mode 100644 charts/longhorn-crd/102.5.1+up1.7.2/templates/_helpers.tpl create mode 100644 charts/longhorn-crd/102.5.1+up1.7.2/templates/crds.yaml create mode 100644 charts/longhorn-crd/103.4.1+up1.7.2/Chart.yaml create mode 100644 charts/longhorn-crd/103.4.1+up1.7.2/README.md create mode 100644 charts/longhorn-crd/103.4.1+up1.7.2/templates/_helpers.tpl create mode 100644 charts/longhorn-crd/103.4.1+up1.7.2/templates/crds.yaml create mode 100644 charts/longhorn-crd/104.2.1+up1.7.2/Chart.yaml create mode 100644 charts/longhorn-crd/104.2.1+up1.7.2/README.md create mode 100644 charts/longhorn-crd/104.2.1+up1.7.2/templates/_helpers.tpl create mode 100644 charts/longhorn-crd/104.2.1+up1.7.2/templates/crds.yaml create mode 100644 charts/longhorn/102.5.1+up1.7.2/.helmignore create mode 100644 charts/longhorn/102.5.1+up1.7.2/Chart.yaml create mode 100644 charts/longhorn/102.5.1+up1.7.2/README.md create mode 100644 charts/longhorn/102.5.1+up1.7.2/app-readme.md create mode 100644 charts/longhorn/102.5.1+up1.7.2/questions.yaml create mode 100644 charts/longhorn/102.5.1+up1.7.2/templates/NOTES.txt create mode 100644 charts/longhorn/102.5.1+up1.7.2/templates/_helpers.tpl create mode 100644 charts/longhorn/102.5.1+up1.7.2/templates/clusterrole.yaml create mode 100644 charts/longhorn/102.5.1+up1.7.2/templates/clusterrolebinding.yaml create mode 100644 charts/longhorn/102.5.1+up1.7.2/templates/daemonset-sa.yaml create mode 100644 charts/longhorn/102.5.1+up1.7.2/templates/default-setting.yaml create mode 100644 charts/longhorn/102.5.1+up1.7.2/templates/deployment-driver.yaml create mode 100644 charts/longhorn/102.5.1+up1.7.2/templates/deployment-ui.yaml create mode 100644 charts/longhorn/102.5.1+up1.7.2/templates/ingress.yaml create mode 100644 charts/longhorn/102.5.1+up1.7.2/templates/network-policies/backing-image-data-source-network-policy.yaml create mode 100644 charts/longhorn/102.5.1+up1.7.2/templates/network-policies/backing-image-manager-network-policy.yaml create mode 100644 charts/longhorn/102.5.1+up1.7.2/templates/network-policies/instance-manager-networking.yaml create mode 100644 charts/longhorn/102.5.1+up1.7.2/templates/network-policies/manager-network-policy.yaml create mode 100644 charts/longhorn/102.5.1+up1.7.2/templates/network-policies/recovery-backend-network-policy.yaml create mode 100644 charts/longhorn/102.5.1+up1.7.2/templates/network-policies/ui-frontend-network-policy.yaml create mode 100644 charts/longhorn/102.5.1+up1.7.2/templates/network-policies/webhook-network-policy.yaml create mode 100644 charts/longhorn/102.5.1+up1.7.2/templates/postupgrade-job.yaml create mode 100644 charts/longhorn/102.5.1+up1.7.2/templates/preupgrade-job.yaml create mode 100644 charts/longhorn/102.5.1+up1.7.2/templates/priorityclass.yaml create mode 100644 charts/longhorn/102.5.1+up1.7.2/templates/psp.yaml create mode 100644 charts/longhorn/102.5.1+up1.7.2/templates/registry-secret.yaml create mode 100644 charts/longhorn/102.5.1+up1.7.2/templates/serviceaccount.yaml create mode 100644 charts/longhorn/102.5.1+up1.7.2/templates/servicemonitor.yaml create mode 100644 charts/longhorn/102.5.1+up1.7.2/templates/services.yaml create mode 100644 charts/longhorn/102.5.1+up1.7.2/templates/storageclass.yaml create mode 100644 charts/longhorn/102.5.1+up1.7.2/templates/tls-secrets.yaml create mode 100644 charts/longhorn/102.5.1+up1.7.2/templates/uninstall-job.yaml create mode 100644 charts/longhorn/102.5.1+up1.7.2/templates/userroles.yaml create mode 100644 charts/longhorn/102.5.1+up1.7.2/templates/validate-install-crd.yaml create mode 100644 charts/longhorn/102.5.1+up1.7.2/templates/validate-psp-install.yaml create mode 100644 charts/longhorn/102.5.1+up1.7.2/values.yaml create mode 100644 charts/longhorn/103.4.1+up1.7.2/.helmignore create mode 100644 charts/longhorn/103.4.1+up1.7.2/Chart.yaml create mode 100644 charts/longhorn/103.4.1+up1.7.2/README.md create mode 100644 charts/longhorn/103.4.1+up1.7.2/app-readme.md create mode 100644 charts/longhorn/103.4.1+up1.7.2/questions.yaml create mode 100644 charts/longhorn/103.4.1+up1.7.2/templates/NOTES.txt create mode 100644 charts/longhorn/103.4.1+up1.7.2/templates/_helpers.tpl create mode 100644 charts/longhorn/103.4.1+up1.7.2/templates/clusterrole.yaml create mode 100644 charts/longhorn/103.4.1+up1.7.2/templates/clusterrolebinding.yaml create mode 100644 charts/longhorn/103.4.1+up1.7.2/templates/daemonset-sa.yaml create mode 100644 charts/longhorn/103.4.1+up1.7.2/templates/default-setting.yaml create mode 100644 charts/longhorn/103.4.1+up1.7.2/templates/deployment-driver.yaml create mode 100644 charts/longhorn/103.4.1+up1.7.2/templates/deployment-ui.yaml create mode 100644 charts/longhorn/103.4.1+up1.7.2/templates/ingress.yaml create mode 100644 charts/longhorn/103.4.1+up1.7.2/templates/network-policies/backing-image-data-source-network-policy.yaml create mode 100644 charts/longhorn/103.4.1+up1.7.2/templates/network-policies/backing-image-manager-network-policy.yaml create mode 100644 charts/longhorn/103.4.1+up1.7.2/templates/network-policies/instance-manager-networking.yaml create mode 100644 charts/longhorn/103.4.1+up1.7.2/templates/network-policies/manager-network-policy.yaml create mode 100644 charts/longhorn/103.4.1+up1.7.2/templates/network-policies/recovery-backend-network-policy.yaml create mode 100644 charts/longhorn/103.4.1+up1.7.2/templates/network-policies/ui-frontend-network-policy.yaml create mode 100644 charts/longhorn/103.4.1+up1.7.2/templates/network-policies/webhook-network-policy.yaml create mode 100644 charts/longhorn/103.4.1+up1.7.2/templates/postupgrade-job.yaml create mode 100644 charts/longhorn/103.4.1+up1.7.2/templates/preupgrade-job.yaml create mode 100644 charts/longhorn/103.4.1+up1.7.2/templates/priorityclass.yaml create mode 100644 charts/longhorn/103.4.1+up1.7.2/templates/psp.yaml create mode 100644 charts/longhorn/103.4.1+up1.7.2/templates/registry-secret.yaml create mode 100644 charts/longhorn/103.4.1+up1.7.2/templates/serviceaccount.yaml create mode 100644 charts/longhorn/103.4.1+up1.7.2/templates/servicemonitor.yaml create mode 100644 charts/longhorn/103.4.1+up1.7.2/templates/services.yaml create mode 100644 charts/longhorn/103.4.1+up1.7.2/templates/storageclass.yaml create mode 100644 charts/longhorn/103.4.1+up1.7.2/templates/tls-secrets.yaml create mode 100644 charts/longhorn/103.4.1+up1.7.2/templates/uninstall-job.yaml create mode 100644 charts/longhorn/103.4.1+up1.7.2/templates/userroles.yaml create mode 100644 charts/longhorn/103.4.1+up1.7.2/templates/validate-install-crd.yaml create mode 100644 charts/longhorn/103.4.1+up1.7.2/templates/validate-psp-install.yaml create mode 100644 charts/longhorn/103.4.1+up1.7.2/values.yaml create mode 100644 charts/longhorn/104.2.1+up1.7.2/.helmignore create mode 100644 charts/longhorn/104.2.1+up1.7.2/Chart.yaml create mode 100644 charts/longhorn/104.2.1+up1.7.2/README.md create mode 100644 charts/longhorn/104.2.1+up1.7.2/app-readme.md create mode 100644 charts/longhorn/104.2.1+up1.7.2/questions.yaml create mode 100644 charts/longhorn/104.2.1+up1.7.2/templates/NOTES.txt create mode 100644 charts/longhorn/104.2.1+up1.7.2/templates/_helpers.tpl create mode 100644 charts/longhorn/104.2.1+up1.7.2/templates/clusterrole.yaml create mode 100644 charts/longhorn/104.2.1+up1.7.2/templates/clusterrolebinding.yaml create mode 100644 charts/longhorn/104.2.1+up1.7.2/templates/daemonset-sa.yaml create mode 100644 charts/longhorn/104.2.1+up1.7.2/templates/default-setting.yaml create mode 100644 charts/longhorn/104.2.1+up1.7.2/templates/deployment-driver.yaml create mode 100644 charts/longhorn/104.2.1+up1.7.2/templates/deployment-ui.yaml create mode 100644 charts/longhorn/104.2.1+up1.7.2/templates/ingress.yaml create mode 100644 charts/longhorn/104.2.1+up1.7.2/templates/network-policies/backing-image-data-source-network-policy.yaml create mode 100644 charts/longhorn/104.2.1+up1.7.2/templates/network-policies/backing-image-manager-network-policy.yaml create mode 100644 charts/longhorn/104.2.1+up1.7.2/templates/network-policies/instance-manager-networking.yaml create mode 100644 charts/longhorn/104.2.1+up1.7.2/templates/network-policies/manager-network-policy.yaml create mode 100644 charts/longhorn/104.2.1+up1.7.2/templates/network-policies/recovery-backend-network-policy.yaml create mode 100644 charts/longhorn/104.2.1+up1.7.2/templates/network-policies/ui-frontend-network-policy.yaml create mode 100644 charts/longhorn/104.2.1+up1.7.2/templates/network-policies/webhook-network-policy.yaml create mode 100644 charts/longhorn/104.2.1+up1.7.2/templates/postupgrade-job.yaml create mode 100644 charts/longhorn/104.2.1+up1.7.2/templates/preupgrade-job.yaml create mode 100644 charts/longhorn/104.2.1+up1.7.2/templates/priorityclass.yaml create mode 100644 charts/longhorn/104.2.1+up1.7.2/templates/psp.yaml create mode 100644 charts/longhorn/104.2.1+up1.7.2/templates/registry-secret.yaml create mode 100644 charts/longhorn/104.2.1+up1.7.2/templates/serviceaccount.yaml create mode 100644 charts/longhorn/104.2.1+up1.7.2/templates/servicemonitor.yaml create mode 100644 charts/longhorn/104.2.1+up1.7.2/templates/services.yaml create mode 100644 charts/longhorn/104.2.1+up1.7.2/templates/storageclass.yaml create mode 100644 charts/longhorn/104.2.1+up1.7.2/templates/tls-secrets.yaml create mode 100644 charts/longhorn/104.2.1+up1.7.2/templates/uninstall-job.yaml create mode 100644 charts/longhorn/104.2.1+up1.7.2/templates/userroles.yaml create mode 100644 charts/longhorn/104.2.1+up1.7.2/templates/validate-install-crd.yaml create mode 100644 charts/longhorn/104.2.1+up1.7.2/templates/validate-psp-install.yaml create mode 100644 charts/longhorn/104.2.1+up1.7.2/values.yaml diff --git a/assets/longhorn-crd/longhorn-crd-102.5.1+up1.7.2.tgz b/assets/longhorn-crd/longhorn-crd-102.5.1+up1.7.2.tgz new file mode 100644 index 0000000000000000000000000000000000000000..ff403338b5f3aa0515b01ed36de522d7687716b1 GIT binary patch literal 13409 zcmV-nG@i>JiwG0|00000|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc zVQyr3R8em|NM&qo0PMYObK5wUDBPd(D^T8ND#>gl+nIFwSyxT%dhFzmcjHXTPSRC( zwyPT=Aqi~?-~gl?r>Fn>ExeEfNq{6M$+jlompCE;92@}W{Tw8eES8j!NyOsAvn6EN z^bW3)@3#3I9UUFLe)UTJdvtWv{P*blqnF&4DGswO>+IXzyS1b_%;FrkZS1hXtbQ%nyd#4~Z?UGD3Ejq7wkqG{KR? z&XaX9!tv3|>G#v)f6r4j)I+b}W>4+>XK0lsFhl(C=Os!~#P~EzH>U+X=l@SX9KUXy z|JTPqd>_vLeLTPYcKAoI#;X&+Q3mEXL1OFwc_q*iEzt@1*J6 zC&*Y%BJlc8@=v_F&gXOd1sqJO&Jc;^-wMDphG2#OEXSDVNpc7Nk;6n%FmawG=+h@Z zBGtS6J`-bzX>c$@5zILPoURb~pL~WGK^fv|!gGw0m;=ZVNbm}0C~6~R zAD>tPo>hoHk%;eW!x8KK=mX^ZHU|F$v)8W>iJq5#0b|B$*H6IVAD@)SPT&kB94rt) zOptN8C3yx(3|S2RijoyjpNMT~p2+$#t8Wy7VVX{F%5zY#@e}adZ=m27t)o5_z%5a- zn)2nLBoFd?b2I<``=t6sGjH%uz)+gN2!VrtKL7_m%f)L0pmt$Ancb;wi@ko0*cwO3 z-UtgBfJCU?M8jhFzGU|mn5U(f0lIgdlxcp}XZYu0RjUn)=j9eyBy zTUgHc;lZd5P{J#UanL?M4T@ULsF=dfIZLe5=sF^u;16kNfDK9l<3#ebxj3y^9sco2 zF*9*Kip>kOzzIq@)pkhqM?aSzS@BW6Z4v7JFKVk)+o|&V&QL=xFqj*}R%8kJoiO^?5y9z6k?K?%A$ z0c~-jU`( zCcs`Wnx~aUC|;><^rRF*{-S!k5Ivs53|`9~6(pEv|I_i&JIpirVVdL&CQj(&H+)H1 z_P!c@0+Qtn$ND8Ei#&nM)x{G4ctnLVTT+nt2>=@Lvd0O4aV(b-CLaWmM(m6x`HGa| z)wJo4LgvpI6R78z;Qv|?NNEgmu7u*0(KVK=QoPZi0STMzQ#?Z10CPrHfLE9U;8#w` z2be8Sz*Kaf^Qj)~S`4N?Qfq4dqBM4%F-#UNumxK5VDfv*h$)Ju>Wh!n2YR&T&qIbJ zG)8S4sJY+bBmpx7Qif8KqPv(IIltTp2l8N$NXkJ~bdYum5O)#^|OX z7Sl*5YnYOcc!hWdS81)!(?xx9ak0?q_4;^*GI*>`K(s_Fc%nb2DI%vIE4#JHd`c@hhHy+$kp3`KN7 z@Yk|$u5?`lq=1kCNhb(Qz*-12F90NQqvsX80}P2VK~9YR)=C0ue0@n70+`I{2@q-_ zKRG;H;H=<65nZivg0s6r$x!et&nV-EFhcLwxIT0c`(R3C6 z8$%{ZEuPk1Rga|a9?K(0z1TcZccrFSt%CSTpzi9;^+!-ZqE<>RO7&?AFU9%@Y+^D; zOtq7AQ}l^QoKj3OWs6C$B+L11g)^}Y{*fb|iKT0HdnP%xIQ4ld4p-d#;DUfNxI)R9 zkUsBst;DMEiCBa|t7Xa`&5sp&jTZ%rubwZHO7ok@RbXp0$;l0&w`8JhJ|`e!xq0vv zXWF=<7Lc+{YHy03Sc))MJk7MXcohmH{F%Sg3Wb6eqN3n%{ zI9NrVSgsfBo=C5mo%zH0vN#D|;|<~Ne!`Zf}T+^dn` zARiede2y4Hv8(Nj(gZ=$c&qrD*LW#paD_6&T8IKQNzR4Np6;C+M?94v((V-z+Y(Jc zOm9g-VUswDS9$7qfxe`aWfO76Cu<>$HaC~}h#|?GEN`NOlJ@T%lNREq$0E3nmPO1T za=2u(+VP?@CEAzgs{xz%=3&p5DFS;n#HrWkE5y0bXnfkxTY{MHsbX}&5VxEb)ktvr zg^Xr0AC?n>$>PJVk0i;H1kMuF(k#uk_7jW0T97xVYy~qptJkl*W~?>Liw~O~7Y}8& z`lVZ!olGWAzDW;-e!ngE#HH#^!C>`G=r1}Q69rIe<*Z(bm3n7&N~}sC?#m;wGN!## ztzQvpV@PSKkVD;!`o0H++Zc`^o>Ic`EJ1<>ZCA;*Ly*F3 z*#sl!6^XJ9F8<#d-1u?doEDeW)CZ{dje{VE461#-=b+jL)qW3D`{1nz%sw#tePQ<7 zG3N(nADDgd1ZMvYG5bD>utg(&n`m?y7-t474`8&uKUaW6j#mqB`~Nmf&&7TiV0Yft zmVha~#Kg)#K#v8|#d!MKnY-{UPS7Q^SfYpSMfc3qqs7NFr)k}U*RiERm-%~OdnsOw zZS1y*n;qD(tsag@jF{eUr*YihTL(CzGfWm&XpR^nQO~?O!Lk~~)zfVnA3TEHFEVhZ zc6Zdk#%s*7946O0o?{2W-NavUUw)-AKBD0Jc!a(WyVFBS{}q$q8G{*G+?{|Q(QHZS zjr{di{av6_37uz@%<-aHVy+Se%{6b904N8W+#0=C-|9LBW=5JNGi+MST|KE(Fb~(q zhq}|lY8>-3%CZyiAKxDx7qck8x}=pq!!ESBs9zqccJ$Hqg zi{*4MmwSlv2bcf^qop)&IFYbv$iLP=)QB1t3Xo^wtj`3cWea)UA*q0S?gYqCX=-qN zZvDP*#`?g50}Bo;_&(R_k=W!18RJW$&_IzZ8)qj`^lxz@q1~yy6s>WTNtIP@Dq9%6 z39LPs9`u=|dYlB;C_zz1S$k}pq19NQ1Y``}Sw`EHC#1IJ&c)G>^24Y{QE-)O|LHi0h&6g_g^ac1q0?$dv_O z=0)K`(ta>6*cKdF8~Af}n&>ES z-@?-vGulq;WYmXJxYb7+h>gydC{P#l}I?LVy7L zjzoQPmXe12t})?v?H8?qw`b0)pR=JxJ%vnz@CGYiQ#TA&zF_6sLn~jM9&FFn*CrWV z%9s{p?!nBYXtpdTPUlvTy-Y%a@|TvtQ;WH!HMn3Bg1YGK3Rq5LFA}p1t!U;d`c=oY z4bVb}7JGbRaHHxOq$Al2PjJLESMHf*i(-i9f~%u^b_F8U3z*%>PC>S0G+!(Q-3OF` zPZ#Zp0U(epcA^7ho0*mACUtNp=1jI`YH1v!t;Q>Rog`DP9IzYP602+bTQ@~Rkne|fK(GX)cvvF&F^1H$g zC4@TyGI&!kWgmiP1>hUHZQ#>DlWhwS6Qoe+l6Sd$La;+U$aB+)u4xmBy^Au!| zEl^8z-7R%r^#s1R5CGMe_V|$^r%~dD<)l<6EJzr=6ZICqx4l?9SX`Z~1am3xQU)*) z(w6++*vam|fN9URy*LMyX#1a(q)Wq7GaELemRSh(hD10)1xxo@H@As<7_%tay9RYs z1L`-E+RZ5Lb2z3Xk<~WeFFiStQG^Gnu5E(T86-mSIXHL$4lc+CjXd!`!H*J@p;-Lq zjo97dk54LA?!aqJbC!%<&QDkGJcbJ9-kq6yH#hOBks4-Qhbgzie5>9xjJLZn*m43> zzNA^Vt+x2;ef5zx7Pemu3cV~w^)%D!W}fESac9<=*^ zgnojO1&?v&8ZyQJb5>2F@iLd~&TD+XUg6C=rru%cW6q|JZ?ds>w&0fBLl5D=1GHa< z{-OPXHBVsE?`J{8LwW)qfmua8ow0?x=rpr zNtz(9MCtb^UF$^l*oa0ExY(RF*nalQ#T9_aI|*+~2bXqqT|MyuIKMh&}rIc-ya?Y?^2T< zl?xK%2xd}Q&X&?@+XM-70M`&p)k3HugxZj!+#uzLHMmY2zqSM0d-1Y=F%KV0>~*?h z^!$QXrm3t4uT1dDJbtfC2!II8J23A@$GkUz>$sS_w*8CJ5;0Z1MBDRa!g>g80Arg2!EPSs~Y)_OO3>HYl31cKfQ4g3Yr9?sDd z%dACUEz|mVm!bl4(P%K-J1?YZE9tv=ERqocvJbIHk0IVga}}?!m*7m@nKM;+w>QsK z{#;dVZh8gPD~DH5kFQq8<`rD4R}HUVStxpUUO`(ZgVTl-SyPTSNHx-P+-X zN<&^N)$5(@)n=gd+S3{~#nHw_2N-+hlT-V@*Q}@K7tDIWtQX9B`)Ae*KDod;1MA$f zM=Y?;z&ZylPhg#U%sQP1e;Xb#%auZI!}LyFE(((Uak=O<*pAD^YZ=UOo zzU}@t<4wzJX0Dl96N}RfH7{&4T0Iehw=yc~uzB_M`zpdwi(C9Z80=45)6jHU>FRB zduTBH=6!8vbd|yk&v1gXJ1=67Nu=90GOjM#FM5-%0&5Sf-GjA{_XY;m9$5R}^A#7crePhCRQdR)_vG^voy6tbB@HWLWhOnaBjRJj#4p{iylqk0g$|E=_C zj)kG>VN~-4&d%s+g)PqAj&(8hVpl_Z(k-D^Xnu`JUJQQ5d$XglG5G2rk6?bRlk%KBgpBHB!R^=5T&>_`TGdhTH4jJznx! z^qeuN{IyMFPHT;BbG@;ROhzq~;VOkd&q3+(Y#Pc$gNyUpnD1%qGbAQFgCwf%svb7w zqS>Wt)e6ABsK56Bs8|4P4)R%m3tzM0BXx!Kn#zKatkH8Yk_98#9vI2KdH^U#?ERtKVS&8|_8!>#y{y%P`@lRe-K-Hp^>h@t zi!!|SGTvmXr4rFanJwyTG!_z>r)AZ= z3vCMqV~2mD!ywFx$*MH8D>R@mCRb=h*C>8NM&Kw<7YxQI zzIym=*L5dYmy4j|mamaW-Yh)B|AJmGK0Y&U0Up0deQ^$I6l=NY9^@5|<6hl?t=$)3 znjP5Bo_hK&l^h62_pOOTJF$xbgIaIyMz*$%5?XB4-R+{y_JB||uC}v^n4cw-V6y1$ z!R1^9TiKESvRf$xTJ-=F0L;fE!wYYP zLD4gytL1v|Yj0VWuFv_KFDaB|4*c{iK}BR!q1C>zi$z@~2($THh!cBRlb#;5Ca?8+ zUmM6^ioosw?Ux9z8~{llYH{z6)IVSWJiw%ArqOJOw!BhCRxi!W?kALIP4=CQ*Ue9Z+LeQLr{4 z{TZ4rrbe|Pvusn&5eGOEAjBv`Y=udoi!p|xOuI{kHlXn{y-rai3*-J3!6aMWoo3Hn zt}4eSku3J{o99X?RltkM!X*<7>~2H)iW5XOv5E+)swXm@sG1_u0~#(LA!XK{ls8{c zl>f^(Qi`5;cub=uPGW|fc8j6om~-jc!M$s2cI4P4psH3n`VhFvfU0NAtUCtV)}%Kg zKq(Z|baZp3TzKPYm%U=(z|nJ#*q|kML$E8tQ=CzMm6>Od`O_*D)Ozv3Yp89yWUa{X zh{g^1OP2hl!b+syZIZ}ji)F1cni_9gsZC8l)Jj=$obXD$DwCWVEgvM?sph?I#tQ2# zw!?sE(`MX?RDM=O!A#Wd z3{yO|){~2g^tBruOH@oz?aLin_}j;Gcv~)R^m1|c$1FY-aC)~5EE+hNEPI?Xb z-I10XiYlzq7G zg{p?V=jG}Oh6Y=qZ#(j|6&zDX?*x|Vd;-g~J%MG~I|?i_u*^m`fn~P8+Gmy-c%}0R zywdgrUTN}e=F3>c5$f<_^@9ph$x5UP(NmQY+MD=>V@vs-F z5(WadOC;0OvLYfyhBLsps3%~F!zsnTzdyYaUq1cm?@!gcr$0S0H_DaKPhUig6`-6W zR+JTt50MH-FOvazv_x^9V6qTwsv<6WCYA}LD4N0~p|{s%(;C31)^}~Wv=8<&cqM|Q z0238(b3jQKkZmk$h{WujxHi6VWBk#@;l9^9&K~nq{$Fm)5b)FJIRyNKfS)}G`1$4| zZ@0s1|MS^@$&k}O|5RO^kp~JHepL9olhG@Hk zv@3$%ifSj4JJIVx?AW+?Nsqm&t^1JVJfm;qy7|)MP!qWipimPz)I<(7k@u@6vJi!K zUD~ccIHrfg4~f7TNK4hT9g3=+K~W7p)U^}D9va)(B`_%P07~mMy&kG-nbTm}+cPIg znTOIZuQ_#7W6P9=)8w8x85DabGwY_(mYH?XYV~YLvDGtzZhK9;FV<#Tl-vWT0r7Yq zweVaT&JZnqkk-7>MJJ+z51VMDeR}(#4nBRdMG6hR8vsGVXG;9fi#^wCD(d>nzoJ zwnULr0PU9hq`Ze1rZJ9WH})G8fPuRhW@sYhD7T2;ZRxO1|10$>ln}!Ib`btYS-ON| zlQNKhlRc=B%2+n_V=J0XkET|^63?bA(^WhhE&AR;2}e^hq17DP9%uFP<5o*FsXn)P zhy8XOxqmC+vb%CM+`)(2=sEasgAaG#e7NeYdwOvd0YJ_DFJP+u_A1n&aS*JU9T8G57bs|-_C1LEOBPj zgtaz*pyQ1WykJcsgDaFFwt-!;Q=V%rQ#GP>hQkHIvA!?8kG;KLn{Vad+Uf%+xVD08 zE4a4y%eCd76&N)09cbnZML83w{*}%)(a*1ne*T-z8d|#fs->&f#&>G$?AM0MZZ_M# z;(m=XuI7!&qEyo)hQNJi=l$NZ_!QgE#_(;1SSk%MW|;||E@H(YFQ;pcr(Vn35n>b2FY3V!ys!(zM3H>5K!KG zbEq&O7ySmIwB%)-3&I4mu7h%A{?xYo+VDb&uD>Z~pHaYa0%msr!Dy+l_NzWz7E~0C zqq{mrTEE+1*{9z@m-^=O`o2B6rj%t~RDVzAltpNwF5s)Zh!O-zo*uj?XIj0BQG(RxT2?Cms`n>F zs45U)k}Gjm&|?n^llu1N}kjk zY2d0^ZP)h9ydIQ_MvvH2>U0ga-KV{%1K>JOQ_3=P4&Y#(C&@$$zLKAh$ePz|V7!saAYZwwz{(f$43++LU;YUjUxf87r6i>*fi7nQKK7zS*+sTcDb zzcEFN#+c{W%l_5AVs#jzEeSp~FdFy&c|cUGyS!}CbKNgQn>rlEFP70CU2)8-YSmrV zAN4`7`vkjBu>0(v-RGP4pgHcOcT@PSUqv4ziy&F-t7Nf>b16s`L9z&v#XYXogL;(Y zVfIWKvt1A0QED#A@Y5^ zH!O}hhd8m-MG{A*P?MTce#HtD^eq? zEjmLHT_JUU!{IH%8LD9zz`0nFLdqA*saJMd4PpVnafD=AAJ3x*aX!zJYM0cHR1^Hp zGi4cFowA-YRU5>$f6dQ?l-Js$)?Kv2U2E)7%h21{wb)yL5Ucuj1KR)2XfH+eT=tX0n)Ta4D z(|FNSL|3WY*VY0B0)}dPi{pfn6r>CZfgi+T=P;UATD0`j3o3vK;8gBKM#R97BR*|U z=^HpKiHX9od%s1k#d6+xQtI+Fl)b%Zb#58IenQ&dZ0$f;#;(aU^^v7uqqY!ME4spQ zoRlLK#M$pWSodFfLh2iME61V9JS+hGYl%DwU5r#7T%}n$2GiT%3T5oh5%JO$r^3)0 z^CDOVv2%S_lpokyxE(p^A_VFZei<cYI+%Dr8BwJsoO$3=q4d=?&x{lenJ;-Q5G$IdH1Mm`YH33WRw*3M#e9D3sD(l zBO1x5kc$tY)X>954C~CNO(KS`RTpZkGGbW&+KL!122?9yi5S*z%7|fJc7Oj7!^&A* z=-S3SYjGX&EB&*=>SyDZeTWg&i{*~w&~p!w93he;L~=a(NDjF&wl5pq3e;g{^6m*R ziP*y{6N(-`Wz;BaGq;v_H`PK>P1?t#%s4*Jn)q z*s`!#s~>a(=_wjFAi=avOkLg#o0iz-PC(saU8Av`$gnWNL7ZiJ&%86JrZ&}d2^rEa zHquW;KW1#dp`;qG+M234zFS>gHT6}a*>1Gbny*6+2UfMzg|@81x13~B8&#%#+!AS} zb3&jkSv45Cb50(gmTc^n4sof5njkaem5uM{}C}{Jz?jUTehRqFQ$HpME zI2%1UegF2_JVsE3%R-r@p<-`kgk)?KR0DKwL25^&X-Bxg@Ooi8xRtNY!wTBu13tG0 zqF1QU4$cm>L>5Xj&SvK9N#RW1wxx(3l% z`$ZpI7iBsdt`{6tBnQSa8?8v8l!XhWjC|OrUvy!iKCsUf#t_&?q5WRYb+y0UdD5`Cj9%O~9MK57EG2l;tof zfi)5C*87@6caQn_R4!vji3zKZ%aGcVP6%Bn=vc)QbgZCb?VXOLk8;0$RT^BbZ3US- zGDl=Z#hOa6;=BHMc=u3y-cgkpfGi7h`ZvDV^TV^fijdWEdQfC zcQVc#bAVT?Jd=qc^)!52%PY;whwBh7_qIiY8?68rTYZS~J9@V-QFOy?m1erK36?mC z8M36l`0Z8uIoM?5nNo;fo&#glQhKN}dwGY)bvy=EklpBf!+S_pfDE}4FCBTOg*5I5 zo*^WU%V=~YPi(oroFgW6BtP^Alf*7e66&&zSx({vZDf~F9sNai)HF_*@7flM8VF7^ z#jNVtFjSar?;{pP-%Vlwvl|~F<~&E>)73kNAw<5fUhDFj;>Ur5oPrs{Xm0*kOcER2 zv}&AIpVx*yZ~eX(IR=~e&- zlIdRDiKpNh1AIwM_ESBBq;Bi*t^zEr!Bd9jh%s4MuyVE;ZaD3x^C%qSQbpVB%KKKkcJQ$|9`k|W%dzr!*T`0a1tUsw zo^^!si%zd)n+AOE+Amr_Zpi{=Z2ArZRBfuk{#5Td*q?&^Y47Y$#<}0j{M2Nq#p71$ zmH%Be`9KpKSuPG3c00ME?nN+yCQqsC($b>1r5w*Egk}@H5f5H~167b+T`C^yGP&*B z#K)SRMjLa?HQLmc*cF-RUi)xs1u)B-1$ zp=NmVx=CO}R#J{75xn_HhuK2SVvLj*U3Aa9XIkiO!^F1@Sd*jtDN;w}@-X7-~3&08@b z`C&R(koo`$7NlT73KpdOvLHR2;;yN$pXM&bpkYzBT4btoyiZr}c4;c8X*(VR1^s*n z`nhtX!7PK(awX;D@hZBii*j1_)zH$LuUm?G3l^uYzJ?85z1egt>iVP8pPLvg6y|E) zQhQ*lNeIw;h8rcgIY!SKo(4HQ|4cJXvvSWq_jh@%^nZIE)`r~WMv zK@8e6mn@j+keE*a7aNU42#|a=lV$3Roew3_@f=6Sn1v`;!>3!S{y@`Q5FUBEV&x2* z%6eB5N|HNQ+wKT*^>hU-s|Q;W+$~5F;#e+~qf%PMCLfuCPrB?^jOTO21coYGv!(Om zE2EFjR_x|Z%GNo7dnhB*qTfE{WOhTs z6$rL%x-ClHWgWEO=n6%Y#Q>5!RR~5`P-J&fOrc<&Cv%)61NXYq{5TAD^$apaTBb7E zAgP`K^Z|GoCp$sxF;RAQ2@C_~07IqM^m>ezmN^YJUG~gL8a9WT|GehZZOpVxX}C$V zXHJH}b0;(FHgZ~K)*-m5XG4RhdPbN%y{6s8F)foGZ3y)Ms+Y_6nnuljYz9*G1VO!l zs&7$H=P<*3ZoSLSGQFY-v0&|jPqf7KOo}F82|1V{)GkWb8nzQ|S7|$!$fur(A-Gsy zcMU#H3=X#Lo!PqW7H(xutjwJ}V=zODyA$vunk^~4k-y%mzY9bvE7ln$bG)cFj#w2O z)tG=9zXYxtY;tS#UVSSK)&c?5{259RpIt8vWFD9cX3 ze|&#*T+E{U>I$tfy8Ubz$<_Wg?bg-*k3Ag&YJnQ=0EZKx!}PD-G%WuQa+7^6h@z(o z`sTT?jLveN5ybhxA*%+paj%*`4@$(1mMG2>6dQ`cFeob0`S+(~FHe8^`&0G)=}&c} z6kqtjX4F)70+XW1x1M^>En3>zfO%22Ai2|wOR1-BjHu7wON&+wo;|y}@pFj*dmLwB zj|sPE)q4*9rr>Yd1AkMvu2E={FoOV*1t!CIjQIYI{Jchq&qX)2-v@EFAYgb282|a~ zzoufaKmYlu79`*-K~JCmG_6Hc22o@0Zto1DMi4cEsBw>L_28i`en}!W*R0#4cb!2J z&nz`ax~zoi^2kdXTg>~2*zW3>0CwBXcNV{Xag1!WtIl9_gGhWWDBU^3Yh<|*qlUn9 zv5_Nr*})Y`6BsEYx4MJnmr6qUW%|??4ont~Z0Vkcd3r`y;(Q5Wd5N+mwU}C6Xe5-h zE!q>1d~KWGCt&dvr#{eC_!th*`q=j4OW$GN(Fi6uvus4yz(uJV%c~jU*#yn!l(p^5 z6A43BtuO?4th>njQPzqN>G&9E`M?Q@jG1;Zr>Fm5xYx0 zZw3KcCm2#X;HhyQf#pETLIR#=an2C>ir$u&*S@7};N4i)DAT+UX1W_iU(K6vRkjZl~!Q|m*;4WaliPJU>woq-n&%A36W&W&n^ zDS7XR=<68M6$IGR1a)pl8`xrdplm8T|`PAhFS0|3lQlG7<#4ct#gT z=|GU4#<`&4be^4(44=-WtFW)?n?{>t0D#kZ1|Z2WfVy>E^PUP)<|Gj+OEO95Z2=G0 z_t{pK2A$L^z20KT$49a>=p)g%dkj(ogW{w;S`7YQO3+9wew6`j_qrLykdG0S(%7QZ zvnv$kOnmg;bhZsDwQW$>SST82@|J&guDkH#RO1W1+p{FKjC2k&cp>ON^OF2W5qLLN z=YsOfYbM9c;Szq4sP*G-M(gnx2D&m(6QmF9N4!Eb_XI5`E0|tFb|a+dvn9mDd0XSX zERbIk?BIBF?~)LHb`^EW`L-{Ej1ob-9nqxSVcRgv&??Owd$n(1@euSSI~9~0#iyz> zTU9*J9~sA;>e-OSQUm|&$cz}$fjvdLw`E84S}66=2T&;W5lVf8QXl(O>O*@>{f*qZ z;botBqlTNTovLW_^=g}m>Ff1@X@sQ(eMuovA)&6g=q}N@u$he$yfGi;ps9jP#t93O z_k2FPLi3Ret7-z^~;w>-yI$Q>G=5j@4(S^!LUC$&mjBmXydV(liQQ$-+;LTo}7X!NTMZT zAX-9}Dft%@p1~whs>0dTIR`mcp7Juk=*dIRBRt^=Pk6%P_x!&A00960jztp_0Db}h DGmg+N literal 0 HcmV?d00001 diff --git a/assets/longhorn-crd/longhorn-crd-103.4.1+up1.7.2.tgz b/assets/longhorn-crd/longhorn-crd-103.4.1+up1.7.2.tgz new file mode 100644 index 0000000000000000000000000000000000000000..a4ffc34c56005c3f779f9439c85379096214c909 GIT binary patch literal 13409 zcmV-nG@i>JiwG0|00000|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc zVQyr3R8em|NM&qo0PMYObK5wUDBPd(D^T8ND#>gl+uiBpSyxT%dhFzmcjHXTPSRC( zcB&g9Aqi~?-~gl?r>Fn>ExeEfNq{6M$+jlompCE;92@}W{Tw8eES8j!NyOsAvn6EN z^bW3)@3#3I9UUFLdihfRdvtWv{P*a`qwl{ve);<7^{b;-KfHeR-O=$6ua3U|4jgS2 z3dfW446^TzHXf@vxjlIxAvA*-ri7n70U&}IOz2`7!7NMA6w|{9u?){KicbK8Bw8Y7 z{cMTj7?Bfjkg*&cSU(|fg?I`hbOOp<$M1NCR@ToMN)Y5|BAOX3A{IY^DgKNY$CR9a z_3;y!rpAA#uczNXi4l(&PBZ!21>qS?5)QH@0%up}9Ly;zdz?P8jF8=>=mfwtO>iW! z^JHC&aD4Q`^yT#U-}6)r_0TK0*;70J8Csu~<>V7Ae_bQSaE!n| zLB?_tfmc7sKk@21pU?3Za4@MlLnM}eD*(?Jf*As^9Alm*$sPDd4iibi#CevWPoMmR zRPXZpOpGC>!NCkgFy{zxxB-^YANXVjqZ>rxlmGbf=;*-cbUe@; zMGR#JpfTic|9b%QY{~!k-~{~kzXyLP{t!QkKh;ma|Ni?yiSU%+HO$ZzT40{ByD8Iu zd}0ZBRw4dGBEGK;N38dw50LZQ82l5=UcE#ldS3noj2Ww4KLLk-d{QDifiskFus{Sc zLB{2l)I9BDSS@BJ0bnzEKE2h$sYkUuR}G78 zVL9W62ctSb39l%|LHhtTC~7sMVhTU!EU`|b>xguMKct}nHYf><6Uo!&;tJ>Bmfa58KX&p*kpl-B(k#{Coy6*D!V?K9{)H!dIB_q5_ES0 z+TujPnx^2NfM60Ml7W}v#EY@Yy{zSw6L26jQN^%?gn`KduLSRa8C28Y)3R$!p9qmn zfW2TePb-a3yi(ohNhyT!{h zeKq<7B+D6&^-D|^c>*cnao6)DH7 zY11Et%%3wRP|q{L|Ft5J(ir4i3B@U+Yb;r%c%wlB5;obVc!aV6=8UcYuP_I|ubh$( zFk7C0spvlEQ$5m@Hgi3$*CL@t zrjbzAFeM-H3h@lC(psOVi~8i^VxiUR_3;d4@K~LIXo*(vM1M|GL{2|keE#9O_A{ts z#C|FP=HPaT7y|DKnSf`MA@10~pthmt>{k?J)ADV~Xo^^di({)EgWejyHo*Jmr1lN~ zF(WN{DnUev_WBf~SR+B5M9hU8%@9XKkz(;PBrO2dBcx`;xS%q55(|30Ml1siMRY;% z*RpS}bX^3bfRF)6CkRZyS_m{R03>mv=M}sI42dy8PK^H6N&;$peMuPtn9S)35NaVm zIXqn8tl&ZsU9ED0v%5pdQ1C3zDC37QTBGEU~27X^#2o-dP1^P9+3U~4qV$qk{mWTI?7Cm>_FdGHly z+PI?@kg`o|d?g4FT%Z#$hY8m|<+E}(7Z7N8z;C~gW9UkqDlG>w5Cpws>;*GNv4wp& zSVf-WxJJ^uSws*qMvE90j?VE{_gsyaderKNAksXnNb`LVX@W=-M4BMdY$VbQAPm>8!ZzRR_Z6pY}S0lke zJ~Bx795IGsSKAq-34)~YR`E5j@lwd(3T2435Cv+IoC}>j-8(mqcq&1p-76xtC7OVk z-jamECUF$6^3?GHeMu?HCgO}w)K_V z8O>xqEGGn$#fM!VNs=cCoF%BGS(l1SZkOUA2vNM9?ER> zOSdjNnM|I1lO78Fep~K|OVyo%!RnjPUvxSq3ZT@=S-lb~_0H;)Sd~EBmq%h{OnawV zzarGekkV2imC&5KYyhU_rG~vQe(}=8i&2I2eGdw^F&slYrG(>If&>lPu99tsAcfho z2}aH<5@j1){J%B0@#DTZEiS964^ZzL2SE-QRQr0*LA4L6{T`_H!CMiSePH(c!tA$W z&JWB!F#F;O%>El<_I(s#i$?r5(daTT&J0){z-WDct^kP~uNL0+|81C_i~TUb?!2ol z0aJX5iIstX9t)(4@$|Jbci~%{pi5}6L=WAI?wP4ai;rhc)4B<-V@rcB^Y_5^QoI=3 z*liOxJFsJ0Jsgo3F}>eTcm%s&WZ+Eg z?x=x{*O+BFOs;o4#}0zKiNE5${7PedM8Ws*2z?)Rr-zdMD<;7+1~as{I{`nT*^<&5 z`RlFvyFjNBI?pJX<3+W^TqO#cYu+pYP!2Y^HF~eU)pZQaj5JGT*tD3tdQz!i9J21h1M9|el}bsK&r2%wpsoEc$BY5Etb_u)af1Sato%S{k!9w1Z*?-eKgd!Ar?g}** z%jsY)_Yma|FaZcgOKIM4B4N{zf31P25j83lAkV~Ep9xCK7V^A9QUUke36P=E)ZqHu z`hDMw^??Nk793dceXi9bvB?iI#+O8)fg)En&Q7A}-{M3#%f})JF_SiT>tFb-_$QZn{jJ7LJNNvlVi=!XOBM5#%vKSemx5_6j z9o@$23K|SK#|s-?V?38;*Gz8mf?P}9E%-+HR?e(>q&qRc!sLCvnj!Yr`58^EGw!lQ z5*nlXTR2rG%+G2lo0R4XzqXQ??>xNxo6Gpvh8Jz9`)m*q*F)b6Etezhl$s}yD+|8N zi^7GZ{a{|OEjY3^@aOEvQzF*$9pu>+nxAGHE$5C>Pe!>|ww$iwnb_6iJ*&}z&kZeC zp5qtbc8Q}Uu;{tz@{Z#OCYA*dT};7GIt%?PVie>g!wHZE7Vr#B7gN!3f&gsL4a_x7 z#boh(YlsV8s~vf*^0eP~HQWi4r#-Hi`Uh5rOamgdYBslw)h|*jf19z00HflbynQYC}(l|z2jaT+MNv2#mU^liUR@e5oZiPzV(v{$2LMXXJ*^>61i?ix`LB^NVwVAD>A;xTGBjQtVfxdMee6d$D$~xH?%0=2G6J3}7Op zE&0E(lih&<)1Ga6aSkZa_CF~}mxiZiHf%;Mvk>YHiEx4nmhQD~ZWH$~W>K_v4eF={ z)NdxWn^D~7a7;-et8KntdU7J82oF+S+XSaGNQB~ZaPR^gT#yeMdE$S9A0;S5vG~s$ zvAe||pH!^ef!CVmEE&6;pRV3{3>D11J2UrgZsJuVHO#sWQ*MX(R=sH$Z+By`LYC|Y`+*3dRdI>X{Oc9Jk7P`XeF)av{M$J+pV+Lj<-YYv-e<;)x+Gs zVRo}rhdk{z#^z}-x(1_bFuLxc(KTc@1XdeZ?PKzR238wbZD6(cvQ`i7-}Lio`g>dQ z^peIKS#|OhtZ0nN1MjjAR>qupo+Jl=GH`%N#L!9*hvcBuz!ml^np=K0`m($|X!rjJ z{RAZo9^=e4WQ+mkteQmQWiH#D*Z6+D!kc+ay~EPSoJ}9!WMl7a!7aIm9>ReKXul5q zL;D45p1`Kx&w_}D^aMTvw^{^~MC`}%3Ufpjn8^Gs?QydV+xEfbsl`b&ek%}ko7{bp zG(ld8((h5a)`{%1y9~*VD!b5h1;u8H{UG!`sGCpk$=!MTn&fw!qmQ9a8ogr|iJ{R8 z#88^x2#$86>-L7@d=qj!(C1mRk@yYJG*S4BR6ee=*ZkD#A(766qG zX@!&H79;V|LY7x=d90 ze-8`49x-A_?0yUrT`Rybe)Zk8`I!RXtb92dj+7>evRSXoUYan7Z!YSeRK5na{DWO8 z7bM0J%%rlMEv41A2@>W2t|6AHg-}HZwIN5jLCOznaGf@OZ3njZ;${D09zK@X>vYHH z`30{`Q&|sQnc$Uq{9c(501=pXVBU|8d2bp;5tw&i-h-AWFz-EP-p+%+ak6+x8*1nluF%bb8}t#`LghW*Q&I{jJqu8ZEC6c>i32=$qP`|1S@w<+n_L^lUIsOy zLQ5JIz9OQy$6L7n{vkP-MDIskGld1+GbTJ5cC`-&f&Pi$e+U_n5;VD`EPhdm z4#jq!Q&wM-r*6b=YX&w_=9q!i%c&ks7BY<6eRoOa?xwB9hZyOGMGho&xVzvZ5Pcf z3e$QQ;Pp(k*f7H)@+|i25U;$(6le8XaL^$s9rZzH35{+*M04Wj%)H-J)~4Je#@==o zYaxyevK&i>U7)ZM1U*q`3Zr9(_1>Uj*h?DYxpWJ;oMU}^RVG&`33O$2=D@-(jo@3$ zK-N<;5|J^n8p4g(fp0VS*p+x}8L-MauA_OY$M-S#LG+aUWU8rrTjQ-5ZI0 z+x>0Eo0iwiTr;&M7N;3%Uf5=|dLjgGWmME*0dKWQu`ms8*`;=EDhZnYn-{U{qLALZ z2ETEQm!fEjTUW;U+!d!TFji#_G+EJiEDxS8L-R8sPuF0$s{h!o&|tIn2`VB52`_ZZ zX6H?m|GDw2f*>w_n3x?E9PZ&bH%iGmeehVrXI{7z~5KFc=K? z&|vt@``XUvDuo%I;RI)QUc?@gNVjcdTwSzZ^d?;e)*e{92Wubi4GgS3u=c^r6IlBm zvv$|9-^dkcp_S@!yP&ZB!p9XR?+{rC(s(@FdgZz~vklN#kDZCB4IOqPkX5poHp03* zUkN__aB+!=l>~#Hx`e9rxTYOxQX!iuWHW_qCJ?fj_AZ;Law}{?Rn1OD^&oivTj|pr z3q#ezsOAftozc|_Tb#Qc>tgD~u7>ucTSBkU{2G(UkNXiCqjQud^lpVnb_vr>owRo7 zcH$=Om{y_j`mLFxFl<)|&+e@eT!{DSLfj;MOi8Y4q=pB~;r#0Gd#N`Kx7WRUyyUg$ zIb%}!Yn#ZN)*9XBdSe@zj9MteRSJQggVN>MG?a-37w5Gx-_zJjf}I&;Ml?5YNqvv2G3r4a%Fp_=q{x3n`1^!Ax z)t8^Fnu>Rg_Sh;G~-qx-db2v-TTSiHSnv?+atQD$!gFTD%)L128StiMB zf0;h@0e$X-*@b7BViu#dfyIt*PUQpE`p9*zD6Q>v+xZ63wpiy_{_Kkc>E&u#W|=^tmUG6kXJm8dvyo4c3*&L zc3?ky>gl^wav&hxw$YZlw@t)dNrnv-7Im2*%;s+)PV8k(dV0{Byw>Y| zZ6I$^7A<}C%Q3-aGE3h}+fH+~c;vz?<{xslcxVaq@d=Mig|t2H#oMYTa;0V*wnBR= zNDN=n7(GUIsllr&0=omWUn0D603>~=#l1gL|9}PX0F$DbMzbN>@=6(5$=HKZZ8r6o(vQ0Th9N9 zsvMg{ve?IOo-3tP0WT&CmrO9QyAA0pP7v9|Dk7+=p2&EjYKlk?Xt;cYlv#UH-h4q( z{x9Q5DSF=FF^!fui5YU*EryO`&ZTPy_pY(okz<#Ds#@vjL*Oa{s-7{k?ig%alir8` zrBG1Q(ao81;f<$V_KJZ6N6$H8gO=P4!LA5TaYp@BW}ZRjPpec=>%|AJp|KU;MVh!0wewxW5nZ=gaRWDj5sjjZ;26i9siB$ z=Q$XOdfcYYt|XhTPzvwBni1I)_Shs>N(#j7i#;Z`=xp^uv$x^!jEyUAF7k$@|3hbeqfPo$yFw~&|hTsBp2G%t@>RCML7&%WQwO&nz?WO6L=J zrR@p4(%wdr)C!Z8%cIb5iH%j0s6u0j>h*r(VJ}oA z3-rsu}mOE(G(^Ly}d4*)&M@WzH7^+eXy6oD-k3G zn5cl814_DpY-3qNBxdi#wegJ`bzj{Om!%&o>`= zyB%KppU?hFhMfNCPnzpK|NFF7bSv=OE%ICg+a~w5e68#3bR8L2IWu1<@Y(#eRevJ9e4*gKQu=PV&!P)JIvIpm?$6D*Xcm?yU9ll$> zw1oDWFn5?t1;`&e?5^Da&vAnI9na9p`H8HAKNdQ)#!)6sHqI*NW>1|(r37;w3x^g1 zuaFiH9sLY(BJ`WWGq`ZN!kiUn2Tr8;#8wj$^cl!IUJh8Ot|e*|Iz0RENq6LDh_*XO zyCUeVsCFW`6TL3Pj*W|#^w_)Fx(`XtGx|oZn=d^MHIe%O3N?{KP2^A$dB18R3sGp- zrS1BIV|qCJkO-WCv{XIYp{VK^6xHBET{}VSp|PD^0)qk%ptN4o>!G@qISr=0J#&(j zc_{tzno~D5woGX_P41bKL9ur-vu-MFnOO&|R?mhMTRkJ_w%4@#Vr{lX$vuD?5Rd0k z3(uwD4AIgDY0Vp5bRs(Vu!%<6r?(I4;L|5tq|m?)D&2o0I0n_YAJ|u6*Do&oa&_bv zd^#*Na7c*Tc1k&FW5nqiV%6JDtr2>(OZWw^+@_$dj&)ru<1R{>T{cS z*l)*?`_~dKyDL}29elWro`VlJ_;B~lhpW!Irx#Zd0My+70;bweZV|*)yU0#4FU|oa z;C6|lWuZeBcUs7^&r?b`o+SuaU7q47k_aco4pijp?8@uX^@;)XKyB6b?YsuX5@$9| zSZnhKI^O8O3)U1exI!6X8`vc~<+;`}RU=wwI9wnc>-*CC*xUQH`Bo0Dtv-N)Yb&_6 zf@^EPTwDHGfk89hfo9H7lrw?qU+HWU{rsxv=fCN!p{1LzTDp2|e5c0Fer>4iX0z=p z?$;>eYTlSEN;OSl2>i4}1aKrTIXj5a9Og-Opgsn-I7z^)It4I}1(T%ab!l>`gx*U4 zq58(PU+GN$j=o^23F@yMO1m7b9?|`O%%A!!1=mV5ogv8?=^PxW`^^pjW#FJN{v9|* z&mh04+bF6ZhS(?~MhQS)gnB0R?@CjvmQ|vJH)HIZkcggYkepRN46>Hws~KVf0p-0n zhYAyN(Qgn+OJ3HwAWSgpIw)7>Pi@Pu4KI}F`kQk083imSV0H%(jFt*(zv{zfK}FFx zx~pTP^}7w0Er$9xw_1uKJipU+4nd_H6R5pZW4tqe>NG`-&*w9VliMIw-S%fC)0>0XdC_#|q>A{O~rq#O`B}jd)Wu@}3dVf-c zssa%v8N;g}Nd-x2Pb8`FPQ4&W1xYGMQs0Iop`h#^oTvBPSK$9wH>$^V15+_v$E(_KUEk?hbbX>G zW%)wQ%=w}ZhQ|DdAJDPU05zVs;q_2s*dF?VqFjJ-CJx7tFqcw66Y9PS5nRGG0yBgN z$QWKM5Nk^`-RH^a!)pyMzXTWOI>x3IRMQNhDRE*sW8(aI#nuGJ;Z7Wfs!q{HKEvuh zH`84xf3|gCGR)-700})R^4U& zQ6B`mPq6z0yU+gFeZF}Qn&VD-H-+E&RrEo!2$IFVN*0?qmx5#wB#R(f+~Zn3s7Fa2 zX3wNC+x74rrRJgxubqkE_9AmbZg<<(oo*dQe*p$2iwo}y{l$Rin4u`6?9N`+qNla% z+Blbed3|jAv3)O7*RXQY{ja1~LV$M@dkK_|MoJQNEXJ@4ob-N>to@g1`>Lki(Y@Dl z!{V58h!cA~hkj?uTisTWYK}4$G6n(52@w>!VB~X|{X|*wy%xMN2f3{DE*N6Yk@%u$ zNg06TPA4PTyfhUEx+c3$nkjP0#Mn7QfJRb)igk2c1M(Nfn3#hE-=O49fFtedIY;w6 zu?+q!The^71S#bl&yqVq%@XunC2E4xvddeXEvq2~rdBzZyn;!SZ>G2p1cZ`_T9C5s zGs*zYKx8dEJCnf001LEon5<>y*&M(msjAOIhV&{wpVlTGB?t-{JVSHAf1rjY7E7f& zGa9U{1&?M*ei2L*5}l*OltUm^Yn-t=2_Mnx{j`+u>WPAvFa2iqO>vROym_RVu$IYFK=wbMDei&#AFKoLT|;4UNrVeZJIAM zjTb#dbd}0|Z7onBV5qjYI8G=@LCTO2_(3do4x@RcMN2=upaPfxPUT)?L<|f$;?wq& zzJbG%m?#{(_gmCjEa#mkr7llH+1ra&=a%v7C!`I|)((Va?3zqdA6W`EY71etqAMK7 zNjXwMoc+#&b^nzoq`rZ-avYk>!ves+mdKOP#YpABRhp$^Fue_~P{!^Y5iebFDh#bL zFM?$dJJ)wb`GKv4+mVwlLZB|;mk|>%T3_R@7M|T*ey{_xIa$H<60)0f%x}(?5R)sk zqH7etAtP|4HlMdPs+w(eX5$09l<8^Xm@Xe%RH*RM2T-W+5-Ple3NQOr;l*@5da(o3 zTfJ?ork6ohI+I(Sx-GPWZW8k5j-J=;Cv@=^Wzo`?caOTJpE6%bMoCd`Wc;$X5S2kT zqLGXWx%d!D4Lxkcu+DtiBx3klb)m*8BZl>_t%%`bK(!KYEw;@kRknI zBmGqLW5)IyN~-ayt*M&hyVccIQ(rZj?M5rD`8woqU{y<9Xv->m%Sk4+QDxf4Es<6_ zCj{D(RfC~B=j8Ee$;NK!5SMDG2|`m4nu5^u=!K?`R2dk}BT~r&qX~>=`0@lsv&W3a zdGI%?+Gr!z>T&D!j>z*ifE78GY0olmWloDU1+owu(K)_`f;Nxq4#LK2*xWF7Yz#t+ zv(bao_iwMwV+2*WER>yj!>Fp*b)SD@SqfehXtTd@ya<-!o4YY?5a zU-ZFsQKqxudcjdea$qd8(TWsGS-4Qj$cK#zme5`1UI8up`ba=YepKXr4X2fz) z^j~F95WLD)fa9-{2I(~}Y{&}au-sxESDEI4ErNQOeR*<

r@Hf#5V# z%&MLZLxtJ)K4MYy-6RGuyYUfX&T|AlUA=P{Lgf4EwJxtIejGT+DVQ;g=H`#ZB(c#= ztHx>dd2Q(P*6(|v6Pp{e!w*?o^(F}lI&#pFgO0p!Ib4H=D!|ejJY{H(7?XtsD`%VGhSP33kHRr7RkY2{%#KFr zqqS|dp+|Pi&I&a>`Tz7P}Ac^Ea}j3=W-wrrai5+d}mr3lvJ zg?#3q8`{c53?1|0gU^7&gJFuRAG(>amnn?V1w-6&@H)*;o&{NgooE+!A{mvX@7CYM zOeFjHa}~8u)#sQz9@vebSXl*?Tk z+_XCF!X{N8tt{D`;f{C{ZA%<>G*0x05UCUIZg(@|4OhEiH;$%JFv0hIeh>HQ%*4D1XIqQm1iv!f*}SEx5Ck$Q(^NFLdL|H=g%!7-TJ2#n!$GHhS<#AlO$zV=c5n_@+aTaI&f2CjcA&p$@7Uhf4_3UL zS@Cq3;O1sLoqS`p@Fh13L z4#uZoeA-XrQ;|Bkx%J891I6PuL~uh0@)l_X=__vR(z{BIy@gmH?lRGAWycGkI zAEtu^sSluFK?)Y6U_sh13(~_W?wb1gY3@=C8Wwe{MW#B(`*ihgm!^W6w&O8S(9d_E zpDRZi%rY1)S5i(MucE8ED5qs#4K2O-x}~VMU~%f|YuM1$n@zW(u0J~cxrxC-VXo#a zwFkDU)Ki;q*T{wr3UyGZgF?M$3U!kd46nS=K#`Sb7f;891!aSeIJ!aE1}XP_>fZtp z#GpNM$%2^ZjM;gPp1R?e`g ztamk`B)N07?T#QPSl|;fgXi!^Sq4lRchoKi*02VS*1PO1(<`bF3)U|9L`z)Hq-X+`kb@aQ?V@z8VLRb=m9}$-(CbvfK)wj}MEf7%6pP>Xnj(#p*3k>L4t0$GF>cjQ%q3-ms8pr&Mvg`!> z$B#$H#VpFNuFx8z+s}rPT-bO zW5O+3^`3*jDfpZAz~24jG!jbM z7VQa0zP8Qp6R`M-Qy=Imd<+L@eQf*jd*5N-(Fi6uvus4yz(uJV%c~jU*#yn!l(p^5 z6A43BtuO?4th>njQPzqN>G&9E`M?Q@jG1;Zr>Fm5xYx0 zZw3KcCm2#X;HhyQf#pETLIR#=an2C>ir$u&*S@7};N4i)DAT+UX1W_iU(K6vRkjZl~!Q|m*;4WanYPJU>woq-n&%A36W&W&n^ zDS7XR=<68M6$IGR1a)pl8`xrdplm8T~U%AhFS0|3lQlG7<#4ct#gT z=|GU4#<`&4be^4(44=-WtFW)?n?{>t0D#kZ1|Z2WfVy>E^PUP)<|Gj+OEO95Z2=G0 z_t{pK2A$L^z20KT$49a>=p)g%dkj(ogW{w;S`7YQO3+9wew6`j_qrLykdG0S(%7QZ zvnv$kOnmg;bhZsDwQW$>SST82@|J&guDkH#RO1W1+p{FKjC2k&cp>ON^OF2W5qLLN z=YsOfYbM9c;Szq4sP*G-M(gnx2D&m(6QmF9N4!Eb_XI5`E0|tFb|a+dvn9mDd0XSX zERbIk?BIBF?~)LHb`^EW`L-{Ej1ob-9nqxSVcRgv&??Owd$n(1@euSSI~9~0#iyz> zTU9*J9~sA;>e-OSQUm|&$cz}$fjvdLw`E84S}66=2T&;W5lVf8QXl(O>O*@>{f*qZ z;botBqlTNTovLW_^=g}m>Ff1@X@sQ(eMuovA)&6g=q}N@u$he$yfGi;ps9jP#t93O z_k2FPLi3RCbc&tQ@$RpIRFoP(SzPkEVN^yH!E5uWgbCp_Wtd;VVl00960yjgsD0Db}h DVwUUV literal 0 HcmV?d00001 diff --git a/assets/longhorn-crd/longhorn-crd-104.2.1+up1.7.2.tgz b/assets/longhorn-crd/longhorn-crd-104.2.1+up1.7.2.tgz new file mode 100644 index 0000000000000000000000000000000000000000..c8d12ba86bb9021b4a0fc2fca3418eed691fecaa GIT binary patch literal 13401 zcmV-fG^WcRiwG0|00000|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc zVQyr3R8em|NM&qo0PMYMbKEwTFr3f+6)5dHWqa1$k`l*xS5;HH8p(b}yO!gUY^Um( zO(kd&-HnJ1Z~(GpIg|hX6fPt|5+Dh7x1=6}U(_OTIk=tsIY=m3EGZ+Ch{cCzOUSb6 z9b6^fZ1XufIy!pw@}>NHbad4Gd-VO$x8EGU{Nd<_S4Tg5C*B`__x-C^-+-g7Lg9FF zo2e&5=B!p%#!<6uoCjdk+g9%+sBba3gnqqnwA(r7eM)3(?kVH$wti_f% zjuANl2N}!Jfwc&ME5uV6p%YN9^D4f6r6Z)kCk~W>4+>XK0lsFhl(CmnBM4#P~EzH^&7%=l{DOj$bv-|EuF4 zz6hM&Fhc;Aea!PDxdZ>mVInb@IL{LF>64$3YF(Dk zL?2=p9L!JzbB+L~D+K;0pCLw2hPWE=9HS)W05Sv;yuulZK}JEg#2h@E-O0%~e|Ig) zVzK}{MbY!Fc@fan=jQ*D-JJYo_#_oIQ-(=42M2%RlRxnTFuhX9Q`J<>dd;UD;uR!t zf!M`+1LR^90_B-^YpZH`3qZ>rxlmGbs=;**`bUe@;MGR#J zpwZ>;|9b%QY{~!k-~{~szXyLReu$Uir+W3rAAcN_6P_}>h8em-3(PZiH)ZIQaJiaPW&oocq&>(_{_afIxZu;2km zgz8l^ESB;mxv#)HE!hmvz4Ihb^NT*izZ9!lZCE@nx4fr2 zMm2yEUSW)b_5o^O)M`Y<5Pr#7VjV`;5$ObfNJRr|P$C%TBu|@*(;C&`pPv*X6X&DY zyg)OYpyX3+heQ|pr7UEfkMe5^QTLaqtx|2L%JQA7=1>0}{9nXkzBNIxlmC19>f0ZF zIBxKN-wTm2@PGI4n4%O+G5VY#BL3skoBv-S!s915n8YXGEaw?rT_H|$7NK)-9* zRw#op%%G4T8{#AY5hWR;NrKp9frv!1vm7TeVl^zgKAIkXKRtQ^G=UO$cLLh%L_wOS z;GckC5+jmp8Zcpp|_Z4vS6Cz3?@$KWEsAsEPGe=J^{&c zhGYE^lSQ6D=4#>z06d~Xm@P3#`~(0!@v_AUfN?CB5+?5jl1A)|Ci#k#{ne!D4}#~< z852{_GeQ5gAdu1+!}zK z#oFsrjAA_r>Lg+=_-KYWA_^6Y*O0UTRFB}A5#s{O^%}7ZFci@R!C%U@xsr7e zkPJcwB%UBJ0c*j~ya15Ijh0vN4lpG81UWI9gRW3)!eA;*geWYH35D9Un%4q=KXav(%fqUkFBH-=1kpuSM6Hxsl&WZJUW)Y*vx&(ZF;!3EP0=PI zaY`}ClrAR05-sPm70$#q_(zU-CYG+*?3tw0;?(D(tH9Q1l9L-kZ^=aId`>{da`WIT%CvDqEg)r` z*eE3s5L}=WFoy}(uku;Bn+pguJmB{~#u0QSPL-O27zl)3683_aqu4?|9Hb)8aa=>` z-6SHg7^7JX3q|Mni+ilbN8M}nBCs?M%hG%sSen4n1ePYSG#jxr0}#V?ilW-VixI~H zQJVC&F-Ii|sUutiW7I0xv4wb|C5mo%zG}XA&W9Wn<~I`K`c@K%+^dqHARibce2y4H zv8(Qk(gZ=$_^RldSAQvFaD_6&S`!6ooSbVqdzyD{9Pw0)NV`=;Y)do&F})=Tg-zrr zKIN(71Nxj&mQBPNpR5Hl+T2{C5JQqUS-wOGCGGbegBI+k$0E3nmW9n9a=2u*+VP?@ z#oCwWs{xxR^RVa3WP!aZ;?%473UMwZ8lO7!mLTSPsu*1`#4V>qRT9*GA-$Q*hvkG| zvUtDiBT4ckfwKg)Bulfd{lwxgmdTq_wt|@))vK3YBi0h;#rsW2eOV+{#;|uP^(#bebSX6z zQV7ktO9x;|UaH#*;&(T3l8`A0Xa04ub45i1ziCgJ>T_`#litgS8?M`#|jXh1hRLogavOAoj%* zi2YYY?E5gn7M1vIq|v2doEfk@fYSQ@OaXFoylQys|F@xfF80F!z4NZN1WfTICRPFh zdNhzO!qZpJ+=Xv&f-a#&6FqbfwmQi0S=y8pr*ub$}xp!(?%V=7=E@^^B_%EUQvnJ>9DD!9CdRA_GTiH%ASuyv8ic zVRF6WF?Jx_P3#r-Wmg(wBMP>UM`-)78$A^FUl9qOF_@vn-3j;!&6bqj$hWuZcQKuc z={%!kju+Jua}_9Pu6Z*BK-t;k)@Z#dtMeF`5owmluxT-N^`uh3JX{|i>P8Q%e#~N& zWhdZ2zCSuHMp2f!LTij}KN+SHAjMZx+N}OR9%U<1i)A$uby|nI%tGpu)he_bb5Na= z5#!yKUglAo1%|2!fTzsyIjr1ayp31J$U&8 zOaOw>QmQwcld!4Fzm`B$k9sN;AkV~Ep9xIM7V^A9QUUke36LSu)ZqHmdcSYV`apsM z2@WLqKG*7z=;Q|}<4dH_m?Bp+&Q84O-{3?-yHkBBTH`2_BCFg~HaB_`Si3Vl=u=De z7zwUXf})JFcHcNdtFbl-$QZn{^tLNYNNvlVi=!XOBM5#%G8q}6x5_3i4c*4-3LFeM z#|zuM#&|B(u9@8A1-h2BThNX2s~lPLNO#Ws3X^yFYKGX4^D~-SN8F{0Bs50%w{R*? zn4i{ARw>mLesv`>-?@AFR~PZI4J+DE^VuLIuDiY$TrPXsDK<|aR~md77ljK>`@yVW zTQFp8V9(i+r9`afTgbC3G(XKYTFxDXo{TcFY&l%TGq9`2dRD^)pBhrGJjXAn)+R1k zt#)L!%F}+^)o>$Bp7xkx>IJL@nFd5^)of-Nt6ipE`vI*pN>MaxPDe5Kt$7-wM%!tg zjCxmUZuQXyVx#jVia~~Z2A`)Yt#N#swZ`B6HX1H&I6+&cVq>Ri!9W0hN20zlOHMA{ zI9sL@r*kXFUMeAh`AbdUsYTt=>Rb>BfnD@=1uQ4B6*;pEt!U;-`cnEbF8lIZ`~9PM$Ws#4(8Dd4!4@A z9b>19S}osxozj({V}dEUMA?$|or|-oyg=hi>e|fK-VkFpwQ*~FvRt8u63iU|8N4Zo zvJb+ug7LU9^>`JK$(|3GWy$s{RKA3nb85jYb`b+_1k z)#LcyngFOu+Wkk0m_|7_EGMNnVVQ){J5g`(d)te(gT>X!N-&rFE@c1{!EMR^#twD| z3QT*n?Zr8uMC<<~CtWI@n$fTswTwcDHzdLdDoDE5y17-{!-z#u-_@xj8&JQR)UHNx zpTjXJiLAQ$e(uRR8HIb0YTCv)ok1c5pM!%J;NXJ1*OMpy6Z9xS8H&X}uf^^bKRzm7 zxdX2?%~>*bIX_;#_2??7dv~Vp-CV`1dTOY39je?8^{x8SP~PrFVao|j`I2Vcy4s@D zyQ+{@7PdbOa=k2i^;Fa9YM$!avbPdfbm}RK;&$!qwd3nh{p>wxWOX<9ubAB|)FDs1 zm9cpml&(SP8kDYksB{g{4T01KQu~-}pn=o|QX5F^y{y%P+c*7en*P?7JiVmxMp~Ub z1uGh(^1!?FgOxI8o+rrxpbQ*f5;3$A$RRmsRdBgIi|UrwMq8Gz2krJBp`D;4!DEcM z29Gg7omJy#ywqj8vl`#8Rd_RtskdADn6v3)n{4czEtn$>@Gucqsk^UUO}-LVn1m59@NaI_vG%ZeNFT`&d|ruM?Jk`7m1G;0TU3 zqwD&H;d~QxJkaJ@(~4O}Bt z@oCfV+d*yQH~we09Bh;2L5nS_n~uP}}4vGe}vm2G?ohZQHTEcV70-=ix&+d!6POJ-%R-X$tGX zDif?SkKZa293TSm4#fM>5${dCC<5^g#Cy>41meBN#M^oBHx3praYOA}pGCK%i~}Q1 zYBbl+eA}Re-W|3`uAk||Ac6zBE=X!+d5n^rXNUoUP%P0?={0bR%S!`mz%)njXuKL8 zz!bWfbAvu2TgbfUdrC?MrDp+3mIYwVA#s4`&Z)04NtV5%*e2J8v8O?eC{avwpQ-E$ zMU=%{0|&XF*#z7!@9fN6PD)7I067zF4#^exp3xcV$`Dus`)%nBaEnCqGr`&^L#!IN z%^U=Vv#FEv4_~zDR}#$UgWYJqCXlO;x}-M?BLn^kbFJ~ga@WuoZaSp{vb3{D+VWDPmmAk;|rE^&^2)fwoOl#0AosMlND zr_Dg=)u%Odildc{4lwr0Ca3m)uUb!!FR1l`S}&;e_D`)BY;u8g2GY4@i&!9?fpiX9 zotL_E`V?pNT2Rm-AszKjX9j0AO3NuN?UN2K+Xr?8fB-H zRX`-_NF*cpf^>bDt|KtRBo-vHG>*AgpyhWIG?-X)CI;W&4ETM`i|wn!)0iGCiv+Z3|IA+?FV-o4Qjfks@_J`h}t3cWVY4;%Q#vacsMFAcNTy<5EGwdgrxQuu4D z$eh|5UFUjZ9hvl6DBV>GhMt4cxG02jV$!$)cg>s6HnC0V28pd<@QvOQ3eef9P)f#Ajbm58hdy$c#A z%D*-XC{%kcnyJ0_p)P^E2lD<<=CDBC19=bR{a)7U!EIokmu}V&p?W$J+(j8)dn&zV zFuFk`mO(`446jk&MS169J4NyqnJbhgLdXWQJ0MvM@M}ezfAtR6DgxEK)JIi^?P{)D zKG$uF-vq3`_3Box+O@Z~E5;no67+^qlA$Ih06lAkD%)VsB0V)$30Rg%65C&=Pklh2 zJ7IRsvkWnd(c1C}^N3^1d$L~5EwBBqSaq0uyF!WRqKp>xRT>M9%u};!-i5XWg|Wjv z(V-A##b8w!+7*)ghUX}B6Y@4WNp?Kzud(1Tq>>r2b9FF0XP?7l4HszS+7*|2UBb^} zRNYl=`vp`*Ko}<3tCv1glam!pFCn|RCNMo)LQJmEimp-onv9sEJY6stqxkCKw_Vqr zU|lAHj$6J)PV#2%8U7dadeQNjaSQPHMe6f&P`y~wMfXfz@i^|)9a!6a0jAl2{p_iy z?^4NufOOxQIJ6NvD=?_`=4NDT-6)~OR^8n$+H4O9QR8YmtBCnoLJ1~|?iO6eRj`#E z`7gVbf}>RrK*7-}I9dfqt37kHGStX^4zH@>eR0$q;B9TG*sgqH+CRMJtxza>I&`&6 z4}SG6%hFYxzy6#;ndZPx&JtKeRuxk1Ydc%irGhZ4zkxWhr#0zmK}+&luJ_e}yg^yC z^p!8iIG4#NeJ^P{&Dr9SGqae#&)MRkInc+)JTm3d_P7^stCGl-8gbYP?X4hZ_>#ux zF_KFSUR@B_9iaUj;gtg*X+tgU{gLtqEPw}?6xH-J8>}s_gprl>Jt##E@Qm7aku0vP zc``K~QO3qb`?UIuv*%OrVTrjk;t2*r$U~R|PFF}k%F7@sFuMb)@5&3-#-u+()5X-t zHe{x4$~ocyX99#6Wr(dXDP%FmP?TwNsgMTr{7kP?6v@Q6e?u_ImUpMwbC;>gu}LI} zef;XVl1mlvVzO}Y1OuDf5WnICkxjHB0;}qQj7O>_i}Zks%SVWrwI${CXB6fCGKQ3* zr7&x%^oFg`9$=wj_3h@+Y)L&%g8D##rN;$P&y!YyAnPJs9yN{Ww!vq9I%`aA@OX_Q~S|{9yK<)+ex|YQXbru z>n#U&<>0Qo2ky!t8p$4wG=L6nJuWE_;(swhJU&P$5aK|H10nvJ2yxf(-za~cgOI4l zt?KLwvgvZA@OG>j5lvzDO>%{#K-|9AV`B5pRv$EZ8xGG{zw+iHZIjkPT zI`~~XhO^mUmsz&x@H&Gw_q1JgS#V!Y{AumjVhQ!_xYG;`hAvSC*#c$n?|Y%DZtr=y zx}2fGR`A=7ENunF)ZRORWICTfGHp*Fnf8VP$qXd3(M%wj?Na+pG6Su2K7m%+o?sU8Yyr@5- za&QRUfkP;vakvco{x8EWeJd)DS@EjnCM%amO~1uARt=(ZjU}qp`}K#tP?<0gxLqO{ zrj`{RDbk$*#zj5>iyuzO{{8*wl_>f2=f6Ky-=6;b#M~%XMmv2TF;;+bj#!aaFg`@e z9lZ<&OTK@T1&bWXzmtit})vt^|jCWL(<;yuD5~q2HHDdc>?X-W7^v~@SZ99 z4RooV4*$wJ9(U=8?CSj(^P3&op?YEKhp>XP+Yn`U&Q*^!*L(2^=2_c)xBO^v?KNTU zP?-vlKXm9_y8)i#1o1nbp_Q|U%!EG{I<&@7CRH}hEazrRok^txaUBbXW&^K~W)L0i z3^5|~tHLw5aGJuL8D|F$q$py`2?_cX4|H4WwNj^wz0% zPIBk;x+Zq4U%bS}-r3fDP;#Ep*K*x_@o~tB+y_v|i5zkwhn&d!l@nR8Lc30F*Y6zD zL*a*b;0(m2>e&uPRnH)=1|RI&31Sb9?Q9Yl7S0n`A0Jda#>E(vFd zls-sm-sqwe(ZKsnB+@>)eNY1*KiWKn1~yR1{u{wDD98Q4whFy|ap9M%AwTESVXlEg zT->&k%26vLPS+5t)^@6m(7j#4&v@ll1#Pvj>tY#q+1rlX<{4UaxWIL$YCT(`$jN|q z^L>)vLk!axN3t3F4GO@RyBKC@BKRmbi{Gv3unzwV^-7cw-2Zmq{zqB5gk+O6kUz>6 zR8OTZn|j&uX4Ac?Rj~N8Da~}{&qj;3caXx-u7*3h$g|H=N;sY+2v|*?;wX{`C&dm_=(cd#0Q5j@mG8}OLp>et!1iuw2p8%LpavF%rn82WZhmUX>b3rz5OY94%Gc-2Y@ngP$>Tn9KC0d-_&&! z)r%oIiilAH&}Si@N%^~y)T(8bQ^K1*_Dx7cOEpN&suzQ_CHZQGn3#a_-kU=;6LQgS z5K2p0*0~@|5bHW9SLUm>=GQhal<54Ma`YJmEGJ-g2M~;wYSwfhXIDT?s?PU|@YmU0ZB_EGim)_m2eiW(o!XCf!JLaM$mgI+4=rGj2+|MXH{ zeO%wy$Jdm+%!}&xWKLOxCh7vd+J`7XkmTvXi*lsZw-_Zz71z8{`K#WZWT7fYgh|Hm zDsWPPliCwbYP?Y|a8iMj3Y^r}!AUs}{zmtq)Nn)XTc>fPz{&%ReMV^s3%n_|SwXfm z)pA+G9M@(ro9^6Bt~tuY-u5!LDZXex4|VJ+tF=4YZY-Jm^6A|e0u?{0H`2gWv+Azx zk$F8+Dk?owNYz-5q@z~*yDEPTSQ!fgF zh~^~oTygt375w&C<9dA`h?csn>LcZjEz29#kUw&c^h62HHPe=&nU_TC}-ku3~_TQ1vDYKpOBy(R1A|M4dVu#v4oTk1jdpRki9a?T;!D^gcoF z6ZAg&r}z2lEohEA>D?H9>sQeS&LVIY`^s5tVq6NGMc^y~XK{~f^`I6dd6+$e#%$Na zcchw&GQ4&MhTD_O4Y}QITX(v3DE$Q(m@F>5FZ353o@0ihjIuj>T8p0Au5065`sMYp z?PdF3rmk+~qWfP-ub2SuD)tm89hDR(=va(l7dYwtAW8eL)Am(Oy}f&{<%Y>I=MX3M zd=CA_lsCGrK-C;&%4G}!mJ=c{bV11HGWv0J=SoFh@9s7V=sN!XAJh62CEL+li zu>>jQ9M6(Ffz1;1Tm@=^)3V81oGq&^#Z0YoE@=gmD&I^|9|#B~6SW{^-Di{moPo%i zcy=a%ivbqX%3-pWk!N!NlcdT%4;j*{{Crv)c$6S0aPSPx1^s~p0&Sgmo!?j(FfulLiE!>b1hUcwa2Pz1#e!1XQFay2s_Bfu9%Lg-9T zywKYqT0*k$v+^z>i-lBkI+t2}iz`A`WdxIKc{lDf{jI26j9uNWtZc<a=b5tfu1;Cc znW}Z-+P`Ko!R58~sC5_ZaMv1p)YA1fb}ja1AjGP^*#P&yHR?-NJ-LN4aliDy}XdEwEis&kp z``VhIK)_IKZ*iPZl7f^W!SI7v>>Nh(N{W_tdVvKn0i4Rc$cX3|a>S?YA$22UlvAj?VNpxI!7bb9lUT`Kd6p#=LNrLF`=L z73BxEW^P9gx^RKIgr7$Yz^HwVzgTE?clyDOna#-xrk9Z2oMV1-wuG2mp%q=D_%#_Z zM{4tVOQWjVR!278u}i6*HumZA(M5#}FMR-o3@;(WOUUrDUm0FZxTJLo1MZ|dlI-F`wBZ%`I3eQEcoYx*hkMOuhL^!zioL87agjVuy_pXFQvyYFPp!Ak6~r3E@W+EoHf4= zSxUcFv--(+vkyL^da>M|9D3}*lOuR?1W%4f@5v!o##XY?te85?OxisGCNg_O{+&C* z#I1gKg$ZGrCb-NI+xFwDf7f`r_O8tVJwh+OfcpdP54itc*J`I;e0|E)4=oLgHTyw_ zlb*tH0|HFj$kb)cut|w+>IBp+)-@d4IT;p0IEb=L@0oT6(bOiIE+Iqu!$$I{Xvg&J zH-uE=Fm4}>NVn&Hb62+bZ78t1{^C~Kn) zS*yn_*E>AV+W=PRScW~zxRp6A!W76tY(!`O8VcGxt~+oWtIg(yzGGu1v^X0*bNcSh zwRw!7a+ifNN<;bHN)O4{NT>$r+%l;ho~9k{0>kr#?ci3vIt?pulMndZ?vUca%Z%tY zxFYOA-%}(h-$d7ArcN~UJocKEgZ%Y4<#eizJc<+(1g(gYKE1$YI@tzgLD4YDQs&{-}F2D%2(S^GmDTo+|H z8?GlDRVW9>G8(N2p_GXWC69dA$Y2TGY3>!!vaJvFBd>#e)qHI;>@_`>i=_W5dV=6p zz5*P7kvK@NaiK$2ATRG?CUBJCttzBq?tl)s<#@00mnPuN_d_Hw7-cz3N?^?icguav zuDknud?J^zqr`w!;nJnH#1ldm3Nlvl1Q{#HSbHa9>7(2)UzG}%Ygr+25xJ<; z!<%XvUf){_Ej9%X1aUDMcE68qiyx~0rD?ohayCNuRiPan&RcaPENs$VKg^i7K6k_Gp!t_Rqwh3SHxFre`lx_iVAe!!-JMk1W zV}LEGNq(wl5Z7((-j#r*)p^R$95E&n3s%N9!wjd*bRLOgT%u^3oS6-ckVk9VYD0_c zn4J}Jdh`Jla(aZE9wDd4gXHvZC+(Qy1le!K?C4K=i)>jpF~mjaLrV~>`wRJuL07b; zi5S}F#e1I)hdaX*S3h(UVJ}q}qYH+(<=}OypF9(?1U=C%^hDAtOW&=(iJC~Z^ViC2 z!O#*JpV~?yvwx?Kh|ik(A*0%k)I-W$O?6Re4s@$d4N?8O_GGEO8x+f3>)g~j?LsG2 z@2yPPoZ$|C6J;rk%N)*zhfE`gyu0tj;NJ?z`5HL4kOO{4BAH=aYcQfD=UIm%omVYibj>|Qt{X!MlICM`9JTgvf#LTEP88}Z-;I8X`M)urOGPLtcdO?<5CX|yuO zT%%2OIsVHOR5^VB1yxQ^_SKMxegp#xA|9WZzrx1>!Ch&1U+eVw$(2K=PaEph4;b zC}@y^1}SKe_Dh5GaDuzWzJ8LsWP^rz-D;MpPVqioz1^j%peF5jbQI+C9mwa(kOs31 zM$47tlgEqbDlf`u*;YeJZ+>nG>MdBDvice}Wc6m%t%&Q7PJV9AU?DJ9c&_kH5u0ujWZJ#xu1 zGaVfBDd1wGkq7~juVyk$ow4(woOC?LkoR-ytEdlP9NfPW>E`_6#Tg4_FnSzfx?N^NFbHv09Rk~(N<3%Z>jp{B8 zxGFq$MoSj1P%g*V%!J3dP9RHcKQ8b_y$Yb0=o&9Kb!Kk!j&?pL8<2LE#Dn+cw=6 zChyV?TIT2qMU=$=k~@_MMrTlDcalw^V4f#)oFoJHx>Nl)40iPlQbk&ZGFl<2o&op) zcqu14LF`dcb~XtN1?B)nrPuI!l$Mq;4OU(Dj7cgshpPX)#?-CMvob}p7rJrjd*v3~CAd>k7b zblp4Cb=x)EN}X7#J9)-nh8A}x;3qU&QhFob-m2flL@F)T86|VPs5XvR6&%%wfa<>l zuIg-ZYqVaKl?rPy0oC{!N)Y7em-4fi0X=HGL+i=U;!+=_#hB?4t1n5xxt1k`B|AX9QUvr}9$%4LlEG(n5 zoM!}aKCsKGLapDc=IcR$xX}{Dd4gg?Fc=0!g*yNKv~1<+&wqcazCZoBJ}E^BAJ~kX z>P}!%6#3>;@3}=wYa1{x(iS9lns6!c)IB4r_&cf5s=>2ocQ<}2XTa{qS?FWJEn4-K zgS{!(oA$uo6s~I&(j?3vKxBc*Fd8Guzm~;onD|^YQ+q#%vIPdii^2HMXa6-7o&Du6 zPcdv|+hU^N1(5m=3TT&o9nZSe~dv6*Jw7QO2Xl6YpxLDHoq zRF_9y(%7QjN5pnl#{{t3cD%EA``OX6Rj)dO(G4Q;wZL@e46l*pMvU47o{Nnf$;%F| zP@2FzHnf&a70V@RLs*ex)SG0Aj?aXEvZG->Y7GENn4{m0m+xP z`h5ZxUvTOJT{R!W0a_p1UViJ_?OPhb1ZS3w=<2vgRb%-yLp+l$U67Q#$7qwuSF6RwJOW0Ynfg)CD_ z{`QQ|&|FX7kX(BjF9@~W@-zX6xHh}<9CXeZb;ba8S99!P*MMdTjc#JJ zwvClX9NRG5dey#tc%qCKgCTWflI_X$q5OtW{8uMEwCB#i3kKy)UVi6B)x(s$b9nT1 z^yzW}?5T2pxI`JNf1Ha`jw9%qc9yAHr+G&I3KK|dIM@FWb&!k%!7iH7MNv8?NDt#& zU~xLnPDzGO=h9Tzm-S6gn57+nER+2qCF;1mawkYxJ3Pm{+ zh5nn)wt=O#4eA;TLE}u`^3Tq76MmFxe4=-Il%(d7&S3^G1pa4Uoc|~U@1E7U!2I%> z$uVQNgrDWq`q4L|_V^0}T@k1W(g*efULl%$f|ipNOfMn35nS}y5@O=Kt?^zK$S(+X zu)n!?N(eu_in`={+m}H`i9p^CZ_;kJZJ1?fm1d5;+Sjpo2>P6z3e1h-Q`ML)D<0_g zjN?x6Y)EA(fq!yDMht1d9-`e_v%`BWr26OsD5UxbsXjugkNryZp)IEVN^V{8vQNEH zo13g1s%W$IYMqH`>-B+Ygr)_3P9ae)p)SAZF4nownT=z-F&|~1shmv4F$A z^N}Q8HbCR?4OFhb*4nkL6Qc~V6($JaIe7o+?6CA~6?e>RNz7m7~!e-%@syP#8Nm0O+1Y8Xx|on;1BWok4{|LJCtFyN5ey&}BPagZ5~t zn8dAsRW$aYCn{<{W4%#K17euEBA7bb7YBQU<)Er&!v{ST&(VUx*q(&DqpCAiRY#o^ zkrg7xM_vq-T`Sf+ z@apJ?@5KA#?~aeZ`vx3s7YzH8^9-_YjyCSAIk-J}{tcKr;K?btf+SiZ2BIZonc{yj v;TcR4B`TaDc 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�?BjkFX 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 Y|M&a9fA+us4FCZD|4H8D7y#k|0KYq~H2?qr literal 0 HcmV?d00001 diff --git a/assets/longhorn/longhorn-104.2.1+up1.7.2.tgz b/assets/longhorn/longhorn-104.2.1+up1.7.2.tgz new file mode 100644 index 0000000000000000000000000000000000000000..8cc65f54ed1010e8136d75f3a450b1a4fa93348a GIT binary patch literal 31996 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 literal 0 HcmV?d00001 diff --git a/charts/longhorn-crd/102.5.1+up1.7.2/Chart.yaml b/charts/longhorn-crd/102.5.1+up1.7.2/Chart.yaml new file mode 100644 index 0000000000..8314e609c9 --- /dev/null +++ b/charts/longhorn-crd/102.5.1+up1.7.2/Chart.yaml @@ -0,0 +1,11 @@ +annotations: + catalog.cattle.io/certified: rancher + catalog.cattle.io/hidden: "true" + catalog.cattle.io/namespace: longhorn-system + catalog.cattle.io/release-name: longhorn-crd +apiVersion: v1 +appVersion: v1.7.2 +description: Installs the CRDs for longhorn. +name: longhorn-crd +type: application +version: 102.5.1+up1.7.2 diff --git a/charts/longhorn-crd/102.5.1+up1.7.2/README.md b/charts/longhorn-crd/102.5.1+up1.7.2/README.md new file mode 100644 index 0000000000..d9f7f14b33 --- /dev/null +++ b/charts/longhorn-crd/102.5.1+up1.7.2/README.md @@ -0,0 +1,2 @@ +# longhorn-crd +A Rancher chart that installs the CRDs used by longhorn. diff --git a/charts/longhorn-crd/102.5.1+up1.7.2/templates/_helpers.tpl b/charts/longhorn-crd/102.5.1+up1.7.2/templates/_helpers.tpl new file mode 100644 index 0000000000..3fbc2ac02f --- /dev/null +++ b/charts/longhorn-crd/102.5.1+up1.7.2/templates/_helpers.tpl @@ -0,0 +1,66 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "longhorn.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +*/}} +{{- define "longhorn.fullname" -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} + + +{{- define "longhorn.managerIP" -}} +{{- $fullname := (include "longhorn.fullname" .) -}} +{{- printf "http://%s-backend:9500" $fullname | trunc 63 | trimSuffix "-" -}} +{{- end -}} + + +{{- define "secret" }} +{{- printf "{\"auths\": {\"%s\": {\"auth\": \"%s\"}}}" .Values.privateRegistry.registryUrl (printf "%s:%s" .Values.privateRegistry.registryUser .Values.privateRegistry.registryPasswd | b64enc) | b64enc }} +{{- end }} + +{{- /* +longhorn.labels generates the standard Helm labels. +*/ -}} +{{- define "longhorn.labels" -}} +app.kubernetes.io/name: {{ template "longhorn.name" . }} +helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +app.kubernetes.io/instance: {{ .Release.Name }} +app.kubernetes.io/version: {{ .Chart.AppVersion }} +{{- end -}} + + +{{- define "system_default_registry" -}} +{{- if .Values.global.cattle.systemDefaultRegistry -}} +{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} +{{- else -}} +{{- "" -}} +{{- end -}} +{{- end -}} + +{{- define "registry_url" -}} +{{- if .Values.privateRegistry.registryUrl -}} +{{- printf "%s/" .Values.privateRegistry.registryUrl -}} +{{- else -}} +{{ include "system_default_registry" . }} +{{- end -}} +{{- end -}} + +{{- /* + define the longhorn release namespace +*/ -}} +{{- define "release_namespace" -}} +{{- if .Values.namespaceOverride -}} +{{- .Values.namespaceOverride -}} +{{- else -}} +{{- .Release.Namespace -}} +{{- end -}} +{{- end -}} diff --git a/charts/longhorn-crd/102.5.1+up1.7.2/templates/crds.yaml b/charts/longhorn-crd/102.5.1+up1.7.2/templates/crds.yaml new file mode 100644 index 0000000000..3b78dd7ad3 --- /dev/null +++ b/charts/longhorn-crd/102.5.1+up1.7.2/templates/crds.yaml @@ -0,0 +1,4400 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: backingimagedatasources.longhorn.io +spec: + group: longhorn.io + names: + kind: BackingImageDataSource + listKind: BackingImageDataSourceList + plural: backingimagedatasources + shortNames: + - lhbids + singular: backingimagedatasource + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The current state of the pod used to provision the backing image + file from source + jsonPath: .status.currentState + name: State + type: string + - description: The data source type + jsonPath: .spec.sourceType + name: SourceType + type: string + - description: The node the backing image file will be prepared on + jsonPath: .spec.nodeID + name: Node + type: string + - description: The disk the backing image file will be prepared on + jsonPath: .spec.diskUUID + name: DiskUUID + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: BackingImageDataSource is where Longhorn stores backing image + data source object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The system generated UUID of the provisioned backing image file + jsonPath: .spec.uuid + name: UUID + type: string + - description: The current state of the pod used to provision the backing image + file from source + jsonPath: .status.currentState + name: State + type: string + - description: The data source type + jsonPath: .spec.sourceType + name: SourceType + type: string + - description: The backing image file size + jsonPath: .status.size + name: Size + type: string + - description: The node the backing image file will be prepared on + jsonPath: .spec.nodeID + name: Node + type: string + - description: The disk the backing image file will be prepared on + jsonPath: .spec.diskUUID + name: DiskUUID + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: BackingImageDataSource is where Longhorn stores backing image + data source object. + 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 + metadata: + type: object + spec: + description: BackingImageDataSourceSpec defines the desired state of the + Longhorn backing image data source + properties: + checksum: + type: string + diskPath: + type: string + diskUUID: + type: string + fileTransferred: + type: boolean + nodeID: + type: string + parameters: + additionalProperties: + type: string + type: object + sourceType: + enum: + - download + - upload + - export-from-volume + - restore + - clone + type: string + uuid: + type: string + type: object + status: + description: BackingImageDataSourceStatus defines the observed state of + the Longhorn backing image data source + properties: + checksum: + type: string + currentState: + type: string + ip: + type: string + message: + type: string + ownerID: + type: string + progress: + type: integer + runningParameters: + additionalProperties: + type: string + nullable: true + type: object + size: + format: int64 + type: integer + storageIP: + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: backingimagemanagers.longhorn.io +spec: + group: longhorn.io + names: + kind: BackingImageManager + listKind: BackingImageManagerList + plural: backingimagemanagers + shortNames: + - lhbim + singular: backingimagemanager + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The current state of the manager + jsonPath: .status.currentState + name: State + type: string + - description: The image the manager pod will use + jsonPath: .spec.image + name: Image + type: string + - description: The node the manager is on + jsonPath: .spec.nodeID + name: Node + type: string + - description: The disk the manager is responsible for + jsonPath: .spec.diskUUID + name: DiskUUID + type: string + - description: The disk path the manager is using + jsonPath: .spec.diskPath + name: DiskPath + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: BackingImageManager is where Longhorn stores backing image manager + object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The current state of the manager + jsonPath: .status.currentState + name: State + type: string + - description: The image the manager pod will use + jsonPath: .spec.image + name: Image + type: string + - description: The node the manager is on + jsonPath: .spec.nodeID + name: Node + type: string + - description: The disk the manager is responsible for + jsonPath: .spec.diskUUID + name: DiskUUID + type: string + - description: The disk path the manager is using + jsonPath: .spec.diskPath + name: DiskPath + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: BackingImageManager is where Longhorn stores backing image manager + object. + 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 + metadata: + type: object + spec: + description: BackingImageManagerSpec defines the desired state of the + Longhorn backing image manager + properties: + backingImages: + additionalProperties: + type: string + type: object + diskPath: + type: string + diskUUID: + type: string + image: + type: string + nodeID: + type: string + type: object + status: + description: BackingImageManagerStatus defines the observed state of the + Longhorn backing image manager + properties: + apiMinVersion: + type: integer + apiVersion: + type: integer + backingImageFileMap: + additionalProperties: + properties: + currentChecksum: + type: string + message: + type: string + name: + type: string + progress: + type: integer + senderManagerAddress: + type: string + sendingReference: + type: integer + size: + format: int64 + type: integer + state: + type: string + uuid: + type: string + virtualSize: + format: int64 + type: integer + type: object + nullable: true + type: object + currentState: + type: string + ip: + type: string + ownerID: + type: string + storageIP: + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: backingimages.longhorn.io +spec: + conversion: + strategy: Webhook + webhook: + clientConfig: + service: + name: longhorn-conversion-webhook + namespace: {{ include "release_namespace" . }} + path: /v1/webhook/conversion + port: 9501 + conversionReviewVersions: + - v1beta2 + - v1beta1 + group: longhorn.io + names: + kind: BackingImage + listKind: BackingImageList + plural: backingimages + shortNames: + - lhbi + singular: backingimage + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The backing image name + jsonPath: .spec.image + name: Image + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: BackingImage is where Longhorn stores backing image object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The system generated UUID + jsonPath: .status.uuid + name: UUID + type: string + - description: The source of the backing image file data + jsonPath: .spec.sourceType + name: SourceType + type: string + - description: The backing image file size in each disk + jsonPath: .status.size + name: Size + type: string + - description: The virtual size of the image (may be larger than file size) + jsonPath: .status.virtualSize + name: VirtualSize + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: BackingImage is where Longhorn stores backing image object. + 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 + metadata: + type: object + spec: + description: BackingImageSpec defines the desired state of the Longhorn + backing image + properties: + checksum: + type: string + diskFileSpecMap: + additionalProperties: + properties: + evictionRequested: + type: boolean + type: object + type: object + diskSelector: + items: + type: string + type: array + disks: + additionalProperties: + type: string + description: Deprecated. We are now using DiskFileSpecMap to assign + different spec to the file on different disks. + type: object + minNumberOfCopies: + type: integer + nodeSelector: + items: + type: string + type: array + secret: + type: string + secretNamespace: + type: string + sourceParameters: + additionalProperties: + type: string + type: object + sourceType: + enum: + - download + - upload + - export-from-volume + - restore + - clone + type: string + type: object + status: + description: BackingImageStatus defines the observed state of the Longhorn + backing image status + properties: + checksum: + type: string + diskFileStatusMap: + additionalProperties: + properties: + lastStateTransitionTime: + type: string + message: + type: string + progress: + type: integer + state: + type: string + type: object + nullable: true + type: object + diskLastRefAtMap: + additionalProperties: + type: string + nullable: true + type: object + ownerID: + type: string + size: + format: int64 + type: integer + uuid: + type: string + virtualSize: + description: Virtual size of image, which may be larger than physical + size. Will be zero until known (e.g. while a backing image is uploading) + format: int64 + type: integer + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: backupbackingimages.longhorn.io +spec: + group: longhorn.io + names: + kind: BackupBackingImage + listKind: BackupBackingImageList + plural: backupbackingimages + shortNames: + - lhbbi + singular: backupbackingimage + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The backing image name + jsonPath: .status.backingImage + name: BackingImage + type: string + - description: The backing image size + jsonPath: .status.size + name: Size + type: string + - description: The backing image backup upload finished time + jsonPath: .status.backupCreatedAt + name: BackupCreatedAt + type: string + - description: The backing image backup state + jsonPath: .status.state + name: State + type: string + - description: The last synced time + jsonPath: .status.lastSyncedAt + name: LastSyncedAt + type: string + name: v1beta2 + schema: + openAPIV3Schema: + description: BackupBackingImage is where Longhorn stores backing image backup + object. + 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 + metadata: + type: object + spec: + description: BackupBackingImageSpec defines the desired state of the Longhorn + backing image backup + properties: + labels: + additionalProperties: + type: string + description: The labels of backing image backup. + type: object + syncRequestedAt: + description: The time to request run sync the remote backing image + backup. + format: date-time + nullable: true + type: string + userCreated: + description: |- + Is this CR created by user through API or UI. + Required + type: boolean + required: + - userCreated + type: object + status: + description: BackupBackingImageStatus defines the observed state of the + Longhorn backing image backup + properties: + backingImage: + description: The backing image name. + type: string + backupCreatedAt: + description: The backing image backup upload finished time. + type: string + checksum: + description: The checksum of the backing image. + type: string + compressionMethod: + description: Compression method + type: string + error: + description: The error message when taking the backing image backup. + type: string + labels: + additionalProperties: + type: string + description: The labels of backing image backup. + nullable: true + type: object + lastSyncedAt: + description: The last time that the backing image backup was synced + with the remote backup target. + format: date-time + nullable: true + type: string + managerAddress: + description: The address of the backing image manager that runs backing + image backup. + type: string + messages: + additionalProperties: + type: string + description: The error messages when listing or inspecting backing + image backup. + nullable: true + type: object + ownerID: + description: The node ID on which the controller is responsible to + reconcile this CR. + type: string + progress: + description: The backing image backup progress. + type: integer + size: + description: The backing image size. + format: int64 + type: integer + state: + description: |- + The backing image backup creation state. + Can be "", "InProgress", "Completed", "Error", "Unknown". + type: string + url: + description: The backing image backup URL. + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: backups.longhorn.io +spec: + group: longhorn.io + names: + kind: Backup + listKind: BackupList + plural: backups + shortNames: + - lhb + singular: backup + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The snapshot name + jsonPath: .status.snapshotName + name: SnapshotName + type: string + - description: The snapshot size + jsonPath: .status.size + name: SnapshotSize + type: string + - description: The snapshot creation time + jsonPath: .status.snapshotCreatedAt + name: SnapshotCreatedAt + type: string + - description: The backup state + jsonPath: .status.state + name: State + type: string + - description: The backup last synced time + jsonPath: .status.lastSyncedAt + name: LastSyncedAt + type: string + name: v1beta1 + schema: + openAPIV3Schema: + description: Backup is where Longhorn stores backup object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The snapshot name + jsonPath: .status.snapshotName + name: SnapshotName + type: string + - description: The snapshot size + jsonPath: .status.size + name: SnapshotSize + type: string + - description: The snapshot creation time + jsonPath: .status.snapshotCreatedAt + name: SnapshotCreatedAt + type: string + - description: The backup state + jsonPath: .status.state + name: State + type: string + - description: The backup last synced time + jsonPath: .status.lastSyncedAt + name: LastSyncedAt + type: string + name: v1beta2 + schema: + openAPIV3Schema: + description: Backup is where Longhorn stores backup object. + 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 + metadata: + type: object + spec: + description: BackupSpec defines the desired state of the Longhorn backup + properties: + backupMode: + description: |- + The backup mode of this backup. + Can be "full" or "incremental" + enum: + - full + - incremental + - "" + type: string + labels: + additionalProperties: + type: string + description: The labels of snapshot backup. + type: object + snapshotName: + description: The snapshot name. + type: string + syncRequestedAt: + description: The time to request run sync the remote backup. + format: date-time + nullable: true + type: string + type: object + status: + description: BackupStatus defines the observed state of the Longhorn backup + properties: + backupCreatedAt: + description: The snapshot backup upload finished time. + type: string + compressionMethod: + description: Compression method + type: string + error: + description: The error message when taking the snapshot backup. + type: string + labels: + additionalProperties: + type: string + description: The labels of snapshot backup. + nullable: true + type: object + lastSyncedAt: + description: The last time that the backup was synced with the remote + backup target. + format: date-time + nullable: true + type: string + messages: + additionalProperties: + type: string + description: The error messages when calling longhorn engine on listing + or inspecting backups. + nullable: true + type: object + newlyUploadDataSize: + description: Size in bytes of newly uploaded data + type: string + ownerID: + description: The node ID on which the controller is responsible to + reconcile this backup CR. + type: string + progress: + description: The snapshot backup progress. + type: integer + reUploadedDataSize: + description: Size in bytes of reuploaded data + type: string + replicaAddress: + description: The address of the replica that runs snapshot backup. + type: string + size: + description: The snapshot size. + type: string + snapshotCreatedAt: + description: The snapshot creation time. + type: string + snapshotName: + description: The snapshot name. + type: string + state: + description: |- + The backup creation state. + Can be "", "InProgress", "Completed", "Error", "Unknown". + type: string + url: + description: The snapshot backup URL. + type: string + volumeBackingImageName: + description: The volume's backing image name. + type: string + volumeCreated: + description: The volume creation time. + type: string + volumeName: + description: The volume name. + type: string + volumeSize: + description: The volume size. + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: backuptargets.longhorn.io +spec: + conversion: + strategy: Webhook + webhook: + clientConfig: + service: + name: longhorn-conversion-webhook + namespace: {{ include "release_namespace" . }} + path: /v1/webhook/conversion + port: 9501 + conversionReviewVersions: + - v1beta2 + - v1beta1 + group: longhorn.io + names: + kind: BackupTarget + listKind: BackupTargetList + plural: backuptargets + shortNames: + - lhbt + singular: backuptarget + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The backup target URL + jsonPath: .spec.backupTargetURL + name: URL + type: string + - description: The backup target credential secret + jsonPath: .spec.credentialSecret + name: Credential + type: string + - description: The backup target poll interval + jsonPath: .spec.pollInterval + name: LastBackupAt + type: string + - description: Indicate whether the backup target is available or not + jsonPath: .status.available + name: Available + type: boolean + - description: The backup target last synced time + jsonPath: .status.lastSyncedAt + name: LastSyncedAt + type: string + name: v1beta1 + schema: + openAPIV3Schema: + description: BackupTarget is where Longhorn stores backup target object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The backup target URL + jsonPath: .spec.backupTargetURL + name: URL + type: string + - description: The backup target credential secret + jsonPath: .spec.credentialSecret + name: Credential + type: string + - description: The backup target poll interval + jsonPath: .spec.pollInterval + name: LastBackupAt + type: string + - description: Indicate whether the backup target is available or not + jsonPath: .status.available + name: Available + type: boolean + - description: The backup target last synced time + jsonPath: .status.lastSyncedAt + name: LastSyncedAt + type: string + name: v1beta2 + schema: + openAPIV3Schema: + description: BackupTarget is where Longhorn stores backup target object. + 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 + metadata: + type: object + spec: + description: BackupTargetSpec defines the desired state of the Longhorn + backup target + properties: + backupTargetURL: + description: The backup target URL. + type: string + credentialSecret: + description: The backup target credential secret. + type: string + pollInterval: + description: The interval that the cluster needs to run sync with + the backup target. + type: string + syncRequestedAt: + description: The time to request run sync the remote backup target. + format: date-time + nullable: true + type: string + type: object + status: + description: BackupTargetStatus defines the observed state of the Longhorn + backup target + properties: + available: + description: Available indicates if the remote backup target is available + or not. + type: boolean + conditions: + description: Records the reason on why the backup target is unavailable. + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status + to another. + type: string + message: + description: Human-readable message indicating details about + last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's + last transition. + type: string + status: + description: |- + Status is the status of the condition. + Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + lastSyncedAt: + description: The last time that the controller synced with the remote + backup target. + format: date-time + nullable: true + type: string + ownerID: + description: The node ID on which the controller is responsible to + reconcile this backup target CR. + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: backupvolumes.longhorn.io +spec: + group: longhorn.io + names: + kind: BackupVolume + listKind: BackupVolumeList + plural: backupvolumes + shortNames: + - lhbv + singular: backupvolume + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The backup volume creation time + jsonPath: .status.createdAt + name: CreatedAt + type: string + - description: The backup volume last backup name + jsonPath: .status.lastBackupName + name: LastBackupName + type: string + - description: The backup volume last backup time + jsonPath: .status.lastBackupAt + name: LastBackupAt + type: string + - description: The backup volume last synced time + jsonPath: .status.lastSyncedAt + name: LastSyncedAt + type: string + name: v1beta1 + schema: + openAPIV3Schema: + description: BackupVolume is where Longhorn stores backup volume object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The backup volume creation time + jsonPath: .status.createdAt + name: CreatedAt + type: string + - description: The backup volume last backup name + jsonPath: .status.lastBackupName + name: LastBackupName + type: string + - description: The backup volume last backup time + jsonPath: .status.lastBackupAt + name: LastBackupAt + type: string + - description: The backup volume last synced time + jsonPath: .status.lastSyncedAt + name: LastSyncedAt + type: string + name: v1beta2 + schema: + openAPIV3Schema: + description: BackupVolume is where Longhorn stores backup volume object. + 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 + metadata: + type: object + spec: + description: BackupVolumeSpec defines the desired state of the Longhorn + backup volume + properties: + syncRequestedAt: + description: The time to request run sync the remote backup volume. + format: date-time + nullable: true + type: string + type: object + status: + description: BackupVolumeStatus defines the observed state of the Longhorn + backup volume + properties: + backingImageChecksum: + description: the backing image checksum. + type: string + backingImageName: + description: The backing image name. + type: string + createdAt: + description: The backup volume creation time. + type: string + dataStored: + description: The backup volume block count. + type: string + labels: + additionalProperties: + type: string + description: The backup volume labels. + nullable: true + type: object + lastBackupAt: + description: The latest volume backup time. + type: string + lastBackupName: + description: The latest volume backup name. + type: string + lastModificationTime: + description: The backup volume config last modification time. + format: date-time + nullable: true + type: string + lastSyncedAt: + description: The last time that the backup volume was synced into + the cluster. + format: date-time + nullable: true + type: string + messages: + additionalProperties: + type: string + description: The error messages when call longhorn engine on list + or inspect backup volumes. + nullable: true + type: object + ownerID: + description: The node ID on which the controller is responsible to + reconcile this backup volume CR. + type: string + size: + description: The backup volume size. + type: string + storageClassName: + description: the storage class name of pv/pvc binding with the volume. + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: engineimages.longhorn.io +spec: + conversion: + strategy: Webhook + webhook: + clientConfig: + service: + name: longhorn-conversion-webhook + namespace: {{ include "release_namespace" . }} + path: /v1/webhook/conversion + port: 9501 + conversionReviewVersions: + - v1beta2 + - v1beta1 + group: longhorn.io + names: + kind: EngineImage + listKind: EngineImageList + plural: engineimages + shortNames: + - lhei + singular: engineimage + preserveUnknownFields: false + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: State of the engine image + jsonPath: .status.state + name: State + type: string + - description: The Longhorn engine image + jsonPath: .spec.image + name: Image + type: string + - description: Number of resources using the engine image + jsonPath: .status.refCount + name: RefCount + type: integer + - description: The build date of the engine image + jsonPath: .status.buildDate + name: BuildDate + type: date + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: EngineImage is where Longhorn stores engine image object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: Compatibility of the engine image + jsonPath: .status.incompatible + name: Incompatible + type: boolean + - description: State of the engine image + jsonPath: .status.state + name: State + type: string + - description: The Longhorn engine image + jsonPath: .spec.image + name: Image + type: string + - description: Number of resources using the engine image + jsonPath: .status.refCount + name: RefCount + type: integer + - description: The build date of the engine image + jsonPath: .status.buildDate + name: BuildDate + type: date + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: EngineImage is where Longhorn stores engine image object. + 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 + metadata: + type: object + spec: + description: EngineImageSpec defines the desired state of the Longhorn + engine image + properties: + image: + minLength: 1 + type: string + required: + - image + type: object + status: + description: EngineImageStatus defines the observed state of the Longhorn + engine image + properties: + buildDate: + type: string + cliAPIMinVersion: + type: integer + cliAPIVersion: + type: integer + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status + to another. + type: string + message: + description: Human-readable message indicating details about + last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's + last transition. + type: string + status: + description: |- + Status is the status of the condition. + Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + controllerAPIMinVersion: + type: integer + controllerAPIVersion: + type: integer + dataFormatMinVersion: + type: integer + dataFormatVersion: + type: integer + gitCommit: + type: string + incompatible: + type: boolean + noRefSince: + type: string + nodeDeploymentMap: + additionalProperties: + type: boolean + nullable: true + type: object + ownerID: + type: string + refCount: + type: integer + state: + type: string + version: + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: engines.longhorn.io +spec: + group: longhorn.io + names: + kind: Engine + listKind: EngineList + plural: engines + shortNames: + - lhe + singular: engine + preserveUnknownFields: false + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The current state of the engine + jsonPath: .status.currentState + name: State + type: string + - description: The node that the engine is on + jsonPath: .spec.nodeID + name: Node + type: string + - description: The instance manager of the engine + jsonPath: .status.instanceManagerName + name: InstanceManager + type: string + - description: The current image of the engine + jsonPath: .status.currentImage + name: Image + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: Engine is where Longhorn stores engine object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The data engine of the engine + jsonPath: .spec.dataEngine + name: Data Engine + type: string + - description: The current state of the engine + jsonPath: .status.currentState + name: State + type: string + - description: The node that the engine is on + jsonPath: .spec.nodeID + name: Node + type: string + - description: The instance manager of the engine + jsonPath: .status.instanceManagerName + name: InstanceManager + type: string + - description: The current image of the engine + jsonPath: .status.currentImage + name: Image + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: Engine is where Longhorn stores engine object. + 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 + metadata: + type: object + spec: + description: EngineSpec defines the desired state of the Longhorn engine + properties: + active: + type: boolean + backendStoreDriver: + description: Deprecated:Replaced by field `dataEngine`. + type: string + backupVolume: + type: string + dataEngine: + enum: + - v1 + - v2 + type: string + desireState: + type: string + disableFrontend: + type: boolean + engineImage: + description: 'Deprecated: Replaced by field `image`.' + type: string + frontend: + enum: + - blockdev + - iscsi + - nvmf + - "" + type: string + image: + type: string + logRequested: + type: boolean + nodeID: + type: string + replicaAddressMap: + additionalProperties: + type: string + type: object + requestedBackupRestore: + type: string + requestedDataSource: + type: string + revisionCounterDisabled: + type: boolean + salvageRequested: + type: boolean + snapshotMaxCount: + type: integer + snapshotMaxSize: + format: int64 + type: string + unmapMarkSnapChainRemovedEnabled: + type: boolean + upgradedReplicaAddressMap: + additionalProperties: + type: string + type: object + volumeName: + type: string + volumeSize: + format: int64 + type: string + type: object + status: + description: EngineStatus defines the observed state of the Longhorn engine + properties: + backupStatus: + additionalProperties: + properties: + backupURL: + type: string + error: + type: string + progress: + type: integer + replicaAddress: + type: string + snapshotName: + type: string + state: + type: string + type: object + nullable: true + type: object + cloneStatus: + additionalProperties: + properties: + error: + type: string + fromReplicaAddress: + type: string + isCloning: + type: boolean + progress: + type: integer + snapshotName: + type: string + state: + type: string + type: object + nullable: true + type: object + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status + to another. + type: string + message: + description: Human-readable message indicating details about + last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's + last transition. + type: string + status: + description: |- + Status is the status of the condition. + Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + currentImage: + type: string + currentReplicaAddressMap: + additionalProperties: + type: string + nullable: true + type: object + currentSize: + format: int64 + type: string + currentState: + type: string + endpoint: + type: string + instanceManagerName: + type: string + ip: + type: string + isExpanding: + type: boolean + lastExpansionError: + type: string + lastExpansionFailedAt: + type: string + lastRestoredBackup: + type: string + logFetched: + type: boolean + ownerID: + type: string + port: + type: integer + purgeStatus: + additionalProperties: + properties: + error: + type: string + isPurging: + type: boolean + progress: + type: integer + state: + type: string + type: object + nullable: true + type: object + rebuildStatus: + additionalProperties: + properties: + error: + type: string + fromReplicaAddress: + type: string + isRebuilding: + type: boolean + progress: + type: integer + state: + type: string + type: object + nullable: true + type: object + replicaModeMap: + additionalProperties: + type: string + nullable: true + type: object + replicaTransitionTimeMap: + additionalProperties: + type: string + description: |- + ReplicaTransitionTimeMap records the time a replica in ReplicaModeMap transitions from one mode to another (or + from not being in the ReplicaModeMap to being in it). This information is sometimes required by other controllers + (e.g. the volume controller uses it to determine the correct value for replica.Spec.lastHealthyAt). + type: object + restoreStatus: + additionalProperties: + properties: + backupURL: + type: string + currentRestoringBackup: + type: string + error: + type: string + filename: + type: string + isRestoring: + type: boolean + lastRestored: + type: string + progress: + type: integer + state: + type: string + type: object + nullable: true + type: object + salvageExecuted: + type: boolean + snapshotMaxCount: + type: integer + snapshotMaxSize: + format: int64 + type: string + snapshots: + additionalProperties: + properties: + children: + additionalProperties: + type: boolean + nullable: true + type: object + created: + type: string + labels: + additionalProperties: + type: string + nullable: true + type: object + name: + type: string + parent: + type: string + removed: + type: boolean + size: + type: string + usercreated: + type: boolean + type: object + nullable: true + type: object + snapshotsError: + type: string + started: + type: boolean + storageIP: + type: string + unmapMarkSnapChainRemovedEnabled: + type: boolean + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: instancemanagers.longhorn.io +spec: + group: longhorn.io + names: + kind: InstanceManager + listKind: InstanceManagerList + plural: instancemanagers + shortNames: + - lhim + singular: instancemanager + preserveUnknownFields: false + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The state of the instance manager + jsonPath: .status.currentState + name: State + type: string + - description: The type of the instance manager (engine or replica) + jsonPath: .spec.type + name: Type + type: string + - description: The node that the instance manager is running on + jsonPath: .spec.nodeID + name: Node + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: InstanceManager is where Longhorn stores instance manager object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The data engine of the instance manager + jsonPath: .spec.dataEngine + name: Data Engine + type: string + - description: The state of the instance manager + jsonPath: .status.currentState + name: State + type: string + - description: The type of the instance manager (engine or replica) + jsonPath: .spec.type + name: Type + type: string + - description: The node that the instance manager is running on + jsonPath: .spec.nodeID + name: Node + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: InstanceManager is where Longhorn stores instance manager object. + 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 + metadata: + type: object + spec: + description: InstanceManagerSpec defines the desired state of the Longhorn + instance manager + properties: + dataEngine: + type: string + image: + type: string + nodeID: + type: string + type: + enum: + - aio + - engine + - replica + type: string + type: object + status: + description: InstanceManagerStatus defines the observed state of the Longhorn + instance manager + properties: + apiMinVersion: + type: integer + apiVersion: + type: integer + currentState: + type: string + instanceEngines: + additionalProperties: + properties: + spec: + properties: + backendStoreDriver: + description: Deprecated:Replaced by field `dataEngine`. + type: string + dataEngine: + type: string + name: + type: string + type: object + status: + properties: + conditions: + additionalProperties: + type: boolean + nullable: true + type: object + endpoint: + type: string + errorMsg: + type: string + listen: + type: string + portEnd: + format: int32 + type: integer + portStart: + format: int32 + type: integer + resourceVersion: + format: int64 + type: integer + state: + type: string + targetPortEnd: + format: int32 + type: integer + targetPortStart: + format: int32 + type: integer + type: + type: string + type: object + type: object + nullable: true + type: object + instanceReplicas: + additionalProperties: + properties: + spec: + properties: + backendStoreDriver: + description: Deprecated:Replaced by field `dataEngine`. + type: string + dataEngine: + type: string + name: + type: string + type: object + status: + properties: + conditions: + additionalProperties: + type: boolean + nullable: true + type: object + endpoint: + type: string + errorMsg: + type: string + listen: + type: string + portEnd: + format: int32 + type: integer + portStart: + format: int32 + type: integer + resourceVersion: + format: int64 + type: integer + state: + type: string + targetPortEnd: + format: int32 + type: integer + targetPortStart: + format: int32 + type: integer + type: + type: string + type: object + type: object + nullable: true + type: object + instances: + additionalProperties: + properties: + spec: + properties: + backendStoreDriver: + description: Deprecated:Replaced by field `dataEngine`. + type: string + dataEngine: + type: string + name: + type: string + type: object + status: + properties: + conditions: + additionalProperties: + type: boolean + nullable: true + type: object + endpoint: + type: string + errorMsg: + type: string + listen: + type: string + portEnd: + format: int32 + type: integer + portStart: + format: int32 + type: integer + resourceVersion: + format: int64 + type: integer + state: + type: string + targetPortEnd: + format: int32 + type: integer + targetPortStart: + format: int32 + type: integer + type: + type: string + type: object + type: object + description: 'Deprecated: Replaced by InstanceEngines and InstanceReplicas' + nullable: true + type: object + ip: + type: string + ownerID: + type: string + proxyApiMinVersion: + type: integer + proxyApiVersion: + type: integer + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: nodes.longhorn.io +spec: + conversion: + strategy: Webhook + webhook: + clientConfig: + service: + name: longhorn-conversion-webhook + namespace: {{ include "release_namespace" . }} + path: /v1/webhook/conversion + port: 9501 + conversionReviewVersions: + - v1beta2 + - v1beta1 + group: longhorn.io + names: + kind: Node + listKind: NodeList + plural: nodes + shortNames: + - lhn + singular: node + preserveUnknownFields: false + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: Indicate whether the node is ready + jsonPath: .status.conditions['Ready']['status'] + name: Ready + type: string + - description: Indicate whether the user disabled/enabled replica scheduling for + the node + jsonPath: .spec.allowScheduling + name: AllowScheduling + type: boolean + - description: Indicate whether Longhorn can schedule replicas on the node + jsonPath: .status.conditions['Schedulable']['status'] + name: Schedulable + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: Node is where Longhorn stores Longhorn node object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: Indicate whether the node is ready + jsonPath: .status.conditions[?(@.type=='Ready')].status + name: Ready + type: string + - description: Indicate whether the user disabled/enabled replica scheduling for + the node + jsonPath: .spec.allowScheduling + name: AllowScheduling + type: boolean + - description: Indicate whether Longhorn can schedule replicas on the node + jsonPath: .status.conditions[?(@.type=='Schedulable')].status + name: Schedulable + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: Node is where Longhorn stores Longhorn node object. + 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 + metadata: + type: object + spec: + description: NodeSpec defines the desired state of the Longhorn node + properties: + allowScheduling: + type: boolean + disks: + additionalProperties: + properties: + allowScheduling: + type: boolean + diskDriver: + enum: + - "" + - auto + - aio + type: string + diskType: + enum: + - filesystem + - block + type: string + evictionRequested: + type: boolean + path: + type: string + storageReserved: + format: int64 + type: integer + tags: + items: + type: string + type: array + type: object + type: object + evictionRequested: + type: boolean + instanceManagerCPURequest: + type: integer + name: + type: string + tags: + items: + type: string + type: array + type: object + status: + description: NodeStatus defines the observed state of the Longhorn node + properties: + autoEvicting: + type: boolean + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status + to another. + type: string + message: + description: Human-readable message indicating details about + last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's + last transition. + type: string + status: + description: |- + Status is the status of the condition. + Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + diskStatus: + additionalProperties: + properties: + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from + one status to another. + type: string + message: + description: Human-readable message indicating details + about last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the + condition's last transition. + type: string + status: + description: |- + Status is the status of the condition. + Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + diskDriver: + type: string + diskName: + type: string + diskPath: + type: string + diskType: + type: string + diskUUID: + type: string + filesystemType: + type: string + instanceManagerName: + type: string + scheduledReplica: + additionalProperties: + format: int64 + type: integer + nullable: true + type: object + storageAvailable: + format: int64 + type: integer + storageMaximum: + format: int64 + type: integer + storageScheduled: + format: int64 + type: integer + type: object + nullable: true + type: object + region: + type: string + snapshotCheckStatus: + properties: + lastPeriodicCheckedAt: + format: date-time + type: string + type: object + zone: + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: orphans.longhorn.io +spec: + group: longhorn.io + names: + kind: Orphan + listKind: OrphanList + plural: orphans + shortNames: + - lho + singular: orphan + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The type of the orphan + jsonPath: .spec.orphanType + name: Type + type: string + - description: The node that the orphan is on + jsonPath: .spec.nodeID + name: Node + type: string + name: v1beta2 + schema: + openAPIV3Schema: + description: Orphan is where Longhorn stores orphan object. + 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 + metadata: + type: object + spec: + description: OrphanSpec defines the desired state of the Longhorn orphaned + data + properties: + nodeID: + description: The node ID on which the controller is responsible to + reconcile this orphan CR. + type: string + orphanType: + description: |- + The type of the orphaned data. + Can be "replica". + type: string + parameters: + additionalProperties: + type: string + description: The parameters of the orphaned data + type: object + type: object + status: + description: OrphanStatus defines the observed state of the Longhorn orphaned + data + properties: + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status + to another. + type: string + message: + description: Human-readable message indicating details about + last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's + last transition. + type: string + status: + description: |- + Status is the status of the condition. + Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + ownerID: + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: recurringjobs.longhorn.io +spec: + group: longhorn.io + names: + kind: RecurringJob + listKind: RecurringJobList + plural: recurringjobs + shortNames: + - lhrj + singular: recurringjob + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: Sets groupings to the jobs. When set to "default" group will be + added to the volume label when no other job label exist in volume + jsonPath: .spec.groups + name: Groups + type: string + - description: Should be one of "backup" or "snapshot" + jsonPath: .spec.task + name: Task + type: string + - description: The cron expression represents recurring job scheduling + jsonPath: .spec.cron + name: Cron + type: string + - description: The number of snapshots/backups to keep for the volume + jsonPath: .spec.retain + name: Retain + type: integer + - description: The concurrent job to run by each cron job + jsonPath: .spec.concurrency + name: Concurrency + type: integer + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + - description: Specify the labels + jsonPath: .spec.labels + name: Labels + type: string + name: v1beta1 + schema: + openAPIV3Schema: + description: RecurringJob is where Longhorn stores recurring job object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: Sets groupings to the jobs. When set to "default" group will be + added to the volume label when no other job label exist in volume + jsonPath: .spec.groups + name: Groups + type: string + - description: Should be one of "snapshot", "snapshot-force-create", "snapshot-cleanup", + "snapshot-delete", "backup", "backup-force-create" or "filesystem-trim" + jsonPath: .spec.task + name: Task + type: string + - description: The cron expression represents recurring job scheduling + jsonPath: .spec.cron + name: Cron + type: string + - description: The number of snapshots/backups to keep for the volume + jsonPath: .spec.retain + name: Retain + type: integer + - description: The concurrent job to run by each cron job + jsonPath: .spec.concurrency + name: Concurrency + type: integer + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + - description: Specify the labels + jsonPath: .spec.labels + name: Labels + type: string + name: v1beta2 + schema: + openAPIV3Schema: + description: RecurringJob is where Longhorn stores recurring job object. + 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 + metadata: + type: object + spec: + description: RecurringJobSpec defines the desired state of the Longhorn + recurring job + properties: + concurrency: + description: The concurrency of taking the snapshot/backup. + type: integer + cron: + description: The cron setting. + type: string + groups: + description: The recurring job group. + items: + type: string + type: array + labels: + additionalProperties: + type: string + description: The label of the snapshot/backup. + type: object + name: + description: The recurring job name. + type: string + parameters: + additionalProperties: + type: string + description: |- + The parameters of the snapshot/backup. + Support parameters: "full-backup-interval". + type: object + retain: + description: The retain count of the snapshot/backup. + type: integer + task: + description: |- + The recurring job task. + Can be "snapshot", "snapshot-force-create", "snapshot-cleanup", "snapshot-delete", "backup", "backup-force-create" or "filesystem-trim" + enum: + - snapshot + - snapshot-force-create + - snapshot-cleanup + - snapshot-delete + - backup + - backup-force-create + - filesystem-trim + type: string + type: object + status: + description: RecurringJobStatus defines the observed state of the Longhorn + recurring job + properties: + executionCount: + description: The number of jobs that have been triggered. + type: integer + ownerID: + description: The owner ID which is responsible to reconcile this recurring + job CR. + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: replicas.longhorn.io +spec: + group: longhorn.io + names: + kind: Replica + listKind: ReplicaList + plural: replicas + shortNames: + - lhr + singular: replica + preserveUnknownFields: false + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The current state of the replica + jsonPath: .status.currentState + name: State + type: string + - description: The node that the replica is on + jsonPath: .spec.nodeID + name: Node + type: string + - description: The disk that the replica is on + jsonPath: .spec.diskID + name: Disk + type: string + - description: The instance manager of the replica + jsonPath: .status.instanceManagerName + name: InstanceManager + type: string + - description: The current image of the replica + jsonPath: .status.currentImage + name: Image + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: Replica is where Longhorn stores replica object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The data engine of the replica + jsonPath: .spec.dataEngine + name: Data Engine + type: string + - description: The current state of the replica + jsonPath: .status.currentState + name: State + type: string + - description: The node that the replica is on + jsonPath: .spec.nodeID + name: Node + type: string + - description: The disk that the replica is on + jsonPath: .spec.diskID + name: Disk + type: string + - description: The instance manager of the replica + jsonPath: .status.instanceManagerName + name: InstanceManager + type: string + - description: The current image of the replica + jsonPath: .status.currentImage + name: Image + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: Replica is where Longhorn stores replica object. + 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 + metadata: + type: object + spec: + description: ReplicaSpec defines the desired state of the Longhorn replica + properties: + active: + type: boolean + backendStoreDriver: + description: Deprecated:Replaced by field `dataEngine`. + type: string + backingImage: + type: string + dataDirectoryName: + type: string + dataEngine: + enum: + - v1 + - v2 + type: string + desireState: + type: string + diskID: + type: string + diskPath: + type: string + engineImage: + description: 'Deprecated: Replaced by field `image`.' + type: string + engineName: + type: string + evictionRequested: + type: boolean + failedAt: + description: |- + FailedAt is set when a running replica fails or when a running engine is unable to use a replica for any reason. + FailedAt indicates the time the failure occurred. When FailedAt is set, a replica is likely to have useful + (though possibly stale) data. A replica with FailedAt set must be rebuilt from a non-failed replica (or it can + be used in a salvage if all replicas are failed). FailedAt is cleared before a rebuild or salvage. FailedAt may + be later than the corresponding entry in an engine's replicaTransitionTimeMap because it is set when the volume + controller acknowledges the change. + type: string + hardNodeAffinity: + type: string + healthyAt: + description: |- + HealthyAt is set the first time a replica becomes read/write in an engine after creation or rebuild. HealthyAt + indicates the time the last successful rebuild occurred. When HealthyAt is set, a replica is likely to have + useful (though possibly stale) data. HealthyAt is cleared before a rebuild. HealthyAt may be later than the + corresponding entry in an engine's replicaTransitionTimeMap because it is set when the volume controller + acknowledges the change. + type: string + image: + type: string + lastFailedAt: + description: |- + LastFailedAt is always set at the same time as FailedAt. Unlike FailedAt, LastFailedAt is never cleared. + LastFailedAt is not a reliable indicator of the state of a replica's data. For example, a replica with + LastFailedAt may already be healthy and in use again. However, because it is never cleared, it can be compared to + LastHealthyAt to help prevent dangerous replica deletion in some corner cases. LastFailedAt may be later than the + corresponding entry in an engine's replicaTransitionTimeMap because it is set when the volume controller + acknowledges the change. + type: string + lastHealthyAt: + description: |- + LastHealthyAt is set every time a replica becomes read/write in an engine. Unlike HealthyAt, LastHealthyAt is + never cleared. LastHealthyAt is not a reliable indicator of the state of a replica's data. For example, a + replica with LastHealthyAt set may be in the middle of a rebuild. However, because it is never cleared, it can be + compared to LastFailedAt to help prevent dangerous replica deletion in some corner cases. LastHealthyAt may be + later than the corresponding entry in an engine's replicaTransitionTimeMap because it is set when the volume + controller acknowledges the change. + type: string + logRequested: + type: boolean + nodeID: + type: string + rebuildRetryCount: + type: integer + revisionCounterDisabled: + type: boolean + salvageRequested: + type: boolean + snapshotMaxCount: + type: integer + snapshotMaxSize: + format: int64 + type: string + unmapMarkDiskChainRemovedEnabled: + type: boolean + volumeName: + type: string + volumeSize: + format: int64 + type: string + type: object + status: + description: ReplicaStatus defines the observed state of the Longhorn + replica + properties: + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status + to another. + type: string + message: + description: Human-readable message indicating details about + last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's + last transition. + type: string + status: + description: |- + Status is the status of the condition. + Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + currentImage: + type: string + currentState: + type: string + evictionRequested: + description: 'Deprecated: Replaced by field `spec.evictionRequested`.' + type: boolean + instanceManagerName: + type: string + ip: + type: string + logFetched: + type: boolean + ownerID: + type: string + port: + type: integer + salvageExecuted: + type: boolean + started: + type: boolean + storageIP: + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: settings.longhorn.io +spec: + group: longhorn.io + names: + kind: Setting + listKind: SettingList + plural: settings + shortNames: + - lhs + singular: setting + preserveUnknownFields: false + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The value of the setting + jsonPath: .value + name: Value + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: Setting is where Longhorn stores setting object. + 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 + metadata: + type: object + value: + type: string + required: + - value + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The value of the setting + jsonPath: .value + name: Value + type: string + - description: The setting is applied + jsonPath: .status.applied + name: Applied + type: boolean + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: Setting is where Longhorn stores setting object. + 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 + metadata: + type: object + status: + description: The status of the setting. + properties: + applied: + description: The setting is applied. + type: boolean + required: + - applied + type: object + value: + description: The value of the setting. + type: string + required: + - value + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: sharemanagers.longhorn.io +spec: + group: longhorn.io + names: + kind: ShareManager + listKind: ShareManagerList + plural: sharemanagers + shortNames: + - lhsm + singular: sharemanager + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The state of the share manager + jsonPath: .status.state + name: State + type: string + - description: The node that the share manager is owned by + jsonPath: .status.ownerID + name: Node + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: ShareManager is where Longhorn stores share manager object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The state of the share manager + jsonPath: .status.state + name: State + type: string + - description: The node that the share manager is owned by + jsonPath: .status.ownerID + name: Node + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: ShareManager is where Longhorn stores share manager object. + 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 + metadata: + type: object + spec: + description: ShareManagerSpec defines the desired state of the Longhorn + share manager + properties: + image: + description: Share manager image used for creating a share manager + pod + type: string + type: object + status: + description: ShareManagerStatus defines the observed state of the Longhorn + share manager + properties: + endpoint: + description: NFS endpoint that can access the mounted filesystem of + the volume + type: string + ownerID: + description: The node ID on which the controller is responsible to + reconcile this share manager resource + type: string + state: + description: The state of the share manager resource + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: snapshots.longhorn.io +spec: + group: longhorn.io + names: + kind: Snapshot + listKind: SnapshotList + plural: snapshots + shortNames: + - lhsnap + singular: snapshot + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The volume that this snapshot belongs to + jsonPath: .spec.volume + name: Volume + type: string + - description: Timestamp when the point-in-time snapshot was taken + jsonPath: .status.creationTime + name: CreationTime + type: string + - description: Indicates if the snapshot is ready to be used to restore/backup + a volume + jsonPath: .status.readyToUse + name: ReadyToUse + type: boolean + - description: Represents the minimum size of volume required to rehydrate from + this snapshot + jsonPath: .status.restoreSize + name: RestoreSize + type: string + - description: The actual size of the snapshot + jsonPath: .status.size + name: Size + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: Snapshot is the Schema for the snapshots API + 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 + metadata: + type: object + spec: + description: SnapshotSpec defines the desired state of Longhorn Snapshot + properties: + createSnapshot: + description: require creating a new snapshot + type: boolean + labels: + additionalProperties: + type: string + description: The labels of snapshot + nullable: true + type: object + volume: + description: |- + the volume that this snapshot belongs to. + This field is immutable after creation. + Required + type: string + required: + - volume + type: object + status: + description: SnapshotStatus defines the observed state of Longhorn Snapshot + properties: + checksum: + type: string + children: + additionalProperties: + type: boolean + nullable: true + type: object + creationTime: + type: string + error: + type: string + labels: + additionalProperties: + type: string + nullable: true + type: object + markRemoved: + type: boolean + ownerID: + type: string + parent: + type: string + readyToUse: + type: boolean + restoreSize: + format: int64 + type: integer + size: + format: int64 + type: integer + userCreated: + type: boolean + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: supportbundles.longhorn.io +spec: + group: longhorn.io + names: + kind: SupportBundle + listKind: SupportBundleList + plural: supportbundles + shortNames: + - lhbundle + singular: supportbundle + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The state of the support bundle + jsonPath: .status.state + name: State + type: string + - description: The issue URL + jsonPath: .spec.issueURL + name: Issue + type: string + - description: A brief description of the issue + jsonPath: .spec.description + name: Description + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: SupportBundle is where Longhorn stores support bundle object + 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 + metadata: + type: object + spec: + description: SupportBundleSpec defines the desired state of the Longhorn + SupportBundle + properties: + description: + description: A brief description of the issue + type: string + issueURL: + description: The issue URL + nullable: true + type: string + nodeID: + description: The preferred responsible controller node ID. + type: string + required: + - description + type: object + status: + description: SupportBundleStatus defines the observed state of the Longhorn + SupportBundle + properties: + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status + to another. + type: string + message: + description: Human-readable message indicating details about + last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's + last transition. + type: string + status: + description: |- + Status is the status of the condition. + Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + type: array + filename: + type: string + filesize: + format: int64 + type: integer + image: + description: The support bundle manager image + type: string + managerIP: + description: The support bundle manager IP + type: string + ownerID: + description: The current responsible controller node ID + type: string + progress: + type: integer + state: + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: systembackups.longhorn.io +spec: + group: longhorn.io + names: + kind: SystemBackup + listKind: SystemBackupList + plural: systembackups + shortNames: + - lhsb + singular: systembackup + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The system backup Longhorn version + jsonPath: .status.version + name: Version + type: string + - description: The system backup state + jsonPath: .status.state + name: State + type: string + - description: The system backup creation time + jsonPath: .status.createdAt + name: Created + type: string + - description: The last time that the system backup was synced into the cluster + jsonPath: .status.lastSyncedAt + name: LastSyncedAt + type: string + name: v1beta2 + schema: + openAPIV3Schema: + description: SystemBackup is where Longhorn stores system backup object + 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 + metadata: + type: object + spec: + description: SystemBackupSpec defines the desired state of the Longhorn + SystemBackup + properties: + volumeBackupPolicy: + description: |- + The create volume backup policy + Can be "if-not-present", "always" or "disabled" + nullable: true + type: string + type: object + status: + description: SystemBackupStatus defines the observed state of the Longhorn + SystemBackup + properties: + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status + to another. + type: string + message: + description: Human-readable message indicating details about + last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's + last transition. + type: string + status: + description: |- + Status is the status of the condition. + Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + createdAt: + description: The system backup creation time. + format: date-time + type: string + gitCommit: + description: The saved Longhorn manager git commit. + nullable: true + type: string + lastSyncedAt: + description: The last time that the system backup was synced into + the cluster. + format: date-time + nullable: true + type: string + managerImage: + description: The saved manager image. + type: string + ownerID: + description: The node ID of the responsible controller to reconcile + this SystemBackup. + type: string + state: + description: The system backup state. + type: string + version: + description: The saved Longhorn version. + nullable: true + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: systemrestores.longhorn.io +spec: + group: longhorn.io + names: + kind: SystemRestore + listKind: SystemRestoreList + plural: systemrestores + shortNames: + - lhsr + singular: systemrestore + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The system restore state + jsonPath: .status.state + name: State + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: SystemRestore is where Longhorn stores system restore object + 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 + metadata: + type: object + spec: + description: SystemRestoreSpec defines the desired state of the Longhorn + SystemRestore + properties: + systemBackup: + description: The system backup name in the object store. + type: string + required: + - systemBackup + type: object + status: + description: SystemRestoreStatus defines the observed state of the Longhorn + SystemRestore + properties: + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status + to another. + type: string + message: + description: Human-readable message indicating details about + last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's + last transition. + type: string + status: + description: |- + Status is the status of the condition. + Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + ownerID: + description: The node ID of the responsible controller to reconcile + this SystemRestore. + type: string + sourceURL: + description: The source system backup URL. + type: string + state: + description: The system restore state. + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: volumeattachments.longhorn.io +spec: + group: longhorn.io + names: + kind: VolumeAttachment + listKind: VolumeAttachmentList + plural: volumeattachments + shortNames: + - lhva + singular: volumeattachment + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: VolumeAttachment stores attachment information of a Longhorn + volume + 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 + metadata: + type: object + spec: + description: VolumeAttachmentSpec defines the desired state of Longhorn + VolumeAttachment + properties: + attachmentTickets: + additionalProperties: + properties: + generation: + description: |- + A sequence number representing a specific generation of the desired state. + Populated by the system. Read-only. + format: int64 + type: integer + id: + description: The unique ID of this attachment. Used to differentiate + different attachments of the same volume. + type: string + nodeID: + description: The node that this attachment is requesting + type: string + parameters: + additionalProperties: + type: string + description: Optional additional parameter for this attachment + type: object + type: + type: string + type: object + type: object + volume: + description: The name of Longhorn volume of this VolumeAttachment + type: string + required: + - volume + type: object + status: + description: VolumeAttachmentStatus defines the observed state of Longhorn + VolumeAttachment + properties: + attachmentTicketStatuses: + additionalProperties: + properties: + conditions: + description: Record any error when trying to fulfill this attachment + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from + one status to another. + type: string + message: + description: Human-readable message indicating details + about last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the + condition's last transition. + type: string + status: + description: |- + Status is the status of the condition. + Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + generation: + description: |- + A sequence number representing a specific generation of the desired state. + Populated by the system. Read-only. + format: int64 + type: integer + id: + description: The unique ID of this attachment. Used to differentiate + different attachments of the same volume. + type: string + satisfied: + description: Indicate whether this attachment ticket has been + satisfied + type: boolean + required: + - conditions + - satisfied + type: object + type: object + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: volumes.longhorn.io +spec: + conversion: + strategy: Webhook + webhook: + clientConfig: + service: + name: longhorn-conversion-webhook + namespace: {{ include "release_namespace" . }} + path: /v1/webhook/conversion + port: 9501 + conversionReviewVersions: + - v1beta2 + - v1beta1 + group: longhorn.io + names: + kind: Volume + listKind: VolumeList + plural: volumes + shortNames: + - lhv + singular: volume + preserveUnknownFields: false + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The state of the volume + jsonPath: .status.state + name: State + type: string + - description: The robustness of the volume + jsonPath: .status.robustness + name: Robustness + type: string + - description: The scheduled condition of the volume + jsonPath: .status.conditions['scheduled']['status'] + name: Scheduled + type: string + - description: The size of the volume + jsonPath: .spec.size + name: Size + type: string + - description: The node that the volume is currently attaching to + jsonPath: .status.currentNodeID + name: Node + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: Volume is where Longhorn stores volume object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The data engine of the volume + jsonPath: .spec.dataEngine + name: Data Engine + type: string + - description: The state of the volume + jsonPath: .status.state + name: State + type: string + - description: The robustness of the volume + jsonPath: .status.robustness + name: Robustness + type: string + - description: The scheduled condition of the volume + jsonPath: .status.conditions[?(@.type=='Schedulable')].status + name: Scheduled + type: string + - description: The size of the volume + jsonPath: .spec.size + name: Size + type: string + - description: The node that the volume is currently attaching to + jsonPath: .status.currentNodeID + name: Node + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: Volume is where Longhorn stores volume object. + 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 + metadata: + type: object + spec: + description: VolumeSpec defines the desired state of the Longhorn volume + properties: + Standby: + type: boolean + accessMode: + enum: + - rwo + - rwx + type: string + backendStoreDriver: + description: Deprecated:Replaced by field `dataEngine`.' + type: string + backingImage: + type: string + backupCompressionMethod: + enum: + - none + - lz4 + - gzip + type: string + dataEngine: + enum: + - v1 + - v2 + type: string + dataLocality: + enum: + - disabled + - best-effort + - strict-local + type: string + dataSource: + type: string + disableFrontend: + type: boolean + diskSelector: + items: + type: string + type: array + encrypted: + type: boolean + engineImage: + description: 'Deprecated: Replaced by field `image`.' + type: string + freezeFilesystemForSnapshot: + description: Setting that freezes the filesystem on the root partition + before a snapshot is created. + enum: + - ignored + - enabled + - disabled + type: string + fromBackup: + type: string + frontend: + enum: + - blockdev + - iscsi + - nvmf + - "" + type: string + image: + type: string + lastAttachedBy: + type: string + migratable: + type: boolean + migrationNodeID: + type: string + nodeID: + type: string + nodeSelector: + items: + type: string + type: array + numberOfReplicas: + type: integer + replicaAutoBalance: + enum: + - ignored + - disabled + - least-effort + - best-effort + type: string + replicaDiskSoftAntiAffinity: + description: Replica disk soft anti affinity of the volume. Set enabled + to allow replicas to be scheduled in the same disk. + enum: + - ignored + - enabled + - disabled + type: string + replicaSoftAntiAffinity: + description: Replica soft anti affinity of the volume. Set enabled + to allow replicas to be scheduled on the same node. + enum: + - ignored + - enabled + - disabled + type: string + replicaZoneSoftAntiAffinity: + description: Replica zone soft anti affinity of the volume. Set enabled + to allow replicas to be scheduled in the same zone. + enum: + - ignored + - enabled + - disabled + type: string + restoreVolumeRecurringJob: + enum: + - ignored + - enabled + - disabled + type: string + revisionCounterDisabled: + type: boolean + size: + format: int64 + type: string + snapshotDataIntegrity: + enum: + - ignored + - disabled + - enabled + - fast-check + type: string + snapshotMaxCount: + type: integer + snapshotMaxSize: + format: int64 + type: string + staleReplicaTimeout: + type: integer + unmapMarkSnapChainRemoved: + enum: + - ignored + - disabled + - enabled + type: string + type: object + status: + description: VolumeStatus defines the observed state of the Longhorn volume + properties: + actualSize: + format: int64 + type: integer + cloneStatus: + properties: + attemptCount: + type: integer + nextAllowedAttemptAt: + type: string + snapshot: + type: string + sourceVolume: + type: string + state: + type: string + type: object + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status + to another. + type: string + message: + description: Human-readable message indicating details about + last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's + last transition. + type: string + status: + description: |- + Status is the status of the condition. + Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + currentImage: + type: string + currentMigrationNodeID: + description: the node that this volume is currently migrating to + type: string + currentNodeID: + type: string + expansionRequired: + type: boolean + frontendDisabled: + type: boolean + isStandby: + type: boolean + kubernetesStatus: + properties: + lastPVCRefAt: + type: string + lastPodRefAt: + type: string + namespace: + description: determine if PVC/Namespace is history or not + type: string + pvName: + type: string + pvStatus: + type: string + pvcName: + type: string + workloadsStatus: + description: determine if Pod/Workload is history or not + items: + properties: + podName: + type: string + podStatus: + type: string + workloadName: + type: string + workloadType: + type: string + type: object + nullable: true + type: array + type: object + lastBackup: + type: string + lastBackupAt: + type: string + lastDegradedAt: + type: string + ownerID: + type: string + pendingNodeID: + description: Deprecated. + type: string + remountRequestedAt: + type: string + restoreInitiated: + type: boolean + restoreRequired: + type: boolean + robustness: + type: string + shareEndpoint: + type: string + shareState: + type: string + state: + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} diff --git a/charts/longhorn-crd/103.4.1+up1.7.2/Chart.yaml b/charts/longhorn-crd/103.4.1+up1.7.2/Chart.yaml new file mode 100644 index 0000000000..071325b2e5 --- /dev/null +++ b/charts/longhorn-crd/103.4.1+up1.7.2/Chart.yaml @@ -0,0 +1,11 @@ +annotations: + catalog.cattle.io/certified: rancher + catalog.cattle.io/hidden: "true" + catalog.cattle.io/namespace: longhorn-system + catalog.cattle.io/release-name: longhorn-crd +apiVersion: v1 +appVersion: v1.7.2 +description: Installs the CRDs for longhorn. +name: longhorn-crd +type: application +version: 103.4.1+up1.7.2 diff --git a/charts/longhorn-crd/103.4.1+up1.7.2/README.md b/charts/longhorn-crd/103.4.1+up1.7.2/README.md new file mode 100644 index 0000000000..d9f7f14b33 --- /dev/null +++ b/charts/longhorn-crd/103.4.1+up1.7.2/README.md @@ -0,0 +1,2 @@ +# longhorn-crd +A Rancher chart that installs the CRDs used by longhorn. diff --git a/charts/longhorn-crd/103.4.1+up1.7.2/templates/_helpers.tpl b/charts/longhorn-crd/103.4.1+up1.7.2/templates/_helpers.tpl new file mode 100644 index 0000000000..3fbc2ac02f --- /dev/null +++ b/charts/longhorn-crd/103.4.1+up1.7.2/templates/_helpers.tpl @@ -0,0 +1,66 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "longhorn.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +*/}} +{{- define "longhorn.fullname" -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} + + +{{- define "longhorn.managerIP" -}} +{{- $fullname := (include "longhorn.fullname" .) -}} +{{- printf "http://%s-backend:9500" $fullname | trunc 63 | trimSuffix "-" -}} +{{- end -}} + + +{{- define "secret" }} +{{- printf "{\"auths\": {\"%s\": {\"auth\": \"%s\"}}}" .Values.privateRegistry.registryUrl (printf "%s:%s" .Values.privateRegistry.registryUser .Values.privateRegistry.registryPasswd | b64enc) | b64enc }} +{{- end }} + +{{- /* +longhorn.labels generates the standard Helm labels. +*/ -}} +{{- define "longhorn.labels" -}} +app.kubernetes.io/name: {{ template "longhorn.name" . }} +helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +app.kubernetes.io/instance: {{ .Release.Name }} +app.kubernetes.io/version: {{ .Chart.AppVersion }} +{{- end -}} + + +{{- define "system_default_registry" -}} +{{- if .Values.global.cattle.systemDefaultRegistry -}} +{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} +{{- else -}} +{{- "" -}} +{{- end -}} +{{- end -}} + +{{- define "registry_url" -}} +{{- if .Values.privateRegistry.registryUrl -}} +{{- printf "%s/" .Values.privateRegistry.registryUrl -}} +{{- else -}} +{{ include "system_default_registry" . }} +{{- end -}} +{{- end -}} + +{{- /* + define the longhorn release namespace +*/ -}} +{{- define "release_namespace" -}} +{{- if .Values.namespaceOverride -}} +{{- .Values.namespaceOverride -}} +{{- else -}} +{{- .Release.Namespace -}} +{{- end -}} +{{- end -}} diff --git a/charts/longhorn-crd/103.4.1+up1.7.2/templates/crds.yaml b/charts/longhorn-crd/103.4.1+up1.7.2/templates/crds.yaml new file mode 100644 index 0000000000..3b78dd7ad3 --- /dev/null +++ b/charts/longhorn-crd/103.4.1+up1.7.2/templates/crds.yaml @@ -0,0 +1,4400 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: backingimagedatasources.longhorn.io +spec: + group: longhorn.io + names: + kind: BackingImageDataSource + listKind: BackingImageDataSourceList + plural: backingimagedatasources + shortNames: + - lhbids + singular: backingimagedatasource + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The current state of the pod used to provision the backing image + file from source + jsonPath: .status.currentState + name: State + type: string + - description: The data source type + jsonPath: .spec.sourceType + name: SourceType + type: string + - description: The node the backing image file will be prepared on + jsonPath: .spec.nodeID + name: Node + type: string + - description: The disk the backing image file will be prepared on + jsonPath: .spec.diskUUID + name: DiskUUID + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: BackingImageDataSource is where Longhorn stores backing image + data source object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The system generated UUID of the provisioned backing image file + jsonPath: .spec.uuid + name: UUID + type: string + - description: The current state of the pod used to provision the backing image + file from source + jsonPath: .status.currentState + name: State + type: string + - description: The data source type + jsonPath: .spec.sourceType + name: SourceType + type: string + - description: The backing image file size + jsonPath: .status.size + name: Size + type: string + - description: The node the backing image file will be prepared on + jsonPath: .spec.nodeID + name: Node + type: string + - description: The disk the backing image file will be prepared on + jsonPath: .spec.diskUUID + name: DiskUUID + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: BackingImageDataSource is where Longhorn stores backing image + data source object. + 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 + metadata: + type: object + spec: + description: BackingImageDataSourceSpec defines the desired state of the + Longhorn backing image data source + properties: + checksum: + type: string + diskPath: + type: string + diskUUID: + type: string + fileTransferred: + type: boolean + nodeID: + type: string + parameters: + additionalProperties: + type: string + type: object + sourceType: + enum: + - download + - upload + - export-from-volume + - restore + - clone + type: string + uuid: + type: string + type: object + status: + description: BackingImageDataSourceStatus defines the observed state of + the Longhorn backing image data source + properties: + checksum: + type: string + currentState: + type: string + ip: + type: string + message: + type: string + ownerID: + type: string + progress: + type: integer + runningParameters: + additionalProperties: + type: string + nullable: true + type: object + size: + format: int64 + type: integer + storageIP: + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: backingimagemanagers.longhorn.io +spec: + group: longhorn.io + names: + kind: BackingImageManager + listKind: BackingImageManagerList + plural: backingimagemanagers + shortNames: + - lhbim + singular: backingimagemanager + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The current state of the manager + jsonPath: .status.currentState + name: State + type: string + - description: The image the manager pod will use + jsonPath: .spec.image + name: Image + type: string + - description: The node the manager is on + jsonPath: .spec.nodeID + name: Node + type: string + - description: The disk the manager is responsible for + jsonPath: .spec.diskUUID + name: DiskUUID + type: string + - description: The disk path the manager is using + jsonPath: .spec.diskPath + name: DiskPath + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: BackingImageManager is where Longhorn stores backing image manager + object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The current state of the manager + jsonPath: .status.currentState + name: State + type: string + - description: The image the manager pod will use + jsonPath: .spec.image + name: Image + type: string + - description: The node the manager is on + jsonPath: .spec.nodeID + name: Node + type: string + - description: The disk the manager is responsible for + jsonPath: .spec.diskUUID + name: DiskUUID + type: string + - description: The disk path the manager is using + jsonPath: .spec.diskPath + name: DiskPath + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: BackingImageManager is where Longhorn stores backing image manager + object. + 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 + metadata: + type: object + spec: + description: BackingImageManagerSpec defines the desired state of the + Longhorn backing image manager + properties: + backingImages: + additionalProperties: + type: string + type: object + diskPath: + type: string + diskUUID: + type: string + image: + type: string + nodeID: + type: string + type: object + status: + description: BackingImageManagerStatus defines the observed state of the + Longhorn backing image manager + properties: + apiMinVersion: + type: integer + apiVersion: + type: integer + backingImageFileMap: + additionalProperties: + properties: + currentChecksum: + type: string + message: + type: string + name: + type: string + progress: + type: integer + senderManagerAddress: + type: string + sendingReference: + type: integer + size: + format: int64 + type: integer + state: + type: string + uuid: + type: string + virtualSize: + format: int64 + type: integer + type: object + nullable: true + type: object + currentState: + type: string + ip: + type: string + ownerID: + type: string + storageIP: + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: backingimages.longhorn.io +spec: + conversion: + strategy: Webhook + webhook: + clientConfig: + service: + name: longhorn-conversion-webhook + namespace: {{ include "release_namespace" . }} + path: /v1/webhook/conversion + port: 9501 + conversionReviewVersions: + - v1beta2 + - v1beta1 + group: longhorn.io + names: + kind: BackingImage + listKind: BackingImageList + plural: backingimages + shortNames: + - lhbi + singular: backingimage + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The backing image name + jsonPath: .spec.image + name: Image + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: BackingImage is where Longhorn stores backing image object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The system generated UUID + jsonPath: .status.uuid + name: UUID + type: string + - description: The source of the backing image file data + jsonPath: .spec.sourceType + name: SourceType + type: string + - description: The backing image file size in each disk + jsonPath: .status.size + name: Size + type: string + - description: The virtual size of the image (may be larger than file size) + jsonPath: .status.virtualSize + name: VirtualSize + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: BackingImage is where Longhorn stores backing image object. + 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 + metadata: + type: object + spec: + description: BackingImageSpec defines the desired state of the Longhorn + backing image + properties: + checksum: + type: string + diskFileSpecMap: + additionalProperties: + properties: + evictionRequested: + type: boolean + type: object + type: object + diskSelector: + items: + type: string + type: array + disks: + additionalProperties: + type: string + description: Deprecated. We are now using DiskFileSpecMap to assign + different spec to the file on different disks. + type: object + minNumberOfCopies: + type: integer + nodeSelector: + items: + type: string + type: array + secret: + type: string + secretNamespace: + type: string + sourceParameters: + additionalProperties: + type: string + type: object + sourceType: + enum: + - download + - upload + - export-from-volume + - restore + - clone + type: string + type: object + status: + description: BackingImageStatus defines the observed state of the Longhorn + backing image status + properties: + checksum: + type: string + diskFileStatusMap: + additionalProperties: + properties: + lastStateTransitionTime: + type: string + message: + type: string + progress: + type: integer + state: + type: string + type: object + nullable: true + type: object + diskLastRefAtMap: + additionalProperties: + type: string + nullable: true + type: object + ownerID: + type: string + size: + format: int64 + type: integer + uuid: + type: string + virtualSize: + description: Virtual size of image, which may be larger than physical + size. Will be zero until known (e.g. while a backing image is uploading) + format: int64 + type: integer + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: backupbackingimages.longhorn.io +spec: + group: longhorn.io + names: + kind: BackupBackingImage + listKind: BackupBackingImageList + plural: backupbackingimages + shortNames: + - lhbbi + singular: backupbackingimage + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The backing image name + jsonPath: .status.backingImage + name: BackingImage + type: string + - description: The backing image size + jsonPath: .status.size + name: Size + type: string + - description: The backing image backup upload finished time + jsonPath: .status.backupCreatedAt + name: BackupCreatedAt + type: string + - description: The backing image backup state + jsonPath: .status.state + name: State + type: string + - description: The last synced time + jsonPath: .status.lastSyncedAt + name: LastSyncedAt + type: string + name: v1beta2 + schema: + openAPIV3Schema: + description: BackupBackingImage is where Longhorn stores backing image backup + object. + 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 + metadata: + type: object + spec: + description: BackupBackingImageSpec defines the desired state of the Longhorn + backing image backup + properties: + labels: + additionalProperties: + type: string + description: The labels of backing image backup. + type: object + syncRequestedAt: + description: The time to request run sync the remote backing image + backup. + format: date-time + nullable: true + type: string + userCreated: + description: |- + Is this CR created by user through API or UI. + Required + type: boolean + required: + - userCreated + type: object + status: + description: BackupBackingImageStatus defines the observed state of the + Longhorn backing image backup + properties: + backingImage: + description: The backing image name. + type: string + backupCreatedAt: + description: The backing image backup upload finished time. + type: string + checksum: + description: The checksum of the backing image. + type: string + compressionMethod: + description: Compression method + type: string + error: + description: The error message when taking the backing image backup. + type: string + labels: + additionalProperties: + type: string + description: The labels of backing image backup. + nullable: true + type: object + lastSyncedAt: + description: The last time that the backing image backup was synced + with the remote backup target. + format: date-time + nullable: true + type: string + managerAddress: + description: The address of the backing image manager that runs backing + image backup. + type: string + messages: + additionalProperties: + type: string + description: The error messages when listing or inspecting backing + image backup. + nullable: true + type: object + ownerID: + description: The node ID on which the controller is responsible to + reconcile this CR. + type: string + progress: + description: The backing image backup progress. + type: integer + size: + description: The backing image size. + format: int64 + type: integer + state: + description: |- + The backing image backup creation state. + Can be "", "InProgress", "Completed", "Error", "Unknown". + type: string + url: + description: The backing image backup URL. + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: backups.longhorn.io +spec: + group: longhorn.io + names: + kind: Backup + listKind: BackupList + plural: backups + shortNames: + - lhb + singular: backup + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The snapshot name + jsonPath: .status.snapshotName + name: SnapshotName + type: string + - description: The snapshot size + jsonPath: .status.size + name: SnapshotSize + type: string + - description: The snapshot creation time + jsonPath: .status.snapshotCreatedAt + name: SnapshotCreatedAt + type: string + - description: The backup state + jsonPath: .status.state + name: State + type: string + - description: The backup last synced time + jsonPath: .status.lastSyncedAt + name: LastSyncedAt + type: string + name: v1beta1 + schema: + openAPIV3Schema: + description: Backup is where Longhorn stores backup object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The snapshot name + jsonPath: .status.snapshotName + name: SnapshotName + type: string + - description: The snapshot size + jsonPath: .status.size + name: SnapshotSize + type: string + - description: The snapshot creation time + jsonPath: .status.snapshotCreatedAt + name: SnapshotCreatedAt + type: string + - description: The backup state + jsonPath: .status.state + name: State + type: string + - description: The backup last synced time + jsonPath: .status.lastSyncedAt + name: LastSyncedAt + type: string + name: v1beta2 + schema: + openAPIV3Schema: + description: Backup is where Longhorn stores backup object. + 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 + metadata: + type: object + spec: + description: BackupSpec defines the desired state of the Longhorn backup + properties: + backupMode: + description: |- + The backup mode of this backup. + Can be "full" or "incremental" + enum: + - full + - incremental + - "" + type: string + labels: + additionalProperties: + type: string + description: The labels of snapshot backup. + type: object + snapshotName: + description: The snapshot name. + type: string + syncRequestedAt: + description: The time to request run sync the remote backup. + format: date-time + nullable: true + type: string + type: object + status: + description: BackupStatus defines the observed state of the Longhorn backup + properties: + backupCreatedAt: + description: The snapshot backup upload finished time. + type: string + compressionMethod: + description: Compression method + type: string + error: + description: The error message when taking the snapshot backup. + type: string + labels: + additionalProperties: + type: string + description: The labels of snapshot backup. + nullable: true + type: object + lastSyncedAt: + description: The last time that the backup was synced with the remote + backup target. + format: date-time + nullable: true + type: string + messages: + additionalProperties: + type: string + description: The error messages when calling longhorn engine on listing + or inspecting backups. + nullable: true + type: object + newlyUploadDataSize: + description: Size in bytes of newly uploaded data + type: string + ownerID: + description: The node ID on which the controller is responsible to + reconcile this backup CR. + type: string + progress: + description: The snapshot backup progress. + type: integer + reUploadedDataSize: + description: Size in bytes of reuploaded data + type: string + replicaAddress: + description: The address of the replica that runs snapshot backup. + type: string + size: + description: The snapshot size. + type: string + snapshotCreatedAt: + description: The snapshot creation time. + type: string + snapshotName: + description: The snapshot name. + type: string + state: + description: |- + The backup creation state. + Can be "", "InProgress", "Completed", "Error", "Unknown". + type: string + url: + description: The snapshot backup URL. + type: string + volumeBackingImageName: + description: The volume's backing image name. + type: string + volumeCreated: + description: The volume creation time. + type: string + volumeName: + description: The volume name. + type: string + volumeSize: + description: The volume size. + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: backuptargets.longhorn.io +spec: + conversion: + strategy: Webhook + webhook: + clientConfig: + service: + name: longhorn-conversion-webhook + namespace: {{ include "release_namespace" . }} + path: /v1/webhook/conversion + port: 9501 + conversionReviewVersions: + - v1beta2 + - v1beta1 + group: longhorn.io + names: + kind: BackupTarget + listKind: BackupTargetList + plural: backuptargets + shortNames: + - lhbt + singular: backuptarget + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The backup target URL + jsonPath: .spec.backupTargetURL + name: URL + type: string + - description: The backup target credential secret + jsonPath: .spec.credentialSecret + name: Credential + type: string + - description: The backup target poll interval + jsonPath: .spec.pollInterval + name: LastBackupAt + type: string + - description: Indicate whether the backup target is available or not + jsonPath: .status.available + name: Available + type: boolean + - description: The backup target last synced time + jsonPath: .status.lastSyncedAt + name: LastSyncedAt + type: string + name: v1beta1 + schema: + openAPIV3Schema: + description: BackupTarget is where Longhorn stores backup target object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The backup target URL + jsonPath: .spec.backupTargetURL + name: URL + type: string + - description: The backup target credential secret + jsonPath: .spec.credentialSecret + name: Credential + type: string + - description: The backup target poll interval + jsonPath: .spec.pollInterval + name: LastBackupAt + type: string + - description: Indicate whether the backup target is available or not + jsonPath: .status.available + name: Available + type: boolean + - description: The backup target last synced time + jsonPath: .status.lastSyncedAt + name: LastSyncedAt + type: string + name: v1beta2 + schema: + openAPIV3Schema: + description: BackupTarget is where Longhorn stores backup target object. + 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 + metadata: + type: object + spec: + description: BackupTargetSpec defines the desired state of the Longhorn + backup target + properties: + backupTargetURL: + description: The backup target URL. + type: string + credentialSecret: + description: The backup target credential secret. + type: string + pollInterval: + description: The interval that the cluster needs to run sync with + the backup target. + type: string + syncRequestedAt: + description: The time to request run sync the remote backup target. + format: date-time + nullable: true + type: string + type: object + status: + description: BackupTargetStatus defines the observed state of the Longhorn + backup target + properties: + available: + description: Available indicates if the remote backup target is available + or not. + type: boolean + conditions: + description: Records the reason on why the backup target is unavailable. + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status + to another. + type: string + message: + description: Human-readable message indicating details about + last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's + last transition. + type: string + status: + description: |- + Status is the status of the condition. + Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + lastSyncedAt: + description: The last time that the controller synced with the remote + backup target. + format: date-time + nullable: true + type: string + ownerID: + description: The node ID on which the controller is responsible to + reconcile this backup target CR. + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: backupvolumes.longhorn.io +spec: + group: longhorn.io + names: + kind: BackupVolume + listKind: BackupVolumeList + plural: backupvolumes + shortNames: + - lhbv + singular: backupvolume + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The backup volume creation time + jsonPath: .status.createdAt + name: CreatedAt + type: string + - description: The backup volume last backup name + jsonPath: .status.lastBackupName + name: LastBackupName + type: string + - description: The backup volume last backup time + jsonPath: .status.lastBackupAt + name: LastBackupAt + type: string + - description: The backup volume last synced time + jsonPath: .status.lastSyncedAt + name: LastSyncedAt + type: string + name: v1beta1 + schema: + openAPIV3Schema: + description: BackupVolume is where Longhorn stores backup volume object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The backup volume creation time + jsonPath: .status.createdAt + name: CreatedAt + type: string + - description: The backup volume last backup name + jsonPath: .status.lastBackupName + name: LastBackupName + type: string + - description: The backup volume last backup time + jsonPath: .status.lastBackupAt + name: LastBackupAt + type: string + - description: The backup volume last synced time + jsonPath: .status.lastSyncedAt + name: LastSyncedAt + type: string + name: v1beta2 + schema: + openAPIV3Schema: + description: BackupVolume is where Longhorn stores backup volume object. + 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 + metadata: + type: object + spec: + description: BackupVolumeSpec defines the desired state of the Longhorn + backup volume + properties: + syncRequestedAt: + description: The time to request run sync the remote backup volume. + format: date-time + nullable: true + type: string + type: object + status: + description: BackupVolumeStatus defines the observed state of the Longhorn + backup volume + properties: + backingImageChecksum: + description: the backing image checksum. + type: string + backingImageName: + description: The backing image name. + type: string + createdAt: + description: The backup volume creation time. + type: string + dataStored: + description: The backup volume block count. + type: string + labels: + additionalProperties: + type: string + description: The backup volume labels. + nullable: true + type: object + lastBackupAt: + description: The latest volume backup time. + type: string + lastBackupName: + description: The latest volume backup name. + type: string + lastModificationTime: + description: The backup volume config last modification time. + format: date-time + nullable: true + type: string + lastSyncedAt: + description: The last time that the backup volume was synced into + the cluster. + format: date-time + nullable: true + type: string + messages: + additionalProperties: + type: string + description: The error messages when call longhorn engine on list + or inspect backup volumes. + nullable: true + type: object + ownerID: + description: The node ID on which the controller is responsible to + reconcile this backup volume CR. + type: string + size: + description: The backup volume size. + type: string + storageClassName: + description: the storage class name of pv/pvc binding with the volume. + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: engineimages.longhorn.io +spec: + conversion: + strategy: Webhook + webhook: + clientConfig: + service: + name: longhorn-conversion-webhook + namespace: {{ include "release_namespace" . }} + path: /v1/webhook/conversion + port: 9501 + conversionReviewVersions: + - v1beta2 + - v1beta1 + group: longhorn.io + names: + kind: EngineImage + listKind: EngineImageList + plural: engineimages + shortNames: + - lhei + singular: engineimage + preserveUnknownFields: false + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: State of the engine image + jsonPath: .status.state + name: State + type: string + - description: The Longhorn engine image + jsonPath: .spec.image + name: Image + type: string + - description: Number of resources using the engine image + jsonPath: .status.refCount + name: RefCount + type: integer + - description: The build date of the engine image + jsonPath: .status.buildDate + name: BuildDate + type: date + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: EngineImage is where Longhorn stores engine image object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: Compatibility of the engine image + jsonPath: .status.incompatible + name: Incompatible + type: boolean + - description: State of the engine image + jsonPath: .status.state + name: State + type: string + - description: The Longhorn engine image + jsonPath: .spec.image + name: Image + type: string + - description: Number of resources using the engine image + jsonPath: .status.refCount + name: RefCount + type: integer + - description: The build date of the engine image + jsonPath: .status.buildDate + name: BuildDate + type: date + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: EngineImage is where Longhorn stores engine image object. + 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 + metadata: + type: object + spec: + description: EngineImageSpec defines the desired state of the Longhorn + engine image + properties: + image: + minLength: 1 + type: string + required: + - image + type: object + status: + description: EngineImageStatus defines the observed state of the Longhorn + engine image + properties: + buildDate: + type: string + cliAPIMinVersion: + type: integer + cliAPIVersion: + type: integer + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status + to another. + type: string + message: + description: Human-readable message indicating details about + last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's + last transition. + type: string + status: + description: |- + Status is the status of the condition. + Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + controllerAPIMinVersion: + type: integer + controllerAPIVersion: + type: integer + dataFormatMinVersion: + type: integer + dataFormatVersion: + type: integer + gitCommit: + type: string + incompatible: + type: boolean + noRefSince: + type: string + nodeDeploymentMap: + additionalProperties: + type: boolean + nullable: true + type: object + ownerID: + type: string + refCount: + type: integer + state: + type: string + version: + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: engines.longhorn.io +spec: + group: longhorn.io + names: + kind: Engine + listKind: EngineList + plural: engines + shortNames: + - lhe + singular: engine + preserveUnknownFields: false + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The current state of the engine + jsonPath: .status.currentState + name: State + type: string + - description: The node that the engine is on + jsonPath: .spec.nodeID + name: Node + type: string + - description: The instance manager of the engine + jsonPath: .status.instanceManagerName + name: InstanceManager + type: string + - description: The current image of the engine + jsonPath: .status.currentImage + name: Image + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: Engine is where Longhorn stores engine object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The data engine of the engine + jsonPath: .spec.dataEngine + name: Data Engine + type: string + - description: The current state of the engine + jsonPath: .status.currentState + name: State + type: string + - description: The node that the engine is on + jsonPath: .spec.nodeID + name: Node + type: string + - description: The instance manager of the engine + jsonPath: .status.instanceManagerName + name: InstanceManager + type: string + - description: The current image of the engine + jsonPath: .status.currentImage + name: Image + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: Engine is where Longhorn stores engine object. + 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 + metadata: + type: object + spec: + description: EngineSpec defines the desired state of the Longhorn engine + properties: + active: + type: boolean + backendStoreDriver: + description: Deprecated:Replaced by field `dataEngine`. + type: string + backupVolume: + type: string + dataEngine: + enum: + - v1 + - v2 + type: string + desireState: + type: string + disableFrontend: + type: boolean + engineImage: + description: 'Deprecated: Replaced by field `image`.' + type: string + frontend: + enum: + - blockdev + - iscsi + - nvmf + - "" + type: string + image: + type: string + logRequested: + type: boolean + nodeID: + type: string + replicaAddressMap: + additionalProperties: + type: string + type: object + requestedBackupRestore: + type: string + requestedDataSource: + type: string + revisionCounterDisabled: + type: boolean + salvageRequested: + type: boolean + snapshotMaxCount: + type: integer + snapshotMaxSize: + format: int64 + type: string + unmapMarkSnapChainRemovedEnabled: + type: boolean + upgradedReplicaAddressMap: + additionalProperties: + type: string + type: object + volumeName: + type: string + volumeSize: + format: int64 + type: string + type: object + status: + description: EngineStatus defines the observed state of the Longhorn engine + properties: + backupStatus: + additionalProperties: + properties: + backupURL: + type: string + error: + type: string + progress: + type: integer + replicaAddress: + type: string + snapshotName: + type: string + state: + type: string + type: object + nullable: true + type: object + cloneStatus: + additionalProperties: + properties: + error: + type: string + fromReplicaAddress: + type: string + isCloning: + type: boolean + progress: + type: integer + snapshotName: + type: string + state: + type: string + type: object + nullable: true + type: object + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status + to another. + type: string + message: + description: Human-readable message indicating details about + last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's + last transition. + type: string + status: + description: |- + Status is the status of the condition. + Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + currentImage: + type: string + currentReplicaAddressMap: + additionalProperties: + type: string + nullable: true + type: object + currentSize: + format: int64 + type: string + currentState: + type: string + endpoint: + type: string + instanceManagerName: + type: string + ip: + type: string + isExpanding: + type: boolean + lastExpansionError: + type: string + lastExpansionFailedAt: + type: string + lastRestoredBackup: + type: string + logFetched: + type: boolean + ownerID: + type: string + port: + type: integer + purgeStatus: + additionalProperties: + properties: + error: + type: string + isPurging: + type: boolean + progress: + type: integer + state: + type: string + type: object + nullable: true + type: object + rebuildStatus: + additionalProperties: + properties: + error: + type: string + fromReplicaAddress: + type: string + isRebuilding: + type: boolean + progress: + type: integer + state: + type: string + type: object + nullable: true + type: object + replicaModeMap: + additionalProperties: + type: string + nullable: true + type: object + replicaTransitionTimeMap: + additionalProperties: + type: string + description: |- + ReplicaTransitionTimeMap records the time a replica in ReplicaModeMap transitions from one mode to another (or + from not being in the ReplicaModeMap to being in it). This information is sometimes required by other controllers + (e.g. the volume controller uses it to determine the correct value for replica.Spec.lastHealthyAt). + type: object + restoreStatus: + additionalProperties: + properties: + backupURL: + type: string + currentRestoringBackup: + type: string + error: + type: string + filename: + type: string + isRestoring: + type: boolean + lastRestored: + type: string + progress: + type: integer + state: + type: string + type: object + nullable: true + type: object + salvageExecuted: + type: boolean + snapshotMaxCount: + type: integer + snapshotMaxSize: + format: int64 + type: string + snapshots: + additionalProperties: + properties: + children: + additionalProperties: + type: boolean + nullable: true + type: object + created: + type: string + labels: + additionalProperties: + type: string + nullable: true + type: object + name: + type: string + parent: + type: string + removed: + type: boolean + size: + type: string + usercreated: + type: boolean + type: object + nullable: true + type: object + snapshotsError: + type: string + started: + type: boolean + storageIP: + type: string + unmapMarkSnapChainRemovedEnabled: + type: boolean + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: instancemanagers.longhorn.io +spec: + group: longhorn.io + names: + kind: InstanceManager + listKind: InstanceManagerList + plural: instancemanagers + shortNames: + - lhim + singular: instancemanager + preserveUnknownFields: false + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The state of the instance manager + jsonPath: .status.currentState + name: State + type: string + - description: The type of the instance manager (engine or replica) + jsonPath: .spec.type + name: Type + type: string + - description: The node that the instance manager is running on + jsonPath: .spec.nodeID + name: Node + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: InstanceManager is where Longhorn stores instance manager object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The data engine of the instance manager + jsonPath: .spec.dataEngine + name: Data Engine + type: string + - description: The state of the instance manager + jsonPath: .status.currentState + name: State + type: string + - description: The type of the instance manager (engine or replica) + jsonPath: .spec.type + name: Type + type: string + - description: The node that the instance manager is running on + jsonPath: .spec.nodeID + name: Node + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: InstanceManager is where Longhorn stores instance manager object. + 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 + metadata: + type: object + spec: + description: InstanceManagerSpec defines the desired state of the Longhorn + instance manager + properties: + dataEngine: + type: string + image: + type: string + nodeID: + type: string + type: + enum: + - aio + - engine + - replica + type: string + type: object + status: + description: InstanceManagerStatus defines the observed state of the Longhorn + instance manager + properties: + apiMinVersion: + type: integer + apiVersion: + type: integer + currentState: + type: string + instanceEngines: + additionalProperties: + properties: + spec: + properties: + backendStoreDriver: + description: Deprecated:Replaced by field `dataEngine`. + type: string + dataEngine: + type: string + name: + type: string + type: object + status: + properties: + conditions: + additionalProperties: + type: boolean + nullable: true + type: object + endpoint: + type: string + errorMsg: + type: string + listen: + type: string + portEnd: + format: int32 + type: integer + portStart: + format: int32 + type: integer + resourceVersion: + format: int64 + type: integer + state: + type: string + targetPortEnd: + format: int32 + type: integer + targetPortStart: + format: int32 + type: integer + type: + type: string + type: object + type: object + nullable: true + type: object + instanceReplicas: + additionalProperties: + properties: + spec: + properties: + backendStoreDriver: + description: Deprecated:Replaced by field `dataEngine`. + type: string + dataEngine: + type: string + name: + type: string + type: object + status: + properties: + conditions: + additionalProperties: + type: boolean + nullable: true + type: object + endpoint: + type: string + errorMsg: + type: string + listen: + type: string + portEnd: + format: int32 + type: integer + portStart: + format: int32 + type: integer + resourceVersion: + format: int64 + type: integer + state: + type: string + targetPortEnd: + format: int32 + type: integer + targetPortStart: + format: int32 + type: integer + type: + type: string + type: object + type: object + nullable: true + type: object + instances: + additionalProperties: + properties: + spec: + properties: + backendStoreDriver: + description: Deprecated:Replaced by field `dataEngine`. + type: string + dataEngine: + type: string + name: + type: string + type: object + status: + properties: + conditions: + additionalProperties: + type: boolean + nullable: true + type: object + endpoint: + type: string + errorMsg: + type: string + listen: + type: string + portEnd: + format: int32 + type: integer + portStart: + format: int32 + type: integer + resourceVersion: + format: int64 + type: integer + state: + type: string + targetPortEnd: + format: int32 + type: integer + targetPortStart: + format: int32 + type: integer + type: + type: string + type: object + type: object + description: 'Deprecated: Replaced by InstanceEngines and InstanceReplicas' + nullable: true + type: object + ip: + type: string + ownerID: + type: string + proxyApiMinVersion: + type: integer + proxyApiVersion: + type: integer + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: nodes.longhorn.io +spec: + conversion: + strategy: Webhook + webhook: + clientConfig: + service: + name: longhorn-conversion-webhook + namespace: {{ include "release_namespace" . }} + path: /v1/webhook/conversion + port: 9501 + conversionReviewVersions: + - v1beta2 + - v1beta1 + group: longhorn.io + names: + kind: Node + listKind: NodeList + plural: nodes + shortNames: + - lhn + singular: node + preserveUnknownFields: false + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: Indicate whether the node is ready + jsonPath: .status.conditions['Ready']['status'] + name: Ready + type: string + - description: Indicate whether the user disabled/enabled replica scheduling for + the node + jsonPath: .spec.allowScheduling + name: AllowScheduling + type: boolean + - description: Indicate whether Longhorn can schedule replicas on the node + jsonPath: .status.conditions['Schedulable']['status'] + name: Schedulable + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: Node is where Longhorn stores Longhorn node object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: Indicate whether the node is ready + jsonPath: .status.conditions[?(@.type=='Ready')].status + name: Ready + type: string + - description: Indicate whether the user disabled/enabled replica scheduling for + the node + jsonPath: .spec.allowScheduling + name: AllowScheduling + type: boolean + - description: Indicate whether Longhorn can schedule replicas on the node + jsonPath: .status.conditions[?(@.type=='Schedulable')].status + name: Schedulable + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: Node is where Longhorn stores Longhorn node object. + 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 + metadata: + type: object + spec: + description: NodeSpec defines the desired state of the Longhorn node + properties: + allowScheduling: + type: boolean + disks: + additionalProperties: + properties: + allowScheduling: + type: boolean + diskDriver: + enum: + - "" + - auto + - aio + type: string + diskType: + enum: + - filesystem + - block + type: string + evictionRequested: + type: boolean + path: + type: string + storageReserved: + format: int64 + type: integer + tags: + items: + type: string + type: array + type: object + type: object + evictionRequested: + type: boolean + instanceManagerCPURequest: + type: integer + name: + type: string + tags: + items: + type: string + type: array + type: object + status: + description: NodeStatus defines the observed state of the Longhorn node + properties: + autoEvicting: + type: boolean + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status + to another. + type: string + message: + description: Human-readable message indicating details about + last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's + last transition. + type: string + status: + description: |- + Status is the status of the condition. + Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + diskStatus: + additionalProperties: + properties: + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from + one status to another. + type: string + message: + description: Human-readable message indicating details + about last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the + condition's last transition. + type: string + status: + description: |- + Status is the status of the condition. + Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + diskDriver: + type: string + diskName: + type: string + diskPath: + type: string + diskType: + type: string + diskUUID: + type: string + filesystemType: + type: string + instanceManagerName: + type: string + scheduledReplica: + additionalProperties: + format: int64 + type: integer + nullable: true + type: object + storageAvailable: + format: int64 + type: integer + storageMaximum: + format: int64 + type: integer + storageScheduled: + format: int64 + type: integer + type: object + nullable: true + type: object + region: + type: string + snapshotCheckStatus: + properties: + lastPeriodicCheckedAt: + format: date-time + type: string + type: object + zone: + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: orphans.longhorn.io +spec: + group: longhorn.io + names: + kind: Orphan + listKind: OrphanList + plural: orphans + shortNames: + - lho + singular: orphan + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The type of the orphan + jsonPath: .spec.orphanType + name: Type + type: string + - description: The node that the orphan is on + jsonPath: .spec.nodeID + name: Node + type: string + name: v1beta2 + schema: + openAPIV3Schema: + description: Orphan is where Longhorn stores orphan object. + 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 + metadata: + type: object + spec: + description: OrphanSpec defines the desired state of the Longhorn orphaned + data + properties: + nodeID: + description: The node ID on which the controller is responsible to + reconcile this orphan CR. + type: string + orphanType: + description: |- + The type of the orphaned data. + Can be "replica". + type: string + parameters: + additionalProperties: + type: string + description: The parameters of the orphaned data + type: object + type: object + status: + description: OrphanStatus defines the observed state of the Longhorn orphaned + data + properties: + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status + to another. + type: string + message: + description: Human-readable message indicating details about + last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's + last transition. + type: string + status: + description: |- + Status is the status of the condition. + Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + ownerID: + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: recurringjobs.longhorn.io +spec: + group: longhorn.io + names: + kind: RecurringJob + listKind: RecurringJobList + plural: recurringjobs + shortNames: + - lhrj + singular: recurringjob + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: Sets groupings to the jobs. When set to "default" group will be + added to the volume label when no other job label exist in volume + jsonPath: .spec.groups + name: Groups + type: string + - description: Should be one of "backup" or "snapshot" + jsonPath: .spec.task + name: Task + type: string + - description: The cron expression represents recurring job scheduling + jsonPath: .spec.cron + name: Cron + type: string + - description: The number of snapshots/backups to keep for the volume + jsonPath: .spec.retain + name: Retain + type: integer + - description: The concurrent job to run by each cron job + jsonPath: .spec.concurrency + name: Concurrency + type: integer + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + - description: Specify the labels + jsonPath: .spec.labels + name: Labels + type: string + name: v1beta1 + schema: + openAPIV3Schema: + description: RecurringJob is where Longhorn stores recurring job object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: Sets groupings to the jobs. When set to "default" group will be + added to the volume label when no other job label exist in volume + jsonPath: .spec.groups + name: Groups + type: string + - description: Should be one of "snapshot", "snapshot-force-create", "snapshot-cleanup", + "snapshot-delete", "backup", "backup-force-create" or "filesystem-trim" + jsonPath: .spec.task + name: Task + type: string + - description: The cron expression represents recurring job scheduling + jsonPath: .spec.cron + name: Cron + type: string + - description: The number of snapshots/backups to keep for the volume + jsonPath: .spec.retain + name: Retain + type: integer + - description: The concurrent job to run by each cron job + jsonPath: .spec.concurrency + name: Concurrency + type: integer + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + - description: Specify the labels + jsonPath: .spec.labels + name: Labels + type: string + name: v1beta2 + schema: + openAPIV3Schema: + description: RecurringJob is where Longhorn stores recurring job object. + 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 + metadata: + type: object + spec: + description: RecurringJobSpec defines the desired state of the Longhorn + recurring job + properties: + concurrency: + description: The concurrency of taking the snapshot/backup. + type: integer + cron: + description: The cron setting. + type: string + groups: + description: The recurring job group. + items: + type: string + type: array + labels: + additionalProperties: + type: string + description: The label of the snapshot/backup. + type: object + name: + description: The recurring job name. + type: string + parameters: + additionalProperties: + type: string + description: |- + The parameters of the snapshot/backup. + Support parameters: "full-backup-interval". + type: object + retain: + description: The retain count of the snapshot/backup. + type: integer + task: + description: |- + The recurring job task. + Can be "snapshot", "snapshot-force-create", "snapshot-cleanup", "snapshot-delete", "backup", "backup-force-create" or "filesystem-trim" + enum: + - snapshot + - snapshot-force-create + - snapshot-cleanup + - snapshot-delete + - backup + - backup-force-create + - filesystem-trim + type: string + type: object + status: + description: RecurringJobStatus defines the observed state of the Longhorn + recurring job + properties: + executionCount: + description: The number of jobs that have been triggered. + type: integer + ownerID: + description: The owner ID which is responsible to reconcile this recurring + job CR. + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: replicas.longhorn.io +spec: + group: longhorn.io + names: + kind: Replica + listKind: ReplicaList + plural: replicas + shortNames: + - lhr + singular: replica + preserveUnknownFields: false + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The current state of the replica + jsonPath: .status.currentState + name: State + type: string + - description: The node that the replica is on + jsonPath: .spec.nodeID + name: Node + type: string + - description: The disk that the replica is on + jsonPath: .spec.diskID + name: Disk + type: string + - description: The instance manager of the replica + jsonPath: .status.instanceManagerName + name: InstanceManager + type: string + - description: The current image of the replica + jsonPath: .status.currentImage + name: Image + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: Replica is where Longhorn stores replica object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The data engine of the replica + jsonPath: .spec.dataEngine + name: Data Engine + type: string + - description: The current state of the replica + jsonPath: .status.currentState + name: State + type: string + - description: The node that the replica is on + jsonPath: .spec.nodeID + name: Node + type: string + - description: The disk that the replica is on + jsonPath: .spec.diskID + name: Disk + type: string + - description: The instance manager of the replica + jsonPath: .status.instanceManagerName + name: InstanceManager + type: string + - description: The current image of the replica + jsonPath: .status.currentImage + name: Image + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: Replica is where Longhorn stores replica object. + 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 + metadata: + type: object + spec: + description: ReplicaSpec defines the desired state of the Longhorn replica + properties: + active: + type: boolean + backendStoreDriver: + description: Deprecated:Replaced by field `dataEngine`. + type: string + backingImage: + type: string + dataDirectoryName: + type: string + dataEngine: + enum: + - v1 + - v2 + type: string + desireState: + type: string + diskID: + type: string + diskPath: + type: string + engineImage: + description: 'Deprecated: Replaced by field `image`.' + type: string + engineName: + type: string + evictionRequested: + type: boolean + failedAt: + description: |- + FailedAt is set when a running replica fails or when a running engine is unable to use a replica for any reason. + FailedAt indicates the time the failure occurred. When FailedAt is set, a replica is likely to have useful + (though possibly stale) data. A replica with FailedAt set must be rebuilt from a non-failed replica (or it can + be used in a salvage if all replicas are failed). FailedAt is cleared before a rebuild or salvage. FailedAt may + be later than the corresponding entry in an engine's replicaTransitionTimeMap because it is set when the volume + controller acknowledges the change. + type: string + hardNodeAffinity: + type: string + healthyAt: + description: |- + HealthyAt is set the first time a replica becomes read/write in an engine after creation or rebuild. HealthyAt + indicates the time the last successful rebuild occurred. When HealthyAt is set, a replica is likely to have + useful (though possibly stale) data. HealthyAt is cleared before a rebuild. HealthyAt may be later than the + corresponding entry in an engine's replicaTransitionTimeMap because it is set when the volume controller + acknowledges the change. + type: string + image: + type: string + lastFailedAt: + description: |- + LastFailedAt is always set at the same time as FailedAt. Unlike FailedAt, LastFailedAt is never cleared. + LastFailedAt is not a reliable indicator of the state of a replica's data. For example, a replica with + LastFailedAt may already be healthy and in use again. However, because it is never cleared, it can be compared to + LastHealthyAt to help prevent dangerous replica deletion in some corner cases. LastFailedAt may be later than the + corresponding entry in an engine's replicaTransitionTimeMap because it is set when the volume controller + acknowledges the change. + type: string + lastHealthyAt: + description: |- + LastHealthyAt is set every time a replica becomes read/write in an engine. Unlike HealthyAt, LastHealthyAt is + never cleared. LastHealthyAt is not a reliable indicator of the state of a replica's data. For example, a + replica with LastHealthyAt set may be in the middle of a rebuild. However, because it is never cleared, it can be + compared to LastFailedAt to help prevent dangerous replica deletion in some corner cases. LastHealthyAt may be + later than the corresponding entry in an engine's replicaTransitionTimeMap because it is set when the volume + controller acknowledges the change. + type: string + logRequested: + type: boolean + nodeID: + type: string + rebuildRetryCount: + type: integer + revisionCounterDisabled: + type: boolean + salvageRequested: + type: boolean + snapshotMaxCount: + type: integer + snapshotMaxSize: + format: int64 + type: string + unmapMarkDiskChainRemovedEnabled: + type: boolean + volumeName: + type: string + volumeSize: + format: int64 + type: string + type: object + status: + description: ReplicaStatus defines the observed state of the Longhorn + replica + properties: + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status + to another. + type: string + message: + description: Human-readable message indicating details about + last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's + last transition. + type: string + status: + description: |- + Status is the status of the condition. + Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + currentImage: + type: string + currentState: + type: string + evictionRequested: + description: 'Deprecated: Replaced by field `spec.evictionRequested`.' + type: boolean + instanceManagerName: + type: string + ip: + type: string + logFetched: + type: boolean + ownerID: + type: string + port: + type: integer + salvageExecuted: + type: boolean + started: + type: boolean + storageIP: + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: settings.longhorn.io +spec: + group: longhorn.io + names: + kind: Setting + listKind: SettingList + plural: settings + shortNames: + - lhs + singular: setting + preserveUnknownFields: false + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The value of the setting + jsonPath: .value + name: Value + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: Setting is where Longhorn stores setting object. + 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 + metadata: + type: object + value: + type: string + required: + - value + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The value of the setting + jsonPath: .value + name: Value + type: string + - description: The setting is applied + jsonPath: .status.applied + name: Applied + type: boolean + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: Setting is where Longhorn stores setting object. + 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 + metadata: + type: object + status: + description: The status of the setting. + properties: + applied: + description: The setting is applied. + type: boolean + required: + - applied + type: object + value: + description: The value of the setting. + type: string + required: + - value + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: sharemanagers.longhorn.io +spec: + group: longhorn.io + names: + kind: ShareManager + listKind: ShareManagerList + plural: sharemanagers + shortNames: + - lhsm + singular: sharemanager + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The state of the share manager + jsonPath: .status.state + name: State + type: string + - description: The node that the share manager is owned by + jsonPath: .status.ownerID + name: Node + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: ShareManager is where Longhorn stores share manager object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The state of the share manager + jsonPath: .status.state + name: State + type: string + - description: The node that the share manager is owned by + jsonPath: .status.ownerID + name: Node + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: ShareManager is where Longhorn stores share manager object. + 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 + metadata: + type: object + spec: + description: ShareManagerSpec defines the desired state of the Longhorn + share manager + properties: + image: + description: Share manager image used for creating a share manager + pod + type: string + type: object + status: + description: ShareManagerStatus defines the observed state of the Longhorn + share manager + properties: + endpoint: + description: NFS endpoint that can access the mounted filesystem of + the volume + type: string + ownerID: + description: The node ID on which the controller is responsible to + reconcile this share manager resource + type: string + state: + description: The state of the share manager resource + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: snapshots.longhorn.io +spec: + group: longhorn.io + names: + kind: Snapshot + listKind: SnapshotList + plural: snapshots + shortNames: + - lhsnap + singular: snapshot + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The volume that this snapshot belongs to + jsonPath: .spec.volume + name: Volume + type: string + - description: Timestamp when the point-in-time snapshot was taken + jsonPath: .status.creationTime + name: CreationTime + type: string + - description: Indicates if the snapshot is ready to be used to restore/backup + a volume + jsonPath: .status.readyToUse + name: ReadyToUse + type: boolean + - description: Represents the minimum size of volume required to rehydrate from + this snapshot + jsonPath: .status.restoreSize + name: RestoreSize + type: string + - description: The actual size of the snapshot + jsonPath: .status.size + name: Size + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: Snapshot is the Schema for the snapshots API + 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 + metadata: + type: object + spec: + description: SnapshotSpec defines the desired state of Longhorn Snapshot + properties: + createSnapshot: + description: require creating a new snapshot + type: boolean + labels: + additionalProperties: + type: string + description: The labels of snapshot + nullable: true + type: object + volume: + description: |- + the volume that this snapshot belongs to. + This field is immutable after creation. + Required + type: string + required: + - volume + type: object + status: + description: SnapshotStatus defines the observed state of Longhorn Snapshot + properties: + checksum: + type: string + children: + additionalProperties: + type: boolean + nullable: true + type: object + creationTime: + type: string + error: + type: string + labels: + additionalProperties: + type: string + nullable: true + type: object + markRemoved: + type: boolean + ownerID: + type: string + parent: + type: string + readyToUse: + type: boolean + restoreSize: + format: int64 + type: integer + size: + format: int64 + type: integer + userCreated: + type: boolean + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: supportbundles.longhorn.io +spec: + group: longhorn.io + names: + kind: SupportBundle + listKind: SupportBundleList + plural: supportbundles + shortNames: + - lhbundle + singular: supportbundle + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The state of the support bundle + jsonPath: .status.state + name: State + type: string + - description: The issue URL + jsonPath: .spec.issueURL + name: Issue + type: string + - description: A brief description of the issue + jsonPath: .spec.description + name: Description + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: SupportBundle is where Longhorn stores support bundle object + 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 + metadata: + type: object + spec: + description: SupportBundleSpec defines the desired state of the Longhorn + SupportBundle + properties: + description: + description: A brief description of the issue + type: string + issueURL: + description: The issue URL + nullable: true + type: string + nodeID: + description: The preferred responsible controller node ID. + type: string + required: + - description + type: object + status: + description: SupportBundleStatus defines the observed state of the Longhorn + SupportBundle + properties: + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status + to another. + type: string + message: + description: Human-readable message indicating details about + last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's + last transition. + type: string + status: + description: |- + Status is the status of the condition. + Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + type: array + filename: + type: string + filesize: + format: int64 + type: integer + image: + description: The support bundle manager image + type: string + managerIP: + description: The support bundle manager IP + type: string + ownerID: + description: The current responsible controller node ID + type: string + progress: + type: integer + state: + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: systembackups.longhorn.io +spec: + group: longhorn.io + names: + kind: SystemBackup + listKind: SystemBackupList + plural: systembackups + shortNames: + - lhsb + singular: systembackup + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The system backup Longhorn version + jsonPath: .status.version + name: Version + type: string + - description: The system backup state + jsonPath: .status.state + name: State + type: string + - description: The system backup creation time + jsonPath: .status.createdAt + name: Created + type: string + - description: The last time that the system backup was synced into the cluster + jsonPath: .status.lastSyncedAt + name: LastSyncedAt + type: string + name: v1beta2 + schema: + openAPIV3Schema: + description: SystemBackup is where Longhorn stores system backup object + 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 + metadata: + type: object + spec: + description: SystemBackupSpec defines the desired state of the Longhorn + SystemBackup + properties: + volumeBackupPolicy: + description: |- + The create volume backup policy + Can be "if-not-present", "always" or "disabled" + nullable: true + type: string + type: object + status: + description: SystemBackupStatus defines the observed state of the Longhorn + SystemBackup + properties: + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status + to another. + type: string + message: + description: Human-readable message indicating details about + last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's + last transition. + type: string + status: + description: |- + Status is the status of the condition. + Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + createdAt: + description: The system backup creation time. + format: date-time + type: string + gitCommit: + description: The saved Longhorn manager git commit. + nullable: true + type: string + lastSyncedAt: + description: The last time that the system backup was synced into + the cluster. + format: date-time + nullable: true + type: string + managerImage: + description: The saved manager image. + type: string + ownerID: + description: The node ID of the responsible controller to reconcile + this SystemBackup. + type: string + state: + description: The system backup state. + type: string + version: + description: The saved Longhorn version. + nullable: true + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: systemrestores.longhorn.io +spec: + group: longhorn.io + names: + kind: SystemRestore + listKind: SystemRestoreList + plural: systemrestores + shortNames: + - lhsr + singular: systemrestore + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The system restore state + jsonPath: .status.state + name: State + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: SystemRestore is where Longhorn stores system restore object + 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 + metadata: + type: object + spec: + description: SystemRestoreSpec defines the desired state of the Longhorn + SystemRestore + properties: + systemBackup: + description: The system backup name in the object store. + type: string + required: + - systemBackup + type: object + status: + description: SystemRestoreStatus defines the observed state of the Longhorn + SystemRestore + properties: + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status + to another. + type: string + message: + description: Human-readable message indicating details about + last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's + last transition. + type: string + status: + description: |- + Status is the status of the condition. + Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + ownerID: + description: The node ID of the responsible controller to reconcile + this SystemRestore. + type: string + sourceURL: + description: The source system backup URL. + type: string + state: + description: The system restore state. + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: volumeattachments.longhorn.io +spec: + group: longhorn.io + names: + kind: VolumeAttachment + listKind: VolumeAttachmentList + plural: volumeattachments + shortNames: + - lhva + singular: volumeattachment + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: VolumeAttachment stores attachment information of a Longhorn + volume + 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 + metadata: + type: object + spec: + description: VolumeAttachmentSpec defines the desired state of Longhorn + VolumeAttachment + properties: + attachmentTickets: + additionalProperties: + properties: + generation: + description: |- + A sequence number representing a specific generation of the desired state. + Populated by the system. Read-only. + format: int64 + type: integer + id: + description: The unique ID of this attachment. Used to differentiate + different attachments of the same volume. + type: string + nodeID: + description: The node that this attachment is requesting + type: string + parameters: + additionalProperties: + type: string + description: Optional additional parameter for this attachment + type: object + type: + type: string + type: object + type: object + volume: + description: The name of Longhorn volume of this VolumeAttachment + type: string + required: + - volume + type: object + status: + description: VolumeAttachmentStatus defines the observed state of Longhorn + VolumeAttachment + properties: + attachmentTicketStatuses: + additionalProperties: + properties: + conditions: + description: Record any error when trying to fulfill this attachment + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from + one status to another. + type: string + message: + description: Human-readable message indicating details + about last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the + condition's last transition. + type: string + status: + description: |- + Status is the status of the condition. + Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + generation: + description: |- + A sequence number representing a specific generation of the desired state. + Populated by the system. Read-only. + format: int64 + type: integer + id: + description: The unique ID of this attachment. Used to differentiate + different attachments of the same volume. + type: string + satisfied: + description: Indicate whether this attachment ticket has been + satisfied + type: boolean + required: + - conditions + - satisfied + type: object + type: object + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: volumes.longhorn.io +spec: + conversion: + strategy: Webhook + webhook: + clientConfig: + service: + name: longhorn-conversion-webhook + namespace: {{ include "release_namespace" . }} + path: /v1/webhook/conversion + port: 9501 + conversionReviewVersions: + - v1beta2 + - v1beta1 + group: longhorn.io + names: + kind: Volume + listKind: VolumeList + plural: volumes + shortNames: + - lhv + singular: volume + preserveUnknownFields: false + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The state of the volume + jsonPath: .status.state + name: State + type: string + - description: The robustness of the volume + jsonPath: .status.robustness + name: Robustness + type: string + - description: The scheduled condition of the volume + jsonPath: .status.conditions['scheduled']['status'] + name: Scheduled + type: string + - description: The size of the volume + jsonPath: .spec.size + name: Size + type: string + - description: The node that the volume is currently attaching to + jsonPath: .status.currentNodeID + name: Node + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: Volume is where Longhorn stores volume object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The data engine of the volume + jsonPath: .spec.dataEngine + name: Data Engine + type: string + - description: The state of the volume + jsonPath: .status.state + name: State + type: string + - description: The robustness of the volume + jsonPath: .status.robustness + name: Robustness + type: string + - description: The scheduled condition of the volume + jsonPath: .status.conditions[?(@.type=='Schedulable')].status + name: Scheduled + type: string + - description: The size of the volume + jsonPath: .spec.size + name: Size + type: string + - description: The node that the volume is currently attaching to + jsonPath: .status.currentNodeID + name: Node + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: Volume is where Longhorn stores volume object. + 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 + metadata: + type: object + spec: + description: VolumeSpec defines the desired state of the Longhorn volume + properties: + Standby: + type: boolean + accessMode: + enum: + - rwo + - rwx + type: string + backendStoreDriver: + description: Deprecated:Replaced by field `dataEngine`.' + type: string + backingImage: + type: string + backupCompressionMethod: + enum: + - none + - lz4 + - gzip + type: string + dataEngine: + enum: + - v1 + - v2 + type: string + dataLocality: + enum: + - disabled + - best-effort + - strict-local + type: string + dataSource: + type: string + disableFrontend: + type: boolean + diskSelector: + items: + type: string + type: array + encrypted: + type: boolean + engineImage: + description: 'Deprecated: Replaced by field `image`.' + type: string + freezeFilesystemForSnapshot: + description: Setting that freezes the filesystem on the root partition + before a snapshot is created. + enum: + - ignored + - enabled + - disabled + type: string + fromBackup: + type: string + frontend: + enum: + - blockdev + - iscsi + - nvmf + - "" + type: string + image: + type: string + lastAttachedBy: + type: string + migratable: + type: boolean + migrationNodeID: + type: string + nodeID: + type: string + nodeSelector: + items: + type: string + type: array + numberOfReplicas: + type: integer + replicaAutoBalance: + enum: + - ignored + - disabled + - least-effort + - best-effort + type: string + replicaDiskSoftAntiAffinity: + description: Replica disk soft anti affinity of the volume. Set enabled + to allow replicas to be scheduled in the same disk. + enum: + - ignored + - enabled + - disabled + type: string + replicaSoftAntiAffinity: + description: Replica soft anti affinity of the volume. Set enabled + to allow replicas to be scheduled on the same node. + enum: + - ignored + - enabled + - disabled + type: string + replicaZoneSoftAntiAffinity: + description: Replica zone soft anti affinity of the volume. Set enabled + to allow replicas to be scheduled in the same zone. + enum: + - ignored + - enabled + - disabled + type: string + restoreVolumeRecurringJob: + enum: + - ignored + - enabled + - disabled + type: string + revisionCounterDisabled: + type: boolean + size: + format: int64 + type: string + snapshotDataIntegrity: + enum: + - ignored + - disabled + - enabled + - fast-check + type: string + snapshotMaxCount: + type: integer + snapshotMaxSize: + format: int64 + type: string + staleReplicaTimeout: + type: integer + unmapMarkSnapChainRemoved: + enum: + - ignored + - disabled + - enabled + type: string + type: object + status: + description: VolumeStatus defines the observed state of the Longhorn volume + properties: + actualSize: + format: int64 + type: integer + cloneStatus: + properties: + attemptCount: + type: integer + nextAllowedAttemptAt: + type: string + snapshot: + type: string + sourceVolume: + type: string + state: + type: string + type: object + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status + to another. + type: string + message: + description: Human-readable message indicating details about + last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's + last transition. + type: string + status: + description: |- + Status is the status of the condition. + Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + currentImage: + type: string + currentMigrationNodeID: + description: the node that this volume is currently migrating to + type: string + currentNodeID: + type: string + expansionRequired: + type: boolean + frontendDisabled: + type: boolean + isStandby: + type: boolean + kubernetesStatus: + properties: + lastPVCRefAt: + type: string + lastPodRefAt: + type: string + namespace: + description: determine if PVC/Namespace is history or not + type: string + pvName: + type: string + pvStatus: + type: string + pvcName: + type: string + workloadsStatus: + description: determine if Pod/Workload is history or not + items: + properties: + podName: + type: string + podStatus: + type: string + workloadName: + type: string + workloadType: + type: string + type: object + nullable: true + type: array + type: object + lastBackup: + type: string + lastBackupAt: + type: string + lastDegradedAt: + type: string + ownerID: + type: string + pendingNodeID: + description: Deprecated. + type: string + remountRequestedAt: + type: string + restoreInitiated: + type: boolean + restoreRequired: + type: boolean + robustness: + type: string + shareEndpoint: + type: string + shareState: + type: string + state: + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} diff --git a/charts/longhorn-crd/104.2.1+up1.7.2/Chart.yaml b/charts/longhorn-crd/104.2.1+up1.7.2/Chart.yaml new file mode 100644 index 0000000000..0b02611274 --- /dev/null +++ b/charts/longhorn-crd/104.2.1+up1.7.2/Chart.yaml @@ -0,0 +1,11 @@ +annotations: + catalog.cattle.io/certified: rancher + catalog.cattle.io/hidden: "true" + catalog.cattle.io/namespace: longhorn-system + catalog.cattle.io/release-name: longhorn-crd +apiVersion: v1 +appVersion: v1.7.2 +description: Installs the CRDs for longhorn. +name: longhorn-crd +type: application +version: 104.2.1+up1.7.2 diff --git a/charts/longhorn-crd/104.2.1+up1.7.2/README.md b/charts/longhorn-crd/104.2.1+up1.7.2/README.md new file mode 100644 index 0000000000..d9f7f14b33 --- /dev/null +++ b/charts/longhorn-crd/104.2.1+up1.7.2/README.md @@ -0,0 +1,2 @@ +# longhorn-crd +A Rancher chart that installs the CRDs used by longhorn. diff --git a/charts/longhorn-crd/104.2.1+up1.7.2/templates/_helpers.tpl b/charts/longhorn-crd/104.2.1+up1.7.2/templates/_helpers.tpl new file mode 100644 index 0000000000..3fbc2ac02f --- /dev/null +++ b/charts/longhorn-crd/104.2.1+up1.7.2/templates/_helpers.tpl @@ -0,0 +1,66 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "longhorn.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +*/}} +{{- define "longhorn.fullname" -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} + + +{{- define "longhorn.managerIP" -}} +{{- $fullname := (include "longhorn.fullname" .) -}} +{{- printf "http://%s-backend:9500" $fullname | trunc 63 | trimSuffix "-" -}} +{{- end -}} + + +{{- define "secret" }} +{{- printf "{\"auths\": {\"%s\": {\"auth\": \"%s\"}}}" .Values.privateRegistry.registryUrl (printf "%s:%s" .Values.privateRegistry.registryUser .Values.privateRegistry.registryPasswd | b64enc) | b64enc }} +{{- end }} + +{{- /* +longhorn.labels generates the standard Helm labels. +*/ -}} +{{- define "longhorn.labels" -}} +app.kubernetes.io/name: {{ template "longhorn.name" . }} +helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +app.kubernetes.io/instance: {{ .Release.Name }} +app.kubernetes.io/version: {{ .Chart.AppVersion }} +{{- end -}} + + +{{- define "system_default_registry" -}} +{{- if .Values.global.cattle.systemDefaultRegistry -}} +{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} +{{- else -}} +{{- "" -}} +{{- end -}} +{{- end -}} + +{{- define "registry_url" -}} +{{- if .Values.privateRegistry.registryUrl -}} +{{- printf "%s/" .Values.privateRegistry.registryUrl -}} +{{- else -}} +{{ include "system_default_registry" . }} +{{- end -}} +{{- end -}} + +{{- /* + define the longhorn release namespace +*/ -}} +{{- define "release_namespace" -}} +{{- if .Values.namespaceOverride -}} +{{- .Values.namespaceOverride -}} +{{- else -}} +{{- .Release.Namespace -}} +{{- end -}} +{{- end -}} diff --git a/charts/longhorn-crd/104.2.1+up1.7.2/templates/crds.yaml b/charts/longhorn-crd/104.2.1+up1.7.2/templates/crds.yaml new file mode 100644 index 0000000000..3b78dd7ad3 --- /dev/null +++ b/charts/longhorn-crd/104.2.1+up1.7.2/templates/crds.yaml @@ -0,0 +1,4400 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: backingimagedatasources.longhorn.io +spec: + group: longhorn.io + names: + kind: BackingImageDataSource + listKind: BackingImageDataSourceList + plural: backingimagedatasources + shortNames: + - lhbids + singular: backingimagedatasource + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The current state of the pod used to provision the backing image + file from source + jsonPath: .status.currentState + name: State + type: string + - description: The data source type + jsonPath: .spec.sourceType + name: SourceType + type: string + - description: The node the backing image file will be prepared on + jsonPath: .spec.nodeID + name: Node + type: string + - description: The disk the backing image file will be prepared on + jsonPath: .spec.diskUUID + name: DiskUUID + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: BackingImageDataSource is where Longhorn stores backing image + data source object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The system generated UUID of the provisioned backing image file + jsonPath: .spec.uuid + name: UUID + type: string + - description: The current state of the pod used to provision the backing image + file from source + jsonPath: .status.currentState + name: State + type: string + - description: The data source type + jsonPath: .spec.sourceType + name: SourceType + type: string + - description: The backing image file size + jsonPath: .status.size + name: Size + type: string + - description: The node the backing image file will be prepared on + jsonPath: .spec.nodeID + name: Node + type: string + - description: The disk the backing image file will be prepared on + jsonPath: .spec.diskUUID + name: DiskUUID + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: BackingImageDataSource is where Longhorn stores backing image + data source object. + 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 + metadata: + type: object + spec: + description: BackingImageDataSourceSpec defines the desired state of the + Longhorn backing image data source + properties: + checksum: + type: string + diskPath: + type: string + diskUUID: + type: string + fileTransferred: + type: boolean + nodeID: + type: string + parameters: + additionalProperties: + type: string + type: object + sourceType: + enum: + - download + - upload + - export-from-volume + - restore + - clone + type: string + uuid: + type: string + type: object + status: + description: BackingImageDataSourceStatus defines the observed state of + the Longhorn backing image data source + properties: + checksum: + type: string + currentState: + type: string + ip: + type: string + message: + type: string + ownerID: + type: string + progress: + type: integer + runningParameters: + additionalProperties: + type: string + nullable: true + type: object + size: + format: int64 + type: integer + storageIP: + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: backingimagemanagers.longhorn.io +spec: + group: longhorn.io + names: + kind: BackingImageManager + listKind: BackingImageManagerList + plural: backingimagemanagers + shortNames: + - lhbim + singular: backingimagemanager + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The current state of the manager + jsonPath: .status.currentState + name: State + type: string + - description: The image the manager pod will use + jsonPath: .spec.image + name: Image + type: string + - description: The node the manager is on + jsonPath: .spec.nodeID + name: Node + type: string + - description: The disk the manager is responsible for + jsonPath: .spec.diskUUID + name: DiskUUID + type: string + - description: The disk path the manager is using + jsonPath: .spec.diskPath + name: DiskPath + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: BackingImageManager is where Longhorn stores backing image manager + object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The current state of the manager + jsonPath: .status.currentState + name: State + type: string + - description: The image the manager pod will use + jsonPath: .spec.image + name: Image + type: string + - description: The node the manager is on + jsonPath: .spec.nodeID + name: Node + type: string + - description: The disk the manager is responsible for + jsonPath: .spec.diskUUID + name: DiskUUID + type: string + - description: The disk path the manager is using + jsonPath: .spec.diskPath + name: DiskPath + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: BackingImageManager is where Longhorn stores backing image manager + object. + 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 + metadata: + type: object + spec: + description: BackingImageManagerSpec defines the desired state of the + Longhorn backing image manager + properties: + backingImages: + additionalProperties: + type: string + type: object + diskPath: + type: string + diskUUID: + type: string + image: + type: string + nodeID: + type: string + type: object + status: + description: BackingImageManagerStatus defines the observed state of the + Longhorn backing image manager + properties: + apiMinVersion: + type: integer + apiVersion: + type: integer + backingImageFileMap: + additionalProperties: + properties: + currentChecksum: + type: string + message: + type: string + name: + type: string + progress: + type: integer + senderManagerAddress: + type: string + sendingReference: + type: integer + size: + format: int64 + type: integer + state: + type: string + uuid: + type: string + virtualSize: + format: int64 + type: integer + type: object + nullable: true + type: object + currentState: + type: string + ip: + type: string + ownerID: + type: string + storageIP: + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: backingimages.longhorn.io +spec: + conversion: + strategy: Webhook + webhook: + clientConfig: + service: + name: longhorn-conversion-webhook + namespace: {{ include "release_namespace" . }} + path: /v1/webhook/conversion + port: 9501 + conversionReviewVersions: + - v1beta2 + - v1beta1 + group: longhorn.io + names: + kind: BackingImage + listKind: BackingImageList + plural: backingimages + shortNames: + - lhbi + singular: backingimage + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The backing image name + jsonPath: .spec.image + name: Image + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: BackingImage is where Longhorn stores backing image object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The system generated UUID + jsonPath: .status.uuid + name: UUID + type: string + - description: The source of the backing image file data + jsonPath: .spec.sourceType + name: SourceType + type: string + - description: The backing image file size in each disk + jsonPath: .status.size + name: Size + type: string + - description: The virtual size of the image (may be larger than file size) + jsonPath: .status.virtualSize + name: VirtualSize + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: BackingImage is where Longhorn stores backing image object. + 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 + metadata: + type: object + spec: + description: BackingImageSpec defines the desired state of the Longhorn + backing image + properties: + checksum: + type: string + diskFileSpecMap: + additionalProperties: + properties: + evictionRequested: + type: boolean + type: object + type: object + diskSelector: + items: + type: string + type: array + disks: + additionalProperties: + type: string + description: Deprecated. We are now using DiskFileSpecMap to assign + different spec to the file on different disks. + type: object + minNumberOfCopies: + type: integer + nodeSelector: + items: + type: string + type: array + secret: + type: string + secretNamespace: + type: string + sourceParameters: + additionalProperties: + type: string + type: object + sourceType: + enum: + - download + - upload + - export-from-volume + - restore + - clone + type: string + type: object + status: + description: BackingImageStatus defines the observed state of the Longhorn + backing image status + properties: + checksum: + type: string + diskFileStatusMap: + additionalProperties: + properties: + lastStateTransitionTime: + type: string + message: + type: string + progress: + type: integer + state: + type: string + type: object + nullable: true + type: object + diskLastRefAtMap: + additionalProperties: + type: string + nullable: true + type: object + ownerID: + type: string + size: + format: int64 + type: integer + uuid: + type: string + virtualSize: + description: Virtual size of image, which may be larger than physical + size. Will be zero until known (e.g. while a backing image is uploading) + format: int64 + type: integer + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: backupbackingimages.longhorn.io +spec: + group: longhorn.io + names: + kind: BackupBackingImage + listKind: BackupBackingImageList + plural: backupbackingimages + shortNames: + - lhbbi + singular: backupbackingimage + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The backing image name + jsonPath: .status.backingImage + name: BackingImage + type: string + - description: The backing image size + jsonPath: .status.size + name: Size + type: string + - description: The backing image backup upload finished time + jsonPath: .status.backupCreatedAt + name: BackupCreatedAt + type: string + - description: The backing image backup state + jsonPath: .status.state + name: State + type: string + - description: The last synced time + jsonPath: .status.lastSyncedAt + name: LastSyncedAt + type: string + name: v1beta2 + schema: + openAPIV3Schema: + description: BackupBackingImage is where Longhorn stores backing image backup + object. + 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 + metadata: + type: object + spec: + description: BackupBackingImageSpec defines the desired state of the Longhorn + backing image backup + properties: + labels: + additionalProperties: + type: string + description: The labels of backing image backup. + type: object + syncRequestedAt: + description: The time to request run sync the remote backing image + backup. + format: date-time + nullable: true + type: string + userCreated: + description: |- + Is this CR created by user through API or UI. + Required + type: boolean + required: + - userCreated + type: object + status: + description: BackupBackingImageStatus defines the observed state of the + Longhorn backing image backup + properties: + backingImage: + description: The backing image name. + type: string + backupCreatedAt: + description: The backing image backup upload finished time. + type: string + checksum: + description: The checksum of the backing image. + type: string + compressionMethod: + description: Compression method + type: string + error: + description: The error message when taking the backing image backup. + type: string + labels: + additionalProperties: + type: string + description: The labels of backing image backup. + nullable: true + type: object + lastSyncedAt: + description: The last time that the backing image backup was synced + with the remote backup target. + format: date-time + nullable: true + type: string + managerAddress: + description: The address of the backing image manager that runs backing + image backup. + type: string + messages: + additionalProperties: + type: string + description: The error messages when listing or inspecting backing + image backup. + nullable: true + type: object + ownerID: + description: The node ID on which the controller is responsible to + reconcile this CR. + type: string + progress: + description: The backing image backup progress. + type: integer + size: + description: The backing image size. + format: int64 + type: integer + state: + description: |- + The backing image backup creation state. + Can be "", "InProgress", "Completed", "Error", "Unknown". + type: string + url: + description: The backing image backup URL. + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: backups.longhorn.io +spec: + group: longhorn.io + names: + kind: Backup + listKind: BackupList + plural: backups + shortNames: + - lhb + singular: backup + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The snapshot name + jsonPath: .status.snapshotName + name: SnapshotName + type: string + - description: The snapshot size + jsonPath: .status.size + name: SnapshotSize + type: string + - description: The snapshot creation time + jsonPath: .status.snapshotCreatedAt + name: SnapshotCreatedAt + type: string + - description: The backup state + jsonPath: .status.state + name: State + type: string + - description: The backup last synced time + jsonPath: .status.lastSyncedAt + name: LastSyncedAt + type: string + name: v1beta1 + schema: + openAPIV3Schema: + description: Backup is where Longhorn stores backup object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The snapshot name + jsonPath: .status.snapshotName + name: SnapshotName + type: string + - description: The snapshot size + jsonPath: .status.size + name: SnapshotSize + type: string + - description: The snapshot creation time + jsonPath: .status.snapshotCreatedAt + name: SnapshotCreatedAt + type: string + - description: The backup state + jsonPath: .status.state + name: State + type: string + - description: The backup last synced time + jsonPath: .status.lastSyncedAt + name: LastSyncedAt + type: string + name: v1beta2 + schema: + openAPIV3Schema: + description: Backup is where Longhorn stores backup object. + 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 + metadata: + type: object + spec: + description: BackupSpec defines the desired state of the Longhorn backup + properties: + backupMode: + description: |- + The backup mode of this backup. + Can be "full" or "incremental" + enum: + - full + - incremental + - "" + type: string + labels: + additionalProperties: + type: string + description: The labels of snapshot backup. + type: object + snapshotName: + description: The snapshot name. + type: string + syncRequestedAt: + description: The time to request run sync the remote backup. + format: date-time + nullable: true + type: string + type: object + status: + description: BackupStatus defines the observed state of the Longhorn backup + properties: + backupCreatedAt: + description: The snapshot backup upload finished time. + type: string + compressionMethod: + description: Compression method + type: string + error: + description: The error message when taking the snapshot backup. + type: string + labels: + additionalProperties: + type: string + description: The labels of snapshot backup. + nullable: true + type: object + lastSyncedAt: + description: The last time that the backup was synced with the remote + backup target. + format: date-time + nullable: true + type: string + messages: + additionalProperties: + type: string + description: The error messages when calling longhorn engine on listing + or inspecting backups. + nullable: true + type: object + newlyUploadDataSize: + description: Size in bytes of newly uploaded data + type: string + ownerID: + description: The node ID on which the controller is responsible to + reconcile this backup CR. + type: string + progress: + description: The snapshot backup progress. + type: integer + reUploadedDataSize: + description: Size in bytes of reuploaded data + type: string + replicaAddress: + description: The address of the replica that runs snapshot backup. + type: string + size: + description: The snapshot size. + type: string + snapshotCreatedAt: + description: The snapshot creation time. + type: string + snapshotName: + description: The snapshot name. + type: string + state: + description: |- + The backup creation state. + Can be "", "InProgress", "Completed", "Error", "Unknown". + type: string + url: + description: The snapshot backup URL. + type: string + volumeBackingImageName: + description: The volume's backing image name. + type: string + volumeCreated: + description: The volume creation time. + type: string + volumeName: + description: The volume name. + type: string + volumeSize: + description: The volume size. + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: backuptargets.longhorn.io +spec: + conversion: + strategy: Webhook + webhook: + clientConfig: + service: + name: longhorn-conversion-webhook + namespace: {{ include "release_namespace" . }} + path: /v1/webhook/conversion + port: 9501 + conversionReviewVersions: + - v1beta2 + - v1beta1 + group: longhorn.io + names: + kind: BackupTarget + listKind: BackupTargetList + plural: backuptargets + shortNames: + - lhbt + singular: backuptarget + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The backup target URL + jsonPath: .spec.backupTargetURL + name: URL + type: string + - description: The backup target credential secret + jsonPath: .spec.credentialSecret + name: Credential + type: string + - description: The backup target poll interval + jsonPath: .spec.pollInterval + name: LastBackupAt + type: string + - description: Indicate whether the backup target is available or not + jsonPath: .status.available + name: Available + type: boolean + - description: The backup target last synced time + jsonPath: .status.lastSyncedAt + name: LastSyncedAt + type: string + name: v1beta1 + schema: + openAPIV3Schema: + description: BackupTarget is where Longhorn stores backup target object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The backup target URL + jsonPath: .spec.backupTargetURL + name: URL + type: string + - description: The backup target credential secret + jsonPath: .spec.credentialSecret + name: Credential + type: string + - description: The backup target poll interval + jsonPath: .spec.pollInterval + name: LastBackupAt + type: string + - description: Indicate whether the backup target is available or not + jsonPath: .status.available + name: Available + type: boolean + - description: The backup target last synced time + jsonPath: .status.lastSyncedAt + name: LastSyncedAt + type: string + name: v1beta2 + schema: + openAPIV3Schema: + description: BackupTarget is where Longhorn stores backup target object. + 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 + metadata: + type: object + spec: + description: BackupTargetSpec defines the desired state of the Longhorn + backup target + properties: + backupTargetURL: + description: The backup target URL. + type: string + credentialSecret: + description: The backup target credential secret. + type: string + pollInterval: + description: The interval that the cluster needs to run sync with + the backup target. + type: string + syncRequestedAt: + description: The time to request run sync the remote backup target. + format: date-time + nullable: true + type: string + type: object + status: + description: BackupTargetStatus defines the observed state of the Longhorn + backup target + properties: + available: + description: Available indicates if the remote backup target is available + or not. + type: boolean + conditions: + description: Records the reason on why the backup target is unavailable. + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status + to another. + type: string + message: + description: Human-readable message indicating details about + last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's + last transition. + type: string + status: + description: |- + Status is the status of the condition. + Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + lastSyncedAt: + description: The last time that the controller synced with the remote + backup target. + format: date-time + nullable: true + type: string + ownerID: + description: The node ID on which the controller is responsible to + reconcile this backup target CR. + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: backupvolumes.longhorn.io +spec: + group: longhorn.io + names: + kind: BackupVolume + listKind: BackupVolumeList + plural: backupvolumes + shortNames: + - lhbv + singular: backupvolume + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The backup volume creation time + jsonPath: .status.createdAt + name: CreatedAt + type: string + - description: The backup volume last backup name + jsonPath: .status.lastBackupName + name: LastBackupName + type: string + - description: The backup volume last backup time + jsonPath: .status.lastBackupAt + name: LastBackupAt + type: string + - description: The backup volume last synced time + jsonPath: .status.lastSyncedAt + name: LastSyncedAt + type: string + name: v1beta1 + schema: + openAPIV3Schema: + description: BackupVolume is where Longhorn stores backup volume object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The backup volume creation time + jsonPath: .status.createdAt + name: CreatedAt + type: string + - description: The backup volume last backup name + jsonPath: .status.lastBackupName + name: LastBackupName + type: string + - description: The backup volume last backup time + jsonPath: .status.lastBackupAt + name: LastBackupAt + type: string + - description: The backup volume last synced time + jsonPath: .status.lastSyncedAt + name: LastSyncedAt + type: string + name: v1beta2 + schema: + openAPIV3Schema: + description: BackupVolume is where Longhorn stores backup volume object. + 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 + metadata: + type: object + spec: + description: BackupVolumeSpec defines the desired state of the Longhorn + backup volume + properties: + syncRequestedAt: + description: The time to request run sync the remote backup volume. + format: date-time + nullable: true + type: string + type: object + status: + description: BackupVolumeStatus defines the observed state of the Longhorn + backup volume + properties: + backingImageChecksum: + description: the backing image checksum. + type: string + backingImageName: + description: The backing image name. + type: string + createdAt: + description: The backup volume creation time. + type: string + dataStored: + description: The backup volume block count. + type: string + labels: + additionalProperties: + type: string + description: The backup volume labels. + nullable: true + type: object + lastBackupAt: + description: The latest volume backup time. + type: string + lastBackupName: + description: The latest volume backup name. + type: string + lastModificationTime: + description: The backup volume config last modification time. + format: date-time + nullable: true + type: string + lastSyncedAt: + description: The last time that the backup volume was synced into + the cluster. + format: date-time + nullable: true + type: string + messages: + additionalProperties: + type: string + description: The error messages when call longhorn engine on list + or inspect backup volumes. + nullable: true + type: object + ownerID: + description: The node ID on which the controller is responsible to + reconcile this backup volume CR. + type: string + size: + description: The backup volume size. + type: string + storageClassName: + description: the storage class name of pv/pvc binding with the volume. + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: engineimages.longhorn.io +spec: + conversion: + strategy: Webhook + webhook: + clientConfig: + service: + name: longhorn-conversion-webhook + namespace: {{ include "release_namespace" . }} + path: /v1/webhook/conversion + port: 9501 + conversionReviewVersions: + - v1beta2 + - v1beta1 + group: longhorn.io + names: + kind: EngineImage + listKind: EngineImageList + plural: engineimages + shortNames: + - lhei + singular: engineimage + preserveUnknownFields: false + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: State of the engine image + jsonPath: .status.state + name: State + type: string + - description: The Longhorn engine image + jsonPath: .spec.image + name: Image + type: string + - description: Number of resources using the engine image + jsonPath: .status.refCount + name: RefCount + type: integer + - description: The build date of the engine image + jsonPath: .status.buildDate + name: BuildDate + type: date + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: EngineImage is where Longhorn stores engine image object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: Compatibility of the engine image + jsonPath: .status.incompatible + name: Incompatible + type: boolean + - description: State of the engine image + jsonPath: .status.state + name: State + type: string + - description: The Longhorn engine image + jsonPath: .spec.image + name: Image + type: string + - description: Number of resources using the engine image + jsonPath: .status.refCount + name: RefCount + type: integer + - description: The build date of the engine image + jsonPath: .status.buildDate + name: BuildDate + type: date + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: EngineImage is where Longhorn stores engine image object. + 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 + metadata: + type: object + spec: + description: EngineImageSpec defines the desired state of the Longhorn + engine image + properties: + image: + minLength: 1 + type: string + required: + - image + type: object + status: + description: EngineImageStatus defines the observed state of the Longhorn + engine image + properties: + buildDate: + type: string + cliAPIMinVersion: + type: integer + cliAPIVersion: + type: integer + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status + to another. + type: string + message: + description: Human-readable message indicating details about + last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's + last transition. + type: string + status: + description: |- + Status is the status of the condition. + Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + controllerAPIMinVersion: + type: integer + controllerAPIVersion: + type: integer + dataFormatMinVersion: + type: integer + dataFormatVersion: + type: integer + gitCommit: + type: string + incompatible: + type: boolean + noRefSince: + type: string + nodeDeploymentMap: + additionalProperties: + type: boolean + nullable: true + type: object + ownerID: + type: string + refCount: + type: integer + state: + type: string + version: + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: engines.longhorn.io +spec: + group: longhorn.io + names: + kind: Engine + listKind: EngineList + plural: engines + shortNames: + - lhe + singular: engine + preserveUnknownFields: false + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The current state of the engine + jsonPath: .status.currentState + name: State + type: string + - description: The node that the engine is on + jsonPath: .spec.nodeID + name: Node + type: string + - description: The instance manager of the engine + jsonPath: .status.instanceManagerName + name: InstanceManager + type: string + - description: The current image of the engine + jsonPath: .status.currentImage + name: Image + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: Engine is where Longhorn stores engine object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The data engine of the engine + jsonPath: .spec.dataEngine + name: Data Engine + type: string + - description: The current state of the engine + jsonPath: .status.currentState + name: State + type: string + - description: The node that the engine is on + jsonPath: .spec.nodeID + name: Node + type: string + - description: The instance manager of the engine + jsonPath: .status.instanceManagerName + name: InstanceManager + type: string + - description: The current image of the engine + jsonPath: .status.currentImage + name: Image + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: Engine is where Longhorn stores engine object. + 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 + metadata: + type: object + spec: + description: EngineSpec defines the desired state of the Longhorn engine + properties: + active: + type: boolean + backendStoreDriver: + description: Deprecated:Replaced by field `dataEngine`. + type: string + backupVolume: + type: string + dataEngine: + enum: + - v1 + - v2 + type: string + desireState: + type: string + disableFrontend: + type: boolean + engineImage: + description: 'Deprecated: Replaced by field `image`.' + type: string + frontend: + enum: + - blockdev + - iscsi + - nvmf + - "" + type: string + image: + type: string + logRequested: + type: boolean + nodeID: + type: string + replicaAddressMap: + additionalProperties: + type: string + type: object + requestedBackupRestore: + type: string + requestedDataSource: + type: string + revisionCounterDisabled: + type: boolean + salvageRequested: + type: boolean + snapshotMaxCount: + type: integer + snapshotMaxSize: + format: int64 + type: string + unmapMarkSnapChainRemovedEnabled: + type: boolean + upgradedReplicaAddressMap: + additionalProperties: + type: string + type: object + volumeName: + type: string + volumeSize: + format: int64 + type: string + type: object + status: + description: EngineStatus defines the observed state of the Longhorn engine + properties: + backupStatus: + additionalProperties: + properties: + backupURL: + type: string + error: + type: string + progress: + type: integer + replicaAddress: + type: string + snapshotName: + type: string + state: + type: string + type: object + nullable: true + type: object + cloneStatus: + additionalProperties: + properties: + error: + type: string + fromReplicaAddress: + type: string + isCloning: + type: boolean + progress: + type: integer + snapshotName: + type: string + state: + type: string + type: object + nullable: true + type: object + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status + to another. + type: string + message: + description: Human-readable message indicating details about + last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's + last transition. + type: string + status: + description: |- + Status is the status of the condition. + Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + currentImage: + type: string + currentReplicaAddressMap: + additionalProperties: + type: string + nullable: true + type: object + currentSize: + format: int64 + type: string + currentState: + type: string + endpoint: + type: string + instanceManagerName: + type: string + ip: + type: string + isExpanding: + type: boolean + lastExpansionError: + type: string + lastExpansionFailedAt: + type: string + lastRestoredBackup: + type: string + logFetched: + type: boolean + ownerID: + type: string + port: + type: integer + purgeStatus: + additionalProperties: + properties: + error: + type: string + isPurging: + type: boolean + progress: + type: integer + state: + type: string + type: object + nullable: true + type: object + rebuildStatus: + additionalProperties: + properties: + error: + type: string + fromReplicaAddress: + type: string + isRebuilding: + type: boolean + progress: + type: integer + state: + type: string + type: object + nullable: true + type: object + replicaModeMap: + additionalProperties: + type: string + nullable: true + type: object + replicaTransitionTimeMap: + additionalProperties: + type: string + description: |- + ReplicaTransitionTimeMap records the time a replica in ReplicaModeMap transitions from one mode to another (or + from not being in the ReplicaModeMap to being in it). This information is sometimes required by other controllers + (e.g. the volume controller uses it to determine the correct value for replica.Spec.lastHealthyAt). + type: object + restoreStatus: + additionalProperties: + properties: + backupURL: + type: string + currentRestoringBackup: + type: string + error: + type: string + filename: + type: string + isRestoring: + type: boolean + lastRestored: + type: string + progress: + type: integer + state: + type: string + type: object + nullable: true + type: object + salvageExecuted: + type: boolean + snapshotMaxCount: + type: integer + snapshotMaxSize: + format: int64 + type: string + snapshots: + additionalProperties: + properties: + children: + additionalProperties: + type: boolean + nullable: true + type: object + created: + type: string + labels: + additionalProperties: + type: string + nullable: true + type: object + name: + type: string + parent: + type: string + removed: + type: boolean + size: + type: string + usercreated: + type: boolean + type: object + nullable: true + type: object + snapshotsError: + type: string + started: + type: boolean + storageIP: + type: string + unmapMarkSnapChainRemovedEnabled: + type: boolean + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: instancemanagers.longhorn.io +spec: + group: longhorn.io + names: + kind: InstanceManager + listKind: InstanceManagerList + plural: instancemanagers + shortNames: + - lhim + singular: instancemanager + preserveUnknownFields: false + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The state of the instance manager + jsonPath: .status.currentState + name: State + type: string + - description: The type of the instance manager (engine or replica) + jsonPath: .spec.type + name: Type + type: string + - description: The node that the instance manager is running on + jsonPath: .spec.nodeID + name: Node + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: InstanceManager is where Longhorn stores instance manager object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The data engine of the instance manager + jsonPath: .spec.dataEngine + name: Data Engine + type: string + - description: The state of the instance manager + jsonPath: .status.currentState + name: State + type: string + - description: The type of the instance manager (engine or replica) + jsonPath: .spec.type + name: Type + type: string + - description: The node that the instance manager is running on + jsonPath: .spec.nodeID + name: Node + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: InstanceManager is where Longhorn stores instance manager object. + 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 + metadata: + type: object + spec: + description: InstanceManagerSpec defines the desired state of the Longhorn + instance manager + properties: + dataEngine: + type: string + image: + type: string + nodeID: + type: string + type: + enum: + - aio + - engine + - replica + type: string + type: object + status: + description: InstanceManagerStatus defines the observed state of the Longhorn + instance manager + properties: + apiMinVersion: + type: integer + apiVersion: + type: integer + currentState: + type: string + instanceEngines: + additionalProperties: + properties: + spec: + properties: + backendStoreDriver: + description: Deprecated:Replaced by field `dataEngine`. + type: string + dataEngine: + type: string + name: + type: string + type: object + status: + properties: + conditions: + additionalProperties: + type: boolean + nullable: true + type: object + endpoint: + type: string + errorMsg: + type: string + listen: + type: string + portEnd: + format: int32 + type: integer + portStart: + format: int32 + type: integer + resourceVersion: + format: int64 + type: integer + state: + type: string + targetPortEnd: + format: int32 + type: integer + targetPortStart: + format: int32 + type: integer + type: + type: string + type: object + type: object + nullable: true + type: object + instanceReplicas: + additionalProperties: + properties: + spec: + properties: + backendStoreDriver: + description: Deprecated:Replaced by field `dataEngine`. + type: string + dataEngine: + type: string + name: + type: string + type: object + status: + properties: + conditions: + additionalProperties: + type: boolean + nullable: true + type: object + endpoint: + type: string + errorMsg: + type: string + listen: + type: string + portEnd: + format: int32 + type: integer + portStart: + format: int32 + type: integer + resourceVersion: + format: int64 + type: integer + state: + type: string + targetPortEnd: + format: int32 + type: integer + targetPortStart: + format: int32 + type: integer + type: + type: string + type: object + type: object + nullable: true + type: object + instances: + additionalProperties: + properties: + spec: + properties: + backendStoreDriver: + description: Deprecated:Replaced by field `dataEngine`. + type: string + dataEngine: + type: string + name: + type: string + type: object + status: + properties: + conditions: + additionalProperties: + type: boolean + nullable: true + type: object + endpoint: + type: string + errorMsg: + type: string + listen: + type: string + portEnd: + format: int32 + type: integer + portStart: + format: int32 + type: integer + resourceVersion: + format: int64 + type: integer + state: + type: string + targetPortEnd: + format: int32 + type: integer + targetPortStart: + format: int32 + type: integer + type: + type: string + type: object + type: object + description: 'Deprecated: Replaced by InstanceEngines and InstanceReplicas' + nullable: true + type: object + ip: + type: string + ownerID: + type: string + proxyApiMinVersion: + type: integer + proxyApiVersion: + type: integer + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: nodes.longhorn.io +spec: + conversion: + strategy: Webhook + webhook: + clientConfig: + service: + name: longhorn-conversion-webhook + namespace: {{ include "release_namespace" . }} + path: /v1/webhook/conversion + port: 9501 + conversionReviewVersions: + - v1beta2 + - v1beta1 + group: longhorn.io + names: + kind: Node + listKind: NodeList + plural: nodes + shortNames: + - lhn + singular: node + preserveUnknownFields: false + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: Indicate whether the node is ready + jsonPath: .status.conditions['Ready']['status'] + name: Ready + type: string + - description: Indicate whether the user disabled/enabled replica scheduling for + the node + jsonPath: .spec.allowScheduling + name: AllowScheduling + type: boolean + - description: Indicate whether Longhorn can schedule replicas on the node + jsonPath: .status.conditions['Schedulable']['status'] + name: Schedulable + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: Node is where Longhorn stores Longhorn node object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: Indicate whether the node is ready + jsonPath: .status.conditions[?(@.type=='Ready')].status + name: Ready + type: string + - description: Indicate whether the user disabled/enabled replica scheduling for + the node + jsonPath: .spec.allowScheduling + name: AllowScheduling + type: boolean + - description: Indicate whether Longhorn can schedule replicas on the node + jsonPath: .status.conditions[?(@.type=='Schedulable')].status + name: Schedulable + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: Node is where Longhorn stores Longhorn node object. + 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 + metadata: + type: object + spec: + description: NodeSpec defines the desired state of the Longhorn node + properties: + allowScheduling: + type: boolean + disks: + additionalProperties: + properties: + allowScheduling: + type: boolean + diskDriver: + enum: + - "" + - auto + - aio + type: string + diskType: + enum: + - filesystem + - block + type: string + evictionRequested: + type: boolean + path: + type: string + storageReserved: + format: int64 + type: integer + tags: + items: + type: string + type: array + type: object + type: object + evictionRequested: + type: boolean + instanceManagerCPURequest: + type: integer + name: + type: string + tags: + items: + type: string + type: array + type: object + status: + description: NodeStatus defines the observed state of the Longhorn node + properties: + autoEvicting: + type: boolean + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status + to another. + type: string + message: + description: Human-readable message indicating details about + last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's + last transition. + type: string + status: + description: |- + Status is the status of the condition. + Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + diskStatus: + additionalProperties: + properties: + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from + one status to another. + type: string + message: + description: Human-readable message indicating details + about last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the + condition's last transition. + type: string + status: + description: |- + Status is the status of the condition. + Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + diskDriver: + type: string + diskName: + type: string + diskPath: + type: string + diskType: + type: string + diskUUID: + type: string + filesystemType: + type: string + instanceManagerName: + type: string + scheduledReplica: + additionalProperties: + format: int64 + type: integer + nullable: true + type: object + storageAvailable: + format: int64 + type: integer + storageMaximum: + format: int64 + type: integer + storageScheduled: + format: int64 + type: integer + type: object + nullable: true + type: object + region: + type: string + snapshotCheckStatus: + properties: + lastPeriodicCheckedAt: + format: date-time + type: string + type: object + zone: + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: orphans.longhorn.io +spec: + group: longhorn.io + names: + kind: Orphan + listKind: OrphanList + plural: orphans + shortNames: + - lho + singular: orphan + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The type of the orphan + jsonPath: .spec.orphanType + name: Type + type: string + - description: The node that the orphan is on + jsonPath: .spec.nodeID + name: Node + type: string + name: v1beta2 + schema: + openAPIV3Schema: + description: Orphan is where Longhorn stores orphan object. + 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 + metadata: + type: object + spec: + description: OrphanSpec defines the desired state of the Longhorn orphaned + data + properties: + nodeID: + description: The node ID on which the controller is responsible to + reconcile this orphan CR. + type: string + orphanType: + description: |- + The type of the orphaned data. + Can be "replica". + type: string + parameters: + additionalProperties: + type: string + description: The parameters of the orphaned data + type: object + type: object + status: + description: OrphanStatus defines the observed state of the Longhorn orphaned + data + properties: + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status + to another. + type: string + message: + description: Human-readable message indicating details about + last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's + last transition. + type: string + status: + description: |- + Status is the status of the condition. + Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + ownerID: + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: recurringjobs.longhorn.io +spec: + group: longhorn.io + names: + kind: RecurringJob + listKind: RecurringJobList + plural: recurringjobs + shortNames: + - lhrj + singular: recurringjob + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: Sets groupings to the jobs. When set to "default" group will be + added to the volume label when no other job label exist in volume + jsonPath: .spec.groups + name: Groups + type: string + - description: Should be one of "backup" or "snapshot" + jsonPath: .spec.task + name: Task + type: string + - description: The cron expression represents recurring job scheduling + jsonPath: .spec.cron + name: Cron + type: string + - description: The number of snapshots/backups to keep for the volume + jsonPath: .spec.retain + name: Retain + type: integer + - description: The concurrent job to run by each cron job + jsonPath: .spec.concurrency + name: Concurrency + type: integer + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + - description: Specify the labels + jsonPath: .spec.labels + name: Labels + type: string + name: v1beta1 + schema: + openAPIV3Schema: + description: RecurringJob is where Longhorn stores recurring job object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: Sets groupings to the jobs. When set to "default" group will be + added to the volume label when no other job label exist in volume + jsonPath: .spec.groups + name: Groups + type: string + - description: Should be one of "snapshot", "snapshot-force-create", "snapshot-cleanup", + "snapshot-delete", "backup", "backup-force-create" or "filesystem-trim" + jsonPath: .spec.task + name: Task + type: string + - description: The cron expression represents recurring job scheduling + jsonPath: .spec.cron + name: Cron + type: string + - description: The number of snapshots/backups to keep for the volume + jsonPath: .spec.retain + name: Retain + type: integer + - description: The concurrent job to run by each cron job + jsonPath: .spec.concurrency + name: Concurrency + type: integer + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + - description: Specify the labels + jsonPath: .spec.labels + name: Labels + type: string + name: v1beta2 + schema: + openAPIV3Schema: + description: RecurringJob is where Longhorn stores recurring job object. + 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 + metadata: + type: object + spec: + description: RecurringJobSpec defines the desired state of the Longhorn + recurring job + properties: + concurrency: + description: The concurrency of taking the snapshot/backup. + type: integer + cron: + description: The cron setting. + type: string + groups: + description: The recurring job group. + items: + type: string + type: array + labels: + additionalProperties: + type: string + description: The label of the snapshot/backup. + type: object + name: + description: The recurring job name. + type: string + parameters: + additionalProperties: + type: string + description: |- + The parameters of the snapshot/backup. + Support parameters: "full-backup-interval". + type: object + retain: + description: The retain count of the snapshot/backup. + type: integer + task: + description: |- + The recurring job task. + Can be "snapshot", "snapshot-force-create", "snapshot-cleanup", "snapshot-delete", "backup", "backup-force-create" or "filesystem-trim" + enum: + - snapshot + - snapshot-force-create + - snapshot-cleanup + - snapshot-delete + - backup + - backup-force-create + - filesystem-trim + type: string + type: object + status: + description: RecurringJobStatus defines the observed state of the Longhorn + recurring job + properties: + executionCount: + description: The number of jobs that have been triggered. + type: integer + ownerID: + description: The owner ID which is responsible to reconcile this recurring + job CR. + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: replicas.longhorn.io +spec: + group: longhorn.io + names: + kind: Replica + listKind: ReplicaList + plural: replicas + shortNames: + - lhr + singular: replica + preserveUnknownFields: false + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The current state of the replica + jsonPath: .status.currentState + name: State + type: string + - description: The node that the replica is on + jsonPath: .spec.nodeID + name: Node + type: string + - description: The disk that the replica is on + jsonPath: .spec.diskID + name: Disk + type: string + - description: The instance manager of the replica + jsonPath: .status.instanceManagerName + name: InstanceManager + type: string + - description: The current image of the replica + jsonPath: .status.currentImage + name: Image + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: Replica is where Longhorn stores replica object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The data engine of the replica + jsonPath: .spec.dataEngine + name: Data Engine + type: string + - description: The current state of the replica + jsonPath: .status.currentState + name: State + type: string + - description: The node that the replica is on + jsonPath: .spec.nodeID + name: Node + type: string + - description: The disk that the replica is on + jsonPath: .spec.diskID + name: Disk + type: string + - description: The instance manager of the replica + jsonPath: .status.instanceManagerName + name: InstanceManager + type: string + - description: The current image of the replica + jsonPath: .status.currentImage + name: Image + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: Replica is where Longhorn stores replica object. + 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 + metadata: + type: object + spec: + description: ReplicaSpec defines the desired state of the Longhorn replica + properties: + active: + type: boolean + backendStoreDriver: + description: Deprecated:Replaced by field `dataEngine`. + type: string + backingImage: + type: string + dataDirectoryName: + type: string + dataEngine: + enum: + - v1 + - v2 + type: string + desireState: + type: string + diskID: + type: string + diskPath: + type: string + engineImage: + description: 'Deprecated: Replaced by field `image`.' + type: string + engineName: + type: string + evictionRequested: + type: boolean + failedAt: + description: |- + FailedAt is set when a running replica fails or when a running engine is unable to use a replica for any reason. + FailedAt indicates the time the failure occurred. When FailedAt is set, a replica is likely to have useful + (though possibly stale) data. A replica with FailedAt set must be rebuilt from a non-failed replica (or it can + be used in a salvage if all replicas are failed). FailedAt is cleared before a rebuild or salvage. FailedAt may + be later than the corresponding entry in an engine's replicaTransitionTimeMap because it is set when the volume + controller acknowledges the change. + type: string + hardNodeAffinity: + type: string + healthyAt: + description: |- + HealthyAt is set the first time a replica becomes read/write in an engine after creation or rebuild. HealthyAt + indicates the time the last successful rebuild occurred. When HealthyAt is set, a replica is likely to have + useful (though possibly stale) data. HealthyAt is cleared before a rebuild. HealthyAt may be later than the + corresponding entry in an engine's replicaTransitionTimeMap because it is set when the volume controller + acknowledges the change. + type: string + image: + type: string + lastFailedAt: + description: |- + LastFailedAt is always set at the same time as FailedAt. Unlike FailedAt, LastFailedAt is never cleared. + LastFailedAt is not a reliable indicator of the state of a replica's data. For example, a replica with + LastFailedAt may already be healthy and in use again. However, because it is never cleared, it can be compared to + LastHealthyAt to help prevent dangerous replica deletion in some corner cases. LastFailedAt may be later than the + corresponding entry in an engine's replicaTransitionTimeMap because it is set when the volume controller + acknowledges the change. + type: string + lastHealthyAt: + description: |- + LastHealthyAt is set every time a replica becomes read/write in an engine. Unlike HealthyAt, LastHealthyAt is + never cleared. LastHealthyAt is not a reliable indicator of the state of a replica's data. For example, a + replica with LastHealthyAt set may be in the middle of a rebuild. However, because it is never cleared, it can be + compared to LastFailedAt to help prevent dangerous replica deletion in some corner cases. LastHealthyAt may be + later than the corresponding entry in an engine's replicaTransitionTimeMap because it is set when the volume + controller acknowledges the change. + type: string + logRequested: + type: boolean + nodeID: + type: string + rebuildRetryCount: + type: integer + revisionCounterDisabled: + type: boolean + salvageRequested: + type: boolean + snapshotMaxCount: + type: integer + snapshotMaxSize: + format: int64 + type: string + unmapMarkDiskChainRemovedEnabled: + type: boolean + volumeName: + type: string + volumeSize: + format: int64 + type: string + type: object + status: + description: ReplicaStatus defines the observed state of the Longhorn + replica + properties: + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status + to another. + type: string + message: + description: Human-readable message indicating details about + last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's + last transition. + type: string + status: + description: |- + Status is the status of the condition. + Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + currentImage: + type: string + currentState: + type: string + evictionRequested: + description: 'Deprecated: Replaced by field `spec.evictionRequested`.' + type: boolean + instanceManagerName: + type: string + ip: + type: string + logFetched: + type: boolean + ownerID: + type: string + port: + type: integer + salvageExecuted: + type: boolean + started: + type: boolean + storageIP: + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: settings.longhorn.io +spec: + group: longhorn.io + names: + kind: Setting + listKind: SettingList + plural: settings + shortNames: + - lhs + singular: setting + preserveUnknownFields: false + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The value of the setting + jsonPath: .value + name: Value + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: Setting is where Longhorn stores setting object. + 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 + metadata: + type: object + value: + type: string + required: + - value + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The value of the setting + jsonPath: .value + name: Value + type: string + - description: The setting is applied + jsonPath: .status.applied + name: Applied + type: boolean + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: Setting is where Longhorn stores setting object. + 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 + metadata: + type: object + status: + description: The status of the setting. + properties: + applied: + description: The setting is applied. + type: boolean + required: + - applied + type: object + value: + description: The value of the setting. + type: string + required: + - value + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: sharemanagers.longhorn.io +spec: + group: longhorn.io + names: + kind: ShareManager + listKind: ShareManagerList + plural: sharemanagers + shortNames: + - lhsm + singular: sharemanager + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The state of the share manager + jsonPath: .status.state + name: State + type: string + - description: The node that the share manager is owned by + jsonPath: .status.ownerID + name: Node + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: ShareManager is where Longhorn stores share manager object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The state of the share manager + jsonPath: .status.state + name: State + type: string + - description: The node that the share manager is owned by + jsonPath: .status.ownerID + name: Node + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: ShareManager is where Longhorn stores share manager object. + 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 + metadata: + type: object + spec: + description: ShareManagerSpec defines the desired state of the Longhorn + share manager + properties: + image: + description: Share manager image used for creating a share manager + pod + type: string + type: object + status: + description: ShareManagerStatus defines the observed state of the Longhorn + share manager + properties: + endpoint: + description: NFS endpoint that can access the mounted filesystem of + the volume + type: string + ownerID: + description: The node ID on which the controller is responsible to + reconcile this share manager resource + type: string + state: + description: The state of the share manager resource + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: snapshots.longhorn.io +spec: + group: longhorn.io + names: + kind: Snapshot + listKind: SnapshotList + plural: snapshots + shortNames: + - lhsnap + singular: snapshot + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The volume that this snapshot belongs to + jsonPath: .spec.volume + name: Volume + type: string + - description: Timestamp when the point-in-time snapshot was taken + jsonPath: .status.creationTime + name: CreationTime + type: string + - description: Indicates if the snapshot is ready to be used to restore/backup + a volume + jsonPath: .status.readyToUse + name: ReadyToUse + type: boolean + - description: Represents the minimum size of volume required to rehydrate from + this snapshot + jsonPath: .status.restoreSize + name: RestoreSize + type: string + - description: The actual size of the snapshot + jsonPath: .status.size + name: Size + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: Snapshot is the Schema for the snapshots API + 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 + metadata: + type: object + spec: + description: SnapshotSpec defines the desired state of Longhorn Snapshot + properties: + createSnapshot: + description: require creating a new snapshot + type: boolean + labels: + additionalProperties: + type: string + description: The labels of snapshot + nullable: true + type: object + volume: + description: |- + the volume that this snapshot belongs to. + This field is immutable after creation. + Required + type: string + required: + - volume + type: object + status: + description: SnapshotStatus defines the observed state of Longhorn Snapshot + properties: + checksum: + type: string + children: + additionalProperties: + type: boolean + nullable: true + type: object + creationTime: + type: string + error: + type: string + labels: + additionalProperties: + type: string + nullable: true + type: object + markRemoved: + type: boolean + ownerID: + type: string + parent: + type: string + readyToUse: + type: boolean + restoreSize: + format: int64 + type: integer + size: + format: int64 + type: integer + userCreated: + type: boolean + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: supportbundles.longhorn.io +spec: + group: longhorn.io + names: + kind: SupportBundle + listKind: SupportBundleList + plural: supportbundles + shortNames: + - lhbundle + singular: supportbundle + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The state of the support bundle + jsonPath: .status.state + name: State + type: string + - description: The issue URL + jsonPath: .spec.issueURL + name: Issue + type: string + - description: A brief description of the issue + jsonPath: .spec.description + name: Description + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: SupportBundle is where Longhorn stores support bundle object + 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 + metadata: + type: object + spec: + description: SupportBundleSpec defines the desired state of the Longhorn + SupportBundle + properties: + description: + description: A brief description of the issue + type: string + issueURL: + description: The issue URL + nullable: true + type: string + nodeID: + description: The preferred responsible controller node ID. + type: string + required: + - description + type: object + status: + description: SupportBundleStatus defines the observed state of the Longhorn + SupportBundle + properties: + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status + to another. + type: string + message: + description: Human-readable message indicating details about + last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's + last transition. + type: string + status: + description: |- + Status is the status of the condition. + Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + type: array + filename: + type: string + filesize: + format: int64 + type: integer + image: + description: The support bundle manager image + type: string + managerIP: + description: The support bundle manager IP + type: string + ownerID: + description: The current responsible controller node ID + type: string + progress: + type: integer + state: + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: systembackups.longhorn.io +spec: + group: longhorn.io + names: + kind: SystemBackup + listKind: SystemBackupList + plural: systembackups + shortNames: + - lhsb + singular: systembackup + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The system backup Longhorn version + jsonPath: .status.version + name: Version + type: string + - description: The system backup state + jsonPath: .status.state + name: State + type: string + - description: The system backup creation time + jsonPath: .status.createdAt + name: Created + type: string + - description: The last time that the system backup was synced into the cluster + jsonPath: .status.lastSyncedAt + name: LastSyncedAt + type: string + name: v1beta2 + schema: + openAPIV3Schema: + description: SystemBackup is where Longhorn stores system backup object + 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 + metadata: + type: object + spec: + description: SystemBackupSpec defines the desired state of the Longhorn + SystemBackup + properties: + volumeBackupPolicy: + description: |- + The create volume backup policy + Can be "if-not-present", "always" or "disabled" + nullable: true + type: string + type: object + status: + description: SystemBackupStatus defines the observed state of the Longhorn + SystemBackup + properties: + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status + to another. + type: string + message: + description: Human-readable message indicating details about + last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's + last transition. + type: string + status: + description: |- + Status is the status of the condition. + Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + createdAt: + description: The system backup creation time. + format: date-time + type: string + gitCommit: + description: The saved Longhorn manager git commit. + nullable: true + type: string + lastSyncedAt: + description: The last time that the system backup was synced into + the cluster. + format: date-time + nullable: true + type: string + managerImage: + description: The saved manager image. + type: string + ownerID: + description: The node ID of the responsible controller to reconcile + this SystemBackup. + type: string + state: + description: The system backup state. + type: string + version: + description: The saved Longhorn version. + nullable: true + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: systemrestores.longhorn.io +spec: + group: longhorn.io + names: + kind: SystemRestore + listKind: SystemRestoreList + plural: systemrestores + shortNames: + - lhsr + singular: systemrestore + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The system restore state + jsonPath: .status.state + name: State + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: SystemRestore is where Longhorn stores system restore object + 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 + metadata: + type: object + spec: + description: SystemRestoreSpec defines the desired state of the Longhorn + SystemRestore + properties: + systemBackup: + description: The system backup name in the object store. + type: string + required: + - systemBackup + type: object + status: + description: SystemRestoreStatus defines the observed state of the Longhorn + SystemRestore + properties: + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status + to another. + type: string + message: + description: Human-readable message indicating details about + last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's + last transition. + type: string + status: + description: |- + Status is the status of the condition. + Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + ownerID: + description: The node ID of the responsible controller to reconcile + this SystemRestore. + type: string + sourceURL: + description: The source system backup URL. + type: string + state: + description: The system restore state. + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: volumeattachments.longhorn.io +spec: + group: longhorn.io + names: + kind: VolumeAttachment + listKind: VolumeAttachmentList + plural: volumeattachments + shortNames: + - lhva + singular: volumeattachment + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: VolumeAttachment stores attachment information of a Longhorn + volume + 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 + metadata: + type: object + spec: + description: VolumeAttachmentSpec defines the desired state of Longhorn + VolumeAttachment + properties: + attachmentTickets: + additionalProperties: + properties: + generation: + description: |- + A sequence number representing a specific generation of the desired state. + Populated by the system. Read-only. + format: int64 + type: integer + id: + description: The unique ID of this attachment. Used to differentiate + different attachments of the same volume. + type: string + nodeID: + description: The node that this attachment is requesting + type: string + parameters: + additionalProperties: + type: string + description: Optional additional parameter for this attachment + type: object + type: + type: string + type: object + type: object + volume: + description: The name of Longhorn volume of this VolumeAttachment + type: string + required: + - volume + type: object + status: + description: VolumeAttachmentStatus defines the observed state of Longhorn + VolumeAttachment + properties: + attachmentTicketStatuses: + additionalProperties: + properties: + conditions: + description: Record any error when trying to fulfill this attachment + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from + one status to another. + type: string + message: + description: Human-readable message indicating details + about last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the + condition's last transition. + type: string + status: + description: |- + Status is the status of the condition. + Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + generation: + description: |- + A sequence number representing a specific generation of the desired state. + Populated by the system. Read-only. + format: int64 + type: integer + id: + description: The unique ID of this attachment. Used to differentiate + different attachments of the same volume. + type: string + satisfied: + description: Indicate whether this attachment ticket has been + satisfied + type: boolean + required: + - conditions + - satisfied + type: object + type: object + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + labels: {{- include "longhorn.labels" . | nindent 4 }} + longhorn-manager: "" + name: volumes.longhorn.io +spec: + conversion: + strategy: Webhook + webhook: + clientConfig: + service: + name: longhorn-conversion-webhook + namespace: {{ include "release_namespace" . }} + path: /v1/webhook/conversion + port: 9501 + conversionReviewVersions: + - v1beta2 + - v1beta1 + group: longhorn.io + names: + kind: Volume + listKind: VolumeList + plural: volumes + shortNames: + - lhv + singular: volume + preserveUnknownFields: false + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The state of the volume + jsonPath: .status.state + name: State + type: string + - description: The robustness of the volume + jsonPath: .status.robustness + name: Robustness + type: string + - description: The scheduled condition of the volume + jsonPath: .status.conditions['scheduled']['status'] + name: Scheduled + type: string + - description: The size of the volume + jsonPath: .spec.size + name: Size + type: string + - description: The node that the volume is currently attaching to + jsonPath: .status.currentNodeID + name: Node + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: Volume is where Longhorn stores volume object. + 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 + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The data engine of the volume + jsonPath: .spec.dataEngine + name: Data Engine + type: string + - description: The state of the volume + jsonPath: .status.state + name: State + type: string + - description: The robustness of the volume + jsonPath: .status.robustness + name: Robustness + type: string + - description: The scheduled condition of the volume + jsonPath: .status.conditions[?(@.type=='Schedulable')].status + name: Scheduled + type: string + - description: The size of the volume + jsonPath: .spec.size + name: Size + type: string + - description: The node that the volume is currently attaching to + jsonPath: .status.currentNodeID + name: Node + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: Volume is where Longhorn stores volume object. + 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 + metadata: + type: object + spec: + description: VolumeSpec defines the desired state of the Longhorn volume + properties: + Standby: + type: boolean + accessMode: + enum: + - rwo + - rwx + type: string + backendStoreDriver: + description: Deprecated:Replaced by field `dataEngine`.' + type: string + backingImage: + type: string + backupCompressionMethod: + enum: + - none + - lz4 + - gzip + type: string + dataEngine: + enum: + - v1 + - v2 + type: string + dataLocality: + enum: + - disabled + - best-effort + - strict-local + type: string + dataSource: + type: string + disableFrontend: + type: boolean + diskSelector: + items: + type: string + type: array + encrypted: + type: boolean + engineImage: + description: 'Deprecated: Replaced by field `image`.' + type: string + freezeFilesystemForSnapshot: + description: Setting that freezes the filesystem on the root partition + before a snapshot is created. + enum: + - ignored + - enabled + - disabled + type: string + fromBackup: + type: string + frontend: + enum: + - blockdev + - iscsi + - nvmf + - "" + type: string + image: + type: string + lastAttachedBy: + type: string + migratable: + type: boolean + migrationNodeID: + type: string + nodeID: + type: string + nodeSelector: + items: + type: string + type: array + numberOfReplicas: + type: integer + replicaAutoBalance: + enum: + - ignored + - disabled + - least-effort + - best-effort + type: string + replicaDiskSoftAntiAffinity: + description: Replica disk soft anti affinity of the volume. Set enabled + to allow replicas to be scheduled in the same disk. + enum: + - ignored + - enabled + - disabled + type: string + replicaSoftAntiAffinity: + description: Replica soft anti affinity of the volume. Set enabled + to allow replicas to be scheduled on the same node. + enum: + - ignored + - enabled + - disabled + type: string + replicaZoneSoftAntiAffinity: + description: Replica zone soft anti affinity of the volume. Set enabled + to allow replicas to be scheduled in the same zone. + enum: + - ignored + - enabled + - disabled + type: string + restoreVolumeRecurringJob: + enum: + - ignored + - enabled + - disabled + type: string + revisionCounterDisabled: + type: boolean + size: + format: int64 + type: string + snapshotDataIntegrity: + enum: + - ignored + - disabled + - enabled + - fast-check + type: string + snapshotMaxCount: + type: integer + snapshotMaxSize: + format: int64 + type: string + staleReplicaTimeout: + type: integer + unmapMarkSnapChainRemoved: + enum: + - ignored + - disabled + - enabled + type: string + type: object + status: + description: VolumeStatus defines the observed state of the Longhorn volume + properties: + actualSize: + format: int64 + type: integer + cloneStatus: + properties: + attemptCount: + type: integer + nextAllowedAttemptAt: + type: string + snapshot: + type: string + sourceVolume: + type: string + state: + type: string + type: object + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status + to another. + type: string + message: + description: Human-readable message indicating details about + last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's + last transition. + type: string + status: + description: |- + Status is the status of the condition. + Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + currentImage: + type: string + currentMigrationNodeID: + description: the node that this volume is currently migrating to + type: string + currentNodeID: + type: string + expansionRequired: + type: boolean + frontendDisabled: + type: boolean + isStandby: + type: boolean + kubernetesStatus: + properties: + lastPVCRefAt: + type: string + lastPodRefAt: + type: string + namespace: + description: determine if PVC/Namespace is history or not + type: string + pvName: + type: string + pvStatus: + type: string + pvcName: + type: string + workloadsStatus: + description: determine if Pod/Workload is history or not + items: + properties: + podName: + type: string + podStatus: + type: string + workloadName: + type: string + workloadType: + type: string + type: object + nullable: true + type: array + type: object + lastBackup: + type: string + lastBackupAt: + type: string + lastDegradedAt: + type: string + ownerID: + type: string + pendingNodeID: + description: Deprecated. + type: string + remountRequestedAt: + type: string + restoreInitiated: + type: boolean + restoreRequired: + type: boolean + robustness: + type: string + shareEndpoint: + type: string + shareState: + type: string + state: + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} diff --git a/charts/longhorn/102.5.1+up1.7.2/.helmignore b/charts/longhorn/102.5.1+up1.7.2/.helmignore new file mode 100644 index 0000000000..f0c1319444 --- /dev/null +++ b/charts/longhorn/102.5.1+up1.7.2/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/charts/longhorn/102.5.1+up1.7.2/Chart.yaml b/charts/longhorn/102.5.1+up1.7.2/Chart.yaml new file mode 100644 index 0000000000..317c3317a2 --- /dev/null +++ b/charts/longhorn/102.5.1+up1.7.2/Chart.yaml @@ -0,0 +1,40 @@ +annotations: + catalog.cattle.io/auto-install: longhorn-crd=match + catalog.cattle.io/certified: rancher + catalog.cattle.io/display-name: Longhorn + catalog.cattle.io/kube-version: '>= 1.21.0-0' + catalog.cattle.io/namespace: longhorn-system + catalog.cattle.io/permits-os: linux,windows + catalog.cattle.io/provides-gvr: longhorn.io/v1beta1 + catalog.cattle.io/rancher-version: '>= 2.7.0-0 < 2.8.0-0' + catalog.cattle.io/release-name: longhorn + catalog.cattle.io/type: cluster-tool + catalog.cattle.io/upstream-version: 1.7.2 +apiVersion: v1 +appVersion: v1.7.2 +description: Longhorn is a distributed block storage system for Kubernetes. +home: https://github.com/longhorn/longhorn +icon: https://raw.githubusercontent.com/cncf/artwork/master/projects/longhorn/icon/color/longhorn-icon-color.png +keywords: +- longhorn +- storage +- distributed +- block +- device +- iscsi +- nfs +kubeVersion: '>=1.21.0-0' +maintainers: +- email: maintainers@longhorn.io + name: Longhorn maintainers +name: longhorn +sources: +- https://github.com/longhorn/longhorn +- https://github.com/longhorn/longhorn-engine +- https://github.com/longhorn/longhorn-instance-manager +- https://github.com/longhorn/longhorn-share-manager +- https://github.com/longhorn/longhorn-manager +- https://github.com/longhorn/longhorn-ui +- https://github.com/longhorn/longhorn-tests +- https://github.com/longhorn/backing-image-manager +version: 102.5.1+up1.7.2 diff --git a/charts/longhorn/102.5.1+up1.7.2/README.md b/charts/longhorn/102.5.1+up1.7.2/README.md new file mode 100644 index 0000000000..adb190be3b --- /dev/null +++ b/charts/longhorn/102.5.1+up1.7.2/README.md @@ -0,0 +1,50 @@ +# Longhorn Chart + +> **Important**: Please install the Longhorn chart in the `longhorn-system` namespace only. + +> **Warning**: Longhorn doesn't support downgrading from a higher version to a lower version. + +> **Note**: Use Helm 3 when installing and upgrading Longhorn. Helm 2 is [no longer supported](https://helm.sh/blog/helm-2-becomes-unsupported/). + +## Source Code + +Longhorn is 100% open source software. Project source code is spread across a number of repos: + +1. Longhorn Engine -- Core controller/replica logic https://github.com/longhorn/longhorn-engine +2. Longhorn Instance Manager -- Controller/replica instance lifecycle management https://github.com/longhorn/longhorn-instance-manager +3. Longhorn Share Manager -- NFS provisioner that exposes Longhorn volumes as ReadWriteMany volumes. https://github.com/longhorn/longhorn-share-manager +4. Backing Image Manager -- Backing image file lifecycle management. https://github.com/longhorn/backing-image-manager +5. Longhorn Manager -- Longhorn orchestration, includes CSI driver for Kubernetes https://github.com/longhorn/longhorn-manager +6. Longhorn UI -- Dashboard https://github.com/longhorn/longhorn-ui + +## Prerequisites + +1. A container runtime compatible with Kubernetes (Docker v1.13+, containerd v1.3.7+, etc.) +2. Kubernetes >= v1.21 +3. Make sure `bash`, `curl`, `findmnt`, `grep`, `awk` and `blkid` has been installed in all nodes of the Kubernetes cluster. +4. Make sure `open-iscsi` has been installed, and the `iscsid` daemon is running on all nodes of the Kubernetes cluster. For GKE, recommended Ubuntu as guest OS image since it contains `open-iscsi` already. + +## Upgrading to Kubernetes v1.25+ + +Starting in Kubernetes v1.25, [Pod Security Policies](https://kubernetes.io/docs/concepts/security/pod-security-policy/) have been removed from the Kubernetes API. + +As a result, **before upgrading to Kubernetes v1.25** (or on a fresh install in a Kubernetes v1.25+ cluster), users are expected to perform an in-place upgrade of this chart with `enablePSP` set to `false` if it has been previously set to `true`. + +> **Note:** +> If you upgrade your cluster to Kubernetes v1.25+ before removing PSPs via a `helm upgrade` (even if you manually clean up resources), **it will leave the Helm release in a broken state within the cluster such that further Helm operations will not work (`helm uninstall`, `helm upgrade`, etc.).** +> +> If your charts get stuck in this state, you may have to clean up your Helm release secrets. +Upon setting `enablePSP` to false, the chart will remove any PSP resources deployed on its behalf from the cluster. This is the default setting for this chart. + +As a replacement for PSPs, [Pod Security Admission](https://kubernetes.io/docs/concepts/security/pod-security-admission/) should be used. Please consult the Longhorn docs for more details on how to configure your chart release namespaces to work with the new Pod Security Admission and apply Pod Security Standards. + +## Uninstallation + +To prevent Longhorn from being accidentally uninstalled (which leads to data lost), we introduce a new setting, deleting-confirmation-flag. If this flag is **false**, the Longhorn uninstallation job will fail. Set this flag to **true** to allow Longhorn uninstallation. You can set this flag using setting page in Longhorn UI or `kubectl -n longhorn-system patch -p '{"value": "true"}' --type=merge lhs deleting-confirmation-flag` + +To prevent damage to the Kubernetes cluster, we recommend deleting all Kubernetes workloads using Longhorn volumes (PersistentVolume, PersistentVolumeClaim, StorageClass, Deployment, StatefulSet, DaemonSet, etc). + +From Rancher Cluster Explorer UI, navigate to Apps page, delete app `longhorn` then app `longhorn-crd` in Installed Apps tab. + +--- +Please see [link](https://github.com/longhorn/longhorn) for more information. diff --git a/charts/longhorn/102.5.1+up1.7.2/app-readme.md b/charts/longhorn/102.5.1+up1.7.2/app-readme.md new file mode 100644 index 0000000000..321e5193c4 --- /dev/null +++ b/charts/longhorn/102.5.1+up1.7.2/app-readme.md @@ -0,0 +1,27 @@ +# Longhorn + +Longhorn is a lightweight, reliable and easy to use distributed block storage system for Kubernetes. Once deployed, users can leverage persistent volumes provided by Longhorn. + +Longhorn creates a dedicated storage controller for each volume and synchronously replicates the volume across multiple replicas stored on multiple nodes. The storage controller and replicas are themselves orchestrated using Kubernetes. Longhorn supports snapshots, backups and even allows you to schedule recurring snapshots and backups! + +**Important**: Please install Longhorn chart in `longhorn-system` namespace only. + +**Warning**: Longhorn doesn't support downgrading from a higher version to a lower version. + +[Chart Documentation](https://github.com/longhorn/longhorn/blob/master/chart/README.md) + + +## Upgrading to Kubernetes v1.25+ + +Starting in Kubernetes v1.25, [Pod Security Policies](https://kubernetes.io/docs/concepts/security/pod-security-policy/) have been removed from the Kubernetes API. + +As a result, **before upgrading to Kubernetes v1.25** (or on a fresh install in a Kubernetes v1.25+ cluster), users are expected to perform an in-place upgrade of this chart with `enablePSP` set to `false` if it has been previously set to `true`. + +> **Note:** +> If you upgrade your cluster to Kubernetes v1.25+ before removing PSPs via a `helm upgrade` (even if you manually clean up resources), **it will leave the Helm release in a broken state within the cluster such that further Helm operations will not work (`helm uninstall`, `helm upgrade`, etc.).** +> +> If your charts get stuck in this state, please consult the Rancher docs on how to clean up your Helm release secrets. + +Upon setting `enablePSP` to false, the chart will remove any PSP resources deployed on its behalf from the cluster. This is the default setting for this chart. + +As a replacement for PSPs, [Pod Security Admission](https://kubernetes.io/docs/concepts/security/pod-security-admission/) should be used. Please consult the Rancher docs for more details on how to configure your chart release namespaces to work with the new Pod Security Admission and apply Pod Security Standards. \ No newline at end of file diff --git a/charts/longhorn/102.5.1+up1.7.2/questions.yaml b/charts/longhorn/102.5.1+up1.7.2/questions.yaml new file mode 100644 index 0000000000..89c8dbe105 --- /dev/null +++ b/charts/longhorn/102.5.1+up1.7.2/questions.yaml @@ -0,0 +1,974 @@ +categories: +- storage +namespace: longhorn-system +questions: +- variable: image.defaultImage + default: "true" + description: "Use default Longhorn images" + label: Use Default Images + type: boolean + show_subquestion_if: false + group: "Longhorn Images" + subquestions: + - variable: image.longhorn.manager.repository + default: rancher/mirrored-longhornio-longhorn-manager + description: "Repository for the Longhorn Manager image." + type: string + label: Longhorn Manager Image Repository + group: "Longhorn Images Settings" + - variable: image.longhorn.manager.tag + default: v1.7.2 + description: "Tag for the Longhorn Manager image." + type: string + label: Longhorn Manager Image Tag + group: "Longhorn Images Settings" + - variable: image.longhorn.engine.repository + default: rancher/mirrored-longhornio-longhorn-engine + description: "Repository for the Longhorn Engine image." + type: string + label: Longhorn Engine Image Repository + group: "Longhorn Images Settings" + - variable: image.longhorn.engine.tag + default: v1.7.2 + description: "Tag for the Longhorn Engine image." + type: string + label: Longhorn Engine Image Tag + group: "Longhorn Images Settings" + - variable: image.longhorn.ui.repository + default: rancher/mirrored-longhornio-longhorn-ui + description: "Repository for the Longhorn UI image." + type: string + label: Longhorn UI Image Repository + group: "Longhorn Images Settings" + - variable: image.longhorn.ui.tag + default: v1.7.2 + description: "Tag for the Longhorn UI image." + type: string + label: Longhorn UI Image Tag + group: "Longhorn Images Settings" + - variable: image.longhorn.instanceManager.repository + default: rancher/mirrored-longhornio-longhorn-instance-manager + description: "Repository for the Longhorn Instance Manager image." + type: string + label: Longhorn Instance Manager Image Repository + group: "Longhorn Images Settings" + - variable: image.longhorn.instanceManager.tag + default: v1.7.2 + description: "Tag for the Longhorn Instance Manager image." + type: string + label: Longhorn Instance Manager Image Tag + group: "Longhorn Images Settings" + - variable: image.longhorn.shareManager.repository + default: rancher/mirrored-longhornio-longhorn-share-manager + description: "Repository for the Longhorn Share Manager image." + type: string + label: Longhorn Share Manager Image Repository + group: "Longhorn Images Settings" + - variable: image.longhorn.shareManager.tag + default: v1.7.2 + description: "Tag for the Longhorn Share Manager image." + type: string + label: Longhorn Share Manager Image Tag + group: "Longhorn Images Settings" + - variable: image.longhorn.backingImageManager.repository + default: rancher/mirrored-longhornio-backing-image-manager + description: "Repository for the Backing Image Manager image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn Backing Image Manager Image Repository + group: "Longhorn Images Settings" + - variable: image.longhorn.backingImageManager.tag + default: v1.7.2 + description: "Tag for the Backing Image Manager image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn Backing Image Manager Image Tag + group: "Longhorn Images Settings" + - variable: image.longhorn.supportBundleKit.repository + default: rancher/mirrored-longhornio-support-bundle-kit + description: "Repository for the Longhorn Support Bundle Manager image." + type: string + label: Longhorn Support Bundle Kit Image Repository + group: "Longhorn Images Settings" + - variable: image.longhorn.supportBundleKit.tag + default: v0.0.45 + description: "Tag for the Longhorn Support Bundle Manager image." + type: string + label: Longhorn Support Bundle Kit Image Tag + group: "Longhorn Images Settings" + - variable: image.csi.attacher.repository + default: rancher/mirrored-longhornio-csi-attacher + description: "Repository for the CSI attacher image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn CSI Attacher Image Repository + group: "Longhorn CSI Driver Images" + - variable: image.csi.attacher.tag + default: v4.7.0 + description: "Tag for the CSI attacher image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn CSI Attacher Image Tag + group: "Longhorn CSI Driver Images" + - variable: image.csi.provisioner.repository + default: rancher/mirrored-longhornio-csi-provisioner + description: "Repository for the CSI Provisioner image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn CSI Provisioner Image Repository + group: "Longhorn CSI Driver Images" + - variable: image.csi.provisioner.tag + default: v4.0.1-20241007 + description: "Tag for the CSI Provisioner image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn CSI Provisioner Image Tag + group: "Longhorn CSI Driver Images" + - variable: image.csi.nodeDriverRegistrar.repository + default: rancher/mirrored-longhornio-csi-node-driver-registrar + description: "Repository for the CSI Node Driver Registrar image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn CSI Node Driver Registrar Image Repository + group: "Longhorn CSI Driver Images" + - variable: image.csi.nodeDriverRegistrar.tag + default: v2.12.0 + description: "Tag for the CSI Node Driver Registrar image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn CSI Node Driver Registrar Image Tag + group: "Longhorn CSI Driver Images" + - variable: image.csi.resizer.repository + default: rancher/mirrored-longhornio-csi-resizer + description: "Repository for the CSI Resizer image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn CSI Driver Resizer Image Repository + group: "Longhorn CSI Driver Images" + - variable: image.csi.resizer.tag + default: v1.12.0 + description: "Tag for the CSI Resizer image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn CSI Driver Resizer Image Tag + group: "Longhorn CSI Driver Images" + - variable: image.csi.snapshotter.repository + default: rancher/mirrored-longhornio-csi-snapshotter + description: "Repository for the CSI Snapshotter image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn CSI Driver Snapshotter Image Repository + group: "Longhorn CSI Driver Images" + - variable: image.csi.snapshotter.tag + default: v7.0.2-20241007 + description: "Tag for the CSI Snapshotter image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn CSI Driver Snapshotter Image Tag + group: "Longhorn CSI Driver Images" + - variable: image.csi.livenessProbe.repository + default: rancher/mirrored-longhornio-livenessprobe + description: "Repository for the CSI liveness probe image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn CSI Liveness Probe Image Repository + group: "Longhorn CSI Driver Images" + - variable: image.csi.livenessProbe.tag + default: v2.14.0 + description: "Tag for the CSI liveness probe image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn CSI Liveness Probe Image Tag + group: "Longhorn CSI Driver Images" +- variable: privateRegistry.registryUrl + label: Private registry URL + description: "URL of a private registry. When unspecified, Longhorn uses the default system registry." + group: "Private Registry Settings" + type: string + default: "" +- variable: privateRegistry.registrySecret + label: Private registry secret name + description: "Kubernetes secret that allows you to pull images from a private registry. This setting applies only when creation of private registry secrets is enabled. You must include the private registry name in the secret name." + group: "Private Registry Settings" + type: string + default: "" +- variable: privateRegistry.createSecret + default: "true" + description: "Setting that allows you to create a private registry secret." + type: boolean + group: "Private Registry Settings" + label: Create Secret for Private Registry Settings + show_subquestion_if: true + subquestions: + - variable: privateRegistry.registryUser + label: Private registry user + description: "User account used for authenticating with a private registry." + type: string + default: "" + - variable: privateRegistry.registryPasswd + label: Private registry password + description: "Password for authenticating with a private registry." + type: password + default: "" +- variable: longhorn.default_setting + default: "false" + description: "Customize the default settings before installing Longhorn for the first time. This option will only work if the cluster hasn't installed Longhorn." + label: "Customize Default Settings" + type: boolean + show_subquestion_if: true + group: "Longhorn Default Settings" + subquestions: + - variable: csi.kubeletRootDir + default: + description: "kubelet root directory. When unspecified, Longhorn uses the default value." + type: string + label: Kubelet Root Directory + group: "Longhorn CSI Driver Settings" + - variable: csi.attacherReplicaCount + type: int + default: 3 + min: 1 + max: 10 + description: "Replica count of the CSI Attacher. When unspecified, Longhorn uses the default value (\"3\")." + label: Longhorn CSI Attacher replica count + group: "Longhorn CSI Driver Settings" + - variable: csi.provisionerReplicaCount + type: int + default: 3 + min: 1 + max: 10 + description: "Replica count of the CSI Provisioner. When unspecified, Longhorn uses the default value (\"3\")." + label: Longhorn CSI Provisioner replica count + group: "Longhorn CSI Driver Settings" + - variable: csi.resizerReplicaCount + type: int + default: 3 + min: 1 + max: 10 + description: "Replica count of the CSI Resizer. When unspecified, Longhorn uses the default value (\"3\")." + label: Longhorn CSI Resizer replica count + group: "Longhorn CSI Driver Settings" + - variable: csi.snapshotterReplicaCount + type: int + default: 3 + min: 1 + max: 10 + description: "Replica count of the CSI Snapshotter. When unspecified, Longhorn uses the default value (\"3\")." + label: Longhorn CSI Snapshotter replica count + group: "Longhorn CSI Driver Settings" + - variable: defaultSettings.backupTarget + label: Backup Target + description: "Endpoint used to access the backupstore. (Options: \"NFS\", \"CIFS\", \"AWS\", \"GCP\", \"AZURE\")" + group: "Longhorn Default Settings" + type: string + default: + - variable: defaultSettings.backupTargetCredentialSecret + label: Backup Target Credential Secret + description: "Name of the Kubernetes secret associated with the backup target." + group: "Longhorn Default Settings" + type: string + default: + - variable: defaultSettings.allowRecurringJobWhileVolumeDetached + label: Allow Recurring Job While Volume Is Detached + description: 'Setting that allows Longhorn to automatically attach a volume and create snapshots or backups when recurring jobs are run.' + group: "Longhorn Default Settings" + type: boolean + default: "false" + - variable: defaultSettings.snapshotMaxCount + label: Snapshot Maximum Count + description: 'Maximum snapshot count for a volume. The value should be between 2 to 250.' + group: "Longhorn Default Settings" + type: int + min: 2 + max: 250 + default: 250 + - variable: defaultSettings.createDefaultDiskLabeledNodes + label: Create Default Disk on Labeled Nodes + description: 'Setting that allows Longhorn to automatically create a default disk only on nodes with the label "node.longhorn.io/create-default-disk=true" (if no other disks exist). When this setting is disabled, Longhorn creates a default disk on each node that is added to the cluster.' + group: "Longhorn Default Settings" + type: boolean + default: "false" + - variable: defaultSettings.defaultDataPath + label: Default Data Path + description: 'Default path for storing data on a host. The default value is "/var/lib/longhorn/".' + group: "Longhorn Default Settings" + type: string + default: "/var/lib/longhorn/" + - variable: defaultSettings.defaultDataLocality + label: Default Data Locality + description: 'Default data locality. A Longhorn volume has data locality if a local replica of the volume exists on the same node as the pod that is using the volume.' + group: "Longhorn Default Settings" + type: enum + options: + - "disabled" + - "best-effort" + default: "disabled" + - variable: defaultSettings.replicaSoftAntiAffinity + label: Replica Node Level Soft Anti-Affinity + description: 'Allow scheduling on nodes with existing healthy replicas of the same volume. By default, false.' + group: "Longhorn Default Settings" + type: boolean + default: "false" + - variable: defaultSettings.replicaAutoBalance + label: Replica Auto Balance + description: 'Enable this setting automatically re-balances replicas when discovered an available node.' + group: "Longhorn Default Settings" + type: enum + options: + - "disabled" + - "least-effort" + - "best-effort" + default: "disabled" + - variable: defaultSettings.storageOverProvisioningPercentage + label: Storage Over Provisioning Percentage + description: "Percentage of storage that can be allocated relative to hard drive capacity. The default value is 100." + group: "Longhorn Default Settings" + type: int + min: 0 + default: 100 + - variable: defaultSettings.storageMinimalAvailablePercentage + label: Storage Minimal Available Percentage + description: "If the minimum available disk capacity exceeds the actual percentage of available disk capacity, the disk becomes unschedulable until more space is freed up. By default, 25." + group: "Longhorn Default Settings" + type: int + min: 0 + max: 100 + default: 25 + - variable: defaultSettings.storageReservedPercentageForDefaultDisk + label: Storage Reserved Percentage For Default Disk + description: "The reserved percentage specifies the percentage of disk space that will not be allocated to the default disk on each new Longhorn node." + group: "Longhorn Default Settings" + type: int + min: 0 + max: 100 + default: 30 + - variable: defaultSettings.upgradeChecker + label: Enable Upgrade Checker + description: 'Upgrade Checker that periodically checks for new Longhorn versions. When a new version is available, a notification appears on the Longhorn UI. This setting is enabled by default.' + group: "Longhorn Default Settings" + type: boolean + default: "true" + - variable: defaultSettings.defaultReplicaCount + label: Default Replica Count + description: "Default number of replicas for volumes created using the Longhorn UI. For Kubernetes configuration, modify the `numberOfReplicas` field in the StorageClass. The default value is \"3\"." + group: "Longhorn Default Settings" + type: int + min: 1 + max: 20 + default: 3 + - variable: defaultSettings.defaultLonghornStaticStorageClass + label: Default Longhorn Static StorageClass Name + description: "Default Longhorn StorageClass. \"storageClassName\" is assigned to PVs and PVCs that are created for an existing Longhorn volume. \"storageClassName\" can also be used as a label, so it is possible to use a Longhorn StorageClass to bind a workload to an existing PV without creating a Kubernetes StorageClass object. The default value is \"longhorn-static\"." + group: "Longhorn Default Settings" + type: string + default: "longhorn-static" + - variable: defaultSettings.backupstorePollInterval + label: Backupstore Poll Interval + description: "Number of seconds that Longhorn waits before checking the backupstore for new backups. The default value is \"300\". When the value is \"0\", polling is disabled." + group: "Longhorn Default Settings" + type: int + min: 0 + default: 300 + - variable: defaultSettings.failedBackupTTL + label: Failed Backup Time to Live + description: "Number of minutes that Longhorn keeps a failed backup resource. When the value is \"0\", automatic deletion is disabled." + group: "Longhorn Default Settings" + type: int + min: 0 + default: 1440 + - variable: defaultSettings.restoreVolumeRecurringJobs + label: Restore Volume Recurring Jobs + description: "Restore recurring jobs from the backup volume on the backup target and create recurring jobs if not exist during a backup restoration." + group: "Longhorn Default Settings" + type: boolean + default: "false" + - variable: defaultSettings.recurringSuccessfulJobsHistoryLimit + label: Cronjob Successful Jobs History Limit + description: "This setting specifies how many successful backup or snapshot job histories should be retained. History will not be retained if the value is 0." + group: "Longhorn Default Settings" + type: int + min: 0 + default: 1 + - variable: defaultSettings.recurringFailedJobsHistoryLimit + label: Cronjob Failed Jobs History Limit + description: 'Maximum number of failed recurring backup and snapshot jobs to be retained. When the value is "0", a history of failed recurring jobs is not retained.' + group: "Longhorn Default Settings" + type: int + min: 0 + default: 1 + - variable: defaultSettings.recurringJobMaxRetention + label: Maximum Retention Number for Recurring Job + description: "Maximum number of snapshots or backups to be retained." + group: "Longhorn Default Settings" + type: int + default: 100 + - variable: defaultSettings.supportBundleFailedHistoryLimit + label: SupportBundle Failed History Limit + description: "This setting specifies how many failed support bundles can exist in the cluster. Set this value to **0** to have Longhorn automatically purge all failed support bundles." + group: "Longhorn Default Settings" + type: int + min: 0 + default: 1 + - variable: defaultSettings.autoSalvage + label: Automatic salvage + description: "Setting that allows Longhorn to automatically salvage volumes when all replicas become faulty (for example, when the network connection is interrupted). Longhorn determines which replicas are usable and then uses these replicas for the volume. This setting is enabled by default." + group: "Longhorn Default Settings" + type: boolean + default: "true" + - variable: defaultSettings.autoDeletePodWhenVolumeDetachedUnexpectedly + label: Automatically Delete Workload Pod when The Volume Is Detached Unexpectedly + description: 'Setting that allows Longhorn to automatically delete a workload pod that is managed by a controller (for example, daemonset) whenever a Longhorn volume is detached unexpectedly (for example, during Kubernetes upgrades). After deletion, the controller restarts the pod and then Kubernetes handles volume reattachment and remounting.' + group: "Longhorn Default Settings" + type: boolean + default: "true" + - variable: defaultSettings.disableSchedulingOnCordonedNode + label: Disable Scheduling On Cordoned Node + description: "Setting that prevents Longhorn Manager from scheduling replicas on a cordoned Kubernetes node. This setting is enabled by default." + group: "Longhorn Default Settings" + type: boolean + default: "true" + - variable: defaultSettings.replicaZoneSoftAntiAffinity + label: Replica Zone Level Soft Anti-Affinity + description: "Allow scheduling new Replicas of Volume to the Nodes in the same Zone as existing healthy Replicas. Nodes don't belong to any Zone will be treated as in the same Zone. Notice that Longhorn relies on label `topology.kubernetes.io/zone=` in the Kubernetes node object to identify the zone. By, default true." + group: "Longhorn Default Settings" + type: boolean + default: "true" + - variable: defaultSettings.replicaDiskSoftAntiAffinity + label: Replica Disk Level Soft Anti-Affinity + description: 'Allow scheduling on disks with existing healthy replicas of the same volume. By default, true.' + group: "Longhorn Default Settings" + type: boolean + default: "true" + - variable: defaultSettings.allowEmptyNodeSelectorVolume + label: Allow Empty Node Selector Volume + description: "Setting that allows scheduling of empty node selector volumes to any node." + group: "Longhorn Default Settings" + type: boolean + default: "true" + - variable: defaultSettings.allowEmptyDiskSelectorVolume + label: Allow Empty Disk Selector Volume + description: "Setting that allows scheduling of empty disk selector volumes to any disk." + group: "Longhorn Default Settings" + type: boolean + default: "true" + - variable: defaultSettings.nodeDownPodDeletionPolicy + label: Pod Deletion Policy When Node is Down + description: "Policy that defines the action Longhorn takes when a volume is stuck with a StatefulSet or Deployment pod on a node that failed." + group: "Longhorn Default Settings" + type: enum + options: + - "do-nothing" + - "delete-statefulset-pod" + - "delete-deployment-pod" + - "delete-both-statefulset-and-deployment-pod" + default: "do-nothing" + - variable: defaultSettings.nodeDrainPolicy + label: Node Drain Policy + description: "Policy that defines the action Longhorn takes when a node with the last healthy replica of a volume is drained." + group: "Longhorn Default Settings" + type: enum + options: + - "block-for-eviction" + - "block-for-eviction-if-contains-last-replica" + - "block-if-contains-last-replica" + - "allow-if-replica-is-stopped" + - "always-allow" + default: "block-if-contains-last-replica" + - variable: defaultSettings.detachManuallyAttachedVolumesWhenCordoned + label: Detach Manually Attached Volumes When Cordoned + description: "Setting that allows automatic detaching of manually-attached volumes when a node is cordoned." + group: "Longhorn Default Settings" + type: boolean + default: "false" + - variable: defaultSettings.priorityClass + label: Priority Class + description: "PriorityClass for system-managed Longhorn components. This setting can help prevent Longhorn components from being evicted under Node Pressure. Longhorn system contains user deployed components (E.g, Longhorn manager, Longhorn driver, Longhorn UI) and system managed components (E.g, instance manager, engine image, CSI driver, etc.) Note that this will be applied to Longhorn user-deployed components by default if there are no priority class values set yet, such as `longhornManager.priorityClass`. WARNING: DO NOT CHANGE THIS SETTING WITH ATTACHED VOLUMES." + group: "Longhorn Default Settings" + type: string + default: "longhorn-critical" + - variable: defaultSettings.replicaReplenishmentWaitInterval + label: Replica Replenishment Wait Interval + description: "The interval in seconds determines how long Longhorn will at least wait to reuse the existing data on a failed replica rather than directly creating a new replica for a degraded volume." + group: "Longhorn Default Settings" + type: int + min: 0 + default: 600 + - variable: defaultSettings.concurrentReplicaRebuildPerNodeLimit + label: Concurrent Replica Rebuild Per Node Limit + description: "Maximum number of replicas that can be concurrently rebuilt on each node. + WARNING: + - The old setting \"Disable Replica Rebuild\" is replaced by this setting. + - Different from relying on replica starting delay to limit the concurrent rebuilding, if the rebuilding is disabled, replica object replenishment will be directly skipped. + - When the value is 0, the eviction and data locality feature won't work. But this shouldn't have any impact to any current replica rebuild and backup restore." + group: "Longhorn Default Settings" + type: int + min: 0 + default: 5 + - variable: defaultSettings.concurrentVolumeBackupRestorePerNodeLimit + label: Concurrent Volume Backup Restore Per Node Limit + description: "Maximum number of volumes that can be concurrently restored on each node using a backup. When the value is \"0\", restoration of volumes using a backup is disabled." + group: "Longhorn Default Settings" + type: int + min: 0 + default: 5 + - variable: defaultSettings.disableRevisionCounter + label: Disable Revision Counter + description: "Setting that disables the revision counter and thereby prevents Longhorn from tracking all write operations to a volume. When salvaging a volume, Longhorn uses properties of the \"volume-head-xxx.img\" file (the last file size and the last time the file was modified) to select the replica to be used for volume recovery. This setting applies only to volumes created using the Longhorn UI." + group: "Longhorn Default Settings" + type: boolean + default: "true" + - variable: defaultSettings.systemManagedPodsImagePullPolicy + label: System Managed Pod Image Pull Policy + description: "Image pull policy for system-managed pods, such as Instance Manager, engine images, and CSI Driver. Changes to the image pull policy are applied only after the system-managed pods restart." + group: "Longhorn Default Settings" + type: enum + options: + - "if-not-present" + - "always" + - "never" + default: "if-not-present" + - variable: defaultSettings.allowVolumeCreationWithDegradedAvailability + label: Allow Volume Creation with Degraded Availability + description: "Setting that allows you to create and attach a volume without having all replicas scheduled at the time of creation." + group: "Longhorn Default Settings" + type: boolean + default: "true" + - variable: defaultSettings.autoCleanupSystemGeneratedSnapshot + label: Automatically Cleanup System Generated Snapshot + description: "Setting that allows Longhorn to automatically clean up the system-generated snapshot after replica rebuilding is completed." + group: "Longhorn Default Settings" + type: boolean + default: "true" + - variable: defaultSettings.autoCleanupRecurringJobBackupSnapshot + label: Automatically Cleanup Recurring Job Backup Snapshot + description: "Setting that allows Longhorn to automatically clean up the snapshot generated by a recurring backup job." + group: "Longhorn Default Settings" + type: boolean + default: "true" + - variable: defaultSettings.concurrentAutomaticEngineUpgradePerNodeLimit + label: Concurrent Automatic Engine Upgrade Per Node Limit + description: "Maximum number of engines that are allowed to concurrently upgrade on each node after Longhorn Manager is upgraded. When the value is \"0\", Longhorn does not automatically upgrade volume engines to the new default engine image version." + group: "Longhorn Default Settings" + type: int + min: 0 + default: 0 + - variable: defaultSettings.backingImageCleanupWaitInterval + label: Backing Image Cleanup Wait Interval + description: "Number of minutes that Longhorn waits before cleaning up the backing image file when no replicas in the disk are using it." + group: "Longhorn Default Settings" + type: int + min: 0 + default: 60 + - variable: defaultSettings.backingImageRecoveryWaitInterval + label: Backing Image Recovery Wait Interval + description: "Number of seconds that Longhorn waits before downloading a backing image file again when the status of all image disk files changes to \"failed\" or \"unknown\"." + group: "Longhorn Default Settings" + type: int + min: 0 + default: 300 + - variable: defaultSettings.guaranteedInstanceManagerCPU + label: Guaranteed Instance Manager CPU + description: "Percentage of the total allocatable CPU resources on each node to be reserved for each instance manager pod when the V1 Data Engine is enabled. The default value is \"12\". + WARNING: + - Value 0 means removing the CPU requests from spec of instance manager pods. + - Considering the possible number of new instance manager pods in a further system upgrade, this integer value ranges from 0 to 40. + - One more set of instance manager pods may need to be deployed when the Longhorn system is upgraded. If current available CPUs of the nodes are not enough for the new instance manager pods, you need to detach the volumes using the oldest instance manager pods so that Longhorn can clean up the old pods automatically and release the CPU resources. And the new pods with the latest instance manager image will be launched then. + - This global setting will be ignored for a node if the field \"InstanceManagerCPURequest\" on the node is set. + - After this setting is changed, all instance manager pods using this global setting on all the nodes will be automatically restarted. In other words, DO NOT CHANGE THIS SETTING WITH ATTACHED VOLUMES." + group: "Longhorn Default Settings" + type: int + min: 0 + max: 40 + default: 12 + - variable: defaultSettings.logLevel + label: Log Level + description: 'Log levels that indicate the type and severity of logs in Longhorn Manager. The default value is "Info". (Options: "Panic", "Fatal", "Error", "Warn", "Info", "Debug", "Trace")' + group: "Longhorn Default Settings" + type: string + default: "Info" + - variable: defaultSettings.disableSnapshotPurge + label: Disable Snapshot Purge + description: "Setting that temporarily prevents all attempts to purge volume snapshots." + group: "Longhorn Default Settings" + type: boolean + default: "false" + - variable: defaultSettings.freezeFilesystemForSnapshot + description: "Setting that freezes the filesystem on the root partition before a snapshot is created." + group: "Longhorn Default Settings" + type: boolean + default: "false" +- variable: defaultSettings.kubernetesClusterAutoscalerEnabled + label: Kubernetes Cluster Autoscaler Enabled (Experimental) + description: "Setting that notifies Longhorn that the cluster is using the Kubernetes Cluster Autoscaler. + WARNING: + - Replica rebuilding could be expensive because nodes with reusable replicas could get removed by the Kubernetes Cluster Autoscaler." + group: "Longhorn Default Settings" + type: boolean + default: false +- variable: defaultSettings.orphanAutoDeletion + label: Orphaned Data Cleanup + description: "Setting that allows Longhorn to automatically delete an orphaned resource and the corresponding data (for example, stale replicas). Orphaned resources on failed or unknown nodes are not automatically cleaned up." + group: "Longhorn Default Settings" + type: boolean + default: false +- variable: defaultSettings.storageNetwork + label: Storage Network + description: "Longhorn uses the storage network for in-cluster data traffic. Leave this blank to use the Kubernetes cluster network. + WARNING: + - This setting should change after detaching all Longhorn volumes, as some of the Longhorn system component pods will get recreated to apply the setting. Longhorn will try to block this setting update when there are attached volumes." + group: "Longhorn Default Settings" + type: string + default: +- variable: defaultSettings.deletingConfirmationFlag + label: Deleting Confirmation Flag + description: "Flag that prevents accidental uninstallation of Longhorn." + group: "Longhorn Default Settings" + type: boolean + default: "false" +- variable: defaultSettings.engineReplicaTimeout + label: Timeout between Engine and Replica + description: "Timeout between the Longhorn Engine and replicas. Specify a value between \"8\" and \"30\" seconds. The default value is \"8\"." + group: "Longhorn Default Settings" + type: int + default: "8" +- variable: defaultSettings.snapshotDataIntegrity + label: Snapshot Data Integrity + description: "This setting allows users to enable or disable snapshot hashing and data integrity checking." + group: "Longhorn Default Settings" + type: string + default: "disabled" +- variable: defaultSettings.snapshotDataIntegrityImmediateCheckAfterSnapshotCreation + label: Immediate Snapshot Data Integrity Check After Creating a Snapshot + description: "Hashing snapshot disk files impacts the performance of the system. The immediate snapshot hashing and checking can be disabled to minimize the impact after creating a snapshot." + group: "Longhorn Default Settings" + type: boolean + default: "false" +- variable: defaultSettings.snapshotDataIntegrityCronjob + label: Snapshot Data Integrity Check CronJob + description: "Unix-cron string format. The setting specifies when Longhorn checks the data integrity of snapshot disk files." + group: "Longhorn Default Settings" + type: string + default: "0 0 */7 * *" +- variable: defaultSettings.removeSnapshotsDuringFilesystemTrim + label: Remove Snapshots During Filesystem Trim + description: "This setting allows Longhorn filesystem trim feature to automatically mark the latest snapshot and its ancestors as removed and stops at the snapshot containing multiple children." + group: "Longhorn Default Settings" + type: boolean + default: "false" +- variable: defaultSettings.fastReplicaRebuildEnabled + label: Fast Replica Rebuild Enabled + description: "Setting that allows fast rebuilding of replicas using the checksum of snapshot disk files. Before enabling this setting, you must set the snapshot-data-integrity value to \"enable\" or \"fast-check\"." + group: "Longhorn Default Settings" + type: boolean + default: false +- variable: defaultSettings.replicaFileSyncHttpClientTimeout + label: Timeout of HTTP Client to Replica File Sync Server + description: "In seconds. The setting specifies the HTTP client timeout to the file sync server." + group: "Longhorn Default Settings" + type: int + default: "30" +- variable: defaultSettings.longGRPCTimeOut + label: Long gRPC Timeout + description: "Number of seconds that Longhorn allows for the completion of replica rebuilding and snapshot cloning operations." + group: "Longhorn Default Settings" + type: int + default: "86400" +- variable: defaultSettings.backupCompressionMethod + label: Backup Compression Method + description: "Setting that allows you to specify a backup compression method." + group: "Longhorn Default Settings" + type: string + default: "lz4" +- variable: defaultSettings.backupConcurrentLimit + label: Backup Concurrent Limit Per Backup + description: "Maximum number of worker threads that can concurrently run for each backup." + group: "Longhorn Default Settings" + type: int + min: 1 + default: 2 +- variable: defaultSettings.restoreConcurrentLimit + label: Restore Concurrent Limit Per Backup + description: "This setting controls how many worker threads per restore concurrently." + group: "Longhorn Default Settings" + type: int + min: 1 + default: 2 +- variable: defaultSettings.allowCollectingLonghornUsageMetrics + label: Allow Collecting Longhorn Usage Metrics + description: "Setting that allows Longhorn to periodically collect anonymous usage data for product improvement purposes. Longhorn sends collected data to the [Upgrade Responder](https://github.com/longhorn/upgrade-responder) server, which is the data source of the Longhorn Public Metrics Dashboard (https://metrics.longhorn.io). The Upgrade Responder server does not store data that can be used to identify clients, including IP addresses." + group: "Longhorn Default Settings" + type: boolean + default: true +- variable: defaultSettings.v1DataEngine + label: V1 Data Engine + description: "Setting that allows you to enable the V1 Data Engine." + group: "Longhorn V1 Data Engine Settings" + type: boolean + default: true +- variable: defaultSettings.v2DataEngine + label: V2 Data Engine + description: "Setting that allows you to enable the V2 Data Engine, which is based on the Storage Performance Development Kit (SPDK). The V2 Data Engine is a preview feature and should not be used in production environments. + WARNING: + - DO NOT CHANGE THIS SETTING WITH ATTACHED VOLUMES. Longhorn will block this setting update when there are attached volumes. + - When the V2 Data Engine is enabled, each instance-manager pod utilizes 1 CPU core. This high CPU usage is attributed to the spdk_tgt process running within each instance-manager pod. The spdk_tgt process is responsible for handling input/output (IO) operations and requires intensive polling. As a result, it consumes 100% of a dedicated CPU core to efficiently manage and process the IO requests, ensuring optimal performance and responsiveness for storage operations." + group: "Longhorn V2 Data Engine (Preview Feature) Settings" + type: boolean + default: false +- variable: defaultSettings.v2DataEngineHugepageLimit + label: V2 Data Engine + description: "This allows users to configure maximum huge page size (in MiB) for the V2 Data Engine." + group: "Longhorn V2 Data Engine (Preview Feature) Settings" + type: int + default: "2048" +- variable: defaultSettings.v2DataEngineLogLevel + label: V2 Data Engine + description: "Setting that allows you to configure the log level of the SPDK target daemon (spdk_tgt) of the V2 Data Engine." + group: "Longhorn V2 Data Engine (Preview Feature) Settings" + type: enum + options: + - "Disabled" + - "Error" + - "Warn" + - "Notice" + - "Info" + - "Debug" + default: "Notice" +- variable: defaultSettings.v2DataEngineLogFlags + label: V2 Data Engine + description: "Setting that allows you to configure the log flags of the SPDK target daemon (spdk_tgt) of the V2 Data Engine." + group: "Longhorn V2 Data Engine (Preview Feature) Settings" + type: string + default: +- variable: defaultSettings.autoCleanupSnapshotWhenDeleteBackup + label: Auto Cleanup Snapshot When Delete Backup + description: "Setting that automatically cleans up the snapshot when the backup is deleted." + group: "Longhorn Default Settings" + type: boolean + default: false +- variable: defaultSettings.rwxVolumeFastFailover + label: RWX Volume Fast Failover (Experimental) + description: "Turn on logic to detect and move RWX volumes quickly on node failure." + group: "Longhorn Default Settings" + type: boolean + default: false +- variable: persistence.defaultClass + default: "true" + description: "Setting that allows you to specify the default Longhorn StorageClass." + label: Default Storage Class + group: "Longhorn Storage Class Settings" + required: true + type: boolean +- variable: persistence.reclaimPolicy + label: Storage Class Retain Policy + description: "Reclaim policy that provides instructions for handling of a volume after its claim is released. (Options: \"Retain\", \"Delete\")" + group: "Longhorn Storage Class Settings" + required: true + type: enum + options: + - "Delete" + - "Retain" + default: "Delete" +- variable: persistence.disableRevisionCounter + label: Default Storage Class Disable Revision Counter + description: "Setting that disables the revision counter and thereby prevents Longhorn from tracking all write operations to a volume. When salvaging a volume, Longhorn uses properties of the volume-head-xxx.img file (the last file size and the last time the file was modified) to select the replica to be used for volume recovery. (Options: \"true\", \"false\")" + group: "Longhorn Storage Class Settings" + required: true + type: enum + options: + - "true" + - "false" + default: "true" +- variable: persistence.defaultClassReplicaCount + description: "Replica count of the default Longhorn StorageClass." + label: Default Storage Class Replica Count + group: "Longhorn Storage Class Settings" + type: int + min: 1 + max: 10 + default: 3 +- variable: persistence.defaultDataLocality + description: "Data locality of the default Longhorn StorageClass. (Options: \"disabled\", \"best-effort\")" + label: Default Storage Class Data Locality + group: "Longhorn Storage Class Settings" + type: enum + options: + - "disabled" + - "best-effort" + default: "disabled" +- variable: persistence.recurringJobSelector.enable + description: "Setting that allows you to enable the recurring job selector for a Longhorn StorageClass." + group: "Longhorn Storage Class Settings" + label: Enable Storage Class Recurring Job Selector + type: boolean + default: false + show_subquestion_if: true + subquestions: + - variable: persistence.recurringJobSelector.jobList + description: 'Recurring job selector for a Longhorn StorageClass. Ensure that quotes are used correctly when specifying job parameters. (Example: `[{"name":"backup", "isGroup":true}]`)' + label: Storage Class Recurring Job Selector List + group: "Longhorn Storage Class Settings" + type: string + default: +- variable: persistence.defaultDiskSelector.enable + description: "Setting that allows you to enable the disk selector for the default Longhorn StorageClass." + group: "Longhorn Storage Class Settings" + label: Enable Storage Class Disk Selector + type: boolean + default: false + show_subquestion_if: true + subquestions: + - variable: persistence.defaultDiskSelector.selector + label: Storage Class Disk Selector + description: 'Disk selector for the default Longhorn StorageClass. Longhorn uses only disks with the specified tags for storing volume data. (Examples: "nvme,sata")' + group: "Longhorn Storage Class Settings" + type: string + default: +- variable: persistence.defaultNodeSelector.enable + description: "Setting that allows you to enable the node selector for the default Longhorn StorageClass." + group: "Longhorn Storage Class Settings" + label: Enable Storage Class Node Selector + type: boolean + default: false + show_subquestion_if: true + subquestions: + - variable: persistence.defaultNodeSelector.selector + label: Storage Class Node Selector + description: 'Node selector for the default Longhorn StorageClass. Longhorn uses only nodes with the specified tags for storing volume data. (Examples: "storage,fast")' + group: "Longhorn Storage Class Settings" + type: string + default: +- variable: persistence.backingImage.enable + description: "Setting that allows you to use a backing image in a Longhorn StorageClass." + group: "Longhorn Storage Class Settings" + label: Default Storage Class Backing Image + type: boolean + default: false + show_subquestion_if: true + subquestions: + - variable: persistence.backingImage.name + description: 'Backing image to be used for creating and restoring volumes in a Longhorn StorageClass. When no backing images are available, specify the data source type and parameters that Longhorn can use to create a backing image.' + label: Storage Class Backing Image Name + group: "Longhorn Storage Class Settings" + type: string + default: + - variable: persistence.backingImage.expectedChecksum + description: 'Expected SHA-512 checksum of a backing image used in a Longhorn StorageClass. + WARNING: + - If the backing image name is not specified, setting this field is meaningless. + - It is not recommended to set this field if the data source type is \"export-from-volume\".' + label: Storage Class Backing Image Expected SHA512 Checksum + group: "Longhorn Storage Class Settings" + type: string + default: + - variable: persistence.backingImage.dataSourceType + description: 'Data source type of a backing image used in a Longhorn StorageClass. If the backing image exists in the cluster, Longhorn uses this setting to verify the image. If the backing image does not exist, Longhorn creates one using the specified data source type. + WARNING: + - If the backing image name is not specified, setting this field is meaningless. + - As for backing image creation with data source type \"upload\", it is recommended to do it via UI rather than StorageClass here. Uploading requires file data sending to the Longhorn backend after the object creation, which is complicated if you want to handle it manually.' + label: Storage Class Backing Image Data Source Type + group: "Longhorn Storage Class Settings" + type: enum + options: + - "" + - "download" + - "upload" + - "export-from-volume" + default: "" + - variable: persistence.backingImage.dataSourceParameters + description: "Data source parameters of a backing image used in a Longhorn StorageClass. You can specify a JSON string of a map. (Example: `'{\"url\":\"https://backing-image-example.s3-region.amazonaws.com/test-backing-image\"}'`) + WARNING: + - If the backing image name is not specified, setting this field is meaningless. + - Be careful of the quotes here." + label: Storage Class Backing Image Data Source Parameters + group: "Longhorn Storage Class Settings" + type: string + default: +- variable: persistence.removeSnapshotsDuringFilesystemTrim + description: "Setting that allows you to enable automatic snapshot removal during filesystem trim for a Longhorn StorageClass. (Options: \"ignored\", \"enabled\", \"disabled\")" + label: Default Storage Class Remove Snapshots During Filesystem Trim + group: "Longhorn Storage Class Settings" + type: enum + options: + - "ignored" + - "enabled" + - "disabled" + default: "ignored" +- variable: ingress.enabled + default: "false" + description: "Expose app using Layer 7 Load Balancer - ingress" + type: boolean + group: "Services and Load Balancing" + label: Expose app using Layer 7 Load Balancer + show_subquestion_if: true + subquestions: + - variable: ingress.host + default: "xip.io" + description: "Hostname of the Layer 7 load balancer." + type: hostname + required: true + label: Layer 7 Load Balancer Hostname + - variable: ingress.path + default: "/" + description: "Default ingress path. You can access the Longhorn UI by following the full ingress path {{host}}+{{path}}." + type: string + required: true + label: Ingress Path + - variable: ingress.pathType + default: "ImplementationSpecific" + description: "Path type for the ingress. (Options: \"ImplementationSpecific\", \"Exact\", \"Prefix\")" + type: enum + options: + - "ImplementationSpecific" + - "Exact" + - "Prefix" + required: true + label: Ingress Path Type +- variable: service.ui.type + default: "Rancher-Proxy" + description: "Service type for Longhorn UI. (Options: \"ClusterIP\", \"NodePort\", \"LoadBalancer\", \"Rancher-Proxy\")" + type: enum + options: + - "ClusterIP" + - "NodePort" + - "LoadBalancer" + - "Rancher-Proxy" + label: Longhorn UI Service + show_if: "ingress.enabled=false" + group: "Services and Load Balancing" + show_subquestion_if: "NodePort" + subquestions: + - variable: service.ui.nodePort + default: "" + description: "NodePort port number for Longhorn UI. When unspecified, Longhorn selects a free port between 30000 and 32767." + type: int + min: 30000 + max: 32767 + show_if: "service.ui.type=NodePort||service.ui.type=LoadBalancer" + label: UI Service NodePort number +- variable: enablePSP + default: "false" + description: "Setting that allows you to enable pod security policies (PSPs) that allow privileged Longhorn pods to start. This setting applies only to clusters running Kubernetes 1.25 and earlier, and with the built-in Pod Security admission controller enabled." + label: Pod Security Policy + type: boolean + group: "Other Settings" +- variable: global.cattle.windowsCluster.enabled + default: "false" + description: "Setting that allows Longhorn to run on a Rancher Windows cluster." + label: Rancher Windows Cluster + type: boolean + group: "Other Settings" +- variable: networkPolicies.enabled + description: "Setting that allows you to enable network policies that control access to Longhorn pods. + Warning: The Rancher Proxy will not work if this feature is enabled and a custom NetworkPolicy must be added." + group: "Other Settings" + label: Network Policies + default: "false" + type: boolean + subquestions: + - variable: networkPolicies.type + label: Network Policies for Ingress + description: "Distribution that determines the policy for allowing access for an ingress. (Options: \"k3s\", \"rke2\", \"rke1\")" + show_if: "networkPolicies.enabled=true&&ingress.enabled=true" + type: enum + default: "rke2" + options: + - "rke1" + - "rke2" + - "k3s" + - variable: defaultSettings.v2DataEngineGuaranteedInstanceManagerCPU + label: Guaranteed Instance Manager CPU for V2 Data Engine + description: 'Number of millicpus on each node to be reserved for each Instance Manager pod when the V2 Data Engine is enabled. The default value is "1250". + WARNING: + - Specifying a value of 0 disables CPU requests for instance manager pods. You must specify an integer between 1000 and 8000. + - This is a global setting. Modifying the value triggers an automatic restart of the instance manager pods. Do not modify the value while volumes are still attached." + group: "Longhorn Default Settings' + type: int + min: 1000 + max: 8000 + default: 1250 diff --git a/charts/longhorn/102.5.1+up1.7.2/templates/NOTES.txt b/charts/longhorn/102.5.1+up1.7.2/templates/NOTES.txt new file mode 100644 index 0000000000..cca7cd77b9 --- /dev/null +++ b/charts/longhorn/102.5.1+up1.7.2/templates/NOTES.txt @@ -0,0 +1,5 @@ +Longhorn is now installed on the cluster! + +Please wait a few minutes for other Longhorn components such as CSI deployments, Engine Images, and Instance Managers to be initialized. + +Visit our documentation at https://longhorn.io/docs/ diff --git a/charts/longhorn/102.5.1+up1.7.2/templates/_helpers.tpl b/charts/longhorn/102.5.1+up1.7.2/templates/_helpers.tpl new file mode 100644 index 0000000000..3fbc2ac02f --- /dev/null +++ b/charts/longhorn/102.5.1+up1.7.2/templates/_helpers.tpl @@ -0,0 +1,66 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "longhorn.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +*/}} +{{- define "longhorn.fullname" -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} + + +{{- define "longhorn.managerIP" -}} +{{- $fullname := (include "longhorn.fullname" .) -}} +{{- printf "http://%s-backend:9500" $fullname | trunc 63 | trimSuffix "-" -}} +{{- end -}} + + +{{- define "secret" }} +{{- printf "{\"auths\": {\"%s\": {\"auth\": \"%s\"}}}" .Values.privateRegistry.registryUrl (printf "%s:%s" .Values.privateRegistry.registryUser .Values.privateRegistry.registryPasswd | b64enc) | b64enc }} +{{- end }} + +{{- /* +longhorn.labels generates the standard Helm labels. +*/ -}} +{{- define "longhorn.labels" -}} +app.kubernetes.io/name: {{ template "longhorn.name" . }} +helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +app.kubernetes.io/instance: {{ .Release.Name }} +app.kubernetes.io/version: {{ .Chart.AppVersion }} +{{- end -}} + + +{{- define "system_default_registry" -}} +{{- if .Values.global.cattle.systemDefaultRegistry -}} +{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} +{{- else -}} +{{- "" -}} +{{- end -}} +{{- end -}} + +{{- define "registry_url" -}} +{{- if .Values.privateRegistry.registryUrl -}} +{{- printf "%s/" .Values.privateRegistry.registryUrl -}} +{{- else -}} +{{ include "system_default_registry" . }} +{{- end -}} +{{- end -}} + +{{- /* + define the longhorn release namespace +*/ -}} +{{- define "release_namespace" -}} +{{- if .Values.namespaceOverride -}} +{{- .Values.namespaceOverride -}} +{{- else -}} +{{- .Release.Namespace -}} +{{- end -}} +{{- end -}} diff --git a/charts/longhorn/102.5.1+up1.7.2/templates/clusterrole.yaml b/charts/longhorn/102.5.1+up1.7.2/templates/clusterrole.yaml new file mode 100644 index 0000000000..c065f1726c --- /dev/null +++ b/charts/longhorn/102.5.1+up1.7.2/templates/clusterrole.yaml @@ -0,0 +1,77 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: longhorn-role + labels: {{- include "longhorn.labels" . | nindent 4 }} +rules: +- apiGroups: + - apiextensions.k8s.io + resources: + - customresourcedefinitions + verbs: + - "*" +- apiGroups: [""] + resources: ["pods", "events", "persistentvolumes", "persistentvolumeclaims","persistentvolumeclaims/status", "nodes", "proxy/nodes", "pods/log", "secrets", "services", "endpoints", "configmaps", "serviceaccounts"] + verbs: ["*"] +- apiGroups: [""] + resources: ["namespaces"] + verbs: ["get", "list"] +- apiGroups: ["apps"] + resources: ["daemonsets", "statefulsets", "deployments"] + verbs: ["*"] +- apiGroups: ["batch"] + resources: ["jobs", "cronjobs"] + verbs: ["*"] +- apiGroups: ["policy"] + resources: ["poddisruptionbudgets", "podsecuritypolicies"] + verbs: ["*"] +- apiGroups: ["scheduling.k8s.io"] + resources: ["priorityclasses"] + verbs: ["watch", "list"] +- apiGroups: ["storage.k8s.io"] + resources: ["storageclasses", "volumeattachments", "volumeattachments/status", "csinodes", "csidrivers"] + verbs: ["*"] +- apiGroups: ["snapshot.storage.k8s.io"] + resources: ["volumesnapshotclasses", "volumesnapshots", "volumesnapshotcontents", "volumesnapshotcontents/status"] + verbs: ["*"] +- apiGroups: ["longhorn.io"] + resources: ["volumes", "volumes/status", "engines", "engines/status", "replicas", "replicas/status", "settings", "settings/status", + "engineimages", "engineimages/status", "nodes", "nodes/status", "instancemanagers", "instancemanagers/status", + {{- if .Values.openshift.enabled }} + "engineimages/finalizers", "nodes/finalizers", "instancemanagers/finalizers", + {{- end }} + "sharemanagers", "sharemanagers/status", "backingimages", "backingimages/status", + "backingimagemanagers", "backingimagemanagers/status", "backingimagedatasources", "backingimagedatasources/status", + "backuptargets", "backuptargets/status", "backupvolumes", "backupvolumes/status", "backups", "backups/status", + "recurringjobs", "recurringjobs/status", "orphans", "orphans/status", "snapshots", "snapshots/status", + "supportbundles", "supportbundles/status", "systembackups", "systembackups/status", "systemrestores", "systemrestores/status", + "volumeattachments", "volumeattachments/status", "backupbackingimages", "backupbackingimages/status"] + verbs: ["*"] +- apiGroups: ["coordination.k8s.io"] + resources: ["leases"] + verbs: ["*"] +- apiGroups: ["metrics.k8s.io"] + resources: ["pods", "nodes"] + verbs: ["get", "list"] +- apiGroups: ["apiregistration.k8s.io"] + resources: ["apiservices"] + verbs: ["list", "watch"] +- apiGroups: ["admissionregistration.k8s.io"] + resources: ["mutatingwebhookconfigurations", "validatingwebhookconfigurations"] + verbs: ["get", "list", "create", "patch", "delete"] +- apiGroups: ["rbac.authorization.k8s.io"] + resources: ["roles", "rolebindings", "clusterrolebindings", "clusterroles"] + verbs: ["*"] +{{- if .Values.openshift.enabled }} +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: longhorn-ocp-privileged-role + labels: {{- include "longhorn.labels" . | nindent 4 }} +rules: +- apiGroups: ["security.openshift.io"] + resources: ["securitycontextconstraints"] + resourceNames: ["anyuid", "privileged"] + verbs: ["use"] +{{- end }} diff --git a/charts/longhorn/102.5.1+up1.7.2/templates/clusterrolebinding.yaml b/charts/longhorn/102.5.1+up1.7.2/templates/clusterrolebinding.yaml new file mode 100644 index 0000000000..2e34f014ce --- /dev/null +++ b/charts/longhorn/102.5.1+up1.7.2/templates/clusterrolebinding.yaml @@ -0,0 +1,49 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: longhorn-bind + labels: {{- include "longhorn.labels" . | nindent 4 }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: longhorn-role +subjects: +- kind: ServiceAccount + name: longhorn-service-account + namespace: {{ include "release_namespace" . }} +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: longhorn-support-bundle + labels: {{- include "longhorn.labels" . | nindent 4 }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: cluster-admin +subjects: +- kind: ServiceAccount + name: longhorn-support-bundle + namespace: {{ include "release_namespace" . }} +{{- if .Values.openshift.enabled }} +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: longhorn-ocp-privileged-bind + labels: {{- include "longhorn.labels" . | nindent 4 }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: longhorn-ocp-privileged-role +subjects: +- kind: ServiceAccount + name: longhorn-service-account + namespace: {{ include "release_namespace" . }} +- kind: ServiceAccount + name: longhorn-ui-service-account + namespace: {{ include "release_namespace" . }} +- kind: ServiceAccount + name: default # supportbundle-agent-support-bundle uses default sa + namespace: {{ include "release_namespace" . }} +{{- end }} diff --git a/charts/longhorn/102.5.1+up1.7.2/templates/daemonset-sa.yaml b/charts/longhorn/102.5.1+up1.7.2/templates/daemonset-sa.yaml new file mode 100644 index 0000000000..af7c09a409 --- /dev/null +++ b/charts/longhorn/102.5.1+up1.7.2/templates/daemonset-sa.yaml @@ -0,0 +1,180 @@ +apiVersion: apps/v1 +kind: DaemonSet +metadata: + labels: {{- include "longhorn.labels" . | nindent 4 }} + app: longhorn-manager + name: longhorn-manager + namespace: {{ include "release_namespace" . }} +spec: + selector: + matchLabels: + app: longhorn-manager + template: + metadata: + labels: {{- include "longhorn.labels" . | nindent 8 }} + app: longhorn-manager + {{- with .Values.annotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + spec: + containers: + - name: longhorn-manager + image: {{ template "registry_url" . }}{{ .Values.image.longhorn.manager.repository }}:{{ .Values.image.longhorn.manager.tag }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + securityContext: + privileged: true + command: + - longhorn-manager + - -d + {{- if eq .Values.longhornManager.log.format "json" }} + - -j + {{- end }} + - daemon + - --engine-image + - "{{ template "registry_url" . }}{{ .Values.image.longhorn.engine.repository }}:{{ .Values.image.longhorn.engine.tag }}" + - --instance-manager-image + - "{{ template "registry_url" . }}{{ .Values.image.longhorn.instanceManager.repository }}:{{ .Values.image.longhorn.instanceManager.tag }}" + - --share-manager-image + - "{{ template "registry_url" . }}{{ .Values.image.longhorn.shareManager.repository }}:{{ .Values.image.longhorn.shareManager.tag }}" + - --backing-image-manager-image + - "{{ template "registry_url" . }}{{ .Values.image.longhorn.backingImageManager.repository }}:{{ .Values.image.longhorn.backingImageManager.tag }}" + - --support-bundle-manager-image + - "{{ template "registry_url" . }}{{ .Values.image.longhorn.supportBundleKit.repository }}:{{ .Values.image.longhorn.supportBundleKit.tag }}" + - --manager-image + - "{{ template "registry_url" . }}{{ .Values.image.longhorn.manager.repository }}:{{ .Values.image.longhorn.manager.tag }}" + - --service-account + - longhorn-service-account + {{- if .Values.preUpgradeChecker.upgradeVersionCheck}} + - --upgrade-version-check + {{- end }} + ports: + - containerPort: 9500 + name: manager + - containerPort: 9501 + name: conversion-wh + - containerPort: 9502 + name: admission-wh + - containerPort: 9503 + name: recov-backend + readinessProbe: + httpGet: + path: /v1/healthz + port: 9501 + scheme: HTTPS + volumeMounts: + - name: boot + mountPath: /host/boot/ + - name: dev + mountPath: /host/dev/ + - name: proc + mountPath: /host/proc/ + - name: longhorn + mountPath: /var/lib/longhorn/ + mountPropagation: Bidirectional + - name: longhorn-grpc-tls + mountPath: /tls-files/ + {{- if .Values.enableGoCoverDir }} + - name: go-cover-dir + mountPath: /go-cover-dir/ + {{- end }} + env: + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + {{- if .Values.enableGoCoverDir }} + - name: GOCOVERDIR + value: /go-cover-dir/ + {{- end }} + - name: pre-pull-share-manager-image + imagePullPolicy: {{ .Values.image.pullPolicy }} + image: {{ template "registry_url" . }}{{ .Values.image.longhorn.shareManager.repository }}:{{ .Values.image.longhorn.shareManager.tag }} + command: ["sh", "-c", "echo share-manager image pulled && sleep infinity"] + volumes: + - name: boot + hostPath: + path: /boot/ + - name: dev + hostPath: + path: /dev/ + - name: proc + hostPath: + path: /proc/ + - name: longhorn + hostPath: + path: /var/lib/longhorn/ + {{- if .Values.enableGoCoverDir }} + - name: go-cover-dir + hostPath: + path: /go-cover-dir/ + type: DirectoryOrCreate + {{- end }} + - name: longhorn-grpc-tls + secret: + secretName: longhorn-grpc-tls + optional: true + {{- if .Values.privateRegistry.registrySecret }} + imagePullSecrets: + - name: {{ .Values.privateRegistry.registrySecret }} + {{- end }} + {{- if .Values.longhornManager.priorityClass }} + priorityClassName: {{ .Values.longhornManager.priorityClass | quote }} + {{- end }} + {{- if or .Values.global.tolerations .Values.longhornManager.tolerations .Values.global.cattle.windowsCluster.enabled }} + tolerations: + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.tolerations }} +{{ toYaml .Values.global.cattle.windowsCluster.tolerations | indent 6 }} + {{- end }} + {{- if or .Values.global.tolerations .Values.longhornManager.tolerations }} +{{ default .Values.global.tolerations .Values.longhornManager.tolerations | toYaml | indent 6 }} + {{- end }} + {{- end }} + {{- if or .Values.global.nodeSelector .Values.longhornManager.nodeSelector .Values.global.cattle.windowsCluster.enabled }} + nodeSelector: + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.nodeSelector }} +{{ toYaml .Values.global.cattle.windowsCluster.nodeSelector | indent 8 }} + {{- end }} + {{- if or .Values.global.nodeSelector .Values.longhornManager.nodeSelector }} +{{ default .Values.global.nodeSelector .Values.longhornManager.nodeSelector | toYaml | indent 8 }} + {{- end }} + {{- end }} + serviceAccountName: longhorn-service-account + updateStrategy: + rollingUpdate: + maxUnavailable: "100%" +--- +apiVersion: v1 +kind: Service +metadata: + labels: {{- include "longhorn.labels" . | nindent 4 }} + app: longhorn-manager + name: longhorn-backend + namespace: {{ include "release_namespace" . }} + {{- if .Values.longhornManager.serviceAnnotations }} + annotations: +{{ toYaml .Values.longhornManager.serviceAnnotations | indent 4 }} + {{- end }} +spec: + type: {{ .Values.service.manager.type }} + selector: + app: longhorn-manager + ports: + - name: manager + port: 9500 + targetPort: manager + {{- if .Values.service.manager.nodePort }} + nodePort: {{ .Values.service.manager.nodePort }} + {{- end }} diff --git a/charts/longhorn/102.5.1+up1.7.2/templates/default-setting.yaml b/charts/longhorn/102.5.1+up1.7.2/templates/default-setting.yaml new file mode 100644 index 0000000000..315cdc6ec9 --- /dev/null +++ b/charts/longhorn/102.5.1+up1.7.2/templates/default-setting.yaml @@ -0,0 +1,244 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: longhorn-default-setting + namespace: {{ include "release_namespace" . }} + labels: {{- include "longhorn.labels" . | nindent 4 }} +data: + default-setting.yaml: |- + {{- if not (kindIs "invalid" .Values.defaultSettings.backupTarget) }} + backup-target: {{ .Values.defaultSettings.backupTarget }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.backupTargetCredentialSecret) }} + backup-target-credential-secret: {{ .Values.defaultSettings.backupTargetCredentialSecret }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.allowRecurringJobWhileVolumeDetached) }} + allow-recurring-job-while-volume-detached: {{ .Values.defaultSettings.allowRecurringJobWhileVolumeDetached }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.createDefaultDiskLabeledNodes) }} + create-default-disk-labeled-nodes: {{ .Values.defaultSettings.createDefaultDiskLabeledNodes }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.defaultDataPath) }} + default-data-path: {{ .Values.defaultSettings.defaultDataPath }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.replicaSoftAntiAffinity) }} + replica-soft-anti-affinity: {{ .Values.defaultSettings.replicaSoftAntiAffinity }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.replicaAutoBalance) }} + replica-auto-balance: {{ .Values.defaultSettings.replicaAutoBalance }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.storageOverProvisioningPercentage) }} + storage-over-provisioning-percentage: {{ .Values.defaultSettings.storageOverProvisioningPercentage }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.storageMinimalAvailablePercentage) }} + storage-minimal-available-percentage: {{ .Values.defaultSettings.storageMinimalAvailablePercentage }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.storageReservedPercentageForDefaultDisk) }} + storage-reserved-percentage-for-default-disk: {{ .Values.defaultSettings.storageReservedPercentageForDefaultDisk }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.upgradeChecker) }} + upgrade-checker: {{ .Values.defaultSettings.upgradeChecker }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.defaultReplicaCount) }} + default-replica-count: {{ .Values.defaultSettings.defaultReplicaCount }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.defaultDataLocality) }} + default-data-locality: {{ .Values.defaultSettings.defaultDataLocality }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.defaultLonghornStaticStorageClass) }} + default-longhorn-static-storage-class: {{ .Values.defaultSettings.defaultLonghornStaticStorageClass }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.backupstorePollInterval) }} + backupstore-poll-interval: {{ .Values.defaultSettings.backupstorePollInterval }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.failedBackupTTL) }} + failed-backup-ttl: {{ .Values.defaultSettings.failedBackupTTL }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.restoreVolumeRecurringJobs) }} + restore-volume-recurring-jobs: {{ .Values.defaultSettings.restoreVolumeRecurringJobs }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.recurringSuccessfulJobsHistoryLimit) }} + recurring-successful-jobs-history-limit: {{ .Values.defaultSettings.recurringSuccessfulJobsHistoryLimit }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.recurringJobMaxRetention) }} + recurring-job-max-retention: {{ .Values.defaultSettings.recurringJobMaxRetention }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.recurringFailedJobsHistoryLimit) }} + recurring-failed-jobs-history-limit: {{ .Values.defaultSettings.recurringFailedJobsHistoryLimit }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.supportBundleFailedHistoryLimit) }} + support-bundle-failed-history-limit: {{ .Values.defaultSettings.supportBundleFailedHistoryLimit }} + {{- end }} + {{- if or (not (kindIs "invalid" .Values.defaultSettings.taintToleration)) (.Values.global.cattle.windowsCluster.enabled) }} + taint-toleration: {{ $windowsDefaultSettingTaintToleration := list }}{{ $defaultSettingTaintToleration := list -}} + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.defaultSetting.taintToleration -}} + {{- $windowsDefaultSettingTaintToleration = .Values.global.cattle.windowsCluster.defaultSetting.taintToleration -}} + {{- end -}} + {{- if not (kindIs "invalid" .Values.defaultSettings.taintToleration) -}} + {{- $defaultSettingTaintToleration = .Values.defaultSettings.taintToleration -}} + {{- end -}} + {{- $taintToleration := list $windowsDefaultSettingTaintToleration $defaultSettingTaintToleration }}{{ join ";" (compact $taintToleration) -}} + {{- end }} + {{- if or (not (kindIs "invalid" .Values.defaultSettings.systemManagedComponentsNodeSelector)) (.Values.global.cattle.windowsCluster.enabled) }} + system-managed-components-node-selector: {{ $windowsDefaultSettingNodeSelector := list }}{{ $defaultSettingNodeSelector := list -}} + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.defaultSetting.systemManagedComponentsNodeSelector -}} + {{ $windowsDefaultSettingNodeSelector = .Values.global.cattle.windowsCluster.defaultSetting.systemManagedComponentsNodeSelector -}} + {{- end -}} + {{- if not (kindIs "invalid" .Values.defaultSettings.systemManagedComponentsNodeSelector) -}} + {{- $defaultSettingNodeSelector = .Values.defaultSettings.systemManagedComponentsNodeSelector -}} + {{- end -}} + {{- $nodeSelector := list $windowsDefaultSettingNodeSelector $defaultSettingNodeSelector }}{{ join ";" (compact $nodeSelector) -}} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.priorityClass) }} + priority-class: {{ .Values.defaultSettings.priorityClass }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.autoSalvage) }} + auto-salvage: {{ .Values.defaultSettings.autoSalvage }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.autoDeletePodWhenVolumeDetachedUnexpectedly) }} + auto-delete-pod-when-volume-detached-unexpectedly: {{ .Values.defaultSettings.autoDeletePodWhenVolumeDetachedUnexpectedly }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.disableSchedulingOnCordonedNode) }} + disable-scheduling-on-cordoned-node: {{ .Values.defaultSettings.disableSchedulingOnCordonedNode }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.replicaZoneSoftAntiAffinity) }} + replica-zone-soft-anti-affinity: {{ .Values.defaultSettings.replicaZoneSoftAntiAffinity }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.replicaDiskSoftAntiAffinity) }} + replica-disk-soft-anti-affinity: {{ .Values.defaultSettings.replicaDiskSoftAntiAffinity }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.nodeDownPodDeletionPolicy) }} + node-down-pod-deletion-policy: {{ .Values.defaultSettings.nodeDownPodDeletionPolicy }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.nodeDrainPolicy) }} + node-drain-policy: {{ .Values.defaultSettings.nodeDrainPolicy }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.detachManuallyAttachedVolumesWhenCordoned) }} + detach-manually-attached-volumes-when-cordoned: {{ .Values.defaultSettings.detachManuallyAttachedVolumesWhenCordoned }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.replicaReplenishmentWaitInterval) }} + replica-replenishment-wait-interval: {{ .Values.defaultSettings.replicaReplenishmentWaitInterval }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.concurrentReplicaRebuildPerNodeLimit) }} + concurrent-replica-rebuild-per-node-limit: {{ .Values.defaultSettings.concurrentReplicaRebuildPerNodeLimit }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.concurrentVolumeBackupRestorePerNodeLimit) }} + concurrent-volume-backup-restore-per-node-limit: {{ .Values.defaultSettings.concurrentVolumeBackupRestorePerNodeLimit }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.disableRevisionCounter) }} + disable-revision-counter: {{ .Values.defaultSettings.disableRevisionCounter }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.systemManagedPodsImagePullPolicy) }} + system-managed-pods-image-pull-policy: {{ .Values.defaultSettings.systemManagedPodsImagePullPolicy }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.allowVolumeCreationWithDegradedAvailability) }} + allow-volume-creation-with-degraded-availability: {{ .Values.defaultSettings.allowVolumeCreationWithDegradedAvailability }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.autoCleanupSystemGeneratedSnapshot) }} + auto-cleanup-system-generated-snapshot: {{ .Values.defaultSettings.autoCleanupSystemGeneratedSnapshot }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.autoCleanupRecurringJobBackupSnapshot) }} + auto-cleanup-recurring-job-backup-snapshot: {{ .Values.defaultSettings.autoCleanupRecurringJobBackupSnapshot }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.concurrentAutomaticEngineUpgradePerNodeLimit) }} + concurrent-automatic-engine-upgrade-per-node-limit: {{ .Values.defaultSettings.concurrentAutomaticEngineUpgradePerNodeLimit }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.backingImageCleanupWaitInterval) }} + backing-image-cleanup-wait-interval: {{ .Values.defaultSettings.backingImageCleanupWaitInterval }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.backingImageRecoveryWaitInterval) }} + backing-image-recovery-wait-interval: {{ .Values.defaultSettings.backingImageRecoveryWaitInterval }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.guaranteedInstanceManagerCPU) }} + guaranteed-instance-manager-cpu: {{ .Values.defaultSettings.guaranteedInstanceManagerCPU }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.kubernetesClusterAutoscalerEnabled) }} + kubernetes-cluster-autoscaler-enabled: {{ .Values.defaultSettings.kubernetesClusterAutoscalerEnabled }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.orphanAutoDeletion) }} + orphan-auto-deletion: {{ .Values.defaultSettings.orphanAutoDeletion }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.storageNetwork) }} + storage-network: {{ .Values.defaultSettings.storageNetwork }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.deletingConfirmationFlag) }} + deleting-confirmation-flag: {{ .Values.defaultSettings.deletingConfirmationFlag }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.engineReplicaTimeout) }} + engine-replica-timeout: {{ .Values.defaultSettings.engineReplicaTimeout }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.snapshotDataIntegrity) }} + snapshot-data-integrity: {{ .Values.defaultSettings.snapshotDataIntegrity }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.snapshotDataIntegrityImmediateCheckAfterSnapshotCreation) }} + snapshot-data-integrity-immediate-check-after-snapshot-creation: {{ .Values.defaultSettings.snapshotDataIntegrityImmediateCheckAfterSnapshotCreation }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.snapshotDataIntegrityCronjob) }} + snapshot-data-integrity-cronjob: {{ .Values.defaultSettings.snapshotDataIntegrityCronjob }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.removeSnapshotsDuringFilesystemTrim) }} + remove-snapshots-during-filesystem-trim: {{ .Values.defaultSettings.removeSnapshotsDuringFilesystemTrim }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.fastReplicaRebuildEnabled) }} + fast-replica-rebuild-enabled: {{ .Values.defaultSettings.fastReplicaRebuildEnabled }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.replicaFileSyncHttpClientTimeout) }} + replica-file-sync-http-client-timeout: {{ .Values.defaultSettings.replicaFileSyncHttpClientTimeout }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.longGRPCTimeOut) }} + long-grpc-timeout: {{ .Values.defaultSettings.longGRPCTimeOut }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.logLevel) }} + log-level: {{ .Values.defaultSettings.logLevel }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.backupCompressionMethod) }} + backup-compression-method: {{ .Values.defaultSettings.backupCompressionMethod }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.backupConcurrentLimit) }} + backup-concurrent-limit: {{ .Values.defaultSettings.backupConcurrentLimit }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.restoreConcurrentLimit) }} + restore-concurrent-limit: {{ .Values.defaultSettings.restoreConcurrentLimit }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.v1DataEngine) }} + v1-data-engine: {{ .Values.defaultSettings.v1DataEngine }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.v2DataEngine) }} + v2-data-engine: {{ .Values.defaultSettings.v2DataEngine }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.v2DataEngineHugepageLimit) }} + v2-data-engine-hugepage-limit: {{ .Values.defaultSettings.v2DataEngineHugepageLimit }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.allowEmptyNodeSelectorVolume) }} + allow-empty-node-selector-volume: {{ .Values.defaultSettings.allowEmptyNodeSelectorVolume }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.allowEmptyDiskSelectorVolume) }} + allow-empty-disk-selector-volume: {{ .Values.defaultSettings.allowEmptyDiskSelectorVolume }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.allowCollectingLonghornUsageMetrics) }} + allow-collecting-longhorn-usage-metrics: {{ .Values.defaultSettings.allowCollectingLonghornUsageMetrics }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.disableSnapshotPurge) }} + disable-snapshot-purge: {{ .Values.defaultSettings.disableSnapshotPurge }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.v2DataEngineGuaranteedInstanceManagerCPU) }} + v2-data-engine-guaranteed-instance-manager-cpu: {{ .Values.defaultSettings.v2DataEngineGuaranteedInstanceManagerCPU }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.snapshotMaxCount) }} + snapshot-max-count: {{ .Values.defaultSettings.snapshotMaxCount }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.v2DataEngineLogLevel) }} + v2-data-engine-log-level: {{ .Values.defaultSettings.v2DataEngineLogLevel }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.v2DataEngineLogFlags) }} + v2-data-engine-log-flags: {{ .Values.defaultSettings.v2DataEngineLogFlags }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.freezeFilesystemForSnapshot) }} + freeze-filesystem-for-snapshot: {{ .Values.defaultSettings.freezeFilesystemForSnapshot }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.autoCleanupSnapshotWhenDeleteBackup) }} + auto-cleanup-when-delete-backup: {{ .Values.defaultSettings.autoCleanupSnapshotWhenDeleteBackup }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.rwxVolumeFastFailover) }} + rwx-volume-fast-failover: {{ .Values.defaultSettings.rwxVolumeFastFailover}} + {{- end }} diff --git a/charts/longhorn/102.5.1+up1.7.2/templates/deployment-driver.yaml b/charts/longhorn/102.5.1+up1.7.2/templates/deployment-driver.yaml new file mode 100644 index 0000000000..3ac582dcbc --- /dev/null +++ b/charts/longhorn/102.5.1+up1.7.2/templates/deployment-driver.yaml @@ -0,0 +1,132 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: longhorn-driver-deployer + namespace: {{ include "release_namespace" . }} + labels: {{- include "longhorn.labels" . | nindent 4 }} +spec: + replicas: 1 + selector: + matchLabels: + app: longhorn-driver-deployer + template: + metadata: + labels: {{- include "longhorn.labels" . | nindent 8 }} + app: longhorn-driver-deployer + spec: + initContainers: + - name: wait-longhorn-manager + image: {{ template "registry_url" . }}{{ .Values.image.longhorn.manager.repository }}:{{ .Values.image.longhorn.manager.tag }} + command: ['sh', '-c', 'while [ $(curl -m 1 -s -o /dev/null -w "%{http_code}" http://longhorn-backend:9500/v1) != "200" ]; do echo waiting; sleep 2; done'] + containers: + - name: longhorn-driver-deployer + image: {{ template "registry_url" . }}{{ .Values.image.longhorn.manager.repository }}:{{ .Values.image.longhorn.manager.tag }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + command: + - longhorn-manager + - -d + - deploy-driver + - --manager-image + - "{{ template "registry_url" . }}{{ .Values.image.longhorn.manager.repository }}:{{ .Values.image.longhorn.manager.tag }}" + - --manager-url + - http://longhorn-backend:9500/v1 + env: + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + - name: SERVICE_ACCOUNT + valueFrom: + fieldRef: + fieldPath: spec.serviceAccountName + {{- if .Values.csi.kubeletRootDir }} + - name: KUBELET_ROOT_DIR + value: {{ .Values.csi.kubeletRootDir }} + {{- end }} + {{- if and .Values.image.csi.attacher.repository .Values.image.csi.attacher.tag }} + - name: CSI_ATTACHER_IMAGE + value: "{{ template "registry_url" . }}{{ .Values.image.csi.attacher.repository }}:{{ .Values.image.csi.attacher.tag }}" + {{- end }} + {{- if and .Values.image.csi.provisioner.repository .Values.image.csi.provisioner.tag }} + - name: CSI_PROVISIONER_IMAGE + value: "{{ template "registry_url" . }}{{ .Values.image.csi.provisioner.repository }}:{{ .Values.image.csi.provisioner.tag }}" + {{- end }} + {{- if and .Values.image.csi.nodeDriverRegistrar.repository .Values.image.csi.nodeDriverRegistrar.tag }} + - name: CSI_NODE_DRIVER_REGISTRAR_IMAGE + value: "{{ template "registry_url" . }}{{ .Values.image.csi.nodeDriverRegistrar.repository }}:{{ .Values.image.csi.nodeDriverRegistrar.tag }}" + {{- end }} + {{- if and .Values.image.csi.resizer.repository .Values.image.csi.resizer.tag }} + - name: CSI_RESIZER_IMAGE + value: "{{ template "registry_url" . }}{{ .Values.image.csi.resizer.repository }}:{{ .Values.image.csi.resizer.tag }}" + {{- end }} + {{- if and .Values.image.csi.snapshotter.repository .Values.image.csi.snapshotter.tag }} + - name: CSI_SNAPSHOTTER_IMAGE + value: "{{ template "registry_url" . }}{{ .Values.image.csi.snapshotter.repository }}:{{ .Values.image.csi.snapshotter.tag }}" + {{- end }} + {{- if and .Values.image.csi.livenessProbe.repository .Values.image.csi.livenessProbe.tag }} + - name: CSI_LIVENESS_PROBE_IMAGE + value: "{{ template "registry_url" . }}{{ .Values.image.csi.livenessProbe.repository }}:{{ .Values.image.csi.livenessProbe.tag }}" + {{- end }} + {{- if .Values.csi.attacherReplicaCount }} + - name: CSI_ATTACHER_REPLICA_COUNT + value: {{ .Values.csi.attacherReplicaCount | quote }} + {{- end }} + {{- if .Values.csi.provisionerReplicaCount }} + - name: CSI_PROVISIONER_REPLICA_COUNT + value: {{ .Values.csi.provisionerReplicaCount | quote }} + {{- end }} + {{- if .Values.csi.resizerReplicaCount }} + - name: CSI_RESIZER_REPLICA_COUNT + value: {{ .Values.csi.resizerReplicaCount | quote }} + {{- end }} + {{- if .Values.csi.snapshotterReplicaCount }} + - name: CSI_SNAPSHOTTER_REPLICA_COUNT + value: {{ .Values.csi.snapshotterReplicaCount | quote }} + {{- end }} + {{- if .Values.enableGoCoverDir }} + - name: GOCOVERDIR + value: /go-cover-dir/ + volumeMounts: + - name: go-cover-dir + mountPath: /go-cover-dir/ + {{- end }} + + {{- if .Values.privateRegistry.registrySecret }} + imagePullSecrets: + - name: {{ .Values.privateRegistry.registrySecret }} + {{- end }} + {{- if .Values.longhornDriver.priorityClass }} + priorityClassName: {{ .Values.longhornDriver.priorityClass | quote }} + {{- end }} + {{- if or .Values.global.tolerations .Values.longhornDriver.tolerations .Values.global.cattle.windowsCluster.enabled }} + tolerations: + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.tolerations }} +{{ toYaml .Values.global.cattle.windowsCluster.tolerations | indent 6 }} + {{- end }} + {{- if or .Values.global.tolerations .Values.longhornDriver.tolerations }} +{{ default .Values.global.tolerations .Values.longhornDriver.tolerations | toYaml | indent 6 }} + {{- end }} + {{- end }} + {{- if or .Values.global.nodeSelector .Values.longhornDriver.nodeSelector .Values.global.cattle.windowsCluster.enabled }} + nodeSelector: + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.nodeSelector }} +{{ toYaml .Values.global.cattle.windowsCluster.nodeSelector | indent 8 }} + {{- end }} + {{- if or .Values.global.nodeSelector .Values.longhornDriver.nodeSelector }} +{{ default .Values.global.nodeSelector .Values.longhornDriver.nodeSelector | toYaml | indent 8 }} + {{- end }} + {{- end }} + serviceAccountName: longhorn-service-account + securityContext: + runAsUser: 0 + {{- if .Values.enableGoCoverDir }} + volumes: + - name: go-cover-dir + hostPath: + path: /go-cover-dir/ + type: DirectoryOrCreate + {{- end }} diff --git a/charts/longhorn/102.5.1+up1.7.2/templates/deployment-ui.yaml b/charts/longhorn/102.5.1+up1.7.2/templates/deployment-ui.yaml new file mode 100644 index 0000000000..e4f3e0f8f7 --- /dev/null +++ b/charts/longhorn/102.5.1+up1.7.2/templates/deployment-ui.yaml @@ -0,0 +1,186 @@ +{{- if .Values.openshift.enabled }} +{{- if .Values.openshift.ui.route }} +# https://github.com/openshift/oauth-proxy/blob/master/contrib/sidecar.yaml +# Create a proxy service account and ensure it will use the route "proxy" +# Create a secure connection to the proxy via a route +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + labels: {{- include "longhorn.labels" . | nindent 4 }} + app: longhorn-ui + name: {{ .Values.openshift.ui.route }} + namespace: {{ include "release_namespace" . }} +spec: + to: + kind: Service + name: longhorn-ui + tls: + termination: reencrypt +--- +apiVersion: v1 +kind: Service +metadata: + labels: {{- include "longhorn.labels" . | nindent 4 }} + app: longhorn-ui + name: longhorn-ui + namespace: {{ include "release_namespace" . }} + annotations: + service.alpha.openshift.io/serving-cert-secret-name: longhorn-ui-tls +spec: + ports: + - name: longhorn-ui + port: {{ .Values.openshift.ui.port | default 443 }} + targetPort: {{ .Values.openshift.ui.proxy | default 8443 }} + selector: + app: longhorn-ui +--- +{{- end }} +{{- end }} +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: {{- include "longhorn.labels" . | nindent 4 }} + app: longhorn-ui + name: longhorn-ui + namespace: {{ include "release_namespace" . }} +spec: + replicas: {{ .Values.longhornUI.replicas }} + selector: + matchLabels: + app: longhorn-ui + template: + metadata: + labels: {{- include "longhorn.labels" . | nindent 8 }} + app: longhorn-ui + spec: + serviceAccountName: longhorn-ui-service-account + affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 1 + podAffinityTerm: + labelSelector: + matchExpressions: + - key: app + operator: In + values: + - longhorn-ui + topologyKey: kubernetes.io/hostname + containers: + {{- if .Values.openshift.enabled }} + {{- if .Values.openshift.ui.route }} + - name: oauth-proxy + {{- if .Values.image.openshift.oauthProxy.repository }} + image: {{ template "registry_url" . }}{{ .Values.image.openshift.oauthProxy.repository }}:{{ .Values.image.openshift.oauthProxy.tag }} + {{- else }} + image: "" + {{- end }} + imagePullPolicy: IfNotPresent + ports: + - containerPort: {{ .Values.openshift.ui.proxy | default 8443 }} + name: public + args: + - --https-address=:{{ .Values.openshift.ui.proxy | default 8443 }} + - --provider=openshift + - --openshift-service-account=longhorn-ui-service-account + - --upstream=http://localhost:8000 + - --tls-cert=/etc/tls/private/tls.crt + - --tls-key=/etc/tls/private/tls.key + - --cookie-secret=SECRET + - --openshift-sar={"namespace":"{{ include "release_namespace" . }}","group":"longhorn.io","resource":"setting","verb":"delete"} + volumeMounts: + - mountPath: /etc/tls/private + name: longhorn-ui-tls + {{- end }} + {{- end }} + - name: longhorn-ui + image: {{ template "registry_url" . }}{{ .Values.image.longhorn.ui.repository }}:{{ .Values.image.longhorn.ui.tag }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + volumeMounts: + - name : nginx-cache + mountPath: /var/cache/nginx/ + - name : nginx-config + mountPath: /var/config/nginx/ + - name: var-run + mountPath: /var/run/ + ports: + - containerPort: 8000 + name: http + env: + - name: LONGHORN_MANAGER_IP + value: "http://longhorn-backend:9500" + - name: LONGHORN_UI_PORT + value: "8000" + volumes: + {{- if .Values.openshift.enabled }} + {{- if .Values.openshift.ui.route }} + - name: longhorn-ui-tls + secret: + secretName: longhorn-ui-tls + {{- end }} + {{- end }} + - emptyDir: {} + name: nginx-cache + - emptyDir: {} + name: nginx-config + - emptyDir: {} + name: var-run + {{- if .Values.privateRegistry.registrySecret }} + imagePullSecrets: + - name: {{ .Values.privateRegistry.registrySecret }} + {{- end }} + {{- if .Values.longhornUI.priorityClass }} + priorityClassName: {{ .Values.longhornUI.priorityClass | quote }} + {{- end }} + {{- if or .Values.global.tolerations .Values.longhornUI.tolerations .Values.global.cattle.windowsCluster.enabled }} + tolerations: + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.tolerations }} +{{ toYaml .Values.global.cattle.windowsCluster.tolerations | indent 6 }} + {{- end }} + {{- if or .Values.global.tolerations .Values.longhornUI.tolerations }} +{{ default .Values.global.tolerations .Values.longhornUI.tolerations | toYaml | indent 6 }} + {{- end }} + {{- end }} + {{- if or .Values.global.nodeSelector .Values.longhornUI.nodeSelector .Values.global.cattle.windowsCluster.enabled }} + nodeSelector: + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.nodeSelector }} +{{ toYaml .Values.global.cattle.windowsCluster.nodeSelector | indent 8 }} + {{- end }} + {{- if or .Values.global.nodeSelector .Values.longhornUI.nodeSelector }} +{{ default .Values.global.nodeSelector .Values.longhornUI.nodeSelector | toYaml | indent 8 }} + {{- end }} + {{- end }} +--- +kind: Service +apiVersion: v1 +metadata: + labels: {{- include "longhorn.labels" . | nindent 4 }} + app: longhorn-ui + {{- if eq .Values.service.ui.type "Rancher-Proxy" }} + kubernetes.io/cluster-service: "true" + {{- end }} + name: longhorn-frontend + namespace: {{ include "release_namespace" . }} +spec: + {{- if eq .Values.service.ui.type "Rancher-Proxy" }} + type: ClusterIP + {{- else }} + type: {{ .Values.service.ui.type }} + {{- end }} + {{- if and .Values.service.ui.loadBalancerIP (eq .Values.service.ui.type "LoadBalancer") }} + loadBalancerIP: {{ .Values.service.ui.loadBalancerIP }} + {{- end }} + {{- if and (eq .Values.service.ui.type "LoadBalancer") .Values.service.ui.loadBalancerSourceRanges }} + loadBalancerSourceRanges: {{- toYaml .Values.service.ui.loadBalancerSourceRanges | nindent 4 }} + {{- end }} + selector: + app: longhorn-ui + ports: + - name: http + port: 80 + targetPort: http + {{- if .Values.service.ui.nodePort }} + nodePort: {{ .Values.service.ui.nodePort }} + {{- else }} + nodePort: null + {{- end }} diff --git a/charts/longhorn/102.5.1+up1.7.2/templates/ingress.yaml b/charts/longhorn/102.5.1+up1.7.2/templates/ingress.yaml new file mode 100644 index 0000000000..61175e827b --- /dev/null +++ b/charts/longhorn/102.5.1+up1.7.2/templates/ingress.yaml @@ -0,0 +1,37 @@ +{{- if .Values.ingress.enabled }} +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: longhorn-ingress + namespace: {{ include "release_namespace" . }} + labels: {{- include "longhorn.labels" . | nindent 4 }} + app: longhorn-ingress + annotations: + {{- if .Values.ingress.secureBackends }} + ingress.kubernetes.io/secure-backends: "true" + {{- end }} + {{- range $key, $value := .Values.ingress.annotations }} + {{ $key }}: {{ $value | quote }} + {{- end }} +spec: + {{- if .Values.ingress.ingressClassName }} + ingressClassName: {{ .Values.ingress.ingressClassName }} + {{- end }} + rules: + - host: {{ .Values.ingress.host }} + http: + paths: + - path: {{ default "" .Values.ingress.path }} + pathType: {{ default "ImplementationSpecific" .Values.ingress.pathType }} + backend: + service: + name: longhorn-frontend + port: + number: 80 +{{- if .Values.ingress.tls }} + tls: + - hosts: + - {{ .Values.ingress.host }} + secretName: {{ .Values.ingress.tlsSecret }} +{{- end }} +{{- end }} diff --git a/charts/longhorn/102.5.1+up1.7.2/templates/network-policies/backing-image-data-source-network-policy.yaml b/charts/longhorn/102.5.1+up1.7.2/templates/network-policies/backing-image-data-source-network-policy.yaml new file mode 100644 index 0000000000..7204d63caa --- /dev/null +++ b/charts/longhorn/102.5.1+up1.7.2/templates/network-policies/backing-image-data-source-network-policy.yaml @@ -0,0 +1,27 @@ +{{- if .Values.networkPolicies.enabled }} +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: backing-image-data-source + namespace: {{ include "release_namespace" . }} +spec: + podSelector: + matchLabels: + longhorn.io/component: backing-image-data-source + policyTypes: + - Ingress + ingress: + - from: + - podSelector: + matchLabels: + app: longhorn-manager + - podSelector: + matchLabels: + longhorn.io/component: instance-manager + - podSelector: + matchLabels: + longhorn.io/component: backing-image-manager + - podSelector: + matchLabels: + longhorn.io/component: backing-image-data-source +{{- end }} diff --git a/charts/longhorn/102.5.1+up1.7.2/templates/network-policies/backing-image-manager-network-policy.yaml b/charts/longhorn/102.5.1+up1.7.2/templates/network-policies/backing-image-manager-network-policy.yaml new file mode 100644 index 0000000000..119ebf08a1 --- /dev/null +++ b/charts/longhorn/102.5.1+up1.7.2/templates/network-policies/backing-image-manager-network-policy.yaml @@ -0,0 +1,27 @@ +{{- if .Values.networkPolicies.enabled }} +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: backing-image-manager + namespace: {{ include "release_namespace" . }} +spec: + podSelector: + matchLabels: + longhorn.io/component: backing-image-manager + policyTypes: + - Ingress + ingress: + - from: + - podSelector: + matchLabels: + app: longhorn-manager + - podSelector: + matchLabels: + longhorn.io/component: instance-manager + - podSelector: + matchLabels: + longhorn.io/component: backing-image-manager + - podSelector: + matchLabels: + longhorn.io/component: backing-image-data-source +{{- end }} diff --git a/charts/longhorn/102.5.1+up1.7.2/templates/network-policies/instance-manager-networking.yaml b/charts/longhorn/102.5.1+up1.7.2/templates/network-policies/instance-manager-networking.yaml new file mode 100644 index 0000000000..332aa2c2fe --- /dev/null +++ b/charts/longhorn/102.5.1+up1.7.2/templates/network-policies/instance-manager-networking.yaml @@ -0,0 +1,27 @@ +{{- if .Values.networkPolicies.enabled }} +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: instance-manager + namespace: {{ include "release_namespace" . }} +spec: + podSelector: + matchLabels: + longhorn.io/component: instance-manager + policyTypes: + - Ingress + ingress: + - from: + - podSelector: + matchLabels: + app: longhorn-manager + - podSelector: + matchLabels: + longhorn.io/component: instance-manager + - podSelector: + matchLabels: + longhorn.io/component: backing-image-manager + - podSelector: + matchLabels: + longhorn.io/component: backing-image-data-source +{{- end }} diff --git a/charts/longhorn/102.5.1+up1.7.2/templates/network-policies/manager-network-policy.yaml b/charts/longhorn/102.5.1+up1.7.2/templates/network-policies/manager-network-policy.yaml new file mode 100644 index 0000000000..6f94029a53 --- /dev/null +++ b/charts/longhorn/102.5.1+up1.7.2/templates/network-policies/manager-network-policy.yaml @@ -0,0 +1,35 @@ +{{- if .Values.networkPolicies.enabled }} +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: longhorn-manager + namespace: {{ include "release_namespace" . }} +spec: + podSelector: + matchLabels: + app: longhorn-manager + policyTypes: + - Ingress + ingress: + - from: + - podSelector: + matchLabels: + app: longhorn-manager + - podSelector: + matchLabels: + app: longhorn-ui + - podSelector: + matchLabels: + app: longhorn-csi-plugin + - podSelector: + matchLabels: + longhorn.io/managed-by: longhorn-manager + matchExpressions: + - { key: recurring-job.longhorn.io, operator: Exists } + - podSelector: + matchExpressions: + - { key: longhorn.io/job-task, operator: Exists } + - podSelector: + matchLabels: + app: longhorn-driver-deployer +{{- end }} diff --git a/charts/longhorn/102.5.1+up1.7.2/templates/network-policies/recovery-backend-network-policy.yaml b/charts/longhorn/102.5.1+up1.7.2/templates/network-policies/recovery-backend-network-policy.yaml new file mode 100644 index 0000000000..37bf5f9bcf --- /dev/null +++ b/charts/longhorn/102.5.1+up1.7.2/templates/network-policies/recovery-backend-network-policy.yaml @@ -0,0 +1,17 @@ +{{- if .Values.networkPolicies.enabled }} +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: longhorn-recovery-backend + namespace: {{ include "release_namespace" . }} +spec: + podSelector: + matchLabels: + longhorn.io/recovery-backend: longhorn-recovery-backend + policyTypes: + - Ingress + ingress: + - ports: + - protocol: TCP + port: 9503 +{{- end }} diff --git a/charts/longhorn/102.5.1+up1.7.2/templates/network-policies/ui-frontend-network-policy.yaml b/charts/longhorn/102.5.1+up1.7.2/templates/network-policies/ui-frontend-network-policy.yaml new file mode 100644 index 0000000000..6f37065980 --- /dev/null +++ b/charts/longhorn/102.5.1+up1.7.2/templates/network-policies/ui-frontend-network-policy.yaml @@ -0,0 +1,46 @@ +{{- if and .Values.networkPolicies.enabled .Values.ingress.enabled (not (eq .Values.networkPolicies.type "")) }} +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: longhorn-ui-frontend + namespace: {{ include "release_namespace" . }} +spec: + podSelector: + matchLabels: + app: longhorn-ui + policyTypes: + - Ingress + ingress: + - from: + {{- if eq .Values.networkPolicies.type "rke1"}} + - namespaceSelector: + matchLabels: + kubernetes.io/metadata.name: ingress-nginx + podSelector: + matchLabels: + app.kubernetes.io/component: controller + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/name: ingress-nginx + {{- else if eq .Values.networkPolicies.type "rke2" }} + - namespaceSelector: + matchLabels: + kubernetes.io/metadata.name: kube-system + podSelector: + matchLabels: + app.kubernetes.io/component: controller + app.kubernetes.io/instance: rke2-ingress-nginx + app.kubernetes.io/name: rke2-ingress-nginx + {{- else if eq .Values.networkPolicies.type "k3s" }} + - namespaceSelector: + matchLabels: + kubernetes.io/metadata.name: kube-system + podSelector: + matchLabels: + app.kubernetes.io/name: traefik + ports: + - port: 8000 + protocol: TCP + - port: 80 + protocol: TCP + {{- end }} +{{- end }} diff --git a/charts/longhorn/102.5.1+up1.7.2/templates/network-policies/webhook-network-policy.yaml b/charts/longhorn/102.5.1+up1.7.2/templates/network-policies/webhook-network-policy.yaml new file mode 100644 index 0000000000..3812e0ffa3 --- /dev/null +++ b/charts/longhorn/102.5.1+up1.7.2/templates/network-policies/webhook-network-policy.yaml @@ -0,0 +1,33 @@ +{{- if .Values.networkPolicies.enabled }} +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: longhorn-conversion-webhook + namespace: {{ include "release_namespace" . }} +spec: + podSelector: + matchLabels: + longhorn.io/conversion-webhook: longhorn-conversion-webhook + policyTypes: + - Ingress + ingress: + - ports: + - protocol: TCP + port: 9501 +--- +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: longhorn-admission-webhook + namespace: {{ include "release_namespace" . }} +spec: + podSelector: + matchLabels: + longhorn.io/admission-webhook: longhorn-admission-webhook + policyTypes: + - Ingress + ingress: + - ports: + - protocol: TCP + port: 9502 +{{- end }} diff --git a/charts/longhorn/102.5.1+up1.7.2/templates/postupgrade-job.yaml b/charts/longhorn/102.5.1+up1.7.2/templates/postupgrade-job.yaml new file mode 100644 index 0000000000..56efd38e9b --- /dev/null +++ b/charts/longhorn/102.5.1+up1.7.2/templates/postupgrade-job.yaml @@ -0,0 +1,56 @@ +apiVersion: batch/v1 +kind: Job +metadata: + annotations: + "helm.sh/hook": post-upgrade + "helm.sh/hook-delete-policy": hook-succeeded,before-hook-creation + name: longhorn-post-upgrade + namespace: {{ include "release_namespace" . }} + labels: {{- include "longhorn.labels" . | nindent 4 }} +spec: + activeDeadlineSeconds: 900 + backoffLimit: 1 + template: + metadata: + name: longhorn-post-upgrade + labels: {{- include "longhorn.labels" . | nindent 8 }} + spec: + containers: + - name: longhorn-post-upgrade + image: {{ template "registry_url" . }}{{ .Values.image.longhorn.manager.repository }}:{{ .Values.image.longhorn.manager.tag }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + command: + - longhorn-manager + - post-upgrade + env: + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + restartPolicy: OnFailure + {{- if .Values.privateRegistry.registrySecret }} + imagePullSecrets: + - name: {{ .Values.privateRegistry.registrySecret }} + {{- end }} + {{- if .Values.longhornManager.priorityClass }} + priorityClassName: {{ .Values.longhornManager.priorityClass | quote }} + {{- end }} + serviceAccountName: longhorn-service-account + {{- if or .Values.global.tolerations .Values.longhornManager.tolerations .Values.global.cattle.windowsCluster.enabled }} + tolerations: + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.tolerations }} +{{ toYaml .Values.global.cattle.windowsCluster.tolerations | indent 6 }} + {{- end }} + {{- if or .Values.global.tolerations .Values.longhornManager.tolerations }} +{{ default .Values.global.tolerations .Values.longhornManager.tolerations | toYaml | indent 6 }} + {{- end }} + {{- end }} + {{- if or .Values.global.nodeSelector .Values.longhornManager.nodeSelector .Values.global.cattle.windowsCluster.enabled }} + nodeSelector: + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.nodeSelector }} +{{ toYaml .Values.global.cattle.windowsCluster.nodeSelector | indent 8 }} + {{- end }} + {{- if or .Values.global.nodeSelector .Values.longhornManager.nodeSelector }} +{{ default .Values.global.nodeSelector .Values.longhornManager.nodeSelector | toYaml | indent 8 }} + {{- end }} + {{- end }} diff --git a/charts/longhorn/102.5.1+up1.7.2/templates/preupgrade-job.yaml b/charts/longhorn/102.5.1+up1.7.2/templates/preupgrade-job.yaml new file mode 100644 index 0000000000..9f7a8a6aa6 --- /dev/null +++ b/charts/longhorn/102.5.1+up1.7.2/templates/preupgrade-job.yaml @@ -0,0 +1,64 @@ +{{- if and .Values.preUpgradeChecker.jobEnabled .Values.preUpgradeChecker.upgradeVersionCheck}} +apiVersion: batch/v1 +kind: Job +metadata: + annotations: + "helm.sh/hook": pre-upgrade + "helm.sh/hook-delete-policy": hook-succeeded,before-hook-creation,hook-failed + name: longhorn-pre-upgrade + namespace: {{ include "release_namespace" . }} + labels: {{- include "longhorn.labels" . | nindent 4 }} +spec: + activeDeadlineSeconds: 900 + backoffLimit: 1 + template: + metadata: + name: longhorn-pre-upgrade + labels: {{- include "longhorn.labels" . | nindent 8 }} + spec: + containers: + - name: longhorn-pre-upgrade + image: {{ template "registry_url" . }}{{ .Values.image.longhorn.manager.repository }}:{{ .Values.image.longhorn.manager.tag }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + securityContext: + privileged: true + command: + - longhorn-manager + - pre-upgrade + volumeMounts: + - name: proc + mountPath: /host/proc/ + env: + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + volumes: + - name: proc + hostPath: + path: /proc/ + restartPolicy: OnFailure + {{- if .Values.privateRegistry.registrySecret }} + imagePullSecrets: + - name: {{ .Values.privateRegistry.registrySecret }} + {{- end }} + serviceAccountName: longhorn-service-account + {{- if or .Values.global.tolerations .Values.longhornManager.tolerations .Values.global.cattle.windowsCluster.enabled }} + tolerations: + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.tolerations }} +{{ toYaml .Values.global.cattle.windowsCluster.tolerations | indent 6 }} + {{- end }} + {{- if or .Values.global.tolerations .Values.longhornManager.tolerations }} +{{ default .Values.global.tolerations .Values.longhornManager.tolerations | toYaml | indent 6 }} + {{- end }} + {{- end }} + {{- if or .Values.global.nodeSelector .Values.longhornManager.nodeSelector .Values.global.cattle.windowsCluster.enabled }} + nodeSelector: + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.nodeSelector }} +{{ toYaml .Values.global.cattle.windowsCluster.nodeSelector | indent 8 }} + {{- end }} + {{- if or .Values.global.nodeSelector .Values.longhornManager.nodeSelector }} +{{ default .Values.global.nodeSelector .Values.longhornManager.nodeSelector | toYaml | indent 8 }} + {{- end }} + {{- end }} +{{- end }} diff --git a/charts/longhorn/102.5.1+up1.7.2/templates/priorityclass.yaml b/charts/longhorn/102.5.1+up1.7.2/templates/priorityclass.yaml new file mode 100644 index 0000000000..208adc84a2 --- /dev/null +++ b/charts/longhorn/102.5.1+up1.7.2/templates/priorityclass.yaml @@ -0,0 +1,9 @@ +apiVersion: scheduling.k8s.io/v1 +kind: PriorityClass +metadata: + name: "longhorn-critical" + labels: {{- include "longhorn.labels" . | nindent 4 }} +description: "Ensure Longhorn pods have the highest priority to prevent any unexpected eviction by the Kubernetes scheduler under node pressure" +globalDefault: false +preemptionPolicy: PreemptLowerPriority +value: 1000000000 diff --git a/charts/longhorn/102.5.1+up1.7.2/templates/psp.yaml b/charts/longhorn/102.5.1+up1.7.2/templates/psp.yaml new file mode 100644 index 0000000000..a2dfc05bef --- /dev/null +++ b/charts/longhorn/102.5.1+up1.7.2/templates/psp.yaml @@ -0,0 +1,66 @@ +{{- if .Values.enablePSP }} +apiVersion: policy/v1beta1 +kind: PodSecurityPolicy +metadata: + name: longhorn-psp + labels: {{- include "longhorn.labels" . | nindent 4 }} +spec: + privileged: true + allowPrivilegeEscalation: true + requiredDropCapabilities: + - NET_RAW + allowedCapabilities: + - SYS_ADMIN + hostNetwork: false + hostIPC: false + hostPID: true + runAsUser: + rule: RunAsAny + seLinux: + rule: RunAsAny + fsGroup: + rule: RunAsAny + supplementalGroups: + rule: RunAsAny + volumes: + - configMap + - downwardAPI + - emptyDir + - secret + - projected + - hostPath +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: longhorn-psp-role + labels: {{- include "longhorn.labels" . | nindent 4 }} + namespace: {{ include "release_namespace" . }} +rules: +- apiGroups: + - policy + resources: + - podsecuritypolicies + verbs: + - use + resourceNames: + - longhorn-psp +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: longhorn-psp-binding + labels: {{- include "longhorn.labels" . | nindent 4 }} + namespace: {{ include "release_namespace" . }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: longhorn-psp-role +subjects: +- kind: ServiceAccount + name: longhorn-service-account + namespace: {{ include "release_namespace" . }} +- kind: ServiceAccount + name: default + namespace: {{ include "release_namespace" . }} +{{- end }} diff --git a/charts/longhorn/102.5.1+up1.7.2/templates/registry-secret.yaml b/charts/longhorn/102.5.1+up1.7.2/templates/registry-secret.yaml new file mode 100644 index 0000000000..3c6b1dc510 --- /dev/null +++ b/charts/longhorn/102.5.1+up1.7.2/templates/registry-secret.yaml @@ -0,0 +1,13 @@ +{{- if .Values.privateRegistry.createSecret }} +{{- if .Values.privateRegistry.registrySecret }} +apiVersion: v1 +kind: Secret +metadata: + name: {{ .Values.privateRegistry.registrySecret }} + namespace: {{ include "release_namespace" . }} + labels: {{- include "longhorn.labels" . | nindent 4 }} +type: kubernetes.io/dockerconfigjson +data: + .dockerconfigjson: {{ template "secret" . }} +{{- end }} +{{- end }} \ No newline at end of file diff --git a/charts/longhorn/102.5.1+up1.7.2/templates/serviceaccount.yaml b/charts/longhorn/102.5.1+up1.7.2/templates/serviceaccount.yaml new file mode 100644 index 0000000000..b0d6dd505b --- /dev/null +++ b/charts/longhorn/102.5.1+up1.7.2/templates/serviceaccount.yaml @@ -0,0 +1,40 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: longhorn-service-account + namespace: {{ include "release_namespace" . }} + labels: {{- include "longhorn.labels" . | nindent 4 }} + {{- with .Values.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: longhorn-ui-service-account + namespace: {{ include "release_namespace" . }} + labels: {{- include "longhorn.labels" . | nindent 4 }} + {{- with .Values.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} + {{- if .Values.openshift.enabled }} + {{- if .Values.openshift.ui.route }} + {{- if not .Values.serviceAccount.annotations }} + annotations: + {{- end }} + serviceaccounts.openshift.io/oauth-redirectreference.primary: '{"kind":"OAuthRedirectReference","apiVersion":"v1","reference":{"kind":"Route","name":"longhorn-ui"}}' + {{- end }} + {{- end }} +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: longhorn-support-bundle + namespace: {{ include "release_namespace" . }} + labels: {{- include "longhorn.labels" . | nindent 4 }} + {{- with .Values.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} \ No newline at end of file diff --git a/charts/longhorn/102.5.1+up1.7.2/templates/servicemonitor.yaml b/charts/longhorn/102.5.1+up1.7.2/templates/servicemonitor.yaml new file mode 100644 index 0000000000..3f32961332 --- /dev/null +++ b/charts/longhorn/102.5.1+up1.7.2/templates/servicemonitor.yaml @@ -0,0 +1,40 @@ +{{- if .Values.metrics.serviceMonitor.enabled -}} +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: longhorn-prometheus-servicemonitor + namespace: {{ include "release_namespace" . }} + labels: + {{- include "longhorn.labels" . | nindent 4 }} + name: longhorn-prometheus-servicemonitor + {{- with .Values.metrics.serviceMonitor.additionalLabels }} + {{- toYaml . | nindent 4 }} + {{- end }} + {{- with .Values.metrics.serviceMonitor.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + selector: + matchLabels: + app: longhorn-manager + namespaceSelector: + matchNames: + - {{ include "release_namespace" . }} + endpoints: + - port: manager + {{- with .Values.metrics.serviceMonitor.interval }} + interval: {{ . }} + {{- end }} + {{- with .Values.metrics.serviceMonitor.scrapeTimeout }} + scrapeTimeout: {{ . }} + {{- end }} + {{- with .Values.metrics.serviceMonitor.relabelings }} + relabelings: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.metrics.serviceMonitor.metricRelabelings }} + metricRelabelings: + {{- toYaml . | nindent 8 }} + {{- end }} +{{- end }} \ No newline at end of file diff --git a/charts/longhorn/102.5.1+up1.7.2/templates/services.yaml b/charts/longhorn/102.5.1+up1.7.2/templates/services.yaml new file mode 100644 index 0000000000..4c8c6bc687 --- /dev/null +++ b/charts/longhorn/102.5.1+up1.7.2/templates/services.yaml @@ -0,0 +1,47 @@ +apiVersion: v1 +kind: Service +metadata: + labels: {{- include "longhorn.labels" . | nindent 4 }} + app: longhorn-conversion-webhook + name: longhorn-conversion-webhook + namespace: {{ include "release_namespace" . }} +spec: + type: ClusterIP + selector: + longhorn.io/conversion-webhook: longhorn-conversion-webhook + ports: + - name: conversion-webhook + port: 9501 + targetPort: conversion-wh +--- +apiVersion: v1 +kind: Service +metadata: + labels: {{- include "longhorn.labels" . | nindent 4 }} + app: longhorn-admission-webhook + name: longhorn-admission-webhook + namespace: {{ include "release_namespace" . }} +spec: + type: ClusterIP + selector: + longhorn.io/admission-webhook: longhorn-admission-webhook + ports: + - name: admission-webhook + port: 9502 + targetPort: admission-wh +--- +apiVersion: v1 +kind: Service +metadata: + labels: {{- include "longhorn.labels" . | nindent 4 }} + app: longhorn-recovery-backend + name: longhorn-recovery-backend + namespace: {{ include "release_namespace" . }} +spec: + type: ClusterIP + selector: + longhorn.io/recovery-backend: longhorn-recovery-backend + ports: + - name: recovery-backend + port: 9503 + targetPort: recov-backend diff --git a/charts/longhorn/102.5.1+up1.7.2/templates/storageclass.yaml b/charts/longhorn/102.5.1+up1.7.2/templates/storageclass.yaml new file mode 100644 index 0000000000..884d38d5f3 --- /dev/null +++ b/charts/longhorn/102.5.1+up1.7.2/templates/storageclass.yaml @@ -0,0 +1,57 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: longhorn-storageclass + namespace: {{ include "release_namespace" . }} + labels: {{- include "longhorn.labels" . | nindent 4 }} +data: + storageclass.yaml: | + kind: StorageClass + apiVersion: storage.k8s.io/v1 + metadata: + name: longhorn + annotations: + storageclass.kubernetes.io/is-default-class: {{ .Values.persistence.defaultClass | quote }} + provisioner: driver.longhorn.io + allowVolumeExpansion: true + reclaimPolicy: "{{ .Values.persistence.reclaimPolicy }}" + volumeBindingMode: Immediate + parameters: + numberOfReplicas: "{{ .Values.persistence.defaultClassReplicaCount }}" + staleReplicaTimeout: "30" + fromBackup: "" + {{- if .Values.persistence.defaultFsType }} + fsType: "{{ .Values.persistence.defaultFsType }}" + {{- end }} + {{- if .Values.persistence.defaultMkfsParams }} + mkfsParams: "{{ .Values.persistence.defaultMkfsParams }}" + {{- end }} + {{- if .Values.persistence.migratable }} + migratable: "{{ .Values.persistence.migratable }}" + {{- end }} + {{- if .Values.persistence.nfsOptions }} + nfsOptions: "{{ .Values.persistence.nfsOptions }}" + {{- end }} + {{- if .Values.persistence.backingImage.enable }} + backingImage: {{ .Values.persistence.backingImage.name }} + backingImageDataSourceType: {{ .Values.persistence.backingImage.dataSourceType }} + backingImageDataSourceParameters: {{ .Values.persistence.backingImage.dataSourceParameters }} + backingImageChecksum: {{ .Values.persistence.backingImage.expectedChecksum }} + {{- end }} + {{- if .Values.persistence.recurringJobSelector.enable }} + recurringJobSelector: '{{ .Values.persistence.recurringJobSelector.jobList }}' + {{- end }} + dataLocality: {{ .Values.persistence.defaultDataLocality | quote }} + {{- if .Values.persistence.defaultDiskSelector.enable }} + diskSelector: "{{ .Values.persistence.defaultDiskSelector.selector }}" + {{- end }} + {{- if .Values.persistence.defaultNodeSelector.enable }} + nodeSelector: "{{ .Values.persistence.defaultNodeSelector.selector }}" + {{- end }} + {{- if .Values.persistence.removeSnapshotsDuringFilesystemTrim }} + unmapMarkSnapChainRemoved: "{{ .Values.persistence.removeSnapshotsDuringFilesystemTrim }}" + {{- end }} + {{- if .Values.persistence.disableRevisionCounter }} + disableRevisionCounter: "{{ .Values.persistence.disableRevisionCounter }}" + dataEngine: "{{ .Values.persistence.dataEngine }}" + {{- end }} diff --git a/charts/longhorn/102.5.1+up1.7.2/templates/tls-secrets.yaml b/charts/longhorn/102.5.1+up1.7.2/templates/tls-secrets.yaml new file mode 100644 index 0000000000..74c43426de --- /dev/null +++ b/charts/longhorn/102.5.1+up1.7.2/templates/tls-secrets.yaml @@ -0,0 +1,16 @@ +{{- if .Values.ingress.enabled }} +{{- range .Values.ingress.secrets }} +apiVersion: v1 +kind: Secret +metadata: + name: {{ .name }} + namespace: {{ include "release_namespace" $ }} + labels: {{- include "longhorn.labels" $ | nindent 4 }} + app: longhorn +type: kubernetes.io/tls +data: + tls.crt: {{ .certificate | b64enc }} + tls.key: {{ .key | b64enc }} +--- +{{- end }} +{{- end }} diff --git a/charts/longhorn/102.5.1+up1.7.2/templates/uninstall-job.yaml b/charts/longhorn/102.5.1+up1.7.2/templates/uninstall-job.yaml new file mode 100644 index 0000000000..1ab46207c3 --- /dev/null +++ b/charts/longhorn/102.5.1+up1.7.2/templates/uninstall-job.yaml @@ -0,0 +1,57 @@ +apiVersion: batch/v1 +kind: Job +metadata: + annotations: + "helm.sh/hook": pre-delete + "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded + name: longhorn-uninstall + namespace: {{ include "release_namespace" . }} + labels: {{- include "longhorn.labels" . | nindent 4 }} +spec: + activeDeadlineSeconds: 900 + backoffLimit: 1 + template: + metadata: + name: longhorn-uninstall + labels: {{- include "longhorn.labels" . | nindent 8 }} + spec: + containers: + - name: longhorn-uninstall + image: {{ template "registry_url" . }}{{ .Values.image.longhorn.manager.repository }}:{{ .Values.image.longhorn.manager.tag }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + command: + - longhorn-manager + - uninstall + - --force + env: + - name: LONGHORN_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + restartPolicy: Never + {{- if .Values.privateRegistry.registrySecret }} + imagePullSecrets: + - name: {{ .Values.privateRegistry.registrySecret }} + {{- end }} + {{- if .Values.longhornManager.priorityClass }} + priorityClassName: {{ .Values.longhornManager.priorityClass | quote }} + {{- end }} + serviceAccountName: longhorn-service-account + {{- if or .Values.global.tolerations .Values.longhornManager.tolerations .Values.global.cattle.windowsCluster.enabled }} + tolerations: + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.tolerations }} +{{ toYaml .Values.global.cattle.windowsCluster.tolerations | indent 6 }} + {{- end }} + {{- if or .Values.global.tolerations .Values.longhornManager.tolerations }} +{{ default .Values.global.tolerations .Values.longhornManager.tolerations | toYaml | indent 6 }} + {{- end }} + {{- end }} + {{- if or .Values.global.nodeSelector .Values.longhornManager.nodeSelector .Values.global.cattle.windowsCluster.enabled }} + nodeSelector: + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.nodeSelector }} +{{ toYaml .Values.global.cattle.windowsCluster.nodeSelector | indent 8 }} + {{- end }} + {{- if or .Values.global.nodeSelector .Values.longhornManager.nodeSelector }} +{{ default .Values.global.nodeSelector .Values.longhornManager.nodeSelector | toYaml | indent 8 }} + {{- end }} + {{- end }} diff --git a/charts/longhorn/102.5.1+up1.7.2/templates/userroles.yaml b/charts/longhorn/102.5.1+up1.7.2/templates/userroles.yaml new file mode 100644 index 0000000000..57a68e130c --- /dev/null +++ b/charts/longhorn/102.5.1+up1.7.2/templates/userroles.yaml @@ -0,0 +1,53 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: "longhorn-admin" + labels: + rbac.authorization.k8s.io/aggregate-to-admin: "true" +rules: +- apiGroups: [ "longhorn.io" ] + resources: ["volumes", "volumes/status", "engines", "engines/status", "replicas", "replicas/status", "settings", "settings/status", + "engineimages", "engineimages/status", "nodes", "nodes/status", "instancemanagers", "instancemanagers/status", + "sharemanagers", "sharemanagers/status", "backingimages", "backingimages/status", + "backingimagemanagers", "backingimagemanagers/status", "backingimagedatasources", "backingimagedatasources/status", "backupbackingimages", "backupbackingimages/status", + "backuptargets", "backuptargets/status", "backupvolumes", "backupvolumes/status", "backups", "backups/status", + "recurringjobs", "recurringjobs/status", "orphans", "orphans/status", "snapshots", "snapshots/status", + "supportbundles", "supportbundles/status", "systembackups", "systembackups/status", "systemrestores", "systemrestores/status", + "volumeattachments", "volumeattachments/status"] + verbs: [ "*" ] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: "longhorn-edit" + labels: + rbac.authorization.k8s.io/aggregate-to-edit: "true" +rules: +- apiGroups: [ "longhorn.io" ] + resources: ["volumes", "volumes/status", "engines", "engines/status", "replicas", "replicas/status", "settings", "settings/status", + "engineimages", "engineimages/status", "nodes", "nodes/status", "instancemanagers", "instancemanagers/status", + "sharemanagers", "sharemanagers/status", "backingimages", "backingimages/status", + "backingimagemanagers", "backingimagemanagers/status", "backingimagedatasources", "backingimagedatasources/status", "backupbackingimages", "backupbackingimages/status", + "backuptargets", "backuptargets/status", "backupvolumes", "backupvolumes/status", "backups", "backups/status", + "recurringjobs", "recurringjobs/status", "orphans", "orphans/status", "snapshots", "snapshots/status", + "supportbundles", "supportbundles/status", "systembackups", "systembackups/status", "systemrestores", "systemrestores/status", + "volumeattachments", "volumeattachments/status"] + verbs: [ "*" ] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: "longhorn-view" + labels: + rbac.authorization.k8s.io/aggregate-to-view: "true" +rules: +- apiGroups: [ "longhorn.io" ] + resources: ["volumes", "volumes/status", "engines", "engines/status", "replicas", "replicas/status", "settings", "settings/status", + "engineimages", "engineimages/status", "nodes", "nodes/status", "instancemanagers", "instancemanagers/status", + "sharemanagers", "sharemanagers/status", "backingimages", "backingimages/status", + "backingimagemanagers", "backingimagemanagers/status", "backingimagedatasources", "backingimagedatasources/status", "backupbackingimages", "backupbackingimages/status", + "backuptargets", "backuptargets/status", "backupvolumes", "backupvolumes/status", "backups", "backups/status", + "recurringjobs", "recurringjobs/status", "orphans", "orphans/status", "snapshots", "snapshots/status", + "supportbundles", "supportbundles/status", "systembackups", "systembackups/status", "systemrestores", "systemrestores/status", + "volumeattachments", "volumeattachments/status"] + verbs: [ "get", "list", "watch" ] diff --git a/charts/longhorn/102.5.1+up1.7.2/templates/validate-install-crd.yaml b/charts/longhorn/102.5.1+up1.7.2/templates/validate-install-crd.yaml new file mode 100644 index 0000000000..7bf81816d0 --- /dev/null +++ b/charts/longhorn/102.5.1+up1.7.2/templates/validate-install-crd.yaml @@ -0,0 +1,35 @@ +#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} +# {{- $found := dict -}} +# {{- set $found "longhorn.io/v1beta1/BackingImageDataSource" false -}} +# {{- set $found "longhorn.io/v1beta1/BackingImageManager" false -}} +# {{- set $found "longhorn.io/v1beta1/BackingImage" false -}} +# {{- set $found "longhorn.io/v1beta2/BackupBackingImage" false -}} +# {{- set $found "longhorn.io/v1beta1/Backup" false -}} +# {{- set $found "longhorn.io/v1beta1/BackupTarget" false -}} +# {{- set $found "longhorn.io/v1beta1/BackupVolume" false -}} +# {{- set $found "longhorn.io/v1beta1/EngineImage" false -}} +# {{- set $found "longhorn.io/v1beta1/Engine" false -}} +# {{- set $found "longhorn.io/v1beta1/InstanceManager" false -}} +# {{- set $found "longhorn.io/v1beta1/Node" false -}} +# {{- set $found "longhorn.io/v1beta2/Orphan" false -}} +# {{- set $found "longhorn.io/v1beta1/RecurringJob" false -}} +# {{- set $found "longhorn.io/v1beta1/Replica" false -}} +# {{- set $found "longhorn.io/v1beta1/Setting" false -}} +# {{- set $found "longhorn.io/v1beta1/ShareManager" false -}} +# {{- set $found "longhorn.io/v1beta2/Snapshot" false -}} +# {{- set $found "longhorn.io/v1beta2/SupportBundle" false -}} +# {{- set $found "longhorn.io/v1beta2/SystemBackup" false -}} +# {{- set $found "longhorn.io/v1beta2/SystemRestore" false -}} +# {{- set $found "longhorn.io/v1beta2/VolumeAttachment" false -}} +# {{- set $found "longhorn.io/v1beta1/Volume" false -}} +# {{- range .Capabilities.APIVersions -}} +# {{- if hasKey $found (toString .) -}} +# {{- set $found (toString .) true -}} +# {{- end -}} +# {{- end -}} +# {{- range $_, $exists := $found -}} +# {{- if (eq $exists false) -}} +# {{- required "Required CRDs are missing. Please install the corresponding CRD chart before installing this chart." "" -}} +# {{- end -}} +# {{- end -}} +#{{- end -}} diff --git a/charts/longhorn/102.5.1+up1.7.2/templates/validate-psp-install.yaml b/charts/longhorn/102.5.1+up1.7.2/templates/validate-psp-install.yaml new file mode 100644 index 0000000000..0df98e3657 --- /dev/null +++ b/charts/longhorn/102.5.1+up1.7.2/templates/validate-psp-install.yaml @@ -0,0 +1,7 @@ +#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} +#{{- if .Values.enablePSP }} +#{{- if not (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} +#{{- fail "The target cluster does not have the PodSecurityPolicy API resource. Please disable PSPs in this chart before proceeding." -}} +#{{- end }} +#{{- end }} +#{{- end }} \ No newline at end of file diff --git a/charts/longhorn/102.5.1+up1.7.2/values.yaml b/charts/longhorn/102.5.1+up1.7.2/values.yaml new file mode 100644 index 0000000000..1fabadb85a --- /dev/null +++ b/charts/longhorn/102.5.1+up1.7.2/values.yaml @@ -0,0 +1,526 @@ +# Default values for longhorn. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. +global: + # -- Toleration for nodes allowed to run user-deployed components such as Longhorn Manager, Longhorn UI, and Longhorn Driver Deployer. + tolerations: [] + # -- Node selector for nodes allowed to run user-deployed components such as Longhorn Manager, Longhorn UI, and Longhorn Driver Deployer. + nodeSelector: {} + cattle: + # -- Default system registry. + systemDefaultRegistry: "" + windowsCluster: + # -- Setting that allows Longhorn to run on a Rancher Windows cluster. + enabled: false + # -- Toleration for Linux nodes that can run user-deployed Longhorn components. + tolerations: + - key: "cattle.io/os" + value: "linux" + effect: "NoSchedule" + operator: "Equal" + # -- Node selector for Linux nodes that can run user-deployed Longhorn components. + nodeSelector: + kubernetes.io/os: "linux" + defaultSetting: + # -- Toleration for system-managed Longhorn components. + taintToleration: cattle.io/os=linux:NoSchedule + # -- Node selector for system-managed Longhorn components. + systemManagedComponentsNodeSelector: kubernetes.io/os:linux + +networkPolicies: + # -- Setting that allows you to enable network policies that control access to Longhorn pods. + enabled: false + # -- Distribution that determines the policy for allowing access for an ingress. (Options: "k3s", "rke2", "rke1") + type: "k3s" + +image: + longhorn: + engine: + # -- Repository for the Longhorn Engine image. + repository: rancher/mirrored-longhornio-longhorn-engine + # -- Tag for the Longhorn Engine image. + tag: v1.7.2 + manager: + # -- Repository for the Longhorn Manager image. + repository: rancher/mirrored-longhornio-longhorn-manager + # -- Tag for the Longhorn Manager image. + tag: v1.7.2 + ui: + # -- Repository for the Longhorn UI image. + repository: rancher/mirrored-longhornio-longhorn-ui + # -- Tag for the Longhorn UI image. + tag: v1.7.2 + instanceManager: + # -- Repository for the Longhorn Instance Manager image. + repository: rancher/mirrored-longhornio-longhorn-instance-manager + # -- Tag for the Longhorn Instance Manager image. + tag: v1.7.2 + shareManager: + # -- Repository for the Longhorn Share Manager image. + repository: rancher/mirrored-longhornio-longhorn-share-manager + # -- Tag for the Longhorn Share Manager image. + tag: v1.7.2 + backingImageManager: + # -- Repository for the Backing Image Manager image. When unspecified, Longhorn uses the default value. + repository: rancher/mirrored-longhornio-backing-image-manager + # -- Tag for the Backing Image Manager image. When unspecified, Longhorn uses the default value. + tag: v1.7.2 + supportBundleKit: + # -- Repository for the Longhorn Support Bundle Manager image. + repository: rancher/mirrored-longhornio-support-bundle-kit + # -- Tag for the Longhorn Support Bundle Manager image. + tag: v0.0.45 + csi: + attacher: + # -- Repository for the CSI attacher image. When unspecified, Longhorn uses the default value. + repository: rancher/mirrored-longhornio-csi-attacher + # -- Tag for the CSI attacher image. When unspecified, Longhorn uses the default value. + tag: v4.7.0 + provisioner: + # -- Repository for the CSI Provisioner image. When unspecified, Longhorn uses the default value. + repository: rancher/mirrored-longhornio-csi-provisioner + # -- Tag for the CSI Provisioner image. When unspecified, Longhorn uses the default value. + tag: v4.0.1-20241007 + nodeDriverRegistrar: + # -- Repository for the CSI Node Driver Registrar image. When unspecified, Longhorn uses the default value. + repository: rancher/mirrored-longhornio-csi-node-driver-registrar + # -- Tag for the CSI Node Driver Registrar image. When unspecified, Longhorn uses the default value. + tag: v2.12.0 + resizer: + # -- Repository for the CSI Resizer image. When unspecified, Longhorn uses the default value. + repository: rancher/mirrored-longhornio-csi-resizer + # -- Tag for the CSI Resizer image. When unspecified, Longhorn uses the default value. + tag: v1.12.0 + snapshotter: + # -- Repository for the CSI Snapshotter image. When unspecified, Longhorn uses the default value. + repository: rancher/mirrored-longhornio-csi-snapshotter + # -- Tag for the CSI Snapshotter image. When unspecified, Longhorn uses the default value. + tag: v7.0.2-20241007 + livenessProbe: + # -- Repository for the CSI liveness probe image. When unspecified, Longhorn uses the default value. + repository: rancher/mirrored-longhornio-livenessprobe + # -- Tag for the CSI liveness probe image. When unspecified, Longhorn uses the default value. + tag: v2.14.0 + openshift: + oauthProxy: + # -- Repository for the OAuth Proxy image. Specify the upstream image (for example, "quay.io/openshift/origin-oauth-proxy"). This setting applies only to OpenShift users. + repository: "" + # -- Tag for the OAuth Proxy image. Specify OCP/OKD version 4.1 or later (including version 4.15, which is available at quay.io/openshift/origin-oauth-proxy:4.15). This setting applies only to OpenShift users. + tag: "" + # -- Image pull policy that applies to all user-deployed Longhorn components, such as Longhorn Manager, Longhorn driver, and Longhorn UI. + pullPolicy: IfNotPresent + +service: + ui: + # -- Service type for Longhorn UI. (Options: "ClusterIP", "NodePort", "LoadBalancer", "Rancher-Proxy") + type: ClusterIP + # -- NodePort port number for Longhorn UI. When unspecified, Longhorn selects a free port between 30000 and 32767. + nodePort: null + manager: + # -- Service type for Longhorn Manager. + type: ClusterIP + # -- NodePort port number for Longhorn Manager. When unspecified, Longhorn selects a free port between 30000 and 32767. + nodePort: "" + +persistence: + # -- Setting that allows you to specify the default Longhorn StorageClass. + defaultClass: true + # -- Filesystem type of the default Longhorn StorageClass. + defaultFsType: ext4 + # -- mkfs parameters of the default Longhorn StorageClass. + defaultMkfsParams: "" + # -- Replica count of the default Longhorn StorageClass. + defaultClassReplicaCount: 3 + # -- Data locality of the default Longhorn StorageClass. (Options: "disabled", "best-effort") + defaultDataLocality: disabled + # -- Reclaim policy that provides instructions for handling of a volume after its claim is released. (Options: "Retain", "Delete") + reclaimPolicy: Delete + # -- Setting that allows you to enable live migration of a Longhorn volume from one node to another. + migratable: false + # -- Setting that disables the revision counter and thereby prevents Longhorn from tracking all write operations to a volume. When salvaging a volume, Longhorn uses properties of the volume-head-xxx.img file (the last file size and the last time the file was modified) to select the replica to be used for volume recovery. + disableRevisionCounter: "true" + # -- Set NFS mount options for Longhorn StorageClass for RWX volumes + nfsOptions: "" + recurringJobSelector: + # -- Setting that allows you to enable the recurring job selector for a Longhorn StorageClass. + enable: false + # -- Recurring job selector for a Longhorn StorageClass. Ensure that quotes are used correctly when specifying job parameters. (Example: `[{"name":"backup", "isGroup":true}]`) + jobList: [] + backingImage: + # -- Setting that allows you to use a backing image in a Longhorn StorageClass. + enable: false + # -- Backing image to be used for creating and restoring volumes in a Longhorn StorageClass. When no backing images are available, specify the data source type and parameters that Longhorn can use to create a backing image. + name: ~ + # -- Data source type of a backing image used in a Longhorn StorageClass. + # If the backing image exists in the cluster, Longhorn uses this setting to verify the image. + # If the backing image does not exist, Longhorn creates one using the specified data source type. + dataSourceType: ~ + # -- Data source parameters of a backing image used in a Longhorn StorageClass. + # You can specify a JSON string of a map. (Example: `'{\"url\":\"https://backing-image-example.s3-region.amazonaws.com/test-backing-image\"}'`) + dataSourceParameters: ~ + # -- Expected SHA-512 checksum of a backing image used in a Longhorn StorageClass. + expectedChecksum: ~ + defaultDiskSelector: + # -- Setting that allows you to enable the disk selector for the default Longhorn StorageClass. + enable: false + # -- Disk selector for the default Longhorn StorageClass. Longhorn uses only disks with the specified tags for storing volume data. (Examples: "nvme,sata") + selector: "" + defaultNodeSelector: + # -- Setting that allows you to enable the node selector for the default Longhorn StorageClass. + enable: false + # -- Node selector for the default Longhorn StorageClass. Longhorn uses only nodes with the specified tags for storing volume data. (Examples: "storage,fast") + selector: "" + # -- Setting that allows you to enable automatic snapshot removal during filesystem trim for a Longhorn StorageClass. (Options: "ignored", "enabled", "disabled") + removeSnapshotsDuringFilesystemTrim: ignored + # -- Setting that allows you to specify the data engine version for the default Longhorn StorageClass. (Options: "v1", "v2") + dataEngine: v1 + +preUpgradeChecker: + # -- Setting that allows Longhorn to perform pre-upgrade checks. Disable this setting when installing Longhorn using Argo CD or other GitOps solutions. + jobEnabled: true + # -- Setting that allows Longhorn to perform upgrade version checks after starting the Longhorn Manager DaemonSet Pods. Disabling this setting also disables `preUpgradeChecker.jobEnabled`. Longhorn recommends keeping this setting enabled. + upgradeVersionCheck: true + +csi: + # -- kubelet root directory. When unspecified, Longhorn uses the default value. + kubeletRootDir: ~ + # -- Replica count of the CSI Attacher. When unspecified, Longhorn uses the default value ("3"). + attacherReplicaCount: ~ + # -- Replica count of the CSI Provisioner. When unspecified, Longhorn uses the default value ("3"). + provisionerReplicaCount: ~ + # -- Replica count of the CSI Resizer. When unspecified, Longhorn uses the default value ("3"). + resizerReplicaCount: ~ + # -- Replica count of the CSI Snapshotter. When unspecified, Longhorn uses the default value ("3"). + snapshotterReplicaCount: ~ + +defaultSettings: + # -- Endpoint used to access the backupstore. (Options: "NFS", "CIFS", "AWS", "GCP", "AZURE") + backupTarget: ~ + # -- Name of the Kubernetes secret associated with the backup target. + backupTargetCredentialSecret: ~ + # -- Setting that allows Longhorn to automatically attach a volume and create snapshots or backups when recurring jobs are run. + allowRecurringJobWhileVolumeDetached: ~ + # -- Setting that allows Longhorn to automatically create a default disk only on nodes with the label "node.longhorn.io/create-default-disk=true" (if no other disks exist). When this setting is disabled, Longhorn creates a default disk on each node that is added to the cluster. + createDefaultDiskLabeledNodes: ~ + # -- Default path for storing data on a host. The default value is "/var/lib/longhorn/". + defaultDataPath: ~ + # -- Default data locality. A Longhorn volume has data locality if a local replica of the volume exists on the same node as the pod that is using the volume. + defaultDataLocality: ~ + # -- Setting that allows scheduling on nodes with healthy replicas of the same volume. This setting is disabled by default. + replicaSoftAntiAffinity: ~ + # -- Setting that automatically rebalances replicas when an available node is discovered. + replicaAutoBalance: ~ + # -- Percentage of storage that can be allocated relative to hard drive capacity. The default value is "100". + storageOverProvisioningPercentage: ~ + # -- Percentage of minimum available disk capacity. When the minimum available capacity exceeds the total available capacity, the disk becomes unschedulable until more space is made available for use. The default value is "25". + storageMinimalAvailablePercentage: ~ + # -- Percentage of disk space that is not allocated to the default disk on each new Longhorn node. + storageReservedPercentageForDefaultDisk: ~ + # -- Upgrade Checker that periodically checks for new Longhorn versions. When a new version is available, a notification appears on the Longhorn UI. This setting is enabled by default + upgradeChecker: ~ + # -- Default number of replicas for volumes created using the Longhorn UI. For Kubernetes configuration, modify the `numberOfReplicas` field in the StorageClass. The default value is "3". + defaultReplicaCount: ~ + # -- Default Longhorn StorageClass. "storageClassName" is assigned to PVs and PVCs that are created for an existing Longhorn volume. "storageClassName" can also be used as a label, so it is possible to use a Longhorn StorageClass to bind a workload to an existing PV without creating a Kubernetes StorageClass object. The default value is "longhorn-static". + defaultLonghornStaticStorageClass: ~ + # -- Number of seconds that Longhorn waits before checking the backupstore for new backups. The default value is "300". When the value is "0", polling is disabled. + backupstorePollInterval: ~ + # -- Number of minutes that Longhorn keeps a failed backup resource. When the value is "0", automatic deletion is disabled. + failedBackupTTL: ~ + # -- Setting that restores recurring jobs from a backup volume on a backup target and creates recurring jobs if none exist during backup restoration. + restoreVolumeRecurringJobs: ~ + # -- Maximum number of successful recurring backup and snapshot jobs to be retained. When the value is "0", a history of successful recurring jobs is not retained. + recurringSuccessfulJobsHistoryLimit: ~ + # -- Maximum number of failed recurring backup and snapshot jobs to be retained. When the value is "0", a history of failed recurring jobs is not retained. + recurringFailedJobsHistoryLimit: ~ + # -- Maximum number of snapshots or backups to be retained. + recurringJobMaxRetention: ~ + # -- Maximum number of failed support bundles that can exist in the cluster. When the value is "0", Longhorn automatically purges all failed support bundles. + supportBundleFailedHistoryLimit: ~ + # -- Taint or toleration for system-managed Longhorn components. + # Specify values using a semicolon-separated list in `kubectl taint` syntax (Example: key1=value1:effect; key2=value2:effect). + taintToleration: ~ + # -- Node selector for system-managed Longhorn components. + systemManagedComponentsNodeSelector: ~ + # -- PriorityClass for system-managed Longhorn components. + # This setting can help prevent Longhorn components from being evicted under Node Pressure. + # Notice that this will be applied to Longhorn user-deployed components by default if there are no priority class values set yet, such as `longhornManager.priorityClass`. + priorityClass: &defaultPriorityClassNameRef "longhorn-critical" + # -- Setting that allows Longhorn to automatically salvage volumes when all replicas become faulty (for example, when the network connection is interrupted). Longhorn determines which replicas are usable and then uses these replicas for the volume. This setting is enabled by default. + autoSalvage: ~ + # -- Setting that allows Longhorn to automatically delete a workload pod that is managed by a controller (for example, daemonset) whenever a Longhorn volume is detached unexpectedly (for example, during Kubernetes upgrades). After deletion, the controller restarts the pod and then Kubernetes handles volume reattachment and remounting. + autoDeletePodWhenVolumeDetachedUnexpectedly: ~ + # -- Setting that prevents Longhorn Manager from scheduling replicas on a cordoned Kubernetes node. This setting is enabled by default. + disableSchedulingOnCordonedNode: ~ + # -- Setting that allows Longhorn to schedule new replicas of a volume to nodes in the same zone as existing healthy replicas. Nodes that do not belong to any zone are treated as existing in the zone that contains healthy replicas. When identifying zones, Longhorn relies on the label "topology.kubernetes.io/zone=" in the Kubernetes node object. + replicaZoneSoftAntiAffinity: ~ + # -- Setting that allows scheduling on disks with existing healthy replicas of the same volume. This setting is enabled by default. + replicaDiskSoftAntiAffinity: ~ + # -- Policy that defines the action Longhorn takes when a volume is stuck with a StatefulSet or Deployment pod on a node that failed. + nodeDownPodDeletionPolicy: ~ + # -- Policy that defines the action Longhorn takes when a node with the last healthy replica of a volume is drained. + nodeDrainPolicy: ~ + # -- Setting that allows automatic detaching of manually-attached volumes when a node is cordoned. + detachManuallyAttachedVolumesWhenCordoned: ~ + # -- Number of seconds that Longhorn waits before reusing existing data on a failed replica instead of creating a new replica of a degraded volume. + replicaReplenishmentWaitInterval: ~ + # -- Maximum number of replicas that can be concurrently rebuilt on each node. + concurrentReplicaRebuildPerNodeLimit: ~ + # -- Maximum number of volumes that can be concurrently restored on each node using a backup. When the value is "0", restoration of volumes using a backup is disabled. + concurrentVolumeBackupRestorePerNodeLimit: ~ + # -- Setting that disables the revision counter and thereby prevents Longhorn from tracking all write operations to a volume. When salvaging a volume, Longhorn uses properties of the "volume-head-xxx.img" file (the last file size and the last time the file was modified) to select the replica to be used for volume recovery. This setting applies only to volumes created using the Longhorn UI. + disableRevisionCounter: "true" + # -- Image pull policy for system-managed pods, such as Instance Manager, engine images, and CSI Driver. Changes to the image pull policy are applied only after the system-managed pods restart. + systemManagedPodsImagePullPolicy: ~ + # -- Setting that allows you to create and attach a volume without having all replicas scheduled at the time of creation. + allowVolumeCreationWithDegradedAvailability: ~ + # -- Setting that allows Longhorn to automatically clean up the system-generated snapshot after replica rebuilding is completed. + autoCleanupSystemGeneratedSnapshot: ~ + # -- Setting that allows Longhorn to automatically clean up the snapshot generated by a recurring backup job. + autoCleanupRecurringJobBackupSnapshot: ~ + # -- Maximum number of engines that are allowed to concurrently upgrade on each node after Longhorn Manager is upgraded. When the value is "0", Longhorn does not automatically upgrade volume engines to the new default engine image version. + concurrentAutomaticEngineUpgradePerNodeLimit: ~ + # -- Number of minutes that Longhorn waits before cleaning up the backing image file when no replicas in the disk are using it. + backingImageCleanupWaitInterval: ~ + # -- Number of seconds that Longhorn waits before downloading a backing image file again when the status of all image disk files changes to "failed" or "unknown". + backingImageRecoveryWaitInterval: ~ + # -- Percentage of the total allocatable CPU resources on each node to be reserved for each instance manager pod when the V1 Data Engine is enabled. The default value is "12". + guaranteedInstanceManagerCPU: ~ + # -- Setting that notifies Longhorn that the cluster is using the Kubernetes Cluster Autoscaler. + kubernetesClusterAutoscalerEnabled: ~ + # -- Setting that allows Longhorn to automatically delete an orphaned resource and the corresponding data (for example, stale replicas). Orphaned resources on failed or unknown nodes are not automatically cleaned up. + orphanAutoDeletion: ~ + # -- Storage network for in-cluster traffic. When unspecified, Longhorn uses the Kubernetes cluster network. + storageNetwork: ~ + # -- Flag that prevents accidental uninstallation of Longhorn. + deletingConfirmationFlag: ~ + # -- Timeout between the Longhorn Engine and replicas. Specify a value between "8" and "30" seconds. The default value is "8". + engineReplicaTimeout: ~ + # -- Setting that allows you to enable and disable snapshot hashing and data integrity checks. + snapshotDataIntegrity: ~ + # -- Setting that allows disabling of snapshot hashing after snapshot creation to minimize impact on system performance. + snapshotDataIntegrityImmediateCheckAfterSnapshotCreation: ~ + # -- Setting that defines when Longhorn checks the integrity of data in snapshot disk files. You must use the Unix cron expression format. + snapshotDataIntegrityCronjob: ~ + # -- Setting that allows Longhorn to automatically mark the latest snapshot and its parent files as removed during a filesystem trim. Longhorn does not remove snapshots containing multiple child files. + removeSnapshotsDuringFilesystemTrim: ~ + # -- Setting that allows fast rebuilding of replicas using the checksum of snapshot disk files. Before enabling this setting, you must set the snapshot-data-integrity value to "enable" or "fast-check". + fastReplicaRebuildEnabled: ~ + # -- Number of seconds that an HTTP client waits for a response from a File Sync server before considering the connection to have failed. + replicaFileSyncHttpClientTimeout: ~ + # -- Number of seconds that Longhorn allows for the completion of replica rebuilding and snapshot cloning operations. + longGRPCTimeOut: ~ + # -- Log levels that indicate the type and severity of logs in Longhorn Manager. The default value is "Info". (Options: "Panic", "Fatal", "Error", "Warn", "Info", "Debug", "Trace") + logLevel: ~ + # -- Setting that allows you to specify a backup compression method. + backupCompressionMethod: ~ + # -- Maximum number of worker threads that can concurrently run for each backup. + backupConcurrentLimit: ~ + # -- Maximum number of worker threads that can concurrently run for each restore operation. + restoreConcurrentLimit: ~ + # -- Setting that allows you to enable the V1 Data Engine. + v1DataEngine: ~ + # -- Setting that allows you to enable the V2 Data Engine, which is based on the Storage Performance Development Kit (SPDK). The V2 Data Engine is a preview feature and should not be used in production environments. + v2DataEngine: ~ + # -- Setting that allows you to configure maximum huge page size (in MiB) for the V2 Data Engine. + v2DataEngineHugepageLimit: ~ + # -- Number of millicpus on each node to be reserved for each Instance Manager pod when the V2 Data Engine is enabled. The default value is "1250". + v2DataEngineGuaranteedInstanceManagerCPU: ~ + # -- Setting that allows scheduling of empty node selector volumes to any node. + allowEmptyNodeSelectorVolume: ~ + # -- Setting that allows scheduling of empty disk selector volumes to any disk. + allowEmptyDiskSelectorVolume: ~ + # -- Setting that allows Longhorn to periodically collect anonymous usage data for product improvement purposes. Longhorn sends collected data to the [Upgrade Responder](https://github.com/longhorn/upgrade-responder) server, which is the data source of the Longhorn Public Metrics Dashboard (https://metrics.longhorn.io). The Upgrade Responder server does not store data that can be used to identify clients, including IP addresses. + allowCollectingLonghornUsageMetrics: ~ + # -- Setting that temporarily prevents all attempts to purge volume snapshots. + disableSnapshotPurge: ~ + # -- Maximum snapshot count for a volume. The value should be between 2 to 250 + snapshotMaxCount: ~ + # -- Setting that allows you to configure the log level of the SPDK target daemon (spdk_tgt) of the V2 Data Engine. + v2DataEngineLogLevel: ~ + # -- Setting that allows you to configure the log flags of the SPDK target daemon (spdk_tgt) of the V2 Data Engine. + v2DataEngineLogFlags: ~ + # -- Setting that freezes the filesystem on the root partition before a snapshot is created. + freezeFilesystemForSnapshot: ~ + # -- Setting that automatically cleans up the snapshot when the backup is deleted. + autoCleanupSnapshotWhenDeleteBackup: ~ + # -- Turn on logic to detect and move RWX volumes quickly on node failure. + rwxVolumeFastFailover: ~ + +privateRegistry: + # -- Setting that allows you to create a private registry secret. + createSecret: ~ + # -- URL of a private registry. When unspecified, Longhorn uses the default system registry. + registryUrl: ~ + # -- User account used for authenticating with a private registry. + registryUser: ~ + # -- Password for authenticating with a private registry. + registryPasswd: ~ + # -- Kubernetes secret that allows you to pull images from a private registry. This setting applies only when creation of private registry secrets is enabled. You must include the private registry name in the secret name. + registrySecret: ~ + +longhornManager: + log: + # -- Format of Longhorn Manager logs. (Options: "plain", "json") + format: plain + # -- PriorityClass for Longhorn Manager. + priorityClass: *defaultPriorityClassNameRef + # -- Toleration for Longhorn Manager on nodes allowed to run Longhorn components. + tolerations: [] + ## If you want to set tolerations for Longhorn Manager DaemonSet, delete the `[]` in the line above + ## and uncomment this example block + # - key: "key" + # operator: "Equal" + # value: "value" + # effect: "NoSchedule" + # -- Node selector for Longhorn Manager. Specify the nodes allowed to run Longhorn Manager. + nodeSelector: {} + ## If you want to set node selector for Longhorn Manager DaemonSet, delete the `{}` in the line above + ## and uncomment this example block + # label-key1: "label-value1" + # label-key2: "label-value2" + # -- Annotation for the Longhorn Manager service. + serviceAnnotations: {} + ## If you want to set annotations for the Longhorn Manager service, delete the `{}` in the line above + ## and uncomment this example block + # annotation-key1: "annotation-value1" + # annotation-key2: "annotation-value2" + +longhornDriver: + # -- PriorityClass for Longhorn Driver. + priorityClass: *defaultPriorityClassNameRef + # -- Toleration for Longhorn Driver on nodes allowed to run Longhorn components. + tolerations: [] + ## If you want to set tolerations for Longhorn Driver Deployer Deployment, delete the `[]` in the line above + ## and uncomment this example block + # - key: "key" + # operator: "Equal" + # value: "value" + # effect: "NoSchedule" + # -- Node selector for Longhorn Driver. Specify the nodes allowed to run Longhorn Driver. + nodeSelector: {} + ## If you want to set node selector for Longhorn Driver Deployer Deployment, delete the `{}` in the line above + ## and uncomment this example block + # label-key1: "label-value1" + # label-key2: "label-value2" + +longhornUI: + # -- Replica count for Longhorn UI. + replicas: 2 + # -- PriorityClass for Longhorn UI. + priorityClass: *defaultPriorityClassNameRef + # -- Toleration for Longhorn UI on nodes allowed to run Longhorn components. + tolerations: [] + ## If you want to set tolerations for Longhorn UI Deployment, delete the `[]` in the line above + ## and uncomment this example block + # - key: "key" + # operator: "Equal" + # value: "value" + # effect: "NoSchedule" + # -- Node selector for Longhorn UI. Specify the nodes allowed to run Longhorn UI. + nodeSelector: {} + ## If you want to set node selector for Longhorn UI Deployment, delete the `{}` in the line above + ## and uncomment this example block + # label-key1: "label-value1" + # label-key2: "label-value2" + +ingress: + # -- Setting that allows Longhorn to generate ingress records for the Longhorn UI service. + enabled: false + + # -- IngressClass resource that contains ingress configuration, including the name of the Ingress controller. + # ingressClassName can replace the kubernetes.io/ingress.class annotation used in earlier Kubernetes releases. + ingressClassName: ~ + + # -- Hostname of the Layer 7 load balancer. + host: sslip.io + + # -- Setting that allows you to enable TLS on ingress records. + tls: false + + # -- Setting that allows you to enable secure connections to the Longhorn UI service via port 443. + secureBackends: false + + # -- TLS secret that contains the private key and certificate to be used for TLS. This setting applies only when TLS is enabled on ingress records. + tlsSecret: longhorn.local-tls + + # -- Default ingress path. You can access the Longhorn UI by following the full ingress path {{host}}+{{path}}. + path: / + + # -- Ingress path type. To maintain backward compatibility, the default value is "ImplementationSpecific". + pathType: ImplementationSpecific + + ## If you're using kube-lego, you will want to add: + ## kubernetes.io/tls-acme: true + ## + ## For a full list of possible ingress annotations, please see + ## ref: https://github.com/kubernetes/ingress-nginx/blob/master/docs/annotations.md + ## + ## If tls is set to true, annotation ingress.kubernetes.io/secure-backends: "true" will automatically be set + # -- Ingress annotations in the form of key-value pairs. + annotations: + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: true + + # -- Secret that contains a TLS private key and certificate. Use secrets if you want to use your own certificates to secure ingresses. + secrets: + ## If you're providing your own certificates, please use this to add the certificates as secrets + ## key and certificate should start with -----BEGIN CERTIFICATE----- or + ## -----BEGIN RSA PRIVATE KEY----- + ## + ## name should line up with a tlsSecret set further up + ## If you're using kube-lego, this is unneeded, as it will create the secret for you if it is not set + ## + ## It is also possible to create and manage the certificates outside of this helm chart + ## Please see README.md for more information + # - name: longhorn.local-tls + # key: + # certificate: + +# -- Setting that allows you to enable pod security policies (PSPs) that allow privileged Longhorn pods to start. This setting applies only to clusters running Kubernetes 1.25 and earlier, and with the built-in Pod Security admission controller enabled. +enablePSP: false + +# -- Specify override namespace, specifically this is useful for using longhorn as sub-chart and its release namespace is not the `longhorn-system`. +namespaceOverride: "" + +# -- Annotation for the Longhorn Manager DaemonSet pods. This setting is optional. +annotations: {} + +serviceAccount: + # -- Annotations to add to the service account + annotations: {} + +metrics: + serviceMonitor: + # -- Setting that allows the creation of a Prometheus ServiceMonitor resource for Longhorn Manager components. + enabled: false + # -- Additional labels for the Prometheus ServiceMonitor resource. + additionalLabels: {} + # -- Annotations for the Prometheus ServiceMonitor resource. + annotations: {} + # -- Interval at which Prometheus scrapes the metrics from the target. + interval: "" + # -- Timeout after which Prometheus considers the scrape to be failed. + scrapeTimeout: "" + # -- Configures the relabeling rules to apply the target’s metadata labels. See the [Prometheus Operator + # documentation](https://prometheus-operator.dev/docs/api-reference/api/#monitoring.coreos.com/v1.Endpoint) for + # formatting details. + relabelings: [] + # -- Configures the relabeling rules to apply to the samples before ingestion. See the [Prometheus Operator + # documentation](https://prometheus-operator.dev/docs/api-reference/api/#monitoring.coreos.com/v1.Endpoint) for + # formatting details. + metricRelabelings: [] + +## openshift settings +openshift: + # -- Setting that allows Longhorn to integrate with OpenShift. + enabled: false + ui: + # -- Route for connections between Longhorn and the OpenShift web console. + route: "longhorn-ui" + # -- Port for accessing the OpenShift web console. + port: 443 + # -- Port for proxy that provides access to the OpenShift web console. + proxy: 8443 + +# -- Setting that allows Longhorn to generate code coverage profiles. +enableGoCoverDir: false diff --git a/charts/longhorn/103.4.1+up1.7.2/.helmignore b/charts/longhorn/103.4.1+up1.7.2/.helmignore new file mode 100644 index 0000000000..f0c1319444 --- /dev/null +++ b/charts/longhorn/103.4.1+up1.7.2/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/charts/longhorn/103.4.1+up1.7.2/Chart.yaml b/charts/longhorn/103.4.1+up1.7.2/Chart.yaml new file mode 100644 index 0000000000..2c62f2a1d7 --- /dev/null +++ b/charts/longhorn/103.4.1+up1.7.2/Chart.yaml @@ -0,0 +1,40 @@ +annotations: + catalog.cattle.io/auto-install: longhorn-crd=match + catalog.cattle.io/certified: rancher + catalog.cattle.io/display-name: Longhorn + catalog.cattle.io/kube-version: '>= 1.21.0-0' + catalog.cattle.io/namespace: longhorn-system + catalog.cattle.io/permits-os: linux,windows + catalog.cattle.io/provides-gvr: longhorn.io/v1beta1 + catalog.cattle.io/rancher-version: '>= 2.8.0-0 < 2.9.0-0' + catalog.cattle.io/release-name: longhorn + catalog.cattle.io/type: cluster-tool + catalog.cattle.io/upstream-version: 1.7.2 +apiVersion: v1 +appVersion: v1.7.2 +description: Longhorn is a distributed block storage system for Kubernetes. +home: https://github.com/longhorn/longhorn +icon: https://raw.githubusercontent.com/cncf/artwork/master/projects/longhorn/icon/color/longhorn-icon-color.png +keywords: +- longhorn +- storage +- distributed +- block +- device +- iscsi +- nfs +kubeVersion: '>=1.21.0-0' +maintainers: +- email: maintainers@longhorn.io + name: Longhorn maintainers +name: longhorn +sources: +- https://github.com/longhorn/longhorn +- https://github.com/longhorn/longhorn-engine +- https://github.com/longhorn/longhorn-instance-manager +- https://github.com/longhorn/longhorn-share-manager +- https://github.com/longhorn/longhorn-manager +- https://github.com/longhorn/longhorn-ui +- https://github.com/longhorn/longhorn-tests +- https://github.com/longhorn/backing-image-manager +version: 103.4.1+up1.7.2 diff --git a/charts/longhorn/103.4.1+up1.7.2/README.md b/charts/longhorn/103.4.1+up1.7.2/README.md new file mode 100644 index 0000000000..adb190be3b --- /dev/null +++ b/charts/longhorn/103.4.1+up1.7.2/README.md @@ -0,0 +1,50 @@ +# Longhorn Chart + +> **Important**: Please install the Longhorn chart in the `longhorn-system` namespace only. + +> **Warning**: Longhorn doesn't support downgrading from a higher version to a lower version. + +> **Note**: Use Helm 3 when installing and upgrading Longhorn. Helm 2 is [no longer supported](https://helm.sh/blog/helm-2-becomes-unsupported/). + +## Source Code + +Longhorn is 100% open source software. Project source code is spread across a number of repos: + +1. Longhorn Engine -- Core controller/replica logic https://github.com/longhorn/longhorn-engine +2. Longhorn Instance Manager -- Controller/replica instance lifecycle management https://github.com/longhorn/longhorn-instance-manager +3. Longhorn Share Manager -- NFS provisioner that exposes Longhorn volumes as ReadWriteMany volumes. https://github.com/longhorn/longhorn-share-manager +4. Backing Image Manager -- Backing image file lifecycle management. https://github.com/longhorn/backing-image-manager +5. Longhorn Manager -- Longhorn orchestration, includes CSI driver for Kubernetes https://github.com/longhorn/longhorn-manager +6. Longhorn UI -- Dashboard https://github.com/longhorn/longhorn-ui + +## Prerequisites + +1. A container runtime compatible with Kubernetes (Docker v1.13+, containerd v1.3.7+, etc.) +2. Kubernetes >= v1.21 +3. Make sure `bash`, `curl`, `findmnt`, `grep`, `awk` and `blkid` has been installed in all nodes of the Kubernetes cluster. +4. Make sure `open-iscsi` has been installed, and the `iscsid` daemon is running on all nodes of the Kubernetes cluster. For GKE, recommended Ubuntu as guest OS image since it contains `open-iscsi` already. + +## Upgrading to Kubernetes v1.25+ + +Starting in Kubernetes v1.25, [Pod Security Policies](https://kubernetes.io/docs/concepts/security/pod-security-policy/) have been removed from the Kubernetes API. + +As a result, **before upgrading to Kubernetes v1.25** (or on a fresh install in a Kubernetes v1.25+ cluster), users are expected to perform an in-place upgrade of this chart with `enablePSP` set to `false` if it has been previously set to `true`. + +> **Note:** +> If you upgrade your cluster to Kubernetes v1.25+ before removing PSPs via a `helm upgrade` (even if you manually clean up resources), **it will leave the Helm release in a broken state within the cluster such that further Helm operations will not work (`helm uninstall`, `helm upgrade`, etc.).** +> +> If your charts get stuck in this state, you may have to clean up your Helm release secrets. +Upon setting `enablePSP` to false, the chart will remove any PSP resources deployed on its behalf from the cluster. This is the default setting for this chart. + +As a replacement for PSPs, [Pod Security Admission](https://kubernetes.io/docs/concepts/security/pod-security-admission/) should be used. Please consult the Longhorn docs for more details on how to configure your chart release namespaces to work with the new Pod Security Admission and apply Pod Security Standards. + +## Uninstallation + +To prevent Longhorn from being accidentally uninstalled (which leads to data lost), we introduce a new setting, deleting-confirmation-flag. If this flag is **false**, the Longhorn uninstallation job will fail. Set this flag to **true** to allow Longhorn uninstallation. You can set this flag using setting page in Longhorn UI or `kubectl -n longhorn-system patch -p '{"value": "true"}' --type=merge lhs deleting-confirmation-flag` + +To prevent damage to the Kubernetes cluster, we recommend deleting all Kubernetes workloads using Longhorn volumes (PersistentVolume, PersistentVolumeClaim, StorageClass, Deployment, StatefulSet, DaemonSet, etc). + +From Rancher Cluster Explorer UI, navigate to Apps page, delete app `longhorn` then app `longhorn-crd` in Installed Apps tab. + +--- +Please see [link](https://github.com/longhorn/longhorn) for more information. diff --git a/charts/longhorn/103.4.1+up1.7.2/app-readme.md b/charts/longhorn/103.4.1+up1.7.2/app-readme.md new file mode 100644 index 0000000000..321e5193c4 --- /dev/null +++ b/charts/longhorn/103.4.1+up1.7.2/app-readme.md @@ -0,0 +1,27 @@ +# Longhorn + +Longhorn is a lightweight, reliable and easy to use distributed block storage system for Kubernetes. Once deployed, users can leverage persistent volumes provided by Longhorn. + +Longhorn creates a dedicated storage controller for each volume and synchronously replicates the volume across multiple replicas stored on multiple nodes. The storage controller and replicas are themselves orchestrated using Kubernetes. Longhorn supports snapshots, backups and even allows you to schedule recurring snapshots and backups! + +**Important**: Please install Longhorn chart in `longhorn-system` namespace only. + +**Warning**: Longhorn doesn't support downgrading from a higher version to a lower version. + +[Chart Documentation](https://github.com/longhorn/longhorn/blob/master/chart/README.md) + + +## Upgrading to Kubernetes v1.25+ + +Starting in Kubernetes v1.25, [Pod Security Policies](https://kubernetes.io/docs/concepts/security/pod-security-policy/) have been removed from the Kubernetes API. + +As a result, **before upgrading to Kubernetes v1.25** (or on a fresh install in a Kubernetes v1.25+ cluster), users are expected to perform an in-place upgrade of this chart with `enablePSP` set to `false` if it has been previously set to `true`. + +> **Note:** +> If you upgrade your cluster to Kubernetes v1.25+ before removing PSPs via a `helm upgrade` (even if you manually clean up resources), **it will leave the Helm release in a broken state within the cluster such that further Helm operations will not work (`helm uninstall`, `helm upgrade`, etc.).** +> +> If your charts get stuck in this state, please consult the Rancher docs on how to clean up your Helm release secrets. + +Upon setting `enablePSP` to false, the chart will remove any PSP resources deployed on its behalf from the cluster. This is the default setting for this chart. + +As a replacement for PSPs, [Pod Security Admission](https://kubernetes.io/docs/concepts/security/pod-security-admission/) should be used. Please consult the Rancher docs for more details on how to configure your chart release namespaces to work with the new Pod Security Admission and apply Pod Security Standards. \ No newline at end of file diff --git a/charts/longhorn/103.4.1+up1.7.2/questions.yaml b/charts/longhorn/103.4.1+up1.7.2/questions.yaml new file mode 100644 index 0000000000..89c8dbe105 --- /dev/null +++ b/charts/longhorn/103.4.1+up1.7.2/questions.yaml @@ -0,0 +1,974 @@ +categories: +- storage +namespace: longhorn-system +questions: +- variable: image.defaultImage + default: "true" + description: "Use default Longhorn images" + label: Use Default Images + type: boolean + show_subquestion_if: false + group: "Longhorn Images" + subquestions: + - variable: image.longhorn.manager.repository + default: rancher/mirrored-longhornio-longhorn-manager + description: "Repository for the Longhorn Manager image." + type: string + label: Longhorn Manager Image Repository + group: "Longhorn Images Settings" + - variable: image.longhorn.manager.tag + default: v1.7.2 + description: "Tag for the Longhorn Manager image." + type: string + label: Longhorn Manager Image Tag + group: "Longhorn Images Settings" + - variable: image.longhorn.engine.repository + default: rancher/mirrored-longhornio-longhorn-engine + description: "Repository for the Longhorn Engine image." + type: string + label: Longhorn Engine Image Repository + group: "Longhorn Images Settings" + - variable: image.longhorn.engine.tag + default: v1.7.2 + description: "Tag for the Longhorn Engine image." + type: string + label: Longhorn Engine Image Tag + group: "Longhorn Images Settings" + - variable: image.longhorn.ui.repository + default: rancher/mirrored-longhornio-longhorn-ui + description: "Repository for the Longhorn UI image." + type: string + label: Longhorn UI Image Repository + group: "Longhorn Images Settings" + - variable: image.longhorn.ui.tag + default: v1.7.2 + description: "Tag for the Longhorn UI image." + type: string + label: Longhorn UI Image Tag + group: "Longhorn Images Settings" + - variable: image.longhorn.instanceManager.repository + default: rancher/mirrored-longhornio-longhorn-instance-manager + description: "Repository for the Longhorn Instance Manager image." + type: string + label: Longhorn Instance Manager Image Repository + group: "Longhorn Images Settings" + - variable: image.longhorn.instanceManager.tag + default: v1.7.2 + description: "Tag for the Longhorn Instance Manager image." + type: string + label: Longhorn Instance Manager Image Tag + group: "Longhorn Images Settings" + - variable: image.longhorn.shareManager.repository + default: rancher/mirrored-longhornio-longhorn-share-manager + description: "Repository for the Longhorn Share Manager image." + type: string + label: Longhorn Share Manager Image Repository + group: "Longhorn Images Settings" + - variable: image.longhorn.shareManager.tag + default: v1.7.2 + description: "Tag for the Longhorn Share Manager image." + type: string + label: Longhorn Share Manager Image Tag + group: "Longhorn Images Settings" + - variable: image.longhorn.backingImageManager.repository + default: rancher/mirrored-longhornio-backing-image-manager + description: "Repository for the Backing Image Manager image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn Backing Image Manager Image Repository + group: "Longhorn Images Settings" + - variable: image.longhorn.backingImageManager.tag + default: v1.7.2 + description: "Tag for the Backing Image Manager image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn Backing Image Manager Image Tag + group: "Longhorn Images Settings" + - variable: image.longhorn.supportBundleKit.repository + default: rancher/mirrored-longhornio-support-bundle-kit + description: "Repository for the Longhorn Support Bundle Manager image." + type: string + label: Longhorn Support Bundle Kit Image Repository + group: "Longhorn Images Settings" + - variable: image.longhorn.supportBundleKit.tag + default: v0.0.45 + description: "Tag for the Longhorn Support Bundle Manager image." + type: string + label: Longhorn Support Bundle Kit Image Tag + group: "Longhorn Images Settings" + - variable: image.csi.attacher.repository + default: rancher/mirrored-longhornio-csi-attacher + description: "Repository for the CSI attacher image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn CSI Attacher Image Repository + group: "Longhorn CSI Driver Images" + - variable: image.csi.attacher.tag + default: v4.7.0 + description: "Tag for the CSI attacher image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn CSI Attacher Image Tag + group: "Longhorn CSI Driver Images" + - variable: image.csi.provisioner.repository + default: rancher/mirrored-longhornio-csi-provisioner + description: "Repository for the CSI Provisioner image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn CSI Provisioner Image Repository + group: "Longhorn CSI Driver Images" + - variable: image.csi.provisioner.tag + default: v4.0.1-20241007 + description: "Tag for the CSI Provisioner image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn CSI Provisioner Image Tag + group: "Longhorn CSI Driver Images" + - variable: image.csi.nodeDriverRegistrar.repository + default: rancher/mirrored-longhornio-csi-node-driver-registrar + description: "Repository for the CSI Node Driver Registrar image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn CSI Node Driver Registrar Image Repository + group: "Longhorn CSI Driver Images" + - variable: image.csi.nodeDriverRegistrar.tag + default: v2.12.0 + description: "Tag for the CSI Node Driver Registrar image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn CSI Node Driver Registrar Image Tag + group: "Longhorn CSI Driver Images" + - variable: image.csi.resizer.repository + default: rancher/mirrored-longhornio-csi-resizer + description: "Repository for the CSI Resizer image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn CSI Driver Resizer Image Repository + group: "Longhorn CSI Driver Images" + - variable: image.csi.resizer.tag + default: v1.12.0 + description: "Tag for the CSI Resizer image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn CSI Driver Resizer Image Tag + group: "Longhorn CSI Driver Images" + - variable: image.csi.snapshotter.repository + default: rancher/mirrored-longhornio-csi-snapshotter + description: "Repository for the CSI Snapshotter image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn CSI Driver Snapshotter Image Repository + group: "Longhorn CSI Driver Images" + - variable: image.csi.snapshotter.tag + default: v7.0.2-20241007 + description: "Tag for the CSI Snapshotter image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn CSI Driver Snapshotter Image Tag + group: "Longhorn CSI Driver Images" + - variable: image.csi.livenessProbe.repository + default: rancher/mirrored-longhornio-livenessprobe + description: "Repository for the CSI liveness probe image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn CSI Liveness Probe Image Repository + group: "Longhorn CSI Driver Images" + - variable: image.csi.livenessProbe.tag + default: v2.14.0 + description: "Tag for the CSI liveness probe image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn CSI Liveness Probe Image Tag + group: "Longhorn CSI Driver Images" +- variable: privateRegistry.registryUrl + label: Private registry URL + description: "URL of a private registry. When unspecified, Longhorn uses the default system registry." + group: "Private Registry Settings" + type: string + default: "" +- variable: privateRegistry.registrySecret + label: Private registry secret name + description: "Kubernetes secret that allows you to pull images from a private registry. This setting applies only when creation of private registry secrets is enabled. You must include the private registry name in the secret name." + group: "Private Registry Settings" + type: string + default: "" +- variable: privateRegistry.createSecret + default: "true" + description: "Setting that allows you to create a private registry secret." + type: boolean + group: "Private Registry Settings" + label: Create Secret for Private Registry Settings + show_subquestion_if: true + subquestions: + - variable: privateRegistry.registryUser + label: Private registry user + description: "User account used for authenticating with a private registry." + type: string + default: "" + - variable: privateRegistry.registryPasswd + label: Private registry password + description: "Password for authenticating with a private registry." + type: password + default: "" +- variable: longhorn.default_setting + default: "false" + description: "Customize the default settings before installing Longhorn for the first time. This option will only work if the cluster hasn't installed Longhorn." + label: "Customize Default Settings" + type: boolean + show_subquestion_if: true + group: "Longhorn Default Settings" + subquestions: + - variable: csi.kubeletRootDir + default: + description: "kubelet root directory. When unspecified, Longhorn uses the default value." + type: string + label: Kubelet Root Directory + group: "Longhorn CSI Driver Settings" + - variable: csi.attacherReplicaCount + type: int + default: 3 + min: 1 + max: 10 + description: "Replica count of the CSI Attacher. When unspecified, Longhorn uses the default value (\"3\")." + label: Longhorn CSI Attacher replica count + group: "Longhorn CSI Driver Settings" + - variable: csi.provisionerReplicaCount + type: int + default: 3 + min: 1 + max: 10 + description: "Replica count of the CSI Provisioner. When unspecified, Longhorn uses the default value (\"3\")." + label: Longhorn CSI Provisioner replica count + group: "Longhorn CSI Driver Settings" + - variable: csi.resizerReplicaCount + type: int + default: 3 + min: 1 + max: 10 + description: "Replica count of the CSI Resizer. When unspecified, Longhorn uses the default value (\"3\")." + label: Longhorn CSI Resizer replica count + group: "Longhorn CSI Driver Settings" + - variable: csi.snapshotterReplicaCount + type: int + default: 3 + min: 1 + max: 10 + description: "Replica count of the CSI Snapshotter. When unspecified, Longhorn uses the default value (\"3\")." + label: Longhorn CSI Snapshotter replica count + group: "Longhorn CSI Driver Settings" + - variable: defaultSettings.backupTarget + label: Backup Target + description: "Endpoint used to access the backupstore. (Options: \"NFS\", \"CIFS\", \"AWS\", \"GCP\", \"AZURE\")" + group: "Longhorn Default Settings" + type: string + default: + - variable: defaultSettings.backupTargetCredentialSecret + label: Backup Target Credential Secret + description: "Name of the Kubernetes secret associated with the backup target." + group: "Longhorn Default Settings" + type: string + default: + - variable: defaultSettings.allowRecurringJobWhileVolumeDetached + label: Allow Recurring Job While Volume Is Detached + description: 'Setting that allows Longhorn to automatically attach a volume and create snapshots or backups when recurring jobs are run.' + group: "Longhorn Default Settings" + type: boolean + default: "false" + - variable: defaultSettings.snapshotMaxCount + label: Snapshot Maximum Count + description: 'Maximum snapshot count for a volume. The value should be between 2 to 250.' + group: "Longhorn Default Settings" + type: int + min: 2 + max: 250 + default: 250 + - variable: defaultSettings.createDefaultDiskLabeledNodes + label: Create Default Disk on Labeled Nodes + description: 'Setting that allows Longhorn to automatically create a default disk only on nodes with the label "node.longhorn.io/create-default-disk=true" (if no other disks exist). When this setting is disabled, Longhorn creates a default disk on each node that is added to the cluster.' + group: "Longhorn Default Settings" + type: boolean + default: "false" + - variable: defaultSettings.defaultDataPath + label: Default Data Path + description: 'Default path for storing data on a host. The default value is "/var/lib/longhorn/".' + group: "Longhorn Default Settings" + type: string + default: "/var/lib/longhorn/" + - variable: defaultSettings.defaultDataLocality + label: Default Data Locality + description: 'Default data locality. A Longhorn volume has data locality if a local replica of the volume exists on the same node as the pod that is using the volume.' + group: "Longhorn Default Settings" + type: enum + options: + - "disabled" + - "best-effort" + default: "disabled" + - variable: defaultSettings.replicaSoftAntiAffinity + label: Replica Node Level Soft Anti-Affinity + description: 'Allow scheduling on nodes with existing healthy replicas of the same volume. By default, false.' + group: "Longhorn Default Settings" + type: boolean + default: "false" + - variable: defaultSettings.replicaAutoBalance + label: Replica Auto Balance + description: 'Enable this setting automatically re-balances replicas when discovered an available node.' + group: "Longhorn Default Settings" + type: enum + options: + - "disabled" + - "least-effort" + - "best-effort" + default: "disabled" + - variable: defaultSettings.storageOverProvisioningPercentage + label: Storage Over Provisioning Percentage + description: "Percentage of storage that can be allocated relative to hard drive capacity. The default value is 100." + group: "Longhorn Default Settings" + type: int + min: 0 + default: 100 + - variable: defaultSettings.storageMinimalAvailablePercentage + label: Storage Minimal Available Percentage + description: "If the minimum available disk capacity exceeds the actual percentage of available disk capacity, the disk becomes unschedulable until more space is freed up. By default, 25." + group: "Longhorn Default Settings" + type: int + min: 0 + max: 100 + default: 25 + - variable: defaultSettings.storageReservedPercentageForDefaultDisk + label: Storage Reserved Percentage For Default Disk + description: "The reserved percentage specifies the percentage of disk space that will not be allocated to the default disk on each new Longhorn node." + group: "Longhorn Default Settings" + type: int + min: 0 + max: 100 + default: 30 + - variable: defaultSettings.upgradeChecker + label: Enable Upgrade Checker + description: 'Upgrade Checker that periodically checks for new Longhorn versions. When a new version is available, a notification appears on the Longhorn UI. This setting is enabled by default.' + group: "Longhorn Default Settings" + type: boolean + default: "true" + - variable: defaultSettings.defaultReplicaCount + label: Default Replica Count + description: "Default number of replicas for volumes created using the Longhorn UI. For Kubernetes configuration, modify the `numberOfReplicas` field in the StorageClass. The default value is \"3\"." + group: "Longhorn Default Settings" + type: int + min: 1 + max: 20 + default: 3 + - variable: defaultSettings.defaultLonghornStaticStorageClass + label: Default Longhorn Static StorageClass Name + description: "Default Longhorn StorageClass. \"storageClassName\" is assigned to PVs and PVCs that are created for an existing Longhorn volume. \"storageClassName\" can also be used as a label, so it is possible to use a Longhorn StorageClass to bind a workload to an existing PV without creating a Kubernetes StorageClass object. The default value is \"longhorn-static\"." + group: "Longhorn Default Settings" + type: string + default: "longhorn-static" + - variable: defaultSettings.backupstorePollInterval + label: Backupstore Poll Interval + description: "Number of seconds that Longhorn waits before checking the backupstore for new backups. The default value is \"300\". When the value is \"0\", polling is disabled." + group: "Longhorn Default Settings" + type: int + min: 0 + default: 300 + - variable: defaultSettings.failedBackupTTL + label: Failed Backup Time to Live + description: "Number of minutes that Longhorn keeps a failed backup resource. When the value is \"0\", automatic deletion is disabled." + group: "Longhorn Default Settings" + type: int + min: 0 + default: 1440 + - variable: defaultSettings.restoreVolumeRecurringJobs + label: Restore Volume Recurring Jobs + description: "Restore recurring jobs from the backup volume on the backup target and create recurring jobs if not exist during a backup restoration." + group: "Longhorn Default Settings" + type: boolean + default: "false" + - variable: defaultSettings.recurringSuccessfulJobsHistoryLimit + label: Cronjob Successful Jobs History Limit + description: "This setting specifies how many successful backup or snapshot job histories should be retained. History will not be retained if the value is 0." + group: "Longhorn Default Settings" + type: int + min: 0 + default: 1 + - variable: defaultSettings.recurringFailedJobsHistoryLimit + label: Cronjob Failed Jobs History Limit + description: 'Maximum number of failed recurring backup and snapshot jobs to be retained. When the value is "0", a history of failed recurring jobs is not retained.' + group: "Longhorn Default Settings" + type: int + min: 0 + default: 1 + - variable: defaultSettings.recurringJobMaxRetention + label: Maximum Retention Number for Recurring Job + description: "Maximum number of snapshots or backups to be retained." + group: "Longhorn Default Settings" + type: int + default: 100 + - variable: defaultSettings.supportBundleFailedHistoryLimit + label: SupportBundle Failed History Limit + description: "This setting specifies how many failed support bundles can exist in the cluster. Set this value to **0** to have Longhorn automatically purge all failed support bundles." + group: "Longhorn Default Settings" + type: int + min: 0 + default: 1 + - variable: defaultSettings.autoSalvage + label: Automatic salvage + description: "Setting that allows Longhorn to automatically salvage volumes when all replicas become faulty (for example, when the network connection is interrupted). Longhorn determines which replicas are usable and then uses these replicas for the volume. This setting is enabled by default." + group: "Longhorn Default Settings" + type: boolean + default: "true" + - variable: defaultSettings.autoDeletePodWhenVolumeDetachedUnexpectedly + label: Automatically Delete Workload Pod when The Volume Is Detached Unexpectedly + description: 'Setting that allows Longhorn to automatically delete a workload pod that is managed by a controller (for example, daemonset) whenever a Longhorn volume is detached unexpectedly (for example, during Kubernetes upgrades). After deletion, the controller restarts the pod and then Kubernetes handles volume reattachment and remounting.' + group: "Longhorn Default Settings" + type: boolean + default: "true" + - variable: defaultSettings.disableSchedulingOnCordonedNode + label: Disable Scheduling On Cordoned Node + description: "Setting that prevents Longhorn Manager from scheduling replicas on a cordoned Kubernetes node. This setting is enabled by default." + group: "Longhorn Default Settings" + type: boolean + default: "true" + - variable: defaultSettings.replicaZoneSoftAntiAffinity + label: Replica Zone Level Soft Anti-Affinity + description: "Allow scheduling new Replicas of Volume to the Nodes in the same Zone as existing healthy Replicas. Nodes don't belong to any Zone will be treated as in the same Zone. Notice that Longhorn relies on label `topology.kubernetes.io/zone=` in the Kubernetes node object to identify the zone. By, default true." + group: "Longhorn Default Settings" + type: boolean + default: "true" + - variable: defaultSettings.replicaDiskSoftAntiAffinity + label: Replica Disk Level Soft Anti-Affinity + description: 'Allow scheduling on disks with existing healthy replicas of the same volume. By default, true.' + group: "Longhorn Default Settings" + type: boolean + default: "true" + - variable: defaultSettings.allowEmptyNodeSelectorVolume + label: Allow Empty Node Selector Volume + description: "Setting that allows scheduling of empty node selector volumes to any node." + group: "Longhorn Default Settings" + type: boolean + default: "true" + - variable: defaultSettings.allowEmptyDiskSelectorVolume + label: Allow Empty Disk Selector Volume + description: "Setting that allows scheduling of empty disk selector volumes to any disk." + group: "Longhorn Default Settings" + type: boolean + default: "true" + - variable: defaultSettings.nodeDownPodDeletionPolicy + label: Pod Deletion Policy When Node is Down + description: "Policy that defines the action Longhorn takes when a volume is stuck with a StatefulSet or Deployment pod on a node that failed." + group: "Longhorn Default Settings" + type: enum + options: + - "do-nothing" + - "delete-statefulset-pod" + - "delete-deployment-pod" + - "delete-both-statefulset-and-deployment-pod" + default: "do-nothing" + - variable: defaultSettings.nodeDrainPolicy + label: Node Drain Policy + description: "Policy that defines the action Longhorn takes when a node with the last healthy replica of a volume is drained." + group: "Longhorn Default Settings" + type: enum + options: + - "block-for-eviction" + - "block-for-eviction-if-contains-last-replica" + - "block-if-contains-last-replica" + - "allow-if-replica-is-stopped" + - "always-allow" + default: "block-if-contains-last-replica" + - variable: defaultSettings.detachManuallyAttachedVolumesWhenCordoned + label: Detach Manually Attached Volumes When Cordoned + description: "Setting that allows automatic detaching of manually-attached volumes when a node is cordoned." + group: "Longhorn Default Settings" + type: boolean + default: "false" + - variable: defaultSettings.priorityClass + label: Priority Class + description: "PriorityClass for system-managed Longhorn components. This setting can help prevent Longhorn components from being evicted under Node Pressure. Longhorn system contains user deployed components (E.g, Longhorn manager, Longhorn driver, Longhorn UI) and system managed components (E.g, instance manager, engine image, CSI driver, etc.) Note that this will be applied to Longhorn user-deployed components by default if there are no priority class values set yet, such as `longhornManager.priorityClass`. WARNING: DO NOT CHANGE THIS SETTING WITH ATTACHED VOLUMES." + group: "Longhorn Default Settings" + type: string + default: "longhorn-critical" + - variable: defaultSettings.replicaReplenishmentWaitInterval + label: Replica Replenishment Wait Interval + description: "The interval in seconds determines how long Longhorn will at least wait to reuse the existing data on a failed replica rather than directly creating a new replica for a degraded volume." + group: "Longhorn Default Settings" + type: int + min: 0 + default: 600 + - variable: defaultSettings.concurrentReplicaRebuildPerNodeLimit + label: Concurrent Replica Rebuild Per Node Limit + description: "Maximum number of replicas that can be concurrently rebuilt on each node. + WARNING: + - The old setting \"Disable Replica Rebuild\" is replaced by this setting. + - Different from relying on replica starting delay to limit the concurrent rebuilding, if the rebuilding is disabled, replica object replenishment will be directly skipped. + - When the value is 0, the eviction and data locality feature won't work. But this shouldn't have any impact to any current replica rebuild and backup restore." + group: "Longhorn Default Settings" + type: int + min: 0 + default: 5 + - variable: defaultSettings.concurrentVolumeBackupRestorePerNodeLimit + label: Concurrent Volume Backup Restore Per Node Limit + description: "Maximum number of volumes that can be concurrently restored on each node using a backup. When the value is \"0\", restoration of volumes using a backup is disabled." + group: "Longhorn Default Settings" + type: int + min: 0 + default: 5 + - variable: defaultSettings.disableRevisionCounter + label: Disable Revision Counter + description: "Setting that disables the revision counter and thereby prevents Longhorn from tracking all write operations to a volume. When salvaging a volume, Longhorn uses properties of the \"volume-head-xxx.img\" file (the last file size and the last time the file was modified) to select the replica to be used for volume recovery. This setting applies only to volumes created using the Longhorn UI." + group: "Longhorn Default Settings" + type: boolean + default: "true" + - variable: defaultSettings.systemManagedPodsImagePullPolicy + label: System Managed Pod Image Pull Policy + description: "Image pull policy for system-managed pods, such as Instance Manager, engine images, and CSI Driver. Changes to the image pull policy are applied only after the system-managed pods restart." + group: "Longhorn Default Settings" + type: enum + options: + - "if-not-present" + - "always" + - "never" + default: "if-not-present" + - variable: defaultSettings.allowVolumeCreationWithDegradedAvailability + label: Allow Volume Creation with Degraded Availability + description: "Setting that allows you to create and attach a volume without having all replicas scheduled at the time of creation." + group: "Longhorn Default Settings" + type: boolean + default: "true" + - variable: defaultSettings.autoCleanupSystemGeneratedSnapshot + label: Automatically Cleanup System Generated Snapshot + description: "Setting that allows Longhorn to automatically clean up the system-generated snapshot after replica rebuilding is completed." + group: "Longhorn Default Settings" + type: boolean + default: "true" + - variable: defaultSettings.autoCleanupRecurringJobBackupSnapshot + label: Automatically Cleanup Recurring Job Backup Snapshot + description: "Setting that allows Longhorn to automatically clean up the snapshot generated by a recurring backup job." + group: "Longhorn Default Settings" + type: boolean + default: "true" + - variable: defaultSettings.concurrentAutomaticEngineUpgradePerNodeLimit + label: Concurrent Automatic Engine Upgrade Per Node Limit + description: "Maximum number of engines that are allowed to concurrently upgrade on each node after Longhorn Manager is upgraded. When the value is \"0\", Longhorn does not automatically upgrade volume engines to the new default engine image version." + group: "Longhorn Default Settings" + type: int + min: 0 + default: 0 + - variable: defaultSettings.backingImageCleanupWaitInterval + label: Backing Image Cleanup Wait Interval + description: "Number of minutes that Longhorn waits before cleaning up the backing image file when no replicas in the disk are using it." + group: "Longhorn Default Settings" + type: int + min: 0 + default: 60 + - variable: defaultSettings.backingImageRecoveryWaitInterval + label: Backing Image Recovery Wait Interval + description: "Number of seconds that Longhorn waits before downloading a backing image file again when the status of all image disk files changes to \"failed\" or \"unknown\"." + group: "Longhorn Default Settings" + type: int + min: 0 + default: 300 + - variable: defaultSettings.guaranteedInstanceManagerCPU + label: Guaranteed Instance Manager CPU + description: "Percentage of the total allocatable CPU resources on each node to be reserved for each instance manager pod when the V1 Data Engine is enabled. The default value is \"12\". + WARNING: + - Value 0 means removing the CPU requests from spec of instance manager pods. + - Considering the possible number of new instance manager pods in a further system upgrade, this integer value ranges from 0 to 40. + - One more set of instance manager pods may need to be deployed when the Longhorn system is upgraded. If current available CPUs of the nodes are not enough for the new instance manager pods, you need to detach the volumes using the oldest instance manager pods so that Longhorn can clean up the old pods automatically and release the CPU resources. And the new pods with the latest instance manager image will be launched then. + - This global setting will be ignored for a node if the field \"InstanceManagerCPURequest\" on the node is set. + - After this setting is changed, all instance manager pods using this global setting on all the nodes will be automatically restarted. In other words, DO NOT CHANGE THIS SETTING WITH ATTACHED VOLUMES." + group: "Longhorn Default Settings" + type: int + min: 0 + max: 40 + default: 12 + - variable: defaultSettings.logLevel + label: Log Level + description: 'Log levels that indicate the type and severity of logs in Longhorn Manager. The default value is "Info". (Options: "Panic", "Fatal", "Error", "Warn", "Info", "Debug", "Trace")' + group: "Longhorn Default Settings" + type: string + default: "Info" + - variable: defaultSettings.disableSnapshotPurge + label: Disable Snapshot Purge + description: "Setting that temporarily prevents all attempts to purge volume snapshots." + group: "Longhorn Default Settings" + type: boolean + default: "false" + - variable: defaultSettings.freezeFilesystemForSnapshot + description: "Setting that freezes the filesystem on the root partition before a snapshot is created." + group: "Longhorn Default Settings" + type: boolean + default: "false" +- variable: defaultSettings.kubernetesClusterAutoscalerEnabled + label: Kubernetes Cluster Autoscaler Enabled (Experimental) + description: "Setting that notifies Longhorn that the cluster is using the Kubernetes Cluster Autoscaler. + WARNING: + - Replica rebuilding could be expensive because nodes with reusable replicas could get removed by the Kubernetes Cluster Autoscaler." + group: "Longhorn Default Settings" + type: boolean + default: false +- variable: defaultSettings.orphanAutoDeletion + label: Orphaned Data Cleanup + description: "Setting that allows Longhorn to automatically delete an orphaned resource and the corresponding data (for example, stale replicas). Orphaned resources on failed or unknown nodes are not automatically cleaned up." + group: "Longhorn Default Settings" + type: boolean + default: false +- variable: defaultSettings.storageNetwork + label: Storage Network + description: "Longhorn uses the storage network for in-cluster data traffic. Leave this blank to use the Kubernetes cluster network. + WARNING: + - This setting should change after detaching all Longhorn volumes, as some of the Longhorn system component pods will get recreated to apply the setting. Longhorn will try to block this setting update when there are attached volumes." + group: "Longhorn Default Settings" + type: string + default: +- variable: defaultSettings.deletingConfirmationFlag + label: Deleting Confirmation Flag + description: "Flag that prevents accidental uninstallation of Longhorn." + group: "Longhorn Default Settings" + type: boolean + default: "false" +- variable: defaultSettings.engineReplicaTimeout + label: Timeout between Engine and Replica + description: "Timeout between the Longhorn Engine and replicas. Specify a value between \"8\" and \"30\" seconds. The default value is \"8\"." + group: "Longhorn Default Settings" + type: int + default: "8" +- variable: defaultSettings.snapshotDataIntegrity + label: Snapshot Data Integrity + description: "This setting allows users to enable or disable snapshot hashing and data integrity checking." + group: "Longhorn Default Settings" + type: string + default: "disabled" +- variable: defaultSettings.snapshotDataIntegrityImmediateCheckAfterSnapshotCreation + label: Immediate Snapshot Data Integrity Check After Creating a Snapshot + description: "Hashing snapshot disk files impacts the performance of the system. The immediate snapshot hashing and checking can be disabled to minimize the impact after creating a snapshot." + group: "Longhorn Default Settings" + type: boolean + default: "false" +- variable: defaultSettings.snapshotDataIntegrityCronjob + label: Snapshot Data Integrity Check CronJob + description: "Unix-cron string format. The setting specifies when Longhorn checks the data integrity of snapshot disk files." + group: "Longhorn Default Settings" + type: string + default: "0 0 */7 * *" +- variable: defaultSettings.removeSnapshotsDuringFilesystemTrim + label: Remove Snapshots During Filesystem Trim + description: "This setting allows Longhorn filesystem trim feature to automatically mark the latest snapshot and its ancestors as removed and stops at the snapshot containing multiple children." + group: "Longhorn Default Settings" + type: boolean + default: "false" +- variable: defaultSettings.fastReplicaRebuildEnabled + label: Fast Replica Rebuild Enabled + description: "Setting that allows fast rebuilding of replicas using the checksum of snapshot disk files. Before enabling this setting, you must set the snapshot-data-integrity value to \"enable\" or \"fast-check\"." + group: "Longhorn Default Settings" + type: boolean + default: false +- variable: defaultSettings.replicaFileSyncHttpClientTimeout + label: Timeout of HTTP Client to Replica File Sync Server + description: "In seconds. The setting specifies the HTTP client timeout to the file sync server." + group: "Longhorn Default Settings" + type: int + default: "30" +- variable: defaultSettings.longGRPCTimeOut + label: Long gRPC Timeout + description: "Number of seconds that Longhorn allows for the completion of replica rebuilding and snapshot cloning operations." + group: "Longhorn Default Settings" + type: int + default: "86400" +- variable: defaultSettings.backupCompressionMethod + label: Backup Compression Method + description: "Setting that allows you to specify a backup compression method." + group: "Longhorn Default Settings" + type: string + default: "lz4" +- variable: defaultSettings.backupConcurrentLimit + label: Backup Concurrent Limit Per Backup + description: "Maximum number of worker threads that can concurrently run for each backup." + group: "Longhorn Default Settings" + type: int + min: 1 + default: 2 +- variable: defaultSettings.restoreConcurrentLimit + label: Restore Concurrent Limit Per Backup + description: "This setting controls how many worker threads per restore concurrently." + group: "Longhorn Default Settings" + type: int + min: 1 + default: 2 +- variable: defaultSettings.allowCollectingLonghornUsageMetrics + label: Allow Collecting Longhorn Usage Metrics + description: "Setting that allows Longhorn to periodically collect anonymous usage data for product improvement purposes. Longhorn sends collected data to the [Upgrade Responder](https://github.com/longhorn/upgrade-responder) server, which is the data source of the Longhorn Public Metrics Dashboard (https://metrics.longhorn.io). The Upgrade Responder server does not store data that can be used to identify clients, including IP addresses." + group: "Longhorn Default Settings" + type: boolean + default: true +- variable: defaultSettings.v1DataEngine + label: V1 Data Engine + description: "Setting that allows you to enable the V1 Data Engine." + group: "Longhorn V1 Data Engine Settings" + type: boolean + default: true +- variable: defaultSettings.v2DataEngine + label: V2 Data Engine + description: "Setting that allows you to enable the V2 Data Engine, which is based on the Storage Performance Development Kit (SPDK). The V2 Data Engine is a preview feature and should not be used in production environments. + WARNING: + - DO NOT CHANGE THIS SETTING WITH ATTACHED VOLUMES. Longhorn will block this setting update when there are attached volumes. + - When the V2 Data Engine is enabled, each instance-manager pod utilizes 1 CPU core. This high CPU usage is attributed to the spdk_tgt process running within each instance-manager pod. The spdk_tgt process is responsible for handling input/output (IO) operations and requires intensive polling. As a result, it consumes 100% of a dedicated CPU core to efficiently manage and process the IO requests, ensuring optimal performance and responsiveness for storage operations." + group: "Longhorn V2 Data Engine (Preview Feature) Settings" + type: boolean + default: false +- variable: defaultSettings.v2DataEngineHugepageLimit + label: V2 Data Engine + description: "This allows users to configure maximum huge page size (in MiB) for the V2 Data Engine." + group: "Longhorn V2 Data Engine (Preview Feature) Settings" + type: int + default: "2048" +- variable: defaultSettings.v2DataEngineLogLevel + label: V2 Data Engine + description: "Setting that allows you to configure the log level of the SPDK target daemon (spdk_tgt) of the V2 Data Engine." + group: "Longhorn V2 Data Engine (Preview Feature) Settings" + type: enum + options: + - "Disabled" + - "Error" + - "Warn" + - "Notice" + - "Info" + - "Debug" + default: "Notice" +- variable: defaultSettings.v2DataEngineLogFlags + label: V2 Data Engine + description: "Setting that allows you to configure the log flags of the SPDK target daemon (spdk_tgt) of the V2 Data Engine." + group: "Longhorn V2 Data Engine (Preview Feature) Settings" + type: string + default: +- variable: defaultSettings.autoCleanupSnapshotWhenDeleteBackup + label: Auto Cleanup Snapshot When Delete Backup + description: "Setting that automatically cleans up the snapshot when the backup is deleted." + group: "Longhorn Default Settings" + type: boolean + default: false +- variable: defaultSettings.rwxVolumeFastFailover + label: RWX Volume Fast Failover (Experimental) + description: "Turn on logic to detect and move RWX volumes quickly on node failure." + group: "Longhorn Default Settings" + type: boolean + default: false +- variable: persistence.defaultClass + default: "true" + description: "Setting that allows you to specify the default Longhorn StorageClass." + label: Default Storage Class + group: "Longhorn Storage Class Settings" + required: true + type: boolean +- variable: persistence.reclaimPolicy + label: Storage Class Retain Policy + description: "Reclaim policy that provides instructions for handling of a volume after its claim is released. (Options: \"Retain\", \"Delete\")" + group: "Longhorn Storage Class Settings" + required: true + type: enum + options: + - "Delete" + - "Retain" + default: "Delete" +- variable: persistence.disableRevisionCounter + label: Default Storage Class Disable Revision Counter + description: "Setting that disables the revision counter and thereby prevents Longhorn from tracking all write operations to a volume. When salvaging a volume, Longhorn uses properties of the volume-head-xxx.img file (the last file size and the last time the file was modified) to select the replica to be used for volume recovery. (Options: \"true\", \"false\")" + group: "Longhorn Storage Class Settings" + required: true + type: enum + options: + - "true" + - "false" + default: "true" +- variable: persistence.defaultClassReplicaCount + description: "Replica count of the default Longhorn StorageClass." + label: Default Storage Class Replica Count + group: "Longhorn Storage Class Settings" + type: int + min: 1 + max: 10 + default: 3 +- variable: persistence.defaultDataLocality + description: "Data locality of the default Longhorn StorageClass. (Options: \"disabled\", \"best-effort\")" + label: Default Storage Class Data Locality + group: "Longhorn Storage Class Settings" + type: enum + options: + - "disabled" + - "best-effort" + default: "disabled" +- variable: persistence.recurringJobSelector.enable + description: "Setting that allows you to enable the recurring job selector for a Longhorn StorageClass." + group: "Longhorn Storage Class Settings" + label: Enable Storage Class Recurring Job Selector + type: boolean + default: false + show_subquestion_if: true + subquestions: + - variable: persistence.recurringJobSelector.jobList + description: 'Recurring job selector for a Longhorn StorageClass. Ensure that quotes are used correctly when specifying job parameters. (Example: `[{"name":"backup", "isGroup":true}]`)' + label: Storage Class Recurring Job Selector List + group: "Longhorn Storage Class Settings" + type: string + default: +- variable: persistence.defaultDiskSelector.enable + description: "Setting that allows you to enable the disk selector for the default Longhorn StorageClass." + group: "Longhorn Storage Class Settings" + label: Enable Storage Class Disk Selector + type: boolean + default: false + show_subquestion_if: true + subquestions: + - variable: persistence.defaultDiskSelector.selector + label: Storage Class Disk Selector + description: 'Disk selector for the default Longhorn StorageClass. Longhorn uses only disks with the specified tags for storing volume data. (Examples: "nvme,sata")' + group: "Longhorn Storage Class Settings" + type: string + default: +- variable: persistence.defaultNodeSelector.enable + description: "Setting that allows you to enable the node selector for the default Longhorn StorageClass." + group: "Longhorn Storage Class Settings" + label: Enable Storage Class Node Selector + type: boolean + default: false + show_subquestion_if: true + subquestions: + - variable: persistence.defaultNodeSelector.selector + label: Storage Class Node Selector + description: 'Node selector for the default Longhorn StorageClass. Longhorn uses only nodes with the specified tags for storing volume data. (Examples: "storage,fast")' + group: "Longhorn Storage Class Settings" + type: string + default: +- variable: persistence.backingImage.enable + description: "Setting that allows you to use a backing image in a Longhorn StorageClass." + group: "Longhorn Storage Class Settings" + label: Default Storage Class Backing Image + type: boolean + default: false + show_subquestion_if: true + subquestions: + - variable: persistence.backingImage.name + description: 'Backing image to be used for creating and restoring volumes in a Longhorn StorageClass. When no backing images are available, specify the data source type and parameters that Longhorn can use to create a backing image.' + label: Storage Class Backing Image Name + group: "Longhorn Storage Class Settings" + type: string + default: + - variable: persistence.backingImage.expectedChecksum + description: 'Expected SHA-512 checksum of a backing image used in a Longhorn StorageClass. + WARNING: + - If the backing image name is not specified, setting this field is meaningless. + - It is not recommended to set this field if the data source type is \"export-from-volume\".' + label: Storage Class Backing Image Expected SHA512 Checksum + group: "Longhorn Storage Class Settings" + type: string + default: + - variable: persistence.backingImage.dataSourceType + description: 'Data source type of a backing image used in a Longhorn StorageClass. If the backing image exists in the cluster, Longhorn uses this setting to verify the image. If the backing image does not exist, Longhorn creates one using the specified data source type. + WARNING: + - If the backing image name is not specified, setting this field is meaningless. + - As for backing image creation with data source type \"upload\", it is recommended to do it via UI rather than StorageClass here. Uploading requires file data sending to the Longhorn backend after the object creation, which is complicated if you want to handle it manually.' + label: Storage Class Backing Image Data Source Type + group: "Longhorn Storage Class Settings" + type: enum + options: + - "" + - "download" + - "upload" + - "export-from-volume" + default: "" + - variable: persistence.backingImage.dataSourceParameters + description: "Data source parameters of a backing image used in a Longhorn StorageClass. You can specify a JSON string of a map. (Example: `'{\"url\":\"https://backing-image-example.s3-region.amazonaws.com/test-backing-image\"}'`) + WARNING: + - If the backing image name is not specified, setting this field is meaningless. + - Be careful of the quotes here." + label: Storage Class Backing Image Data Source Parameters + group: "Longhorn Storage Class Settings" + type: string + default: +- variable: persistence.removeSnapshotsDuringFilesystemTrim + description: "Setting that allows you to enable automatic snapshot removal during filesystem trim for a Longhorn StorageClass. (Options: \"ignored\", \"enabled\", \"disabled\")" + label: Default Storage Class Remove Snapshots During Filesystem Trim + group: "Longhorn Storage Class Settings" + type: enum + options: + - "ignored" + - "enabled" + - "disabled" + default: "ignored" +- variable: ingress.enabled + default: "false" + description: "Expose app using Layer 7 Load Balancer - ingress" + type: boolean + group: "Services and Load Balancing" + label: Expose app using Layer 7 Load Balancer + show_subquestion_if: true + subquestions: + - variable: ingress.host + default: "xip.io" + description: "Hostname of the Layer 7 load balancer." + type: hostname + required: true + label: Layer 7 Load Balancer Hostname + - variable: ingress.path + default: "/" + description: "Default ingress path. You can access the Longhorn UI by following the full ingress path {{host}}+{{path}}." + type: string + required: true + label: Ingress Path + - variable: ingress.pathType + default: "ImplementationSpecific" + description: "Path type for the ingress. (Options: \"ImplementationSpecific\", \"Exact\", \"Prefix\")" + type: enum + options: + - "ImplementationSpecific" + - "Exact" + - "Prefix" + required: true + label: Ingress Path Type +- variable: service.ui.type + default: "Rancher-Proxy" + description: "Service type for Longhorn UI. (Options: \"ClusterIP\", \"NodePort\", \"LoadBalancer\", \"Rancher-Proxy\")" + type: enum + options: + - "ClusterIP" + - "NodePort" + - "LoadBalancer" + - "Rancher-Proxy" + label: Longhorn UI Service + show_if: "ingress.enabled=false" + group: "Services and Load Balancing" + show_subquestion_if: "NodePort" + subquestions: + - variable: service.ui.nodePort + default: "" + description: "NodePort port number for Longhorn UI. When unspecified, Longhorn selects a free port between 30000 and 32767." + type: int + min: 30000 + max: 32767 + show_if: "service.ui.type=NodePort||service.ui.type=LoadBalancer" + label: UI Service NodePort number +- variable: enablePSP + default: "false" + description: "Setting that allows you to enable pod security policies (PSPs) that allow privileged Longhorn pods to start. This setting applies only to clusters running Kubernetes 1.25 and earlier, and with the built-in Pod Security admission controller enabled." + label: Pod Security Policy + type: boolean + group: "Other Settings" +- variable: global.cattle.windowsCluster.enabled + default: "false" + description: "Setting that allows Longhorn to run on a Rancher Windows cluster." + label: Rancher Windows Cluster + type: boolean + group: "Other Settings" +- variable: networkPolicies.enabled + description: "Setting that allows you to enable network policies that control access to Longhorn pods. + Warning: The Rancher Proxy will not work if this feature is enabled and a custom NetworkPolicy must be added." + group: "Other Settings" + label: Network Policies + default: "false" + type: boolean + subquestions: + - variable: networkPolicies.type + label: Network Policies for Ingress + description: "Distribution that determines the policy for allowing access for an ingress. (Options: \"k3s\", \"rke2\", \"rke1\")" + show_if: "networkPolicies.enabled=true&&ingress.enabled=true" + type: enum + default: "rke2" + options: + - "rke1" + - "rke2" + - "k3s" + - variable: defaultSettings.v2DataEngineGuaranteedInstanceManagerCPU + label: Guaranteed Instance Manager CPU for V2 Data Engine + description: 'Number of millicpus on each node to be reserved for each Instance Manager pod when the V2 Data Engine is enabled. The default value is "1250". + WARNING: + - Specifying a value of 0 disables CPU requests for instance manager pods. You must specify an integer between 1000 and 8000. + - This is a global setting. Modifying the value triggers an automatic restart of the instance manager pods. Do not modify the value while volumes are still attached." + group: "Longhorn Default Settings' + type: int + min: 1000 + max: 8000 + default: 1250 diff --git a/charts/longhorn/103.4.1+up1.7.2/templates/NOTES.txt b/charts/longhorn/103.4.1+up1.7.2/templates/NOTES.txt new file mode 100644 index 0000000000..cca7cd77b9 --- /dev/null +++ b/charts/longhorn/103.4.1+up1.7.2/templates/NOTES.txt @@ -0,0 +1,5 @@ +Longhorn is now installed on the cluster! + +Please wait a few minutes for other Longhorn components such as CSI deployments, Engine Images, and Instance Managers to be initialized. + +Visit our documentation at https://longhorn.io/docs/ diff --git a/charts/longhorn/103.4.1+up1.7.2/templates/_helpers.tpl b/charts/longhorn/103.4.1+up1.7.2/templates/_helpers.tpl new file mode 100644 index 0000000000..3fbc2ac02f --- /dev/null +++ b/charts/longhorn/103.4.1+up1.7.2/templates/_helpers.tpl @@ -0,0 +1,66 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "longhorn.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +*/}} +{{- define "longhorn.fullname" -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} + + +{{- define "longhorn.managerIP" -}} +{{- $fullname := (include "longhorn.fullname" .) -}} +{{- printf "http://%s-backend:9500" $fullname | trunc 63 | trimSuffix "-" -}} +{{- end -}} + + +{{- define "secret" }} +{{- printf "{\"auths\": {\"%s\": {\"auth\": \"%s\"}}}" .Values.privateRegistry.registryUrl (printf "%s:%s" .Values.privateRegistry.registryUser .Values.privateRegistry.registryPasswd | b64enc) | b64enc }} +{{- end }} + +{{- /* +longhorn.labels generates the standard Helm labels. +*/ -}} +{{- define "longhorn.labels" -}} +app.kubernetes.io/name: {{ template "longhorn.name" . }} +helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +app.kubernetes.io/instance: {{ .Release.Name }} +app.kubernetes.io/version: {{ .Chart.AppVersion }} +{{- end -}} + + +{{- define "system_default_registry" -}} +{{- if .Values.global.cattle.systemDefaultRegistry -}} +{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} +{{- else -}} +{{- "" -}} +{{- end -}} +{{- end -}} + +{{- define "registry_url" -}} +{{- if .Values.privateRegistry.registryUrl -}} +{{- printf "%s/" .Values.privateRegistry.registryUrl -}} +{{- else -}} +{{ include "system_default_registry" . }} +{{- end -}} +{{- end -}} + +{{- /* + define the longhorn release namespace +*/ -}} +{{- define "release_namespace" -}} +{{- if .Values.namespaceOverride -}} +{{- .Values.namespaceOverride -}} +{{- else -}} +{{- .Release.Namespace -}} +{{- end -}} +{{- end -}} diff --git a/charts/longhorn/103.4.1+up1.7.2/templates/clusterrole.yaml b/charts/longhorn/103.4.1+up1.7.2/templates/clusterrole.yaml new file mode 100644 index 0000000000..c065f1726c --- /dev/null +++ b/charts/longhorn/103.4.1+up1.7.2/templates/clusterrole.yaml @@ -0,0 +1,77 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: longhorn-role + labels: {{- include "longhorn.labels" . | nindent 4 }} +rules: +- apiGroups: + - apiextensions.k8s.io + resources: + - customresourcedefinitions + verbs: + - "*" +- apiGroups: [""] + resources: ["pods", "events", "persistentvolumes", "persistentvolumeclaims","persistentvolumeclaims/status", "nodes", "proxy/nodes", "pods/log", "secrets", "services", "endpoints", "configmaps", "serviceaccounts"] + verbs: ["*"] +- apiGroups: [""] + resources: ["namespaces"] + verbs: ["get", "list"] +- apiGroups: ["apps"] + resources: ["daemonsets", "statefulsets", "deployments"] + verbs: ["*"] +- apiGroups: ["batch"] + resources: ["jobs", "cronjobs"] + verbs: ["*"] +- apiGroups: ["policy"] + resources: ["poddisruptionbudgets", "podsecuritypolicies"] + verbs: ["*"] +- apiGroups: ["scheduling.k8s.io"] + resources: ["priorityclasses"] + verbs: ["watch", "list"] +- apiGroups: ["storage.k8s.io"] + resources: ["storageclasses", "volumeattachments", "volumeattachments/status", "csinodes", "csidrivers"] + verbs: ["*"] +- apiGroups: ["snapshot.storage.k8s.io"] + resources: ["volumesnapshotclasses", "volumesnapshots", "volumesnapshotcontents", "volumesnapshotcontents/status"] + verbs: ["*"] +- apiGroups: ["longhorn.io"] + resources: ["volumes", "volumes/status", "engines", "engines/status", "replicas", "replicas/status", "settings", "settings/status", + "engineimages", "engineimages/status", "nodes", "nodes/status", "instancemanagers", "instancemanagers/status", + {{- if .Values.openshift.enabled }} + "engineimages/finalizers", "nodes/finalizers", "instancemanagers/finalizers", + {{- end }} + "sharemanagers", "sharemanagers/status", "backingimages", "backingimages/status", + "backingimagemanagers", "backingimagemanagers/status", "backingimagedatasources", "backingimagedatasources/status", + "backuptargets", "backuptargets/status", "backupvolumes", "backupvolumes/status", "backups", "backups/status", + "recurringjobs", "recurringjobs/status", "orphans", "orphans/status", "snapshots", "snapshots/status", + "supportbundles", "supportbundles/status", "systembackups", "systembackups/status", "systemrestores", "systemrestores/status", + "volumeattachments", "volumeattachments/status", "backupbackingimages", "backupbackingimages/status"] + verbs: ["*"] +- apiGroups: ["coordination.k8s.io"] + resources: ["leases"] + verbs: ["*"] +- apiGroups: ["metrics.k8s.io"] + resources: ["pods", "nodes"] + verbs: ["get", "list"] +- apiGroups: ["apiregistration.k8s.io"] + resources: ["apiservices"] + verbs: ["list", "watch"] +- apiGroups: ["admissionregistration.k8s.io"] + resources: ["mutatingwebhookconfigurations", "validatingwebhookconfigurations"] + verbs: ["get", "list", "create", "patch", "delete"] +- apiGroups: ["rbac.authorization.k8s.io"] + resources: ["roles", "rolebindings", "clusterrolebindings", "clusterroles"] + verbs: ["*"] +{{- if .Values.openshift.enabled }} +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: longhorn-ocp-privileged-role + labels: {{- include "longhorn.labels" . | nindent 4 }} +rules: +- apiGroups: ["security.openshift.io"] + resources: ["securitycontextconstraints"] + resourceNames: ["anyuid", "privileged"] + verbs: ["use"] +{{- end }} diff --git a/charts/longhorn/103.4.1+up1.7.2/templates/clusterrolebinding.yaml b/charts/longhorn/103.4.1+up1.7.2/templates/clusterrolebinding.yaml new file mode 100644 index 0000000000..2e34f014ce --- /dev/null +++ b/charts/longhorn/103.4.1+up1.7.2/templates/clusterrolebinding.yaml @@ -0,0 +1,49 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: longhorn-bind + labels: {{- include "longhorn.labels" . | nindent 4 }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: longhorn-role +subjects: +- kind: ServiceAccount + name: longhorn-service-account + namespace: {{ include "release_namespace" . }} +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: longhorn-support-bundle + labels: {{- include "longhorn.labels" . | nindent 4 }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: cluster-admin +subjects: +- kind: ServiceAccount + name: longhorn-support-bundle + namespace: {{ include "release_namespace" . }} +{{- if .Values.openshift.enabled }} +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: longhorn-ocp-privileged-bind + labels: {{- include "longhorn.labels" . | nindent 4 }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: longhorn-ocp-privileged-role +subjects: +- kind: ServiceAccount + name: longhorn-service-account + namespace: {{ include "release_namespace" . }} +- kind: ServiceAccount + name: longhorn-ui-service-account + namespace: {{ include "release_namespace" . }} +- kind: ServiceAccount + name: default # supportbundle-agent-support-bundle uses default sa + namespace: {{ include "release_namespace" . }} +{{- end }} diff --git a/charts/longhorn/103.4.1+up1.7.2/templates/daemonset-sa.yaml b/charts/longhorn/103.4.1+up1.7.2/templates/daemonset-sa.yaml new file mode 100644 index 0000000000..af7c09a409 --- /dev/null +++ b/charts/longhorn/103.4.1+up1.7.2/templates/daemonset-sa.yaml @@ -0,0 +1,180 @@ +apiVersion: apps/v1 +kind: DaemonSet +metadata: + labels: {{- include "longhorn.labels" . | nindent 4 }} + app: longhorn-manager + name: longhorn-manager + namespace: {{ include "release_namespace" . }} +spec: + selector: + matchLabels: + app: longhorn-manager + template: + metadata: + labels: {{- include "longhorn.labels" . | nindent 8 }} + app: longhorn-manager + {{- with .Values.annotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + spec: + containers: + - name: longhorn-manager + image: {{ template "registry_url" . }}{{ .Values.image.longhorn.manager.repository }}:{{ .Values.image.longhorn.manager.tag }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + securityContext: + privileged: true + command: + - longhorn-manager + - -d + {{- if eq .Values.longhornManager.log.format "json" }} + - -j + {{- end }} + - daemon + - --engine-image + - "{{ template "registry_url" . }}{{ .Values.image.longhorn.engine.repository }}:{{ .Values.image.longhorn.engine.tag }}" + - --instance-manager-image + - "{{ template "registry_url" . }}{{ .Values.image.longhorn.instanceManager.repository }}:{{ .Values.image.longhorn.instanceManager.tag }}" + - --share-manager-image + - "{{ template "registry_url" . }}{{ .Values.image.longhorn.shareManager.repository }}:{{ .Values.image.longhorn.shareManager.tag }}" + - --backing-image-manager-image + - "{{ template "registry_url" . }}{{ .Values.image.longhorn.backingImageManager.repository }}:{{ .Values.image.longhorn.backingImageManager.tag }}" + - --support-bundle-manager-image + - "{{ template "registry_url" . }}{{ .Values.image.longhorn.supportBundleKit.repository }}:{{ .Values.image.longhorn.supportBundleKit.tag }}" + - --manager-image + - "{{ template "registry_url" . }}{{ .Values.image.longhorn.manager.repository }}:{{ .Values.image.longhorn.manager.tag }}" + - --service-account + - longhorn-service-account + {{- if .Values.preUpgradeChecker.upgradeVersionCheck}} + - --upgrade-version-check + {{- end }} + ports: + - containerPort: 9500 + name: manager + - containerPort: 9501 + name: conversion-wh + - containerPort: 9502 + name: admission-wh + - containerPort: 9503 + name: recov-backend + readinessProbe: + httpGet: + path: /v1/healthz + port: 9501 + scheme: HTTPS + volumeMounts: + - name: boot + mountPath: /host/boot/ + - name: dev + mountPath: /host/dev/ + - name: proc + mountPath: /host/proc/ + - name: longhorn + mountPath: /var/lib/longhorn/ + mountPropagation: Bidirectional + - name: longhorn-grpc-tls + mountPath: /tls-files/ + {{- if .Values.enableGoCoverDir }} + - name: go-cover-dir + mountPath: /go-cover-dir/ + {{- end }} + env: + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + {{- if .Values.enableGoCoverDir }} + - name: GOCOVERDIR + value: /go-cover-dir/ + {{- end }} + - name: pre-pull-share-manager-image + imagePullPolicy: {{ .Values.image.pullPolicy }} + image: {{ template "registry_url" . }}{{ .Values.image.longhorn.shareManager.repository }}:{{ .Values.image.longhorn.shareManager.tag }} + command: ["sh", "-c", "echo share-manager image pulled && sleep infinity"] + volumes: + - name: boot + hostPath: + path: /boot/ + - name: dev + hostPath: + path: /dev/ + - name: proc + hostPath: + path: /proc/ + - name: longhorn + hostPath: + path: /var/lib/longhorn/ + {{- if .Values.enableGoCoverDir }} + - name: go-cover-dir + hostPath: + path: /go-cover-dir/ + type: DirectoryOrCreate + {{- end }} + - name: longhorn-grpc-tls + secret: + secretName: longhorn-grpc-tls + optional: true + {{- if .Values.privateRegistry.registrySecret }} + imagePullSecrets: + - name: {{ .Values.privateRegistry.registrySecret }} + {{- end }} + {{- if .Values.longhornManager.priorityClass }} + priorityClassName: {{ .Values.longhornManager.priorityClass | quote }} + {{- end }} + {{- if or .Values.global.tolerations .Values.longhornManager.tolerations .Values.global.cattle.windowsCluster.enabled }} + tolerations: + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.tolerations }} +{{ toYaml .Values.global.cattle.windowsCluster.tolerations | indent 6 }} + {{- end }} + {{- if or .Values.global.tolerations .Values.longhornManager.tolerations }} +{{ default .Values.global.tolerations .Values.longhornManager.tolerations | toYaml | indent 6 }} + {{- end }} + {{- end }} + {{- if or .Values.global.nodeSelector .Values.longhornManager.nodeSelector .Values.global.cattle.windowsCluster.enabled }} + nodeSelector: + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.nodeSelector }} +{{ toYaml .Values.global.cattle.windowsCluster.nodeSelector | indent 8 }} + {{- end }} + {{- if or .Values.global.nodeSelector .Values.longhornManager.nodeSelector }} +{{ default .Values.global.nodeSelector .Values.longhornManager.nodeSelector | toYaml | indent 8 }} + {{- end }} + {{- end }} + serviceAccountName: longhorn-service-account + updateStrategy: + rollingUpdate: + maxUnavailable: "100%" +--- +apiVersion: v1 +kind: Service +metadata: + labels: {{- include "longhorn.labels" . | nindent 4 }} + app: longhorn-manager + name: longhorn-backend + namespace: {{ include "release_namespace" . }} + {{- if .Values.longhornManager.serviceAnnotations }} + annotations: +{{ toYaml .Values.longhornManager.serviceAnnotations | indent 4 }} + {{- end }} +spec: + type: {{ .Values.service.manager.type }} + selector: + app: longhorn-manager + ports: + - name: manager + port: 9500 + targetPort: manager + {{- if .Values.service.manager.nodePort }} + nodePort: {{ .Values.service.manager.nodePort }} + {{- end }} diff --git a/charts/longhorn/103.4.1+up1.7.2/templates/default-setting.yaml b/charts/longhorn/103.4.1+up1.7.2/templates/default-setting.yaml new file mode 100644 index 0000000000..315cdc6ec9 --- /dev/null +++ b/charts/longhorn/103.4.1+up1.7.2/templates/default-setting.yaml @@ -0,0 +1,244 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: longhorn-default-setting + namespace: {{ include "release_namespace" . }} + labels: {{- include "longhorn.labels" . | nindent 4 }} +data: + default-setting.yaml: |- + {{- if not (kindIs "invalid" .Values.defaultSettings.backupTarget) }} + backup-target: {{ .Values.defaultSettings.backupTarget }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.backupTargetCredentialSecret) }} + backup-target-credential-secret: {{ .Values.defaultSettings.backupTargetCredentialSecret }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.allowRecurringJobWhileVolumeDetached) }} + allow-recurring-job-while-volume-detached: {{ .Values.defaultSettings.allowRecurringJobWhileVolumeDetached }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.createDefaultDiskLabeledNodes) }} + create-default-disk-labeled-nodes: {{ .Values.defaultSettings.createDefaultDiskLabeledNodes }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.defaultDataPath) }} + default-data-path: {{ .Values.defaultSettings.defaultDataPath }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.replicaSoftAntiAffinity) }} + replica-soft-anti-affinity: {{ .Values.defaultSettings.replicaSoftAntiAffinity }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.replicaAutoBalance) }} + replica-auto-balance: {{ .Values.defaultSettings.replicaAutoBalance }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.storageOverProvisioningPercentage) }} + storage-over-provisioning-percentage: {{ .Values.defaultSettings.storageOverProvisioningPercentage }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.storageMinimalAvailablePercentage) }} + storage-minimal-available-percentage: {{ .Values.defaultSettings.storageMinimalAvailablePercentage }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.storageReservedPercentageForDefaultDisk) }} + storage-reserved-percentage-for-default-disk: {{ .Values.defaultSettings.storageReservedPercentageForDefaultDisk }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.upgradeChecker) }} + upgrade-checker: {{ .Values.defaultSettings.upgradeChecker }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.defaultReplicaCount) }} + default-replica-count: {{ .Values.defaultSettings.defaultReplicaCount }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.defaultDataLocality) }} + default-data-locality: {{ .Values.defaultSettings.defaultDataLocality }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.defaultLonghornStaticStorageClass) }} + default-longhorn-static-storage-class: {{ .Values.defaultSettings.defaultLonghornStaticStorageClass }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.backupstorePollInterval) }} + backupstore-poll-interval: {{ .Values.defaultSettings.backupstorePollInterval }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.failedBackupTTL) }} + failed-backup-ttl: {{ .Values.defaultSettings.failedBackupTTL }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.restoreVolumeRecurringJobs) }} + restore-volume-recurring-jobs: {{ .Values.defaultSettings.restoreVolumeRecurringJobs }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.recurringSuccessfulJobsHistoryLimit) }} + recurring-successful-jobs-history-limit: {{ .Values.defaultSettings.recurringSuccessfulJobsHistoryLimit }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.recurringJobMaxRetention) }} + recurring-job-max-retention: {{ .Values.defaultSettings.recurringJobMaxRetention }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.recurringFailedJobsHistoryLimit) }} + recurring-failed-jobs-history-limit: {{ .Values.defaultSettings.recurringFailedJobsHistoryLimit }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.supportBundleFailedHistoryLimit) }} + support-bundle-failed-history-limit: {{ .Values.defaultSettings.supportBundleFailedHistoryLimit }} + {{- end }} + {{- if or (not (kindIs "invalid" .Values.defaultSettings.taintToleration)) (.Values.global.cattle.windowsCluster.enabled) }} + taint-toleration: {{ $windowsDefaultSettingTaintToleration := list }}{{ $defaultSettingTaintToleration := list -}} + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.defaultSetting.taintToleration -}} + {{- $windowsDefaultSettingTaintToleration = .Values.global.cattle.windowsCluster.defaultSetting.taintToleration -}} + {{- end -}} + {{- if not (kindIs "invalid" .Values.defaultSettings.taintToleration) -}} + {{- $defaultSettingTaintToleration = .Values.defaultSettings.taintToleration -}} + {{- end -}} + {{- $taintToleration := list $windowsDefaultSettingTaintToleration $defaultSettingTaintToleration }}{{ join ";" (compact $taintToleration) -}} + {{- end }} + {{- if or (not (kindIs "invalid" .Values.defaultSettings.systemManagedComponentsNodeSelector)) (.Values.global.cattle.windowsCluster.enabled) }} + system-managed-components-node-selector: {{ $windowsDefaultSettingNodeSelector := list }}{{ $defaultSettingNodeSelector := list -}} + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.defaultSetting.systemManagedComponentsNodeSelector -}} + {{ $windowsDefaultSettingNodeSelector = .Values.global.cattle.windowsCluster.defaultSetting.systemManagedComponentsNodeSelector -}} + {{- end -}} + {{- if not (kindIs "invalid" .Values.defaultSettings.systemManagedComponentsNodeSelector) -}} + {{- $defaultSettingNodeSelector = .Values.defaultSettings.systemManagedComponentsNodeSelector -}} + {{- end -}} + {{- $nodeSelector := list $windowsDefaultSettingNodeSelector $defaultSettingNodeSelector }}{{ join ";" (compact $nodeSelector) -}} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.priorityClass) }} + priority-class: {{ .Values.defaultSettings.priorityClass }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.autoSalvage) }} + auto-salvage: {{ .Values.defaultSettings.autoSalvage }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.autoDeletePodWhenVolumeDetachedUnexpectedly) }} + auto-delete-pod-when-volume-detached-unexpectedly: {{ .Values.defaultSettings.autoDeletePodWhenVolumeDetachedUnexpectedly }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.disableSchedulingOnCordonedNode) }} + disable-scheduling-on-cordoned-node: {{ .Values.defaultSettings.disableSchedulingOnCordonedNode }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.replicaZoneSoftAntiAffinity) }} + replica-zone-soft-anti-affinity: {{ .Values.defaultSettings.replicaZoneSoftAntiAffinity }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.replicaDiskSoftAntiAffinity) }} + replica-disk-soft-anti-affinity: {{ .Values.defaultSettings.replicaDiskSoftAntiAffinity }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.nodeDownPodDeletionPolicy) }} + node-down-pod-deletion-policy: {{ .Values.defaultSettings.nodeDownPodDeletionPolicy }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.nodeDrainPolicy) }} + node-drain-policy: {{ .Values.defaultSettings.nodeDrainPolicy }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.detachManuallyAttachedVolumesWhenCordoned) }} + detach-manually-attached-volumes-when-cordoned: {{ .Values.defaultSettings.detachManuallyAttachedVolumesWhenCordoned }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.replicaReplenishmentWaitInterval) }} + replica-replenishment-wait-interval: {{ .Values.defaultSettings.replicaReplenishmentWaitInterval }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.concurrentReplicaRebuildPerNodeLimit) }} + concurrent-replica-rebuild-per-node-limit: {{ .Values.defaultSettings.concurrentReplicaRebuildPerNodeLimit }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.concurrentVolumeBackupRestorePerNodeLimit) }} + concurrent-volume-backup-restore-per-node-limit: {{ .Values.defaultSettings.concurrentVolumeBackupRestorePerNodeLimit }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.disableRevisionCounter) }} + disable-revision-counter: {{ .Values.defaultSettings.disableRevisionCounter }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.systemManagedPodsImagePullPolicy) }} + system-managed-pods-image-pull-policy: {{ .Values.defaultSettings.systemManagedPodsImagePullPolicy }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.allowVolumeCreationWithDegradedAvailability) }} + allow-volume-creation-with-degraded-availability: {{ .Values.defaultSettings.allowVolumeCreationWithDegradedAvailability }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.autoCleanupSystemGeneratedSnapshot) }} + auto-cleanup-system-generated-snapshot: {{ .Values.defaultSettings.autoCleanupSystemGeneratedSnapshot }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.autoCleanupRecurringJobBackupSnapshot) }} + auto-cleanup-recurring-job-backup-snapshot: {{ .Values.defaultSettings.autoCleanupRecurringJobBackupSnapshot }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.concurrentAutomaticEngineUpgradePerNodeLimit) }} + concurrent-automatic-engine-upgrade-per-node-limit: {{ .Values.defaultSettings.concurrentAutomaticEngineUpgradePerNodeLimit }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.backingImageCleanupWaitInterval) }} + backing-image-cleanup-wait-interval: {{ .Values.defaultSettings.backingImageCleanupWaitInterval }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.backingImageRecoveryWaitInterval) }} + backing-image-recovery-wait-interval: {{ .Values.defaultSettings.backingImageRecoveryWaitInterval }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.guaranteedInstanceManagerCPU) }} + guaranteed-instance-manager-cpu: {{ .Values.defaultSettings.guaranteedInstanceManagerCPU }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.kubernetesClusterAutoscalerEnabled) }} + kubernetes-cluster-autoscaler-enabled: {{ .Values.defaultSettings.kubernetesClusterAutoscalerEnabled }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.orphanAutoDeletion) }} + orphan-auto-deletion: {{ .Values.defaultSettings.orphanAutoDeletion }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.storageNetwork) }} + storage-network: {{ .Values.defaultSettings.storageNetwork }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.deletingConfirmationFlag) }} + deleting-confirmation-flag: {{ .Values.defaultSettings.deletingConfirmationFlag }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.engineReplicaTimeout) }} + engine-replica-timeout: {{ .Values.defaultSettings.engineReplicaTimeout }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.snapshotDataIntegrity) }} + snapshot-data-integrity: {{ .Values.defaultSettings.snapshotDataIntegrity }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.snapshotDataIntegrityImmediateCheckAfterSnapshotCreation) }} + snapshot-data-integrity-immediate-check-after-snapshot-creation: {{ .Values.defaultSettings.snapshotDataIntegrityImmediateCheckAfterSnapshotCreation }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.snapshotDataIntegrityCronjob) }} + snapshot-data-integrity-cronjob: {{ .Values.defaultSettings.snapshotDataIntegrityCronjob }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.removeSnapshotsDuringFilesystemTrim) }} + remove-snapshots-during-filesystem-trim: {{ .Values.defaultSettings.removeSnapshotsDuringFilesystemTrim }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.fastReplicaRebuildEnabled) }} + fast-replica-rebuild-enabled: {{ .Values.defaultSettings.fastReplicaRebuildEnabled }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.replicaFileSyncHttpClientTimeout) }} + replica-file-sync-http-client-timeout: {{ .Values.defaultSettings.replicaFileSyncHttpClientTimeout }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.longGRPCTimeOut) }} + long-grpc-timeout: {{ .Values.defaultSettings.longGRPCTimeOut }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.logLevel) }} + log-level: {{ .Values.defaultSettings.logLevel }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.backupCompressionMethod) }} + backup-compression-method: {{ .Values.defaultSettings.backupCompressionMethod }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.backupConcurrentLimit) }} + backup-concurrent-limit: {{ .Values.defaultSettings.backupConcurrentLimit }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.restoreConcurrentLimit) }} + restore-concurrent-limit: {{ .Values.defaultSettings.restoreConcurrentLimit }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.v1DataEngine) }} + v1-data-engine: {{ .Values.defaultSettings.v1DataEngine }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.v2DataEngine) }} + v2-data-engine: {{ .Values.defaultSettings.v2DataEngine }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.v2DataEngineHugepageLimit) }} + v2-data-engine-hugepage-limit: {{ .Values.defaultSettings.v2DataEngineHugepageLimit }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.allowEmptyNodeSelectorVolume) }} + allow-empty-node-selector-volume: {{ .Values.defaultSettings.allowEmptyNodeSelectorVolume }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.allowEmptyDiskSelectorVolume) }} + allow-empty-disk-selector-volume: {{ .Values.defaultSettings.allowEmptyDiskSelectorVolume }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.allowCollectingLonghornUsageMetrics) }} + allow-collecting-longhorn-usage-metrics: {{ .Values.defaultSettings.allowCollectingLonghornUsageMetrics }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.disableSnapshotPurge) }} + disable-snapshot-purge: {{ .Values.defaultSettings.disableSnapshotPurge }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.v2DataEngineGuaranteedInstanceManagerCPU) }} + v2-data-engine-guaranteed-instance-manager-cpu: {{ .Values.defaultSettings.v2DataEngineGuaranteedInstanceManagerCPU }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.snapshotMaxCount) }} + snapshot-max-count: {{ .Values.defaultSettings.snapshotMaxCount }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.v2DataEngineLogLevel) }} + v2-data-engine-log-level: {{ .Values.defaultSettings.v2DataEngineLogLevel }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.v2DataEngineLogFlags) }} + v2-data-engine-log-flags: {{ .Values.defaultSettings.v2DataEngineLogFlags }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.freezeFilesystemForSnapshot) }} + freeze-filesystem-for-snapshot: {{ .Values.defaultSettings.freezeFilesystemForSnapshot }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.autoCleanupSnapshotWhenDeleteBackup) }} + auto-cleanup-when-delete-backup: {{ .Values.defaultSettings.autoCleanupSnapshotWhenDeleteBackup }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.rwxVolumeFastFailover) }} + rwx-volume-fast-failover: {{ .Values.defaultSettings.rwxVolumeFastFailover}} + {{- end }} diff --git a/charts/longhorn/103.4.1+up1.7.2/templates/deployment-driver.yaml b/charts/longhorn/103.4.1+up1.7.2/templates/deployment-driver.yaml new file mode 100644 index 0000000000..3ac582dcbc --- /dev/null +++ b/charts/longhorn/103.4.1+up1.7.2/templates/deployment-driver.yaml @@ -0,0 +1,132 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: longhorn-driver-deployer + namespace: {{ include "release_namespace" . }} + labels: {{- include "longhorn.labels" . | nindent 4 }} +spec: + replicas: 1 + selector: + matchLabels: + app: longhorn-driver-deployer + template: + metadata: + labels: {{- include "longhorn.labels" . | nindent 8 }} + app: longhorn-driver-deployer + spec: + initContainers: + - name: wait-longhorn-manager + image: {{ template "registry_url" . }}{{ .Values.image.longhorn.manager.repository }}:{{ .Values.image.longhorn.manager.tag }} + command: ['sh', '-c', 'while [ $(curl -m 1 -s -o /dev/null -w "%{http_code}" http://longhorn-backend:9500/v1) != "200" ]; do echo waiting; sleep 2; done'] + containers: + - name: longhorn-driver-deployer + image: {{ template "registry_url" . }}{{ .Values.image.longhorn.manager.repository }}:{{ .Values.image.longhorn.manager.tag }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + command: + - longhorn-manager + - -d + - deploy-driver + - --manager-image + - "{{ template "registry_url" . }}{{ .Values.image.longhorn.manager.repository }}:{{ .Values.image.longhorn.manager.tag }}" + - --manager-url + - http://longhorn-backend:9500/v1 + env: + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + - name: SERVICE_ACCOUNT + valueFrom: + fieldRef: + fieldPath: spec.serviceAccountName + {{- if .Values.csi.kubeletRootDir }} + - name: KUBELET_ROOT_DIR + value: {{ .Values.csi.kubeletRootDir }} + {{- end }} + {{- if and .Values.image.csi.attacher.repository .Values.image.csi.attacher.tag }} + - name: CSI_ATTACHER_IMAGE + value: "{{ template "registry_url" . }}{{ .Values.image.csi.attacher.repository }}:{{ .Values.image.csi.attacher.tag }}" + {{- end }} + {{- if and .Values.image.csi.provisioner.repository .Values.image.csi.provisioner.tag }} + - name: CSI_PROVISIONER_IMAGE + value: "{{ template "registry_url" . }}{{ .Values.image.csi.provisioner.repository }}:{{ .Values.image.csi.provisioner.tag }}" + {{- end }} + {{- if and .Values.image.csi.nodeDriverRegistrar.repository .Values.image.csi.nodeDriverRegistrar.tag }} + - name: CSI_NODE_DRIVER_REGISTRAR_IMAGE + value: "{{ template "registry_url" . }}{{ .Values.image.csi.nodeDriverRegistrar.repository }}:{{ .Values.image.csi.nodeDriverRegistrar.tag }}" + {{- end }} + {{- if and .Values.image.csi.resizer.repository .Values.image.csi.resizer.tag }} + - name: CSI_RESIZER_IMAGE + value: "{{ template "registry_url" . }}{{ .Values.image.csi.resizer.repository }}:{{ .Values.image.csi.resizer.tag }}" + {{- end }} + {{- if and .Values.image.csi.snapshotter.repository .Values.image.csi.snapshotter.tag }} + - name: CSI_SNAPSHOTTER_IMAGE + value: "{{ template "registry_url" . }}{{ .Values.image.csi.snapshotter.repository }}:{{ .Values.image.csi.snapshotter.tag }}" + {{- end }} + {{- if and .Values.image.csi.livenessProbe.repository .Values.image.csi.livenessProbe.tag }} + - name: CSI_LIVENESS_PROBE_IMAGE + value: "{{ template "registry_url" . }}{{ .Values.image.csi.livenessProbe.repository }}:{{ .Values.image.csi.livenessProbe.tag }}" + {{- end }} + {{- if .Values.csi.attacherReplicaCount }} + - name: CSI_ATTACHER_REPLICA_COUNT + value: {{ .Values.csi.attacherReplicaCount | quote }} + {{- end }} + {{- if .Values.csi.provisionerReplicaCount }} + - name: CSI_PROVISIONER_REPLICA_COUNT + value: {{ .Values.csi.provisionerReplicaCount | quote }} + {{- end }} + {{- if .Values.csi.resizerReplicaCount }} + - name: CSI_RESIZER_REPLICA_COUNT + value: {{ .Values.csi.resizerReplicaCount | quote }} + {{- end }} + {{- if .Values.csi.snapshotterReplicaCount }} + - name: CSI_SNAPSHOTTER_REPLICA_COUNT + value: {{ .Values.csi.snapshotterReplicaCount | quote }} + {{- end }} + {{- if .Values.enableGoCoverDir }} + - name: GOCOVERDIR + value: /go-cover-dir/ + volumeMounts: + - name: go-cover-dir + mountPath: /go-cover-dir/ + {{- end }} + + {{- if .Values.privateRegistry.registrySecret }} + imagePullSecrets: + - name: {{ .Values.privateRegistry.registrySecret }} + {{- end }} + {{- if .Values.longhornDriver.priorityClass }} + priorityClassName: {{ .Values.longhornDriver.priorityClass | quote }} + {{- end }} + {{- if or .Values.global.tolerations .Values.longhornDriver.tolerations .Values.global.cattle.windowsCluster.enabled }} + tolerations: + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.tolerations }} +{{ toYaml .Values.global.cattle.windowsCluster.tolerations | indent 6 }} + {{- end }} + {{- if or .Values.global.tolerations .Values.longhornDriver.tolerations }} +{{ default .Values.global.tolerations .Values.longhornDriver.tolerations | toYaml | indent 6 }} + {{- end }} + {{- end }} + {{- if or .Values.global.nodeSelector .Values.longhornDriver.nodeSelector .Values.global.cattle.windowsCluster.enabled }} + nodeSelector: + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.nodeSelector }} +{{ toYaml .Values.global.cattle.windowsCluster.nodeSelector | indent 8 }} + {{- end }} + {{- if or .Values.global.nodeSelector .Values.longhornDriver.nodeSelector }} +{{ default .Values.global.nodeSelector .Values.longhornDriver.nodeSelector | toYaml | indent 8 }} + {{- end }} + {{- end }} + serviceAccountName: longhorn-service-account + securityContext: + runAsUser: 0 + {{- if .Values.enableGoCoverDir }} + volumes: + - name: go-cover-dir + hostPath: + path: /go-cover-dir/ + type: DirectoryOrCreate + {{- end }} diff --git a/charts/longhorn/103.4.1+up1.7.2/templates/deployment-ui.yaml b/charts/longhorn/103.4.1+up1.7.2/templates/deployment-ui.yaml new file mode 100644 index 0000000000..e4f3e0f8f7 --- /dev/null +++ b/charts/longhorn/103.4.1+up1.7.2/templates/deployment-ui.yaml @@ -0,0 +1,186 @@ +{{- if .Values.openshift.enabled }} +{{- if .Values.openshift.ui.route }} +# https://github.com/openshift/oauth-proxy/blob/master/contrib/sidecar.yaml +# Create a proxy service account and ensure it will use the route "proxy" +# Create a secure connection to the proxy via a route +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + labels: {{- include "longhorn.labels" . | nindent 4 }} + app: longhorn-ui + name: {{ .Values.openshift.ui.route }} + namespace: {{ include "release_namespace" . }} +spec: + to: + kind: Service + name: longhorn-ui + tls: + termination: reencrypt +--- +apiVersion: v1 +kind: Service +metadata: + labels: {{- include "longhorn.labels" . | nindent 4 }} + app: longhorn-ui + name: longhorn-ui + namespace: {{ include "release_namespace" . }} + annotations: + service.alpha.openshift.io/serving-cert-secret-name: longhorn-ui-tls +spec: + ports: + - name: longhorn-ui + port: {{ .Values.openshift.ui.port | default 443 }} + targetPort: {{ .Values.openshift.ui.proxy | default 8443 }} + selector: + app: longhorn-ui +--- +{{- end }} +{{- end }} +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: {{- include "longhorn.labels" . | nindent 4 }} + app: longhorn-ui + name: longhorn-ui + namespace: {{ include "release_namespace" . }} +spec: + replicas: {{ .Values.longhornUI.replicas }} + selector: + matchLabels: + app: longhorn-ui + template: + metadata: + labels: {{- include "longhorn.labels" . | nindent 8 }} + app: longhorn-ui + spec: + serviceAccountName: longhorn-ui-service-account + affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 1 + podAffinityTerm: + labelSelector: + matchExpressions: + - key: app + operator: In + values: + - longhorn-ui + topologyKey: kubernetes.io/hostname + containers: + {{- if .Values.openshift.enabled }} + {{- if .Values.openshift.ui.route }} + - name: oauth-proxy + {{- if .Values.image.openshift.oauthProxy.repository }} + image: {{ template "registry_url" . }}{{ .Values.image.openshift.oauthProxy.repository }}:{{ .Values.image.openshift.oauthProxy.tag }} + {{- else }} + image: "" + {{- end }} + imagePullPolicy: IfNotPresent + ports: + - containerPort: {{ .Values.openshift.ui.proxy | default 8443 }} + name: public + args: + - --https-address=:{{ .Values.openshift.ui.proxy | default 8443 }} + - --provider=openshift + - --openshift-service-account=longhorn-ui-service-account + - --upstream=http://localhost:8000 + - --tls-cert=/etc/tls/private/tls.crt + - --tls-key=/etc/tls/private/tls.key + - --cookie-secret=SECRET + - --openshift-sar={"namespace":"{{ include "release_namespace" . }}","group":"longhorn.io","resource":"setting","verb":"delete"} + volumeMounts: + - mountPath: /etc/tls/private + name: longhorn-ui-tls + {{- end }} + {{- end }} + - name: longhorn-ui + image: {{ template "registry_url" . }}{{ .Values.image.longhorn.ui.repository }}:{{ .Values.image.longhorn.ui.tag }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + volumeMounts: + - name : nginx-cache + mountPath: /var/cache/nginx/ + - name : nginx-config + mountPath: /var/config/nginx/ + - name: var-run + mountPath: /var/run/ + ports: + - containerPort: 8000 + name: http + env: + - name: LONGHORN_MANAGER_IP + value: "http://longhorn-backend:9500" + - name: LONGHORN_UI_PORT + value: "8000" + volumes: + {{- if .Values.openshift.enabled }} + {{- if .Values.openshift.ui.route }} + - name: longhorn-ui-tls + secret: + secretName: longhorn-ui-tls + {{- end }} + {{- end }} + - emptyDir: {} + name: nginx-cache + - emptyDir: {} + name: nginx-config + - emptyDir: {} + name: var-run + {{- if .Values.privateRegistry.registrySecret }} + imagePullSecrets: + - name: {{ .Values.privateRegistry.registrySecret }} + {{- end }} + {{- if .Values.longhornUI.priorityClass }} + priorityClassName: {{ .Values.longhornUI.priorityClass | quote }} + {{- end }} + {{- if or .Values.global.tolerations .Values.longhornUI.tolerations .Values.global.cattle.windowsCluster.enabled }} + tolerations: + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.tolerations }} +{{ toYaml .Values.global.cattle.windowsCluster.tolerations | indent 6 }} + {{- end }} + {{- if or .Values.global.tolerations .Values.longhornUI.tolerations }} +{{ default .Values.global.tolerations .Values.longhornUI.tolerations | toYaml | indent 6 }} + {{- end }} + {{- end }} + {{- if or .Values.global.nodeSelector .Values.longhornUI.nodeSelector .Values.global.cattle.windowsCluster.enabled }} + nodeSelector: + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.nodeSelector }} +{{ toYaml .Values.global.cattle.windowsCluster.nodeSelector | indent 8 }} + {{- end }} + {{- if or .Values.global.nodeSelector .Values.longhornUI.nodeSelector }} +{{ default .Values.global.nodeSelector .Values.longhornUI.nodeSelector | toYaml | indent 8 }} + {{- end }} + {{- end }} +--- +kind: Service +apiVersion: v1 +metadata: + labels: {{- include "longhorn.labels" . | nindent 4 }} + app: longhorn-ui + {{- if eq .Values.service.ui.type "Rancher-Proxy" }} + kubernetes.io/cluster-service: "true" + {{- end }} + name: longhorn-frontend + namespace: {{ include "release_namespace" . }} +spec: + {{- if eq .Values.service.ui.type "Rancher-Proxy" }} + type: ClusterIP + {{- else }} + type: {{ .Values.service.ui.type }} + {{- end }} + {{- if and .Values.service.ui.loadBalancerIP (eq .Values.service.ui.type "LoadBalancer") }} + loadBalancerIP: {{ .Values.service.ui.loadBalancerIP }} + {{- end }} + {{- if and (eq .Values.service.ui.type "LoadBalancer") .Values.service.ui.loadBalancerSourceRanges }} + loadBalancerSourceRanges: {{- toYaml .Values.service.ui.loadBalancerSourceRanges | nindent 4 }} + {{- end }} + selector: + app: longhorn-ui + ports: + - name: http + port: 80 + targetPort: http + {{- if .Values.service.ui.nodePort }} + nodePort: {{ .Values.service.ui.nodePort }} + {{- else }} + nodePort: null + {{- end }} diff --git a/charts/longhorn/103.4.1+up1.7.2/templates/ingress.yaml b/charts/longhorn/103.4.1+up1.7.2/templates/ingress.yaml new file mode 100644 index 0000000000..61175e827b --- /dev/null +++ b/charts/longhorn/103.4.1+up1.7.2/templates/ingress.yaml @@ -0,0 +1,37 @@ +{{- if .Values.ingress.enabled }} +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: longhorn-ingress + namespace: {{ include "release_namespace" . }} + labels: {{- include "longhorn.labels" . | nindent 4 }} + app: longhorn-ingress + annotations: + {{- if .Values.ingress.secureBackends }} + ingress.kubernetes.io/secure-backends: "true" + {{- end }} + {{- range $key, $value := .Values.ingress.annotations }} + {{ $key }}: {{ $value | quote }} + {{- end }} +spec: + {{- if .Values.ingress.ingressClassName }} + ingressClassName: {{ .Values.ingress.ingressClassName }} + {{- end }} + rules: + - host: {{ .Values.ingress.host }} + http: + paths: + - path: {{ default "" .Values.ingress.path }} + pathType: {{ default "ImplementationSpecific" .Values.ingress.pathType }} + backend: + service: + name: longhorn-frontend + port: + number: 80 +{{- if .Values.ingress.tls }} + tls: + - hosts: + - {{ .Values.ingress.host }} + secretName: {{ .Values.ingress.tlsSecret }} +{{- end }} +{{- end }} diff --git a/charts/longhorn/103.4.1+up1.7.2/templates/network-policies/backing-image-data-source-network-policy.yaml b/charts/longhorn/103.4.1+up1.7.2/templates/network-policies/backing-image-data-source-network-policy.yaml new file mode 100644 index 0000000000..7204d63caa --- /dev/null +++ b/charts/longhorn/103.4.1+up1.7.2/templates/network-policies/backing-image-data-source-network-policy.yaml @@ -0,0 +1,27 @@ +{{- if .Values.networkPolicies.enabled }} +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: backing-image-data-source + namespace: {{ include "release_namespace" . }} +spec: + podSelector: + matchLabels: + longhorn.io/component: backing-image-data-source + policyTypes: + - Ingress + ingress: + - from: + - podSelector: + matchLabels: + app: longhorn-manager + - podSelector: + matchLabels: + longhorn.io/component: instance-manager + - podSelector: + matchLabels: + longhorn.io/component: backing-image-manager + - podSelector: + matchLabels: + longhorn.io/component: backing-image-data-source +{{- end }} diff --git a/charts/longhorn/103.4.1+up1.7.2/templates/network-policies/backing-image-manager-network-policy.yaml b/charts/longhorn/103.4.1+up1.7.2/templates/network-policies/backing-image-manager-network-policy.yaml new file mode 100644 index 0000000000..119ebf08a1 --- /dev/null +++ b/charts/longhorn/103.4.1+up1.7.2/templates/network-policies/backing-image-manager-network-policy.yaml @@ -0,0 +1,27 @@ +{{- if .Values.networkPolicies.enabled }} +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: backing-image-manager + namespace: {{ include "release_namespace" . }} +spec: + podSelector: + matchLabels: + longhorn.io/component: backing-image-manager + policyTypes: + - Ingress + ingress: + - from: + - podSelector: + matchLabels: + app: longhorn-manager + - podSelector: + matchLabels: + longhorn.io/component: instance-manager + - podSelector: + matchLabels: + longhorn.io/component: backing-image-manager + - podSelector: + matchLabels: + longhorn.io/component: backing-image-data-source +{{- end }} diff --git a/charts/longhorn/103.4.1+up1.7.2/templates/network-policies/instance-manager-networking.yaml b/charts/longhorn/103.4.1+up1.7.2/templates/network-policies/instance-manager-networking.yaml new file mode 100644 index 0000000000..332aa2c2fe --- /dev/null +++ b/charts/longhorn/103.4.1+up1.7.2/templates/network-policies/instance-manager-networking.yaml @@ -0,0 +1,27 @@ +{{- if .Values.networkPolicies.enabled }} +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: instance-manager + namespace: {{ include "release_namespace" . }} +spec: + podSelector: + matchLabels: + longhorn.io/component: instance-manager + policyTypes: + - Ingress + ingress: + - from: + - podSelector: + matchLabels: + app: longhorn-manager + - podSelector: + matchLabels: + longhorn.io/component: instance-manager + - podSelector: + matchLabels: + longhorn.io/component: backing-image-manager + - podSelector: + matchLabels: + longhorn.io/component: backing-image-data-source +{{- end }} diff --git a/charts/longhorn/103.4.1+up1.7.2/templates/network-policies/manager-network-policy.yaml b/charts/longhorn/103.4.1+up1.7.2/templates/network-policies/manager-network-policy.yaml new file mode 100644 index 0000000000..6f94029a53 --- /dev/null +++ b/charts/longhorn/103.4.1+up1.7.2/templates/network-policies/manager-network-policy.yaml @@ -0,0 +1,35 @@ +{{- if .Values.networkPolicies.enabled }} +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: longhorn-manager + namespace: {{ include "release_namespace" . }} +spec: + podSelector: + matchLabels: + app: longhorn-manager + policyTypes: + - Ingress + ingress: + - from: + - podSelector: + matchLabels: + app: longhorn-manager + - podSelector: + matchLabels: + app: longhorn-ui + - podSelector: + matchLabels: + app: longhorn-csi-plugin + - podSelector: + matchLabels: + longhorn.io/managed-by: longhorn-manager + matchExpressions: + - { key: recurring-job.longhorn.io, operator: Exists } + - podSelector: + matchExpressions: + - { key: longhorn.io/job-task, operator: Exists } + - podSelector: + matchLabels: + app: longhorn-driver-deployer +{{- end }} diff --git a/charts/longhorn/103.4.1+up1.7.2/templates/network-policies/recovery-backend-network-policy.yaml b/charts/longhorn/103.4.1+up1.7.2/templates/network-policies/recovery-backend-network-policy.yaml new file mode 100644 index 0000000000..37bf5f9bcf --- /dev/null +++ b/charts/longhorn/103.4.1+up1.7.2/templates/network-policies/recovery-backend-network-policy.yaml @@ -0,0 +1,17 @@ +{{- if .Values.networkPolicies.enabled }} +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: longhorn-recovery-backend + namespace: {{ include "release_namespace" . }} +spec: + podSelector: + matchLabels: + longhorn.io/recovery-backend: longhorn-recovery-backend + policyTypes: + - Ingress + ingress: + - ports: + - protocol: TCP + port: 9503 +{{- end }} diff --git a/charts/longhorn/103.4.1+up1.7.2/templates/network-policies/ui-frontend-network-policy.yaml b/charts/longhorn/103.4.1+up1.7.2/templates/network-policies/ui-frontend-network-policy.yaml new file mode 100644 index 0000000000..6f37065980 --- /dev/null +++ b/charts/longhorn/103.4.1+up1.7.2/templates/network-policies/ui-frontend-network-policy.yaml @@ -0,0 +1,46 @@ +{{- if and .Values.networkPolicies.enabled .Values.ingress.enabled (not (eq .Values.networkPolicies.type "")) }} +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: longhorn-ui-frontend + namespace: {{ include "release_namespace" . }} +spec: + podSelector: + matchLabels: + app: longhorn-ui + policyTypes: + - Ingress + ingress: + - from: + {{- if eq .Values.networkPolicies.type "rke1"}} + - namespaceSelector: + matchLabels: + kubernetes.io/metadata.name: ingress-nginx + podSelector: + matchLabels: + app.kubernetes.io/component: controller + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/name: ingress-nginx + {{- else if eq .Values.networkPolicies.type "rke2" }} + - namespaceSelector: + matchLabels: + kubernetes.io/metadata.name: kube-system + podSelector: + matchLabels: + app.kubernetes.io/component: controller + app.kubernetes.io/instance: rke2-ingress-nginx + app.kubernetes.io/name: rke2-ingress-nginx + {{- else if eq .Values.networkPolicies.type "k3s" }} + - namespaceSelector: + matchLabels: + kubernetes.io/metadata.name: kube-system + podSelector: + matchLabels: + app.kubernetes.io/name: traefik + ports: + - port: 8000 + protocol: TCP + - port: 80 + protocol: TCP + {{- end }} +{{- end }} diff --git a/charts/longhorn/103.4.1+up1.7.2/templates/network-policies/webhook-network-policy.yaml b/charts/longhorn/103.4.1+up1.7.2/templates/network-policies/webhook-network-policy.yaml new file mode 100644 index 0000000000..3812e0ffa3 --- /dev/null +++ b/charts/longhorn/103.4.1+up1.7.2/templates/network-policies/webhook-network-policy.yaml @@ -0,0 +1,33 @@ +{{- if .Values.networkPolicies.enabled }} +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: longhorn-conversion-webhook + namespace: {{ include "release_namespace" . }} +spec: + podSelector: + matchLabels: + longhorn.io/conversion-webhook: longhorn-conversion-webhook + policyTypes: + - Ingress + ingress: + - ports: + - protocol: TCP + port: 9501 +--- +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: longhorn-admission-webhook + namespace: {{ include "release_namespace" . }} +spec: + podSelector: + matchLabels: + longhorn.io/admission-webhook: longhorn-admission-webhook + policyTypes: + - Ingress + ingress: + - ports: + - protocol: TCP + port: 9502 +{{- end }} diff --git a/charts/longhorn/103.4.1+up1.7.2/templates/postupgrade-job.yaml b/charts/longhorn/103.4.1+up1.7.2/templates/postupgrade-job.yaml new file mode 100644 index 0000000000..56efd38e9b --- /dev/null +++ b/charts/longhorn/103.4.1+up1.7.2/templates/postupgrade-job.yaml @@ -0,0 +1,56 @@ +apiVersion: batch/v1 +kind: Job +metadata: + annotations: + "helm.sh/hook": post-upgrade + "helm.sh/hook-delete-policy": hook-succeeded,before-hook-creation + name: longhorn-post-upgrade + namespace: {{ include "release_namespace" . }} + labels: {{- include "longhorn.labels" . | nindent 4 }} +spec: + activeDeadlineSeconds: 900 + backoffLimit: 1 + template: + metadata: + name: longhorn-post-upgrade + labels: {{- include "longhorn.labels" . | nindent 8 }} + spec: + containers: + - name: longhorn-post-upgrade + image: {{ template "registry_url" . }}{{ .Values.image.longhorn.manager.repository }}:{{ .Values.image.longhorn.manager.tag }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + command: + - longhorn-manager + - post-upgrade + env: + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + restartPolicy: OnFailure + {{- if .Values.privateRegistry.registrySecret }} + imagePullSecrets: + - name: {{ .Values.privateRegistry.registrySecret }} + {{- end }} + {{- if .Values.longhornManager.priorityClass }} + priorityClassName: {{ .Values.longhornManager.priorityClass | quote }} + {{- end }} + serviceAccountName: longhorn-service-account + {{- if or .Values.global.tolerations .Values.longhornManager.tolerations .Values.global.cattle.windowsCluster.enabled }} + tolerations: + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.tolerations }} +{{ toYaml .Values.global.cattle.windowsCluster.tolerations | indent 6 }} + {{- end }} + {{- if or .Values.global.tolerations .Values.longhornManager.tolerations }} +{{ default .Values.global.tolerations .Values.longhornManager.tolerations | toYaml | indent 6 }} + {{- end }} + {{- end }} + {{- if or .Values.global.nodeSelector .Values.longhornManager.nodeSelector .Values.global.cattle.windowsCluster.enabled }} + nodeSelector: + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.nodeSelector }} +{{ toYaml .Values.global.cattle.windowsCluster.nodeSelector | indent 8 }} + {{- end }} + {{- if or .Values.global.nodeSelector .Values.longhornManager.nodeSelector }} +{{ default .Values.global.nodeSelector .Values.longhornManager.nodeSelector | toYaml | indent 8 }} + {{- end }} + {{- end }} diff --git a/charts/longhorn/103.4.1+up1.7.2/templates/preupgrade-job.yaml b/charts/longhorn/103.4.1+up1.7.2/templates/preupgrade-job.yaml new file mode 100644 index 0000000000..9f7a8a6aa6 --- /dev/null +++ b/charts/longhorn/103.4.1+up1.7.2/templates/preupgrade-job.yaml @@ -0,0 +1,64 @@ +{{- if and .Values.preUpgradeChecker.jobEnabled .Values.preUpgradeChecker.upgradeVersionCheck}} +apiVersion: batch/v1 +kind: Job +metadata: + annotations: + "helm.sh/hook": pre-upgrade + "helm.sh/hook-delete-policy": hook-succeeded,before-hook-creation,hook-failed + name: longhorn-pre-upgrade + namespace: {{ include "release_namespace" . }} + labels: {{- include "longhorn.labels" . | nindent 4 }} +spec: + activeDeadlineSeconds: 900 + backoffLimit: 1 + template: + metadata: + name: longhorn-pre-upgrade + labels: {{- include "longhorn.labels" . | nindent 8 }} + spec: + containers: + - name: longhorn-pre-upgrade + image: {{ template "registry_url" . }}{{ .Values.image.longhorn.manager.repository }}:{{ .Values.image.longhorn.manager.tag }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + securityContext: + privileged: true + command: + - longhorn-manager + - pre-upgrade + volumeMounts: + - name: proc + mountPath: /host/proc/ + env: + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + volumes: + - name: proc + hostPath: + path: /proc/ + restartPolicy: OnFailure + {{- if .Values.privateRegistry.registrySecret }} + imagePullSecrets: + - name: {{ .Values.privateRegistry.registrySecret }} + {{- end }} + serviceAccountName: longhorn-service-account + {{- if or .Values.global.tolerations .Values.longhornManager.tolerations .Values.global.cattle.windowsCluster.enabled }} + tolerations: + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.tolerations }} +{{ toYaml .Values.global.cattle.windowsCluster.tolerations | indent 6 }} + {{- end }} + {{- if or .Values.global.tolerations .Values.longhornManager.tolerations }} +{{ default .Values.global.tolerations .Values.longhornManager.tolerations | toYaml | indent 6 }} + {{- end }} + {{- end }} + {{- if or .Values.global.nodeSelector .Values.longhornManager.nodeSelector .Values.global.cattle.windowsCluster.enabled }} + nodeSelector: + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.nodeSelector }} +{{ toYaml .Values.global.cattle.windowsCluster.nodeSelector | indent 8 }} + {{- end }} + {{- if or .Values.global.nodeSelector .Values.longhornManager.nodeSelector }} +{{ default .Values.global.nodeSelector .Values.longhornManager.nodeSelector | toYaml | indent 8 }} + {{- end }} + {{- end }} +{{- end }} diff --git a/charts/longhorn/103.4.1+up1.7.2/templates/priorityclass.yaml b/charts/longhorn/103.4.1+up1.7.2/templates/priorityclass.yaml new file mode 100644 index 0000000000..208adc84a2 --- /dev/null +++ b/charts/longhorn/103.4.1+up1.7.2/templates/priorityclass.yaml @@ -0,0 +1,9 @@ +apiVersion: scheduling.k8s.io/v1 +kind: PriorityClass +metadata: + name: "longhorn-critical" + labels: {{- include "longhorn.labels" . | nindent 4 }} +description: "Ensure Longhorn pods have the highest priority to prevent any unexpected eviction by the Kubernetes scheduler under node pressure" +globalDefault: false +preemptionPolicy: PreemptLowerPriority +value: 1000000000 diff --git a/charts/longhorn/103.4.1+up1.7.2/templates/psp.yaml b/charts/longhorn/103.4.1+up1.7.2/templates/psp.yaml new file mode 100644 index 0000000000..a2dfc05bef --- /dev/null +++ b/charts/longhorn/103.4.1+up1.7.2/templates/psp.yaml @@ -0,0 +1,66 @@ +{{- if .Values.enablePSP }} +apiVersion: policy/v1beta1 +kind: PodSecurityPolicy +metadata: + name: longhorn-psp + labels: {{- include "longhorn.labels" . | nindent 4 }} +spec: + privileged: true + allowPrivilegeEscalation: true + requiredDropCapabilities: + - NET_RAW + allowedCapabilities: + - SYS_ADMIN + hostNetwork: false + hostIPC: false + hostPID: true + runAsUser: + rule: RunAsAny + seLinux: + rule: RunAsAny + fsGroup: + rule: RunAsAny + supplementalGroups: + rule: RunAsAny + volumes: + - configMap + - downwardAPI + - emptyDir + - secret + - projected + - hostPath +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: longhorn-psp-role + labels: {{- include "longhorn.labels" . | nindent 4 }} + namespace: {{ include "release_namespace" . }} +rules: +- apiGroups: + - policy + resources: + - podsecuritypolicies + verbs: + - use + resourceNames: + - longhorn-psp +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: longhorn-psp-binding + labels: {{- include "longhorn.labels" . | nindent 4 }} + namespace: {{ include "release_namespace" . }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: longhorn-psp-role +subjects: +- kind: ServiceAccount + name: longhorn-service-account + namespace: {{ include "release_namespace" . }} +- kind: ServiceAccount + name: default + namespace: {{ include "release_namespace" . }} +{{- end }} diff --git a/charts/longhorn/103.4.1+up1.7.2/templates/registry-secret.yaml b/charts/longhorn/103.4.1+up1.7.2/templates/registry-secret.yaml new file mode 100644 index 0000000000..3c6b1dc510 --- /dev/null +++ b/charts/longhorn/103.4.1+up1.7.2/templates/registry-secret.yaml @@ -0,0 +1,13 @@ +{{- if .Values.privateRegistry.createSecret }} +{{- if .Values.privateRegistry.registrySecret }} +apiVersion: v1 +kind: Secret +metadata: + name: {{ .Values.privateRegistry.registrySecret }} + namespace: {{ include "release_namespace" . }} + labels: {{- include "longhorn.labels" . | nindent 4 }} +type: kubernetes.io/dockerconfigjson +data: + .dockerconfigjson: {{ template "secret" . }} +{{- end }} +{{- end }} \ No newline at end of file diff --git a/charts/longhorn/103.4.1+up1.7.2/templates/serviceaccount.yaml b/charts/longhorn/103.4.1+up1.7.2/templates/serviceaccount.yaml new file mode 100644 index 0000000000..b0d6dd505b --- /dev/null +++ b/charts/longhorn/103.4.1+up1.7.2/templates/serviceaccount.yaml @@ -0,0 +1,40 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: longhorn-service-account + namespace: {{ include "release_namespace" . }} + labels: {{- include "longhorn.labels" . | nindent 4 }} + {{- with .Values.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: longhorn-ui-service-account + namespace: {{ include "release_namespace" . }} + labels: {{- include "longhorn.labels" . | nindent 4 }} + {{- with .Values.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} + {{- if .Values.openshift.enabled }} + {{- if .Values.openshift.ui.route }} + {{- if not .Values.serviceAccount.annotations }} + annotations: + {{- end }} + serviceaccounts.openshift.io/oauth-redirectreference.primary: '{"kind":"OAuthRedirectReference","apiVersion":"v1","reference":{"kind":"Route","name":"longhorn-ui"}}' + {{- end }} + {{- end }} +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: longhorn-support-bundle + namespace: {{ include "release_namespace" . }} + labels: {{- include "longhorn.labels" . | nindent 4 }} + {{- with .Values.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} \ No newline at end of file diff --git a/charts/longhorn/103.4.1+up1.7.2/templates/servicemonitor.yaml b/charts/longhorn/103.4.1+up1.7.2/templates/servicemonitor.yaml new file mode 100644 index 0000000000..3f32961332 --- /dev/null +++ b/charts/longhorn/103.4.1+up1.7.2/templates/servicemonitor.yaml @@ -0,0 +1,40 @@ +{{- if .Values.metrics.serviceMonitor.enabled -}} +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: longhorn-prometheus-servicemonitor + namespace: {{ include "release_namespace" . }} + labels: + {{- include "longhorn.labels" . | nindent 4 }} + name: longhorn-prometheus-servicemonitor + {{- with .Values.metrics.serviceMonitor.additionalLabels }} + {{- toYaml . | nindent 4 }} + {{- end }} + {{- with .Values.metrics.serviceMonitor.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + selector: + matchLabels: + app: longhorn-manager + namespaceSelector: + matchNames: + - {{ include "release_namespace" . }} + endpoints: + - port: manager + {{- with .Values.metrics.serviceMonitor.interval }} + interval: {{ . }} + {{- end }} + {{- with .Values.metrics.serviceMonitor.scrapeTimeout }} + scrapeTimeout: {{ . }} + {{- end }} + {{- with .Values.metrics.serviceMonitor.relabelings }} + relabelings: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.metrics.serviceMonitor.metricRelabelings }} + metricRelabelings: + {{- toYaml . | nindent 8 }} + {{- end }} +{{- end }} \ No newline at end of file diff --git a/charts/longhorn/103.4.1+up1.7.2/templates/services.yaml b/charts/longhorn/103.4.1+up1.7.2/templates/services.yaml new file mode 100644 index 0000000000..4c8c6bc687 --- /dev/null +++ b/charts/longhorn/103.4.1+up1.7.2/templates/services.yaml @@ -0,0 +1,47 @@ +apiVersion: v1 +kind: Service +metadata: + labels: {{- include "longhorn.labels" . | nindent 4 }} + app: longhorn-conversion-webhook + name: longhorn-conversion-webhook + namespace: {{ include "release_namespace" . }} +spec: + type: ClusterIP + selector: + longhorn.io/conversion-webhook: longhorn-conversion-webhook + ports: + - name: conversion-webhook + port: 9501 + targetPort: conversion-wh +--- +apiVersion: v1 +kind: Service +metadata: + labels: {{- include "longhorn.labels" . | nindent 4 }} + app: longhorn-admission-webhook + name: longhorn-admission-webhook + namespace: {{ include "release_namespace" . }} +spec: + type: ClusterIP + selector: + longhorn.io/admission-webhook: longhorn-admission-webhook + ports: + - name: admission-webhook + port: 9502 + targetPort: admission-wh +--- +apiVersion: v1 +kind: Service +metadata: + labels: {{- include "longhorn.labels" . | nindent 4 }} + app: longhorn-recovery-backend + name: longhorn-recovery-backend + namespace: {{ include "release_namespace" . }} +spec: + type: ClusterIP + selector: + longhorn.io/recovery-backend: longhorn-recovery-backend + ports: + - name: recovery-backend + port: 9503 + targetPort: recov-backend diff --git a/charts/longhorn/103.4.1+up1.7.2/templates/storageclass.yaml b/charts/longhorn/103.4.1+up1.7.2/templates/storageclass.yaml new file mode 100644 index 0000000000..884d38d5f3 --- /dev/null +++ b/charts/longhorn/103.4.1+up1.7.2/templates/storageclass.yaml @@ -0,0 +1,57 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: longhorn-storageclass + namespace: {{ include "release_namespace" . }} + labels: {{- include "longhorn.labels" . | nindent 4 }} +data: + storageclass.yaml: | + kind: StorageClass + apiVersion: storage.k8s.io/v1 + metadata: + name: longhorn + annotations: + storageclass.kubernetes.io/is-default-class: {{ .Values.persistence.defaultClass | quote }} + provisioner: driver.longhorn.io + allowVolumeExpansion: true + reclaimPolicy: "{{ .Values.persistence.reclaimPolicy }}" + volumeBindingMode: Immediate + parameters: + numberOfReplicas: "{{ .Values.persistence.defaultClassReplicaCount }}" + staleReplicaTimeout: "30" + fromBackup: "" + {{- if .Values.persistence.defaultFsType }} + fsType: "{{ .Values.persistence.defaultFsType }}" + {{- end }} + {{- if .Values.persistence.defaultMkfsParams }} + mkfsParams: "{{ .Values.persistence.defaultMkfsParams }}" + {{- end }} + {{- if .Values.persistence.migratable }} + migratable: "{{ .Values.persistence.migratable }}" + {{- end }} + {{- if .Values.persistence.nfsOptions }} + nfsOptions: "{{ .Values.persistence.nfsOptions }}" + {{- end }} + {{- if .Values.persistence.backingImage.enable }} + backingImage: {{ .Values.persistence.backingImage.name }} + backingImageDataSourceType: {{ .Values.persistence.backingImage.dataSourceType }} + backingImageDataSourceParameters: {{ .Values.persistence.backingImage.dataSourceParameters }} + backingImageChecksum: {{ .Values.persistence.backingImage.expectedChecksum }} + {{- end }} + {{- if .Values.persistence.recurringJobSelector.enable }} + recurringJobSelector: '{{ .Values.persistence.recurringJobSelector.jobList }}' + {{- end }} + dataLocality: {{ .Values.persistence.defaultDataLocality | quote }} + {{- if .Values.persistence.defaultDiskSelector.enable }} + diskSelector: "{{ .Values.persistence.defaultDiskSelector.selector }}" + {{- end }} + {{- if .Values.persistence.defaultNodeSelector.enable }} + nodeSelector: "{{ .Values.persistence.defaultNodeSelector.selector }}" + {{- end }} + {{- if .Values.persistence.removeSnapshotsDuringFilesystemTrim }} + unmapMarkSnapChainRemoved: "{{ .Values.persistence.removeSnapshotsDuringFilesystemTrim }}" + {{- end }} + {{- if .Values.persistence.disableRevisionCounter }} + disableRevisionCounter: "{{ .Values.persistence.disableRevisionCounter }}" + dataEngine: "{{ .Values.persistence.dataEngine }}" + {{- end }} diff --git a/charts/longhorn/103.4.1+up1.7.2/templates/tls-secrets.yaml b/charts/longhorn/103.4.1+up1.7.2/templates/tls-secrets.yaml new file mode 100644 index 0000000000..74c43426de --- /dev/null +++ b/charts/longhorn/103.4.1+up1.7.2/templates/tls-secrets.yaml @@ -0,0 +1,16 @@ +{{- if .Values.ingress.enabled }} +{{- range .Values.ingress.secrets }} +apiVersion: v1 +kind: Secret +metadata: + name: {{ .name }} + namespace: {{ include "release_namespace" $ }} + labels: {{- include "longhorn.labels" $ | nindent 4 }} + app: longhorn +type: kubernetes.io/tls +data: + tls.crt: {{ .certificate | b64enc }} + tls.key: {{ .key | b64enc }} +--- +{{- end }} +{{- end }} diff --git a/charts/longhorn/103.4.1+up1.7.2/templates/uninstall-job.yaml b/charts/longhorn/103.4.1+up1.7.2/templates/uninstall-job.yaml new file mode 100644 index 0000000000..1ab46207c3 --- /dev/null +++ b/charts/longhorn/103.4.1+up1.7.2/templates/uninstall-job.yaml @@ -0,0 +1,57 @@ +apiVersion: batch/v1 +kind: Job +metadata: + annotations: + "helm.sh/hook": pre-delete + "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded + name: longhorn-uninstall + namespace: {{ include "release_namespace" . }} + labels: {{- include "longhorn.labels" . | nindent 4 }} +spec: + activeDeadlineSeconds: 900 + backoffLimit: 1 + template: + metadata: + name: longhorn-uninstall + labels: {{- include "longhorn.labels" . | nindent 8 }} + spec: + containers: + - name: longhorn-uninstall + image: {{ template "registry_url" . }}{{ .Values.image.longhorn.manager.repository }}:{{ .Values.image.longhorn.manager.tag }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + command: + - longhorn-manager + - uninstall + - --force + env: + - name: LONGHORN_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + restartPolicy: Never + {{- if .Values.privateRegistry.registrySecret }} + imagePullSecrets: + - name: {{ .Values.privateRegistry.registrySecret }} + {{- end }} + {{- if .Values.longhornManager.priorityClass }} + priorityClassName: {{ .Values.longhornManager.priorityClass | quote }} + {{- end }} + serviceAccountName: longhorn-service-account + {{- if or .Values.global.tolerations .Values.longhornManager.tolerations .Values.global.cattle.windowsCluster.enabled }} + tolerations: + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.tolerations }} +{{ toYaml .Values.global.cattle.windowsCluster.tolerations | indent 6 }} + {{- end }} + {{- if or .Values.global.tolerations .Values.longhornManager.tolerations }} +{{ default .Values.global.tolerations .Values.longhornManager.tolerations | toYaml | indent 6 }} + {{- end }} + {{- end }} + {{- if or .Values.global.nodeSelector .Values.longhornManager.nodeSelector .Values.global.cattle.windowsCluster.enabled }} + nodeSelector: + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.nodeSelector }} +{{ toYaml .Values.global.cattle.windowsCluster.nodeSelector | indent 8 }} + {{- end }} + {{- if or .Values.global.nodeSelector .Values.longhornManager.nodeSelector }} +{{ default .Values.global.nodeSelector .Values.longhornManager.nodeSelector | toYaml | indent 8 }} + {{- end }} + {{- end }} diff --git a/charts/longhorn/103.4.1+up1.7.2/templates/userroles.yaml b/charts/longhorn/103.4.1+up1.7.2/templates/userroles.yaml new file mode 100644 index 0000000000..57a68e130c --- /dev/null +++ b/charts/longhorn/103.4.1+up1.7.2/templates/userroles.yaml @@ -0,0 +1,53 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: "longhorn-admin" + labels: + rbac.authorization.k8s.io/aggregate-to-admin: "true" +rules: +- apiGroups: [ "longhorn.io" ] + resources: ["volumes", "volumes/status", "engines", "engines/status", "replicas", "replicas/status", "settings", "settings/status", + "engineimages", "engineimages/status", "nodes", "nodes/status", "instancemanagers", "instancemanagers/status", + "sharemanagers", "sharemanagers/status", "backingimages", "backingimages/status", + "backingimagemanagers", "backingimagemanagers/status", "backingimagedatasources", "backingimagedatasources/status", "backupbackingimages", "backupbackingimages/status", + "backuptargets", "backuptargets/status", "backupvolumes", "backupvolumes/status", "backups", "backups/status", + "recurringjobs", "recurringjobs/status", "orphans", "orphans/status", "snapshots", "snapshots/status", + "supportbundles", "supportbundles/status", "systembackups", "systembackups/status", "systemrestores", "systemrestores/status", + "volumeattachments", "volumeattachments/status"] + verbs: [ "*" ] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: "longhorn-edit" + labels: + rbac.authorization.k8s.io/aggregate-to-edit: "true" +rules: +- apiGroups: [ "longhorn.io" ] + resources: ["volumes", "volumes/status", "engines", "engines/status", "replicas", "replicas/status", "settings", "settings/status", + "engineimages", "engineimages/status", "nodes", "nodes/status", "instancemanagers", "instancemanagers/status", + "sharemanagers", "sharemanagers/status", "backingimages", "backingimages/status", + "backingimagemanagers", "backingimagemanagers/status", "backingimagedatasources", "backingimagedatasources/status", "backupbackingimages", "backupbackingimages/status", + "backuptargets", "backuptargets/status", "backupvolumes", "backupvolumes/status", "backups", "backups/status", + "recurringjobs", "recurringjobs/status", "orphans", "orphans/status", "snapshots", "snapshots/status", + "supportbundles", "supportbundles/status", "systembackups", "systembackups/status", "systemrestores", "systemrestores/status", + "volumeattachments", "volumeattachments/status"] + verbs: [ "*" ] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: "longhorn-view" + labels: + rbac.authorization.k8s.io/aggregate-to-view: "true" +rules: +- apiGroups: [ "longhorn.io" ] + resources: ["volumes", "volumes/status", "engines", "engines/status", "replicas", "replicas/status", "settings", "settings/status", + "engineimages", "engineimages/status", "nodes", "nodes/status", "instancemanagers", "instancemanagers/status", + "sharemanagers", "sharemanagers/status", "backingimages", "backingimages/status", + "backingimagemanagers", "backingimagemanagers/status", "backingimagedatasources", "backingimagedatasources/status", "backupbackingimages", "backupbackingimages/status", + "backuptargets", "backuptargets/status", "backupvolumes", "backupvolumes/status", "backups", "backups/status", + "recurringjobs", "recurringjobs/status", "orphans", "orphans/status", "snapshots", "snapshots/status", + "supportbundles", "supportbundles/status", "systembackups", "systembackups/status", "systemrestores", "systemrestores/status", + "volumeattachments", "volumeattachments/status"] + verbs: [ "get", "list", "watch" ] diff --git a/charts/longhorn/103.4.1+up1.7.2/templates/validate-install-crd.yaml b/charts/longhorn/103.4.1+up1.7.2/templates/validate-install-crd.yaml new file mode 100644 index 0000000000..7bf81816d0 --- /dev/null +++ b/charts/longhorn/103.4.1+up1.7.2/templates/validate-install-crd.yaml @@ -0,0 +1,35 @@ +#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} +# {{- $found := dict -}} +# {{- set $found "longhorn.io/v1beta1/BackingImageDataSource" false -}} +# {{- set $found "longhorn.io/v1beta1/BackingImageManager" false -}} +# {{- set $found "longhorn.io/v1beta1/BackingImage" false -}} +# {{- set $found "longhorn.io/v1beta2/BackupBackingImage" false -}} +# {{- set $found "longhorn.io/v1beta1/Backup" false -}} +# {{- set $found "longhorn.io/v1beta1/BackupTarget" false -}} +# {{- set $found "longhorn.io/v1beta1/BackupVolume" false -}} +# {{- set $found "longhorn.io/v1beta1/EngineImage" false -}} +# {{- set $found "longhorn.io/v1beta1/Engine" false -}} +# {{- set $found "longhorn.io/v1beta1/InstanceManager" false -}} +# {{- set $found "longhorn.io/v1beta1/Node" false -}} +# {{- set $found "longhorn.io/v1beta2/Orphan" false -}} +# {{- set $found "longhorn.io/v1beta1/RecurringJob" false -}} +# {{- set $found "longhorn.io/v1beta1/Replica" false -}} +# {{- set $found "longhorn.io/v1beta1/Setting" false -}} +# {{- set $found "longhorn.io/v1beta1/ShareManager" false -}} +# {{- set $found "longhorn.io/v1beta2/Snapshot" false -}} +# {{- set $found "longhorn.io/v1beta2/SupportBundle" false -}} +# {{- set $found "longhorn.io/v1beta2/SystemBackup" false -}} +# {{- set $found "longhorn.io/v1beta2/SystemRestore" false -}} +# {{- set $found "longhorn.io/v1beta2/VolumeAttachment" false -}} +# {{- set $found "longhorn.io/v1beta1/Volume" false -}} +# {{- range .Capabilities.APIVersions -}} +# {{- if hasKey $found (toString .) -}} +# {{- set $found (toString .) true -}} +# {{- end -}} +# {{- end -}} +# {{- range $_, $exists := $found -}} +# {{- if (eq $exists false) -}} +# {{- required "Required CRDs are missing. Please install the corresponding CRD chart before installing this chart." "" -}} +# {{- end -}} +# {{- end -}} +#{{- end -}} diff --git a/charts/longhorn/103.4.1+up1.7.2/templates/validate-psp-install.yaml b/charts/longhorn/103.4.1+up1.7.2/templates/validate-psp-install.yaml new file mode 100644 index 0000000000..0df98e3657 --- /dev/null +++ b/charts/longhorn/103.4.1+up1.7.2/templates/validate-psp-install.yaml @@ -0,0 +1,7 @@ +#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} +#{{- if .Values.enablePSP }} +#{{- if not (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} +#{{- fail "The target cluster does not have the PodSecurityPolicy API resource. Please disable PSPs in this chart before proceeding." -}} +#{{- end }} +#{{- end }} +#{{- end }} \ No newline at end of file diff --git a/charts/longhorn/103.4.1+up1.7.2/values.yaml b/charts/longhorn/103.4.1+up1.7.2/values.yaml new file mode 100644 index 0000000000..1fabadb85a --- /dev/null +++ b/charts/longhorn/103.4.1+up1.7.2/values.yaml @@ -0,0 +1,526 @@ +# Default values for longhorn. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. +global: + # -- Toleration for nodes allowed to run user-deployed components such as Longhorn Manager, Longhorn UI, and Longhorn Driver Deployer. + tolerations: [] + # -- Node selector for nodes allowed to run user-deployed components such as Longhorn Manager, Longhorn UI, and Longhorn Driver Deployer. + nodeSelector: {} + cattle: + # -- Default system registry. + systemDefaultRegistry: "" + windowsCluster: + # -- Setting that allows Longhorn to run on a Rancher Windows cluster. + enabled: false + # -- Toleration for Linux nodes that can run user-deployed Longhorn components. + tolerations: + - key: "cattle.io/os" + value: "linux" + effect: "NoSchedule" + operator: "Equal" + # -- Node selector for Linux nodes that can run user-deployed Longhorn components. + nodeSelector: + kubernetes.io/os: "linux" + defaultSetting: + # -- Toleration for system-managed Longhorn components. + taintToleration: cattle.io/os=linux:NoSchedule + # -- Node selector for system-managed Longhorn components. + systemManagedComponentsNodeSelector: kubernetes.io/os:linux + +networkPolicies: + # -- Setting that allows you to enable network policies that control access to Longhorn pods. + enabled: false + # -- Distribution that determines the policy for allowing access for an ingress. (Options: "k3s", "rke2", "rke1") + type: "k3s" + +image: + longhorn: + engine: + # -- Repository for the Longhorn Engine image. + repository: rancher/mirrored-longhornio-longhorn-engine + # -- Tag for the Longhorn Engine image. + tag: v1.7.2 + manager: + # -- Repository for the Longhorn Manager image. + repository: rancher/mirrored-longhornio-longhorn-manager + # -- Tag for the Longhorn Manager image. + tag: v1.7.2 + ui: + # -- Repository for the Longhorn UI image. + repository: rancher/mirrored-longhornio-longhorn-ui + # -- Tag for the Longhorn UI image. + tag: v1.7.2 + instanceManager: + # -- Repository for the Longhorn Instance Manager image. + repository: rancher/mirrored-longhornio-longhorn-instance-manager + # -- Tag for the Longhorn Instance Manager image. + tag: v1.7.2 + shareManager: + # -- Repository for the Longhorn Share Manager image. + repository: rancher/mirrored-longhornio-longhorn-share-manager + # -- Tag for the Longhorn Share Manager image. + tag: v1.7.2 + backingImageManager: + # -- Repository for the Backing Image Manager image. When unspecified, Longhorn uses the default value. + repository: rancher/mirrored-longhornio-backing-image-manager + # -- Tag for the Backing Image Manager image. When unspecified, Longhorn uses the default value. + tag: v1.7.2 + supportBundleKit: + # -- Repository for the Longhorn Support Bundle Manager image. + repository: rancher/mirrored-longhornio-support-bundle-kit + # -- Tag for the Longhorn Support Bundle Manager image. + tag: v0.0.45 + csi: + attacher: + # -- Repository for the CSI attacher image. When unspecified, Longhorn uses the default value. + repository: rancher/mirrored-longhornio-csi-attacher + # -- Tag for the CSI attacher image. When unspecified, Longhorn uses the default value. + tag: v4.7.0 + provisioner: + # -- Repository for the CSI Provisioner image. When unspecified, Longhorn uses the default value. + repository: rancher/mirrored-longhornio-csi-provisioner + # -- Tag for the CSI Provisioner image. When unspecified, Longhorn uses the default value. + tag: v4.0.1-20241007 + nodeDriverRegistrar: + # -- Repository for the CSI Node Driver Registrar image. When unspecified, Longhorn uses the default value. + repository: rancher/mirrored-longhornio-csi-node-driver-registrar + # -- Tag for the CSI Node Driver Registrar image. When unspecified, Longhorn uses the default value. + tag: v2.12.0 + resizer: + # -- Repository for the CSI Resizer image. When unspecified, Longhorn uses the default value. + repository: rancher/mirrored-longhornio-csi-resizer + # -- Tag for the CSI Resizer image. When unspecified, Longhorn uses the default value. + tag: v1.12.0 + snapshotter: + # -- Repository for the CSI Snapshotter image. When unspecified, Longhorn uses the default value. + repository: rancher/mirrored-longhornio-csi-snapshotter + # -- Tag for the CSI Snapshotter image. When unspecified, Longhorn uses the default value. + tag: v7.0.2-20241007 + livenessProbe: + # -- Repository for the CSI liveness probe image. When unspecified, Longhorn uses the default value. + repository: rancher/mirrored-longhornio-livenessprobe + # -- Tag for the CSI liveness probe image. When unspecified, Longhorn uses the default value. + tag: v2.14.0 + openshift: + oauthProxy: + # -- Repository for the OAuth Proxy image. Specify the upstream image (for example, "quay.io/openshift/origin-oauth-proxy"). This setting applies only to OpenShift users. + repository: "" + # -- Tag for the OAuth Proxy image. Specify OCP/OKD version 4.1 or later (including version 4.15, which is available at quay.io/openshift/origin-oauth-proxy:4.15). This setting applies only to OpenShift users. + tag: "" + # -- Image pull policy that applies to all user-deployed Longhorn components, such as Longhorn Manager, Longhorn driver, and Longhorn UI. + pullPolicy: IfNotPresent + +service: + ui: + # -- Service type for Longhorn UI. (Options: "ClusterIP", "NodePort", "LoadBalancer", "Rancher-Proxy") + type: ClusterIP + # -- NodePort port number for Longhorn UI. When unspecified, Longhorn selects a free port between 30000 and 32767. + nodePort: null + manager: + # -- Service type for Longhorn Manager. + type: ClusterIP + # -- NodePort port number for Longhorn Manager. When unspecified, Longhorn selects a free port between 30000 and 32767. + nodePort: "" + +persistence: + # -- Setting that allows you to specify the default Longhorn StorageClass. + defaultClass: true + # -- Filesystem type of the default Longhorn StorageClass. + defaultFsType: ext4 + # -- mkfs parameters of the default Longhorn StorageClass. + defaultMkfsParams: "" + # -- Replica count of the default Longhorn StorageClass. + defaultClassReplicaCount: 3 + # -- Data locality of the default Longhorn StorageClass. (Options: "disabled", "best-effort") + defaultDataLocality: disabled + # -- Reclaim policy that provides instructions for handling of a volume after its claim is released. (Options: "Retain", "Delete") + reclaimPolicy: Delete + # -- Setting that allows you to enable live migration of a Longhorn volume from one node to another. + migratable: false + # -- Setting that disables the revision counter and thereby prevents Longhorn from tracking all write operations to a volume. When salvaging a volume, Longhorn uses properties of the volume-head-xxx.img file (the last file size and the last time the file was modified) to select the replica to be used for volume recovery. + disableRevisionCounter: "true" + # -- Set NFS mount options for Longhorn StorageClass for RWX volumes + nfsOptions: "" + recurringJobSelector: + # -- Setting that allows you to enable the recurring job selector for a Longhorn StorageClass. + enable: false + # -- Recurring job selector for a Longhorn StorageClass. Ensure that quotes are used correctly when specifying job parameters. (Example: `[{"name":"backup", "isGroup":true}]`) + jobList: [] + backingImage: + # -- Setting that allows you to use a backing image in a Longhorn StorageClass. + enable: false + # -- Backing image to be used for creating and restoring volumes in a Longhorn StorageClass. When no backing images are available, specify the data source type and parameters that Longhorn can use to create a backing image. + name: ~ + # -- Data source type of a backing image used in a Longhorn StorageClass. + # If the backing image exists in the cluster, Longhorn uses this setting to verify the image. + # If the backing image does not exist, Longhorn creates one using the specified data source type. + dataSourceType: ~ + # -- Data source parameters of a backing image used in a Longhorn StorageClass. + # You can specify a JSON string of a map. (Example: `'{\"url\":\"https://backing-image-example.s3-region.amazonaws.com/test-backing-image\"}'`) + dataSourceParameters: ~ + # -- Expected SHA-512 checksum of a backing image used in a Longhorn StorageClass. + expectedChecksum: ~ + defaultDiskSelector: + # -- Setting that allows you to enable the disk selector for the default Longhorn StorageClass. + enable: false + # -- Disk selector for the default Longhorn StorageClass. Longhorn uses only disks with the specified tags for storing volume data. (Examples: "nvme,sata") + selector: "" + defaultNodeSelector: + # -- Setting that allows you to enable the node selector for the default Longhorn StorageClass. + enable: false + # -- Node selector for the default Longhorn StorageClass. Longhorn uses only nodes with the specified tags for storing volume data. (Examples: "storage,fast") + selector: "" + # -- Setting that allows you to enable automatic snapshot removal during filesystem trim for a Longhorn StorageClass. (Options: "ignored", "enabled", "disabled") + removeSnapshotsDuringFilesystemTrim: ignored + # -- Setting that allows you to specify the data engine version for the default Longhorn StorageClass. (Options: "v1", "v2") + dataEngine: v1 + +preUpgradeChecker: + # -- Setting that allows Longhorn to perform pre-upgrade checks. Disable this setting when installing Longhorn using Argo CD or other GitOps solutions. + jobEnabled: true + # -- Setting that allows Longhorn to perform upgrade version checks after starting the Longhorn Manager DaemonSet Pods. Disabling this setting also disables `preUpgradeChecker.jobEnabled`. Longhorn recommends keeping this setting enabled. + upgradeVersionCheck: true + +csi: + # -- kubelet root directory. When unspecified, Longhorn uses the default value. + kubeletRootDir: ~ + # -- Replica count of the CSI Attacher. When unspecified, Longhorn uses the default value ("3"). + attacherReplicaCount: ~ + # -- Replica count of the CSI Provisioner. When unspecified, Longhorn uses the default value ("3"). + provisionerReplicaCount: ~ + # -- Replica count of the CSI Resizer. When unspecified, Longhorn uses the default value ("3"). + resizerReplicaCount: ~ + # -- Replica count of the CSI Snapshotter. When unspecified, Longhorn uses the default value ("3"). + snapshotterReplicaCount: ~ + +defaultSettings: + # -- Endpoint used to access the backupstore. (Options: "NFS", "CIFS", "AWS", "GCP", "AZURE") + backupTarget: ~ + # -- Name of the Kubernetes secret associated with the backup target. + backupTargetCredentialSecret: ~ + # -- Setting that allows Longhorn to automatically attach a volume and create snapshots or backups when recurring jobs are run. + allowRecurringJobWhileVolumeDetached: ~ + # -- Setting that allows Longhorn to automatically create a default disk only on nodes with the label "node.longhorn.io/create-default-disk=true" (if no other disks exist). When this setting is disabled, Longhorn creates a default disk on each node that is added to the cluster. + createDefaultDiskLabeledNodes: ~ + # -- Default path for storing data on a host. The default value is "/var/lib/longhorn/". + defaultDataPath: ~ + # -- Default data locality. A Longhorn volume has data locality if a local replica of the volume exists on the same node as the pod that is using the volume. + defaultDataLocality: ~ + # -- Setting that allows scheduling on nodes with healthy replicas of the same volume. This setting is disabled by default. + replicaSoftAntiAffinity: ~ + # -- Setting that automatically rebalances replicas when an available node is discovered. + replicaAutoBalance: ~ + # -- Percentage of storage that can be allocated relative to hard drive capacity. The default value is "100". + storageOverProvisioningPercentage: ~ + # -- Percentage of minimum available disk capacity. When the minimum available capacity exceeds the total available capacity, the disk becomes unschedulable until more space is made available for use. The default value is "25". + storageMinimalAvailablePercentage: ~ + # -- Percentage of disk space that is not allocated to the default disk on each new Longhorn node. + storageReservedPercentageForDefaultDisk: ~ + # -- Upgrade Checker that periodically checks for new Longhorn versions. When a new version is available, a notification appears on the Longhorn UI. This setting is enabled by default + upgradeChecker: ~ + # -- Default number of replicas for volumes created using the Longhorn UI. For Kubernetes configuration, modify the `numberOfReplicas` field in the StorageClass. The default value is "3". + defaultReplicaCount: ~ + # -- Default Longhorn StorageClass. "storageClassName" is assigned to PVs and PVCs that are created for an existing Longhorn volume. "storageClassName" can also be used as a label, so it is possible to use a Longhorn StorageClass to bind a workload to an existing PV without creating a Kubernetes StorageClass object. The default value is "longhorn-static". + defaultLonghornStaticStorageClass: ~ + # -- Number of seconds that Longhorn waits before checking the backupstore for new backups. The default value is "300". When the value is "0", polling is disabled. + backupstorePollInterval: ~ + # -- Number of minutes that Longhorn keeps a failed backup resource. When the value is "0", automatic deletion is disabled. + failedBackupTTL: ~ + # -- Setting that restores recurring jobs from a backup volume on a backup target and creates recurring jobs if none exist during backup restoration. + restoreVolumeRecurringJobs: ~ + # -- Maximum number of successful recurring backup and snapshot jobs to be retained. When the value is "0", a history of successful recurring jobs is not retained. + recurringSuccessfulJobsHistoryLimit: ~ + # -- Maximum number of failed recurring backup and snapshot jobs to be retained. When the value is "0", a history of failed recurring jobs is not retained. + recurringFailedJobsHistoryLimit: ~ + # -- Maximum number of snapshots or backups to be retained. + recurringJobMaxRetention: ~ + # -- Maximum number of failed support bundles that can exist in the cluster. When the value is "0", Longhorn automatically purges all failed support bundles. + supportBundleFailedHistoryLimit: ~ + # -- Taint or toleration for system-managed Longhorn components. + # Specify values using a semicolon-separated list in `kubectl taint` syntax (Example: key1=value1:effect; key2=value2:effect). + taintToleration: ~ + # -- Node selector for system-managed Longhorn components. + systemManagedComponentsNodeSelector: ~ + # -- PriorityClass for system-managed Longhorn components. + # This setting can help prevent Longhorn components from being evicted under Node Pressure. + # Notice that this will be applied to Longhorn user-deployed components by default if there are no priority class values set yet, such as `longhornManager.priorityClass`. + priorityClass: &defaultPriorityClassNameRef "longhorn-critical" + # -- Setting that allows Longhorn to automatically salvage volumes when all replicas become faulty (for example, when the network connection is interrupted). Longhorn determines which replicas are usable and then uses these replicas for the volume. This setting is enabled by default. + autoSalvage: ~ + # -- Setting that allows Longhorn to automatically delete a workload pod that is managed by a controller (for example, daemonset) whenever a Longhorn volume is detached unexpectedly (for example, during Kubernetes upgrades). After deletion, the controller restarts the pod and then Kubernetes handles volume reattachment and remounting. + autoDeletePodWhenVolumeDetachedUnexpectedly: ~ + # -- Setting that prevents Longhorn Manager from scheduling replicas on a cordoned Kubernetes node. This setting is enabled by default. + disableSchedulingOnCordonedNode: ~ + # -- Setting that allows Longhorn to schedule new replicas of a volume to nodes in the same zone as existing healthy replicas. Nodes that do not belong to any zone are treated as existing in the zone that contains healthy replicas. When identifying zones, Longhorn relies on the label "topology.kubernetes.io/zone=" in the Kubernetes node object. + replicaZoneSoftAntiAffinity: ~ + # -- Setting that allows scheduling on disks with existing healthy replicas of the same volume. This setting is enabled by default. + replicaDiskSoftAntiAffinity: ~ + # -- Policy that defines the action Longhorn takes when a volume is stuck with a StatefulSet or Deployment pod on a node that failed. + nodeDownPodDeletionPolicy: ~ + # -- Policy that defines the action Longhorn takes when a node with the last healthy replica of a volume is drained. + nodeDrainPolicy: ~ + # -- Setting that allows automatic detaching of manually-attached volumes when a node is cordoned. + detachManuallyAttachedVolumesWhenCordoned: ~ + # -- Number of seconds that Longhorn waits before reusing existing data on a failed replica instead of creating a new replica of a degraded volume. + replicaReplenishmentWaitInterval: ~ + # -- Maximum number of replicas that can be concurrently rebuilt on each node. + concurrentReplicaRebuildPerNodeLimit: ~ + # -- Maximum number of volumes that can be concurrently restored on each node using a backup. When the value is "0", restoration of volumes using a backup is disabled. + concurrentVolumeBackupRestorePerNodeLimit: ~ + # -- Setting that disables the revision counter and thereby prevents Longhorn from tracking all write operations to a volume. When salvaging a volume, Longhorn uses properties of the "volume-head-xxx.img" file (the last file size and the last time the file was modified) to select the replica to be used for volume recovery. This setting applies only to volumes created using the Longhorn UI. + disableRevisionCounter: "true" + # -- Image pull policy for system-managed pods, such as Instance Manager, engine images, and CSI Driver. Changes to the image pull policy are applied only after the system-managed pods restart. + systemManagedPodsImagePullPolicy: ~ + # -- Setting that allows you to create and attach a volume without having all replicas scheduled at the time of creation. + allowVolumeCreationWithDegradedAvailability: ~ + # -- Setting that allows Longhorn to automatically clean up the system-generated snapshot after replica rebuilding is completed. + autoCleanupSystemGeneratedSnapshot: ~ + # -- Setting that allows Longhorn to automatically clean up the snapshot generated by a recurring backup job. + autoCleanupRecurringJobBackupSnapshot: ~ + # -- Maximum number of engines that are allowed to concurrently upgrade on each node after Longhorn Manager is upgraded. When the value is "0", Longhorn does not automatically upgrade volume engines to the new default engine image version. + concurrentAutomaticEngineUpgradePerNodeLimit: ~ + # -- Number of minutes that Longhorn waits before cleaning up the backing image file when no replicas in the disk are using it. + backingImageCleanupWaitInterval: ~ + # -- Number of seconds that Longhorn waits before downloading a backing image file again when the status of all image disk files changes to "failed" or "unknown". + backingImageRecoveryWaitInterval: ~ + # -- Percentage of the total allocatable CPU resources on each node to be reserved for each instance manager pod when the V1 Data Engine is enabled. The default value is "12". + guaranteedInstanceManagerCPU: ~ + # -- Setting that notifies Longhorn that the cluster is using the Kubernetes Cluster Autoscaler. + kubernetesClusterAutoscalerEnabled: ~ + # -- Setting that allows Longhorn to automatically delete an orphaned resource and the corresponding data (for example, stale replicas). Orphaned resources on failed or unknown nodes are not automatically cleaned up. + orphanAutoDeletion: ~ + # -- Storage network for in-cluster traffic. When unspecified, Longhorn uses the Kubernetes cluster network. + storageNetwork: ~ + # -- Flag that prevents accidental uninstallation of Longhorn. + deletingConfirmationFlag: ~ + # -- Timeout between the Longhorn Engine and replicas. Specify a value between "8" and "30" seconds. The default value is "8". + engineReplicaTimeout: ~ + # -- Setting that allows you to enable and disable snapshot hashing and data integrity checks. + snapshotDataIntegrity: ~ + # -- Setting that allows disabling of snapshot hashing after snapshot creation to minimize impact on system performance. + snapshotDataIntegrityImmediateCheckAfterSnapshotCreation: ~ + # -- Setting that defines when Longhorn checks the integrity of data in snapshot disk files. You must use the Unix cron expression format. + snapshotDataIntegrityCronjob: ~ + # -- Setting that allows Longhorn to automatically mark the latest snapshot and its parent files as removed during a filesystem trim. Longhorn does not remove snapshots containing multiple child files. + removeSnapshotsDuringFilesystemTrim: ~ + # -- Setting that allows fast rebuilding of replicas using the checksum of snapshot disk files. Before enabling this setting, you must set the snapshot-data-integrity value to "enable" or "fast-check". + fastReplicaRebuildEnabled: ~ + # -- Number of seconds that an HTTP client waits for a response from a File Sync server before considering the connection to have failed. + replicaFileSyncHttpClientTimeout: ~ + # -- Number of seconds that Longhorn allows for the completion of replica rebuilding and snapshot cloning operations. + longGRPCTimeOut: ~ + # -- Log levels that indicate the type and severity of logs in Longhorn Manager. The default value is "Info". (Options: "Panic", "Fatal", "Error", "Warn", "Info", "Debug", "Trace") + logLevel: ~ + # -- Setting that allows you to specify a backup compression method. + backupCompressionMethod: ~ + # -- Maximum number of worker threads that can concurrently run for each backup. + backupConcurrentLimit: ~ + # -- Maximum number of worker threads that can concurrently run for each restore operation. + restoreConcurrentLimit: ~ + # -- Setting that allows you to enable the V1 Data Engine. + v1DataEngine: ~ + # -- Setting that allows you to enable the V2 Data Engine, which is based on the Storage Performance Development Kit (SPDK). The V2 Data Engine is a preview feature and should not be used in production environments. + v2DataEngine: ~ + # -- Setting that allows you to configure maximum huge page size (in MiB) for the V2 Data Engine. + v2DataEngineHugepageLimit: ~ + # -- Number of millicpus on each node to be reserved for each Instance Manager pod when the V2 Data Engine is enabled. The default value is "1250". + v2DataEngineGuaranteedInstanceManagerCPU: ~ + # -- Setting that allows scheduling of empty node selector volumes to any node. + allowEmptyNodeSelectorVolume: ~ + # -- Setting that allows scheduling of empty disk selector volumes to any disk. + allowEmptyDiskSelectorVolume: ~ + # -- Setting that allows Longhorn to periodically collect anonymous usage data for product improvement purposes. Longhorn sends collected data to the [Upgrade Responder](https://github.com/longhorn/upgrade-responder) server, which is the data source of the Longhorn Public Metrics Dashboard (https://metrics.longhorn.io). The Upgrade Responder server does not store data that can be used to identify clients, including IP addresses. + allowCollectingLonghornUsageMetrics: ~ + # -- Setting that temporarily prevents all attempts to purge volume snapshots. + disableSnapshotPurge: ~ + # -- Maximum snapshot count for a volume. The value should be between 2 to 250 + snapshotMaxCount: ~ + # -- Setting that allows you to configure the log level of the SPDK target daemon (spdk_tgt) of the V2 Data Engine. + v2DataEngineLogLevel: ~ + # -- Setting that allows you to configure the log flags of the SPDK target daemon (spdk_tgt) of the V2 Data Engine. + v2DataEngineLogFlags: ~ + # -- Setting that freezes the filesystem on the root partition before a snapshot is created. + freezeFilesystemForSnapshot: ~ + # -- Setting that automatically cleans up the snapshot when the backup is deleted. + autoCleanupSnapshotWhenDeleteBackup: ~ + # -- Turn on logic to detect and move RWX volumes quickly on node failure. + rwxVolumeFastFailover: ~ + +privateRegistry: + # -- Setting that allows you to create a private registry secret. + createSecret: ~ + # -- URL of a private registry. When unspecified, Longhorn uses the default system registry. + registryUrl: ~ + # -- User account used for authenticating with a private registry. + registryUser: ~ + # -- Password for authenticating with a private registry. + registryPasswd: ~ + # -- Kubernetes secret that allows you to pull images from a private registry. This setting applies only when creation of private registry secrets is enabled. You must include the private registry name in the secret name. + registrySecret: ~ + +longhornManager: + log: + # -- Format of Longhorn Manager logs. (Options: "plain", "json") + format: plain + # -- PriorityClass for Longhorn Manager. + priorityClass: *defaultPriorityClassNameRef + # -- Toleration for Longhorn Manager on nodes allowed to run Longhorn components. + tolerations: [] + ## If you want to set tolerations for Longhorn Manager DaemonSet, delete the `[]` in the line above + ## and uncomment this example block + # - key: "key" + # operator: "Equal" + # value: "value" + # effect: "NoSchedule" + # -- Node selector for Longhorn Manager. Specify the nodes allowed to run Longhorn Manager. + nodeSelector: {} + ## If you want to set node selector for Longhorn Manager DaemonSet, delete the `{}` in the line above + ## and uncomment this example block + # label-key1: "label-value1" + # label-key2: "label-value2" + # -- Annotation for the Longhorn Manager service. + serviceAnnotations: {} + ## If you want to set annotations for the Longhorn Manager service, delete the `{}` in the line above + ## and uncomment this example block + # annotation-key1: "annotation-value1" + # annotation-key2: "annotation-value2" + +longhornDriver: + # -- PriorityClass for Longhorn Driver. + priorityClass: *defaultPriorityClassNameRef + # -- Toleration for Longhorn Driver on nodes allowed to run Longhorn components. + tolerations: [] + ## If you want to set tolerations for Longhorn Driver Deployer Deployment, delete the `[]` in the line above + ## and uncomment this example block + # - key: "key" + # operator: "Equal" + # value: "value" + # effect: "NoSchedule" + # -- Node selector for Longhorn Driver. Specify the nodes allowed to run Longhorn Driver. + nodeSelector: {} + ## If you want to set node selector for Longhorn Driver Deployer Deployment, delete the `{}` in the line above + ## and uncomment this example block + # label-key1: "label-value1" + # label-key2: "label-value2" + +longhornUI: + # -- Replica count for Longhorn UI. + replicas: 2 + # -- PriorityClass for Longhorn UI. + priorityClass: *defaultPriorityClassNameRef + # -- Toleration for Longhorn UI on nodes allowed to run Longhorn components. + tolerations: [] + ## If you want to set tolerations for Longhorn UI Deployment, delete the `[]` in the line above + ## and uncomment this example block + # - key: "key" + # operator: "Equal" + # value: "value" + # effect: "NoSchedule" + # -- Node selector for Longhorn UI. Specify the nodes allowed to run Longhorn UI. + nodeSelector: {} + ## If you want to set node selector for Longhorn UI Deployment, delete the `{}` in the line above + ## and uncomment this example block + # label-key1: "label-value1" + # label-key2: "label-value2" + +ingress: + # -- Setting that allows Longhorn to generate ingress records for the Longhorn UI service. + enabled: false + + # -- IngressClass resource that contains ingress configuration, including the name of the Ingress controller. + # ingressClassName can replace the kubernetes.io/ingress.class annotation used in earlier Kubernetes releases. + ingressClassName: ~ + + # -- Hostname of the Layer 7 load balancer. + host: sslip.io + + # -- Setting that allows you to enable TLS on ingress records. + tls: false + + # -- Setting that allows you to enable secure connections to the Longhorn UI service via port 443. + secureBackends: false + + # -- TLS secret that contains the private key and certificate to be used for TLS. This setting applies only when TLS is enabled on ingress records. + tlsSecret: longhorn.local-tls + + # -- Default ingress path. You can access the Longhorn UI by following the full ingress path {{host}}+{{path}}. + path: / + + # -- Ingress path type. To maintain backward compatibility, the default value is "ImplementationSpecific". + pathType: ImplementationSpecific + + ## If you're using kube-lego, you will want to add: + ## kubernetes.io/tls-acme: true + ## + ## For a full list of possible ingress annotations, please see + ## ref: https://github.com/kubernetes/ingress-nginx/blob/master/docs/annotations.md + ## + ## If tls is set to true, annotation ingress.kubernetes.io/secure-backends: "true" will automatically be set + # -- Ingress annotations in the form of key-value pairs. + annotations: + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: true + + # -- Secret that contains a TLS private key and certificate. Use secrets if you want to use your own certificates to secure ingresses. + secrets: + ## If you're providing your own certificates, please use this to add the certificates as secrets + ## key and certificate should start with -----BEGIN CERTIFICATE----- or + ## -----BEGIN RSA PRIVATE KEY----- + ## + ## name should line up with a tlsSecret set further up + ## If you're using kube-lego, this is unneeded, as it will create the secret for you if it is not set + ## + ## It is also possible to create and manage the certificates outside of this helm chart + ## Please see README.md for more information + # - name: longhorn.local-tls + # key: + # certificate: + +# -- Setting that allows you to enable pod security policies (PSPs) that allow privileged Longhorn pods to start. This setting applies only to clusters running Kubernetes 1.25 and earlier, and with the built-in Pod Security admission controller enabled. +enablePSP: false + +# -- Specify override namespace, specifically this is useful for using longhorn as sub-chart and its release namespace is not the `longhorn-system`. +namespaceOverride: "" + +# -- Annotation for the Longhorn Manager DaemonSet pods. This setting is optional. +annotations: {} + +serviceAccount: + # -- Annotations to add to the service account + annotations: {} + +metrics: + serviceMonitor: + # -- Setting that allows the creation of a Prometheus ServiceMonitor resource for Longhorn Manager components. + enabled: false + # -- Additional labels for the Prometheus ServiceMonitor resource. + additionalLabels: {} + # -- Annotations for the Prometheus ServiceMonitor resource. + annotations: {} + # -- Interval at which Prometheus scrapes the metrics from the target. + interval: "" + # -- Timeout after which Prometheus considers the scrape to be failed. + scrapeTimeout: "" + # -- Configures the relabeling rules to apply the target’s metadata labels. See the [Prometheus Operator + # documentation](https://prometheus-operator.dev/docs/api-reference/api/#monitoring.coreos.com/v1.Endpoint) for + # formatting details. + relabelings: [] + # -- Configures the relabeling rules to apply to the samples before ingestion. See the [Prometheus Operator + # documentation](https://prometheus-operator.dev/docs/api-reference/api/#monitoring.coreos.com/v1.Endpoint) for + # formatting details. + metricRelabelings: [] + +## openshift settings +openshift: + # -- Setting that allows Longhorn to integrate with OpenShift. + enabled: false + ui: + # -- Route for connections between Longhorn and the OpenShift web console. + route: "longhorn-ui" + # -- Port for accessing the OpenShift web console. + port: 443 + # -- Port for proxy that provides access to the OpenShift web console. + proxy: 8443 + +# -- Setting that allows Longhorn to generate code coverage profiles. +enableGoCoverDir: false diff --git a/charts/longhorn/104.2.1+up1.7.2/.helmignore b/charts/longhorn/104.2.1+up1.7.2/.helmignore new file mode 100644 index 0000000000..f0c1319444 --- /dev/null +++ b/charts/longhorn/104.2.1+up1.7.2/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/charts/longhorn/104.2.1+up1.7.2/Chart.yaml b/charts/longhorn/104.2.1+up1.7.2/Chart.yaml new file mode 100644 index 0000000000..5fec6946d7 --- /dev/null +++ b/charts/longhorn/104.2.1+up1.7.2/Chart.yaml @@ -0,0 +1,40 @@ +annotations: + catalog.cattle.io/auto-install: longhorn-crd=match + catalog.cattle.io/certified: rancher + catalog.cattle.io/display-name: Longhorn + catalog.cattle.io/kube-version: '>= 1.21.0-0' + catalog.cattle.io/namespace: longhorn-system + catalog.cattle.io/permits-os: linux,windows + catalog.cattle.io/provides-gvr: longhorn.io/v1beta1 + catalog.cattle.io/rancher-version: '>= 2.9.0-0 < 2.10.0-0' + catalog.cattle.io/release-name: longhorn + catalog.cattle.io/type: cluster-tool + catalog.cattle.io/upstream-version: 1.7.2 +apiVersion: v1 +appVersion: v1.7.2 +description: Longhorn is a distributed block storage system for Kubernetes. +home: https://github.com/longhorn/longhorn +icon: https://raw.githubusercontent.com/cncf/artwork/master/projects/longhorn/icon/color/longhorn-icon-color.png +keywords: +- longhorn +- storage +- distributed +- block +- device +- iscsi +- nfs +kubeVersion: '>=1.21.0-0' +maintainers: +- email: maintainers@longhorn.io + name: Longhorn maintainers +name: longhorn +sources: +- https://github.com/longhorn/longhorn +- https://github.com/longhorn/longhorn-engine +- https://github.com/longhorn/longhorn-instance-manager +- https://github.com/longhorn/longhorn-share-manager +- https://github.com/longhorn/longhorn-manager +- https://github.com/longhorn/longhorn-ui +- https://github.com/longhorn/longhorn-tests +- https://github.com/longhorn/backing-image-manager +version: 104.2.1+up1.7.2 diff --git a/charts/longhorn/104.2.1+up1.7.2/README.md b/charts/longhorn/104.2.1+up1.7.2/README.md new file mode 100644 index 0000000000..adb190be3b --- /dev/null +++ b/charts/longhorn/104.2.1+up1.7.2/README.md @@ -0,0 +1,50 @@ +# Longhorn Chart + +> **Important**: Please install the Longhorn chart in the `longhorn-system` namespace only. + +> **Warning**: Longhorn doesn't support downgrading from a higher version to a lower version. + +> **Note**: Use Helm 3 when installing and upgrading Longhorn. Helm 2 is [no longer supported](https://helm.sh/blog/helm-2-becomes-unsupported/). + +## Source Code + +Longhorn is 100% open source software. Project source code is spread across a number of repos: + +1. Longhorn Engine -- Core controller/replica logic https://github.com/longhorn/longhorn-engine +2. Longhorn Instance Manager -- Controller/replica instance lifecycle management https://github.com/longhorn/longhorn-instance-manager +3. Longhorn Share Manager -- NFS provisioner that exposes Longhorn volumes as ReadWriteMany volumes. https://github.com/longhorn/longhorn-share-manager +4. Backing Image Manager -- Backing image file lifecycle management. https://github.com/longhorn/backing-image-manager +5. Longhorn Manager -- Longhorn orchestration, includes CSI driver for Kubernetes https://github.com/longhorn/longhorn-manager +6. Longhorn UI -- Dashboard https://github.com/longhorn/longhorn-ui + +## Prerequisites + +1. A container runtime compatible with Kubernetes (Docker v1.13+, containerd v1.3.7+, etc.) +2. Kubernetes >= v1.21 +3. Make sure `bash`, `curl`, `findmnt`, `grep`, `awk` and `blkid` has been installed in all nodes of the Kubernetes cluster. +4. Make sure `open-iscsi` has been installed, and the `iscsid` daemon is running on all nodes of the Kubernetes cluster. For GKE, recommended Ubuntu as guest OS image since it contains `open-iscsi` already. + +## Upgrading to Kubernetes v1.25+ + +Starting in Kubernetes v1.25, [Pod Security Policies](https://kubernetes.io/docs/concepts/security/pod-security-policy/) have been removed from the Kubernetes API. + +As a result, **before upgrading to Kubernetes v1.25** (or on a fresh install in a Kubernetes v1.25+ cluster), users are expected to perform an in-place upgrade of this chart with `enablePSP` set to `false` if it has been previously set to `true`. + +> **Note:** +> If you upgrade your cluster to Kubernetes v1.25+ before removing PSPs via a `helm upgrade` (even if you manually clean up resources), **it will leave the Helm release in a broken state within the cluster such that further Helm operations will not work (`helm uninstall`, `helm upgrade`, etc.).** +> +> If your charts get stuck in this state, you may have to clean up your Helm release secrets. +Upon setting `enablePSP` to false, the chart will remove any PSP resources deployed on its behalf from the cluster. This is the default setting for this chart. + +As a replacement for PSPs, [Pod Security Admission](https://kubernetes.io/docs/concepts/security/pod-security-admission/) should be used. Please consult the Longhorn docs for more details on how to configure your chart release namespaces to work with the new Pod Security Admission and apply Pod Security Standards. + +## Uninstallation + +To prevent Longhorn from being accidentally uninstalled (which leads to data lost), we introduce a new setting, deleting-confirmation-flag. If this flag is **false**, the Longhorn uninstallation job will fail. Set this flag to **true** to allow Longhorn uninstallation. You can set this flag using setting page in Longhorn UI or `kubectl -n longhorn-system patch -p '{"value": "true"}' --type=merge lhs deleting-confirmation-flag` + +To prevent damage to the Kubernetes cluster, we recommend deleting all Kubernetes workloads using Longhorn volumes (PersistentVolume, PersistentVolumeClaim, StorageClass, Deployment, StatefulSet, DaemonSet, etc). + +From Rancher Cluster Explorer UI, navigate to Apps page, delete app `longhorn` then app `longhorn-crd` in Installed Apps tab. + +--- +Please see [link](https://github.com/longhorn/longhorn) for more information. diff --git a/charts/longhorn/104.2.1+up1.7.2/app-readme.md b/charts/longhorn/104.2.1+up1.7.2/app-readme.md new file mode 100644 index 0000000000..321e5193c4 --- /dev/null +++ b/charts/longhorn/104.2.1+up1.7.2/app-readme.md @@ -0,0 +1,27 @@ +# Longhorn + +Longhorn is a lightweight, reliable and easy to use distributed block storage system for Kubernetes. Once deployed, users can leverage persistent volumes provided by Longhorn. + +Longhorn creates a dedicated storage controller for each volume and synchronously replicates the volume across multiple replicas stored on multiple nodes. The storage controller and replicas are themselves orchestrated using Kubernetes. Longhorn supports snapshots, backups and even allows you to schedule recurring snapshots and backups! + +**Important**: Please install Longhorn chart in `longhorn-system` namespace only. + +**Warning**: Longhorn doesn't support downgrading from a higher version to a lower version. + +[Chart Documentation](https://github.com/longhorn/longhorn/blob/master/chart/README.md) + + +## Upgrading to Kubernetes v1.25+ + +Starting in Kubernetes v1.25, [Pod Security Policies](https://kubernetes.io/docs/concepts/security/pod-security-policy/) have been removed from the Kubernetes API. + +As a result, **before upgrading to Kubernetes v1.25** (or on a fresh install in a Kubernetes v1.25+ cluster), users are expected to perform an in-place upgrade of this chart with `enablePSP` set to `false` if it has been previously set to `true`. + +> **Note:** +> If you upgrade your cluster to Kubernetes v1.25+ before removing PSPs via a `helm upgrade` (even if you manually clean up resources), **it will leave the Helm release in a broken state within the cluster such that further Helm operations will not work (`helm uninstall`, `helm upgrade`, etc.).** +> +> If your charts get stuck in this state, please consult the Rancher docs on how to clean up your Helm release secrets. + +Upon setting `enablePSP` to false, the chart will remove any PSP resources deployed on its behalf from the cluster. This is the default setting for this chart. + +As a replacement for PSPs, [Pod Security Admission](https://kubernetes.io/docs/concepts/security/pod-security-admission/) should be used. Please consult the Rancher docs for more details on how to configure your chart release namespaces to work with the new Pod Security Admission and apply Pod Security Standards. \ No newline at end of file diff --git a/charts/longhorn/104.2.1+up1.7.2/questions.yaml b/charts/longhorn/104.2.1+up1.7.2/questions.yaml new file mode 100644 index 0000000000..89c8dbe105 --- /dev/null +++ b/charts/longhorn/104.2.1+up1.7.2/questions.yaml @@ -0,0 +1,974 @@ +categories: +- storage +namespace: longhorn-system +questions: +- variable: image.defaultImage + default: "true" + description: "Use default Longhorn images" + label: Use Default Images + type: boolean + show_subquestion_if: false + group: "Longhorn Images" + subquestions: + - variable: image.longhorn.manager.repository + default: rancher/mirrored-longhornio-longhorn-manager + description: "Repository for the Longhorn Manager image." + type: string + label: Longhorn Manager Image Repository + group: "Longhorn Images Settings" + - variable: image.longhorn.manager.tag + default: v1.7.2 + description: "Tag for the Longhorn Manager image." + type: string + label: Longhorn Manager Image Tag + group: "Longhorn Images Settings" + - variable: image.longhorn.engine.repository + default: rancher/mirrored-longhornio-longhorn-engine + description: "Repository for the Longhorn Engine image." + type: string + label: Longhorn Engine Image Repository + group: "Longhorn Images Settings" + - variable: image.longhorn.engine.tag + default: v1.7.2 + description: "Tag for the Longhorn Engine image." + type: string + label: Longhorn Engine Image Tag + group: "Longhorn Images Settings" + - variable: image.longhorn.ui.repository + default: rancher/mirrored-longhornio-longhorn-ui + description: "Repository for the Longhorn UI image." + type: string + label: Longhorn UI Image Repository + group: "Longhorn Images Settings" + - variable: image.longhorn.ui.tag + default: v1.7.2 + description: "Tag for the Longhorn UI image." + type: string + label: Longhorn UI Image Tag + group: "Longhorn Images Settings" + - variable: image.longhorn.instanceManager.repository + default: rancher/mirrored-longhornio-longhorn-instance-manager + description: "Repository for the Longhorn Instance Manager image." + type: string + label: Longhorn Instance Manager Image Repository + group: "Longhorn Images Settings" + - variable: image.longhorn.instanceManager.tag + default: v1.7.2 + description: "Tag for the Longhorn Instance Manager image." + type: string + label: Longhorn Instance Manager Image Tag + group: "Longhorn Images Settings" + - variable: image.longhorn.shareManager.repository + default: rancher/mirrored-longhornio-longhorn-share-manager + description: "Repository for the Longhorn Share Manager image." + type: string + label: Longhorn Share Manager Image Repository + group: "Longhorn Images Settings" + - variable: image.longhorn.shareManager.tag + default: v1.7.2 + description: "Tag for the Longhorn Share Manager image." + type: string + label: Longhorn Share Manager Image Tag + group: "Longhorn Images Settings" + - variable: image.longhorn.backingImageManager.repository + default: rancher/mirrored-longhornio-backing-image-manager + description: "Repository for the Backing Image Manager image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn Backing Image Manager Image Repository + group: "Longhorn Images Settings" + - variable: image.longhorn.backingImageManager.tag + default: v1.7.2 + description: "Tag for the Backing Image Manager image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn Backing Image Manager Image Tag + group: "Longhorn Images Settings" + - variable: image.longhorn.supportBundleKit.repository + default: rancher/mirrored-longhornio-support-bundle-kit + description: "Repository for the Longhorn Support Bundle Manager image." + type: string + label: Longhorn Support Bundle Kit Image Repository + group: "Longhorn Images Settings" + - variable: image.longhorn.supportBundleKit.tag + default: v0.0.45 + description: "Tag for the Longhorn Support Bundle Manager image." + type: string + label: Longhorn Support Bundle Kit Image Tag + group: "Longhorn Images Settings" + - variable: image.csi.attacher.repository + default: rancher/mirrored-longhornio-csi-attacher + description: "Repository for the CSI attacher image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn CSI Attacher Image Repository + group: "Longhorn CSI Driver Images" + - variable: image.csi.attacher.tag + default: v4.7.0 + description: "Tag for the CSI attacher image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn CSI Attacher Image Tag + group: "Longhorn CSI Driver Images" + - variable: image.csi.provisioner.repository + default: rancher/mirrored-longhornio-csi-provisioner + description: "Repository for the CSI Provisioner image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn CSI Provisioner Image Repository + group: "Longhorn CSI Driver Images" + - variable: image.csi.provisioner.tag + default: v4.0.1-20241007 + description: "Tag for the CSI Provisioner image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn CSI Provisioner Image Tag + group: "Longhorn CSI Driver Images" + - variable: image.csi.nodeDriverRegistrar.repository + default: rancher/mirrored-longhornio-csi-node-driver-registrar + description: "Repository for the CSI Node Driver Registrar image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn CSI Node Driver Registrar Image Repository + group: "Longhorn CSI Driver Images" + - variable: image.csi.nodeDriverRegistrar.tag + default: v2.12.0 + description: "Tag for the CSI Node Driver Registrar image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn CSI Node Driver Registrar Image Tag + group: "Longhorn CSI Driver Images" + - variable: image.csi.resizer.repository + default: rancher/mirrored-longhornio-csi-resizer + description: "Repository for the CSI Resizer image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn CSI Driver Resizer Image Repository + group: "Longhorn CSI Driver Images" + - variable: image.csi.resizer.tag + default: v1.12.0 + description: "Tag for the CSI Resizer image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn CSI Driver Resizer Image Tag + group: "Longhorn CSI Driver Images" + - variable: image.csi.snapshotter.repository + default: rancher/mirrored-longhornio-csi-snapshotter + description: "Repository for the CSI Snapshotter image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn CSI Driver Snapshotter Image Repository + group: "Longhorn CSI Driver Images" + - variable: image.csi.snapshotter.tag + default: v7.0.2-20241007 + description: "Tag for the CSI Snapshotter image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn CSI Driver Snapshotter Image Tag + group: "Longhorn CSI Driver Images" + - variable: image.csi.livenessProbe.repository + default: rancher/mirrored-longhornio-livenessprobe + description: "Repository for the CSI liveness probe image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn CSI Liveness Probe Image Repository + group: "Longhorn CSI Driver Images" + - variable: image.csi.livenessProbe.tag + default: v2.14.0 + description: "Tag for the CSI liveness probe image. When unspecified, Longhorn uses the default value." + type: string + label: Longhorn CSI Liveness Probe Image Tag + group: "Longhorn CSI Driver Images" +- variable: privateRegistry.registryUrl + label: Private registry URL + description: "URL of a private registry. When unspecified, Longhorn uses the default system registry." + group: "Private Registry Settings" + type: string + default: "" +- variable: privateRegistry.registrySecret + label: Private registry secret name + description: "Kubernetes secret that allows you to pull images from a private registry. This setting applies only when creation of private registry secrets is enabled. You must include the private registry name in the secret name." + group: "Private Registry Settings" + type: string + default: "" +- variable: privateRegistry.createSecret + default: "true" + description: "Setting that allows you to create a private registry secret." + type: boolean + group: "Private Registry Settings" + label: Create Secret for Private Registry Settings + show_subquestion_if: true + subquestions: + - variable: privateRegistry.registryUser + label: Private registry user + description: "User account used for authenticating with a private registry." + type: string + default: "" + - variable: privateRegistry.registryPasswd + label: Private registry password + description: "Password for authenticating with a private registry." + type: password + default: "" +- variable: longhorn.default_setting + default: "false" + description: "Customize the default settings before installing Longhorn for the first time. This option will only work if the cluster hasn't installed Longhorn." + label: "Customize Default Settings" + type: boolean + show_subquestion_if: true + group: "Longhorn Default Settings" + subquestions: + - variable: csi.kubeletRootDir + default: + description: "kubelet root directory. When unspecified, Longhorn uses the default value." + type: string + label: Kubelet Root Directory + group: "Longhorn CSI Driver Settings" + - variable: csi.attacherReplicaCount + type: int + default: 3 + min: 1 + max: 10 + description: "Replica count of the CSI Attacher. When unspecified, Longhorn uses the default value (\"3\")." + label: Longhorn CSI Attacher replica count + group: "Longhorn CSI Driver Settings" + - variable: csi.provisionerReplicaCount + type: int + default: 3 + min: 1 + max: 10 + description: "Replica count of the CSI Provisioner. When unspecified, Longhorn uses the default value (\"3\")." + label: Longhorn CSI Provisioner replica count + group: "Longhorn CSI Driver Settings" + - variable: csi.resizerReplicaCount + type: int + default: 3 + min: 1 + max: 10 + description: "Replica count of the CSI Resizer. When unspecified, Longhorn uses the default value (\"3\")." + label: Longhorn CSI Resizer replica count + group: "Longhorn CSI Driver Settings" + - variable: csi.snapshotterReplicaCount + type: int + default: 3 + min: 1 + max: 10 + description: "Replica count of the CSI Snapshotter. When unspecified, Longhorn uses the default value (\"3\")." + label: Longhorn CSI Snapshotter replica count + group: "Longhorn CSI Driver Settings" + - variable: defaultSettings.backupTarget + label: Backup Target + description: "Endpoint used to access the backupstore. (Options: \"NFS\", \"CIFS\", \"AWS\", \"GCP\", \"AZURE\")" + group: "Longhorn Default Settings" + type: string + default: + - variable: defaultSettings.backupTargetCredentialSecret + label: Backup Target Credential Secret + description: "Name of the Kubernetes secret associated with the backup target." + group: "Longhorn Default Settings" + type: string + default: + - variable: defaultSettings.allowRecurringJobWhileVolumeDetached + label: Allow Recurring Job While Volume Is Detached + description: 'Setting that allows Longhorn to automatically attach a volume and create snapshots or backups when recurring jobs are run.' + group: "Longhorn Default Settings" + type: boolean + default: "false" + - variable: defaultSettings.snapshotMaxCount + label: Snapshot Maximum Count + description: 'Maximum snapshot count for a volume. The value should be between 2 to 250.' + group: "Longhorn Default Settings" + type: int + min: 2 + max: 250 + default: 250 + - variable: defaultSettings.createDefaultDiskLabeledNodes + label: Create Default Disk on Labeled Nodes + description: 'Setting that allows Longhorn to automatically create a default disk only on nodes with the label "node.longhorn.io/create-default-disk=true" (if no other disks exist). When this setting is disabled, Longhorn creates a default disk on each node that is added to the cluster.' + group: "Longhorn Default Settings" + type: boolean + default: "false" + - variable: defaultSettings.defaultDataPath + label: Default Data Path + description: 'Default path for storing data on a host. The default value is "/var/lib/longhorn/".' + group: "Longhorn Default Settings" + type: string + default: "/var/lib/longhorn/" + - variable: defaultSettings.defaultDataLocality + label: Default Data Locality + description: 'Default data locality. A Longhorn volume has data locality if a local replica of the volume exists on the same node as the pod that is using the volume.' + group: "Longhorn Default Settings" + type: enum + options: + - "disabled" + - "best-effort" + default: "disabled" + - variable: defaultSettings.replicaSoftAntiAffinity + label: Replica Node Level Soft Anti-Affinity + description: 'Allow scheduling on nodes with existing healthy replicas of the same volume. By default, false.' + group: "Longhorn Default Settings" + type: boolean + default: "false" + - variable: defaultSettings.replicaAutoBalance + label: Replica Auto Balance + description: 'Enable this setting automatically re-balances replicas when discovered an available node.' + group: "Longhorn Default Settings" + type: enum + options: + - "disabled" + - "least-effort" + - "best-effort" + default: "disabled" + - variable: defaultSettings.storageOverProvisioningPercentage + label: Storage Over Provisioning Percentage + description: "Percentage of storage that can be allocated relative to hard drive capacity. The default value is 100." + group: "Longhorn Default Settings" + type: int + min: 0 + default: 100 + - variable: defaultSettings.storageMinimalAvailablePercentage + label: Storage Minimal Available Percentage + description: "If the minimum available disk capacity exceeds the actual percentage of available disk capacity, the disk becomes unschedulable until more space is freed up. By default, 25." + group: "Longhorn Default Settings" + type: int + min: 0 + max: 100 + default: 25 + - variable: defaultSettings.storageReservedPercentageForDefaultDisk + label: Storage Reserved Percentage For Default Disk + description: "The reserved percentage specifies the percentage of disk space that will not be allocated to the default disk on each new Longhorn node." + group: "Longhorn Default Settings" + type: int + min: 0 + max: 100 + default: 30 + - variable: defaultSettings.upgradeChecker + label: Enable Upgrade Checker + description: 'Upgrade Checker that periodically checks for new Longhorn versions. When a new version is available, a notification appears on the Longhorn UI. This setting is enabled by default.' + group: "Longhorn Default Settings" + type: boolean + default: "true" + - variable: defaultSettings.defaultReplicaCount + label: Default Replica Count + description: "Default number of replicas for volumes created using the Longhorn UI. For Kubernetes configuration, modify the `numberOfReplicas` field in the StorageClass. The default value is \"3\"." + group: "Longhorn Default Settings" + type: int + min: 1 + max: 20 + default: 3 + - variable: defaultSettings.defaultLonghornStaticStorageClass + label: Default Longhorn Static StorageClass Name + description: "Default Longhorn StorageClass. \"storageClassName\" is assigned to PVs and PVCs that are created for an existing Longhorn volume. \"storageClassName\" can also be used as a label, so it is possible to use a Longhorn StorageClass to bind a workload to an existing PV without creating a Kubernetes StorageClass object. The default value is \"longhorn-static\"." + group: "Longhorn Default Settings" + type: string + default: "longhorn-static" + - variable: defaultSettings.backupstorePollInterval + label: Backupstore Poll Interval + description: "Number of seconds that Longhorn waits before checking the backupstore for new backups. The default value is \"300\". When the value is \"0\", polling is disabled." + group: "Longhorn Default Settings" + type: int + min: 0 + default: 300 + - variable: defaultSettings.failedBackupTTL + label: Failed Backup Time to Live + description: "Number of minutes that Longhorn keeps a failed backup resource. When the value is \"0\", automatic deletion is disabled." + group: "Longhorn Default Settings" + type: int + min: 0 + default: 1440 + - variable: defaultSettings.restoreVolumeRecurringJobs + label: Restore Volume Recurring Jobs + description: "Restore recurring jobs from the backup volume on the backup target and create recurring jobs if not exist during a backup restoration." + group: "Longhorn Default Settings" + type: boolean + default: "false" + - variable: defaultSettings.recurringSuccessfulJobsHistoryLimit + label: Cronjob Successful Jobs History Limit + description: "This setting specifies how many successful backup or snapshot job histories should be retained. History will not be retained if the value is 0." + group: "Longhorn Default Settings" + type: int + min: 0 + default: 1 + - variable: defaultSettings.recurringFailedJobsHistoryLimit + label: Cronjob Failed Jobs History Limit + description: 'Maximum number of failed recurring backup and snapshot jobs to be retained. When the value is "0", a history of failed recurring jobs is not retained.' + group: "Longhorn Default Settings" + type: int + min: 0 + default: 1 + - variable: defaultSettings.recurringJobMaxRetention + label: Maximum Retention Number for Recurring Job + description: "Maximum number of snapshots or backups to be retained." + group: "Longhorn Default Settings" + type: int + default: 100 + - variable: defaultSettings.supportBundleFailedHistoryLimit + label: SupportBundle Failed History Limit + description: "This setting specifies how many failed support bundles can exist in the cluster. Set this value to **0** to have Longhorn automatically purge all failed support bundles." + group: "Longhorn Default Settings" + type: int + min: 0 + default: 1 + - variable: defaultSettings.autoSalvage + label: Automatic salvage + description: "Setting that allows Longhorn to automatically salvage volumes when all replicas become faulty (for example, when the network connection is interrupted). Longhorn determines which replicas are usable and then uses these replicas for the volume. This setting is enabled by default." + group: "Longhorn Default Settings" + type: boolean + default: "true" + - variable: defaultSettings.autoDeletePodWhenVolumeDetachedUnexpectedly + label: Automatically Delete Workload Pod when The Volume Is Detached Unexpectedly + description: 'Setting that allows Longhorn to automatically delete a workload pod that is managed by a controller (for example, daemonset) whenever a Longhorn volume is detached unexpectedly (for example, during Kubernetes upgrades). After deletion, the controller restarts the pod and then Kubernetes handles volume reattachment and remounting.' + group: "Longhorn Default Settings" + type: boolean + default: "true" + - variable: defaultSettings.disableSchedulingOnCordonedNode + label: Disable Scheduling On Cordoned Node + description: "Setting that prevents Longhorn Manager from scheduling replicas on a cordoned Kubernetes node. This setting is enabled by default." + group: "Longhorn Default Settings" + type: boolean + default: "true" + - variable: defaultSettings.replicaZoneSoftAntiAffinity + label: Replica Zone Level Soft Anti-Affinity + description: "Allow scheduling new Replicas of Volume to the Nodes in the same Zone as existing healthy Replicas. Nodes don't belong to any Zone will be treated as in the same Zone. Notice that Longhorn relies on label `topology.kubernetes.io/zone=` in the Kubernetes node object to identify the zone. By, default true." + group: "Longhorn Default Settings" + type: boolean + default: "true" + - variable: defaultSettings.replicaDiskSoftAntiAffinity + label: Replica Disk Level Soft Anti-Affinity + description: 'Allow scheduling on disks with existing healthy replicas of the same volume. By default, true.' + group: "Longhorn Default Settings" + type: boolean + default: "true" + - variable: defaultSettings.allowEmptyNodeSelectorVolume + label: Allow Empty Node Selector Volume + description: "Setting that allows scheduling of empty node selector volumes to any node." + group: "Longhorn Default Settings" + type: boolean + default: "true" + - variable: defaultSettings.allowEmptyDiskSelectorVolume + label: Allow Empty Disk Selector Volume + description: "Setting that allows scheduling of empty disk selector volumes to any disk." + group: "Longhorn Default Settings" + type: boolean + default: "true" + - variable: defaultSettings.nodeDownPodDeletionPolicy + label: Pod Deletion Policy When Node is Down + description: "Policy that defines the action Longhorn takes when a volume is stuck with a StatefulSet or Deployment pod on a node that failed." + group: "Longhorn Default Settings" + type: enum + options: + - "do-nothing" + - "delete-statefulset-pod" + - "delete-deployment-pod" + - "delete-both-statefulset-and-deployment-pod" + default: "do-nothing" + - variable: defaultSettings.nodeDrainPolicy + label: Node Drain Policy + description: "Policy that defines the action Longhorn takes when a node with the last healthy replica of a volume is drained." + group: "Longhorn Default Settings" + type: enum + options: + - "block-for-eviction" + - "block-for-eviction-if-contains-last-replica" + - "block-if-contains-last-replica" + - "allow-if-replica-is-stopped" + - "always-allow" + default: "block-if-contains-last-replica" + - variable: defaultSettings.detachManuallyAttachedVolumesWhenCordoned + label: Detach Manually Attached Volumes When Cordoned + description: "Setting that allows automatic detaching of manually-attached volumes when a node is cordoned." + group: "Longhorn Default Settings" + type: boolean + default: "false" + - variable: defaultSettings.priorityClass + label: Priority Class + description: "PriorityClass for system-managed Longhorn components. This setting can help prevent Longhorn components from being evicted under Node Pressure. Longhorn system contains user deployed components (E.g, Longhorn manager, Longhorn driver, Longhorn UI) and system managed components (E.g, instance manager, engine image, CSI driver, etc.) Note that this will be applied to Longhorn user-deployed components by default if there are no priority class values set yet, such as `longhornManager.priorityClass`. WARNING: DO NOT CHANGE THIS SETTING WITH ATTACHED VOLUMES." + group: "Longhorn Default Settings" + type: string + default: "longhorn-critical" + - variable: defaultSettings.replicaReplenishmentWaitInterval + label: Replica Replenishment Wait Interval + description: "The interval in seconds determines how long Longhorn will at least wait to reuse the existing data on a failed replica rather than directly creating a new replica for a degraded volume." + group: "Longhorn Default Settings" + type: int + min: 0 + default: 600 + - variable: defaultSettings.concurrentReplicaRebuildPerNodeLimit + label: Concurrent Replica Rebuild Per Node Limit + description: "Maximum number of replicas that can be concurrently rebuilt on each node. + WARNING: + - The old setting \"Disable Replica Rebuild\" is replaced by this setting. + - Different from relying on replica starting delay to limit the concurrent rebuilding, if the rebuilding is disabled, replica object replenishment will be directly skipped. + - When the value is 0, the eviction and data locality feature won't work. But this shouldn't have any impact to any current replica rebuild and backup restore." + group: "Longhorn Default Settings" + type: int + min: 0 + default: 5 + - variable: defaultSettings.concurrentVolumeBackupRestorePerNodeLimit + label: Concurrent Volume Backup Restore Per Node Limit + description: "Maximum number of volumes that can be concurrently restored on each node using a backup. When the value is \"0\", restoration of volumes using a backup is disabled." + group: "Longhorn Default Settings" + type: int + min: 0 + default: 5 + - variable: defaultSettings.disableRevisionCounter + label: Disable Revision Counter + description: "Setting that disables the revision counter and thereby prevents Longhorn from tracking all write operations to a volume. When salvaging a volume, Longhorn uses properties of the \"volume-head-xxx.img\" file (the last file size and the last time the file was modified) to select the replica to be used for volume recovery. This setting applies only to volumes created using the Longhorn UI." + group: "Longhorn Default Settings" + type: boolean + default: "true" + - variable: defaultSettings.systemManagedPodsImagePullPolicy + label: System Managed Pod Image Pull Policy + description: "Image pull policy for system-managed pods, such as Instance Manager, engine images, and CSI Driver. Changes to the image pull policy are applied only after the system-managed pods restart." + group: "Longhorn Default Settings" + type: enum + options: + - "if-not-present" + - "always" + - "never" + default: "if-not-present" + - variable: defaultSettings.allowVolumeCreationWithDegradedAvailability + label: Allow Volume Creation with Degraded Availability + description: "Setting that allows you to create and attach a volume without having all replicas scheduled at the time of creation." + group: "Longhorn Default Settings" + type: boolean + default: "true" + - variable: defaultSettings.autoCleanupSystemGeneratedSnapshot + label: Automatically Cleanup System Generated Snapshot + description: "Setting that allows Longhorn to automatically clean up the system-generated snapshot after replica rebuilding is completed." + group: "Longhorn Default Settings" + type: boolean + default: "true" + - variable: defaultSettings.autoCleanupRecurringJobBackupSnapshot + label: Automatically Cleanup Recurring Job Backup Snapshot + description: "Setting that allows Longhorn to automatically clean up the snapshot generated by a recurring backup job." + group: "Longhorn Default Settings" + type: boolean + default: "true" + - variable: defaultSettings.concurrentAutomaticEngineUpgradePerNodeLimit + label: Concurrent Automatic Engine Upgrade Per Node Limit + description: "Maximum number of engines that are allowed to concurrently upgrade on each node after Longhorn Manager is upgraded. When the value is \"0\", Longhorn does not automatically upgrade volume engines to the new default engine image version." + group: "Longhorn Default Settings" + type: int + min: 0 + default: 0 + - variable: defaultSettings.backingImageCleanupWaitInterval + label: Backing Image Cleanup Wait Interval + description: "Number of minutes that Longhorn waits before cleaning up the backing image file when no replicas in the disk are using it." + group: "Longhorn Default Settings" + type: int + min: 0 + default: 60 + - variable: defaultSettings.backingImageRecoveryWaitInterval + label: Backing Image Recovery Wait Interval + description: "Number of seconds that Longhorn waits before downloading a backing image file again when the status of all image disk files changes to \"failed\" or \"unknown\"." + group: "Longhorn Default Settings" + type: int + min: 0 + default: 300 + - variable: defaultSettings.guaranteedInstanceManagerCPU + label: Guaranteed Instance Manager CPU + description: "Percentage of the total allocatable CPU resources on each node to be reserved for each instance manager pod when the V1 Data Engine is enabled. The default value is \"12\". + WARNING: + - Value 0 means removing the CPU requests from spec of instance manager pods. + - Considering the possible number of new instance manager pods in a further system upgrade, this integer value ranges from 0 to 40. + - One more set of instance manager pods may need to be deployed when the Longhorn system is upgraded. If current available CPUs of the nodes are not enough for the new instance manager pods, you need to detach the volumes using the oldest instance manager pods so that Longhorn can clean up the old pods automatically and release the CPU resources. And the new pods with the latest instance manager image will be launched then. + - This global setting will be ignored for a node if the field \"InstanceManagerCPURequest\" on the node is set. + - After this setting is changed, all instance manager pods using this global setting on all the nodes will be automatically restarted. In other words, DO NOT CHANGE THIS SETTING WITH ATTACHED VOLUMES." + group: "Longhorn Default Settings" + type: int + min: 0 + max: 40 + default: 12 + - variable: defaultSettings.logLevel + label: Log Level + description: 'Log levels that indicate the type and severity of logs in Longhorn Manager. The default value is "Info". (Options: "Panic", "Fatal", "Error", "Warn", "Info", "Debug", "Trace")' + group: "Longhorn Default Settings" + type: string + default: "Info" + - variable: defaultSettings.disableSnapshotPurge + label: Disable Snapshot Purge + description: "Setting that temporarily prevents all attempts to purge volume snapshots." + group: "Longhorn Default Settings" + type: boolean + default: "false" + - variable: defaultSettings.freezeFilesystemForSnapshot + description: "Setting that freezes the filesystem on the root partition before a snapshot is created." + group: "Longhorn Default Settings" + type: boolean + default: "false" +- variable: defaultSettings.kubernetesClusterAutoscalerEnabled + label: Kubernetes Cluster Autoscaler Enabled (Experimental) + description: "Setting that notifies Longhorn that the cluster is using the Kubernetes Cluster Autoscaler. + WARNING: + - Replica rebuilding could be expensive because nodes with reusable replicas could get removed by the Kubernetes Cluster Autoscaler." + group: "Longhorn Default Settings" + type: boolean + default: false +- variable: defaultSettings.orphanAutoDeletion + label: Orphaned Data Cleanup + description: "Setting that allows Longhorn to automatically delete an orphaned resource and the corresponding data (for example, stale replicas). Orphaned resources on failed or unknown nodes are not automatically cleaned up." + group: "Longhorn Default Settings" + type: boolean + default: false +- variable: defaultSettings.storageNetwork + label: Storage Network + description: "Longhorn uses the storage network for in-cluster data traffic. Leave this blank to use the Kubernetes cluster network. + WARNING: + - This setting should change after detaching all Longhorn volumes, as some of the Longhorn system component pods will get recreated to apply the setting. Longhorn will try to block this setting update when there are attached volumes." + group: "Longhorn Default Settings" + type: string + default: +- variable: defaultSettings.deletingConfirmationFlag + label: Deleting Confirmation Flag + description: "Flag that prevents accidental uninstallation of Longhorn." + group: "Longhorn Default Settings" + type: boolean + default: "false" +- variable: defaultSettings.engineReplicaTimeout + label: Timeout between Engine and Replica + description: "Timeout between the Longhorn Engine and replicas. Specify a value between \"8\" and \"30\" seconds. The default value is \"8\"." + group: "Longhorn Default Settings" + type: int + default: "8" +- variable: defaultSettings.snapshotDataIntegrity + label: Snapshot Data Integrity + description: "This setting allows users to enable or disable snapshot hashing and data integrity checking." + group: "Longhorn Default Settings" + type: string + default: "disabled" +- variable: defaultSettings.snapshotDataIntegrityImmediateCheckAfterSnapshotCreation + label: Immediate Snapshot Data Integrity Check After Creating a Snapshot + description: "Hashing snapshot disk files impacts the performance of the system. The immediate snapshot hashing and checking can be disabled to minimize the impact after creating a snapshot." + group: "Longhorn Default Settings" + type: boolean + default: "false" +- variable: defaultSettings.snapshotDataIntegrityCronjob + label: Snapshot Data Integrity Check CronJob + description: "Unix-cron string format. The setting specifies when Longhorn checks the data integrity of snapshot disk files." + group: "Longhorn Default Settings" + type: string + default: "0 0 */7 * *" +- variable: defaultSettings.removeSnapshotsDuringFilesystemTrim + label: Remove Snapshots During Filesystem Trim + description: "This setting allows Longhorn filesystem trim feature to automatically mark the latest snapshot and its ancestors as removed and stops at the snapshot containing multiple children." + group: "Longhorn Default Settings" + type: boolean + default: "false" +- variable: defaultSettings.fastReplicaRebuildEnabled + label: Fast Replica Rebuild Enabled + description: "Setting that allows fast rebuilding of replicas using the checksum of snapshot disk files. Before enabling this setting, you must set the snapshot-data-integrity value to \"enable\" or \"fast-check\"." + group: "Longhorn Default Settings" + type: boolean + default: false +- variable: defaultSettings.replicaFileSyncHttpClientTimeout + label: Timeout of HTTP Client to Replica File Sync Server + description: "In seconds. The setting specifies the HTTP client timeout to the file sync server." + group: "Longhorn Default Settings" + type: int + default: "30" +- variable: defaultSettings.longGRPCTimeOut + label: Long gRPC Timeout + description: "Number of seconds that Longhorn allows for the completion of replica rebuilding and snapshot cloning operations." + group: "Longhorn Default Settings" + type: int + default: "86400" +- variable: defaultSettings.backupCompressionMethod + label: Backup Compression Method + description: "Setting that allows you to specify a backup compression method." + group: "Longhorn Default Settings" + type: string + default: "lz4" +- variable: defaultSettings.backupConcurrentLimit + label: Backup Concurrent Limit Per Backup + description: "Maximum number of worker threads that can concurrently run for each backup." + group: "Longhorn Default Settings" + type: int + min: 1 + default: 2 +- variable: defaultSettings.restoreConcurrentLimit + label: Restore Concurrent Limit Per Backup + description: "This setting controls how many worker threads per restore concurrently." + group: "Longhorn Default Settings" + type: int + min: 1 + default: 2 +- variable: defaultSettings.allowCollectingLonghornUsageMetrics + label: Allow Collecting Longhorn Usage Metrics + description: "Setting that allows Longhorn to periodically collect anonymous usage data for product improvement purposes. Longhorn sends collected data to the [Upgrade Responder](https://github.com/longhorn/upgrade-responder) server, which is the data source of the Longhorn Public Metrics Dashboard (https://metrics.longhorn.io). The Upgrade Responder server does not store data that can be used to identify clients, including IP addresses." + group: "Longhorn Default Settings" + type: boolean + default: true +- variable: defaultSettings.v1DataEngine + label: V1 Data Engine + description: "Setting that allows you to enable the V1 Data Engine." + group: "Longhorn V1 Data Engine Settings" + type: boolean + default: true +- variable: defaultSettings.v2DataEngine + label: V2 Data Engine + description: "Setting that allows you to enable the V2 Data Engine, which is based on the Storage Performance Development Kit (SPDK). The V2 Data Engine is a preview feature and should not be used in production environments. + WARNING: + - DO NOT CHANGE THIS SETTING WITH ATTACHED VOLUMES. Longhorn will block this setting update when there are attached volumes. + - When the V2 Data Engine is enabled, each instance-manager pod utilizes 1 CPU core. This high CPU usage is attributed to the spdk_tgt process running within each instance-manager pod. The spdk_tgt process is responsible for handling input/output (IO) operations and requires intensive polling. As a result, it consumes 100% of a dedicated CPU core to efficiently manage and process the IO requests, ensuring optimal performance and responsiveness for storage operations." + group: "Longhorn V2 Data Engine (Preview Feature) Settings" + type: boolean + default: false +- variable: defaultSettings.v2DataEngineHugepageLimit + label: V2 Data Engine + description: "This allows users to configure maximum huge page size (in MiB) for the V2 Data Engine." + group: "Longhorn V2 Data Engine (Preview Feature) Settings" + type: int + default: "2048" +- variable: defaultSettings.v2DataEngineLogLevel + label: V2 Data Engine + description: "Setting that allows you to configure the log level of the SPDK target daemon (spdk_tgt) of the V2 Data Engine." + group: "Longhorn V2 Data Engine (Preview Feature) Settings" + type: enum + options: + - "Disabled" + - "Error" + - "Warn" + - "Notice" + - "Info" + - "Debug" + default: "Notice" +- variable: defaultSettings.v2DataEngineLogFlags + label: V2 Data Engine + description: "Setting that allows you to configure the log flags of the SPDK target daemon (spdk_tgt) of the V2 Data Engine." + group: "Longhorn V2 Data Engine (Preview Feature) Settings" + type: string + default: +- variable: defaultSettings.autoCleanupSnapshotWhenDeleteBackup + label: Auto Cleanup Snapshot When Delete Backup + description: "Setting that automatically cleans up the snapshot when the backup is deleted." + group: "Longhorn Default Settings" + type: boolean + default: false +- variable: defaultSettings.rwxVolumeFastFailover + label: RWX Volume Fast Failover (Experimental) + description: "Turn on logic to detect and move RWX volumes quickly on node failure." + group: "Longhorn Default Settings" + type: boolean + default: false +- variable: persistence.defaultClass + default: "true" + description: "Setting that allows you to specify the default Longhorn StorageClass." + label: Default Storage Class + group: "Longhorn Storage Class Settings" + required: true + type: boolean +- variable: persistence.reclaimPolicy + label: Storage Class Retain Policy + description: "Reclaim policy that provides instructions for handling of a volume after its claim is released. (Options: \"Retain\", \"Delete\")" + group: "Longhorn Storage Class Settings" + required: true + type: enum + options: + - "Delete" + - "Retain" + default: "Delete" +- variable: persistence.disableRevisionCounter + label: Default Storage Class Disable Revision Counter + description: "Setting that disables the revision counter and thereby prevents Longhorn from tracking all write operations to a volume. When salvaging a volume, Longhorn uses properties of the volume-head-xxx.img file (the last file size and the last time the file was modified) to select the replica to be used for volume recovery. (Options: \"true\", \"false\")" + group: "Longhorn Storage Class Settings" + required: true + type: enum + options: + - "true" + - "false" + default: "true" +- variable: persistence.defaultClassReplicaCount + description: "Replica count of the default Longhorn StorageClass." + label: Default Storage Class Replica Count + group: "Longhorn Storage Class Settings" + type: int + min: 1 + max: 10 + default: 3 +- variable: persistence.defaultDataLocality + description: "Data locality of the default Longhorn StorageClass. (Options: \"disabled\", \"best-effort\")" + label: Default Storage Class Data Locality + group: "Longhorn Storage Class Settings" + type: enum + options: + - "disabled" + - "best-effort" + default: "disabled" +- variable: persistence.recurringJobSelector.enable + description: "Setting that allows you to enable the recurring job selector for a Longhorn StorageClass." + group: "Longhorn Storage Class Settings" + label: Enable Storage Class Recurring Job Selector + type: boolean + default: false + show_subquestion_if: true + subquestions: + - variable: persistence.recurringJobSelector.jobList + description: 'Recurring job selector for a Longhorn StorageClass. Ensure that quotes are used correctly when specifying job parameters. (Example: `[{"name":"backup", "isGroup":true}]`)' + label: Storage Class Recurring Job Selector List + group: "Longhorn Storage Class Settings" + type: string + default: +- variable: persistence.defaultDiskSelector.enable + description: "Setting that allows you to enable the disk selector for the default Longhorn StorageClass." + group: "Longhorn Storage Class Settings" + label: Enable Storage Class Disk Selector + type: boolean + default: false + show_subquestion_if: true + subquestions: + - variable: persistence.defaultDiskSelector.selector + label: Storage Class Disk Selector + description: 'Disk selector for the default Longhorn StorageClass. Longhorn uses only disks with the specified tags for storing volume data. (Examples: "nvme,sata")' + group: "Longhorn Storage Class Settings" + type: string + default: +- variable: persistence.defaultNodeSelector.enable + description: "Setting that allows you to enable the node selector for the default Longhorn StorageClass." + group: "Longhorn Storage Class Settings" + label: Enable Storage Class Node Selector + type: boolean + default: false + show_subquestion_if: true + subquestions: + - variable: persistence.defaultNodeSelector.selector + label: Storage Class Node Selector + description: 'Node selector for the default Longhorn StorageClass. Longhorn uses only nodes with the specified tags for storing volume data. (Examples: "storage,fast")' + group: "Longhorn Storage Class Settings" + type: string + default: +- variable: persistence.backingImage.enable + description: "Setting that allows you to use a backing image in a Longhorn StorageClass." + group: "Longhorn Storage Class Settings" + label: Default Storage Class Backing Image + type: boolean + default: false + show_subquestion_if: true + subquestions: + - variable: persistence.backingImage.name + description: 'Backing image to be used for creating and restoring volumes in a Longhorn StorageClass. When no backing images are available, specify the data source type and parameters that Longhorn can use to create a backing image.' + label: Storage Class Backing Image Name + group: "Longhorn Storage Class Settings" + type: string + default: + - variable: persistence.backingImage.expectedChecksum + description: 'Expected SHA-512 checksum of a backing image used in a Longhorn StorageClass. + WARNING: + - If the backing image name is not specified, setting this field is meaningless. + - It is not recommended to set this field if the data source type is \"export-from-volume\".' + label: Storage Class Backing Image Expected SHA512 Checksum + group: "Longhorn Storage Class Settings" + type: string + default: + - variable: persistence.backingImage.dataSourceType + description: 'Data source type of a backing image used in a Longhorn StorageClass. If the backing image exists in the cluster, Longhorn uses this setting to verify the image. If the backing image does not exist, Longhorn creates one using the specified data source type. + WARNING: + - If the backing image name is not specified, setting this field is meaningless. + - As for backing image creation with data source type \"upload\", it is recommended to do it via UI rather than StorageClass here. Uploading requires file data sending to the Longhorn backend after the object creation, which is complicated if you want to handle it manually.' + label: Storage Class Backing Image Data Source Type + group: "Longhorn Storage Class Settings" + type: enum + options: + - "" + - "download" + - "upload" + - "export-from-volume" + default: "" + - variable: persistence.backingImage.dataSourceParameters + description: "Data source parameters of a backing image used in a Longhorn StorageClass. You can specify a JSON string of a map. (Example: `'{\"url\":\"https://backing-image-example.s3-region.amazonaws.com/test-backing-image\"}'`) + WARNING: + - If the backing image name is not specified, setting this field is meaningless. + - Be careful of the quotes here." + label: Storage Class Backing Image Data Source Parameters + group: "Longhorn Storage Class Settings" + type: string + default: +- variable: persistence.removeSnapshotsDuringFilesystemTrim + description: "Setting that allows you to enable automatic snapshot removal during filesystem trim for a Longhorn StorageClass. (Options: \"ignored\", \"enabled\", \"disabled\")" + label: Default Storage Class Remove Snapshots During Filesystem Trim + group: "Longhorn Storage Class Settings" + type: enum + options: + - "ignored" + - "enabled" + - "disabled" + default: "ignored" +- variable: ingress.enabled + default: "false" + description: "Expose app using Layer 7 Load Balancer - ingress" + type: boolean + group: "Services and Load Balancing" + label: Expose app using Layer 7 Load Balancer + show_subquestion_if: true + subquestions: + - variable: ingress.host + default: "xip.io" + description: "Hostname of the Layer 7 load balancer." + type: hostname + required: true + label: Layer 7 Load Balancer Hostname + - variable: ingress.path + default: "/" + description: "Default ingress path. You can access the Longhorn UI by following the full ingress path {{host}}+{{path}}." + type: string + required: true + label: Ingress Path + - variable: ingress.pathType + default: "ImplementationSpecific" + description: "Path type for the ingress. (Options: \"ImplementationSpecific\", \"Exact\", \"Prefix\")" + type: enum + options: + - "ImplementationSpecific" + - "Exact" + - "Prefix" + required: true + label: Ingress Path Type +- variable: service.ui.type + default: "Rancher-Proxy" + description: "Service type for Longhorn UI. (Options: \"ClusterIP\", \"NodePort\", \"LoadBalancer\", \"Rancher-Proxy\")" + type: enum + options: + - "ClusterIP" + - "NodePort" + - "LoadBalancer" + - "Rancher-Proxy" + label: Longhorn UI Service + show_if: "ingress.enabled=false" + group: "Services and Load Balancing" + show_subquestion_if: "NodePort" + subquestions: + - variable: service.ui.nodePort + default: "" + description: "NodePort port number for Longhorn UI. When unspecified, Longhorn selects a free port between 30000 and 32767." + type: int + min: 30000 + max: 32767 + show_if: "service.ui.type=NodePort||service.ui.type=LoadBalancer" + label: UI Service NodePort number +- variable: enablePSP + default: "false" + description: "Setting that allows you to enable pod security policies (PSPs) that allow privileged Longhorn pods to start. This setting applies only to clusters running Kubernetes 1.25 and earlier, and with the built-in Pod Security admission controller enabled." + label: Pod Security Policy + type: boolean + group: "Other Settings" +- variable: global.cattle.windowsCluster.enabled + default: "false" + description: "Setting that allows Longhorn to run on a Rancher Windows cluster." + label: Rancher Windows Cluster + type: boolean + group: "Other Settings" +- variable: networkPolicies.enabled + description: "Setting that allows you to enable network policies that control access to Longhorn pods. + Warning: The Rancher Proxy will not work if this feature is enabled and a custom NetworkPolicy must be added." + group: "Other Settings" + label: Network Policies + default: "false" + type: boolean + subquestions: + - variable: networkPolicies.type + label: Network Policies for Ingress + description: "Distribution that determines the policy for allowing access for an ingress. (Options: \"k3s\", \"rke2\", \"rke1\")" + show_if: "networkPolicies.enabled=true&&ingress.enabled=true" + type: enum + default: "rke2" + options: + - "rke1" + - "rke2" + - "k3s" + - variable: defaultSettings.v2DataEngineGuaranteedInstanceManagerCPU + label: Guaranteed Instance Manager CPU for V2 Data Engine + description: 'Number of millicpus on each node to be reserved for each Instance Manager pod when the V2 Data Engine is enabled. The default value is "1250". + WARNING: + - Specifying a value of 0 disables CPU requests for instance manager pods. You must specify an integer between 1000 and 8000. + - This is a global setting. Modifying the value triggers an automatic restart of the instance manager pods. Do not modify the value while volumes are still attached." + group: "Longhorn Default Settings' + type: int + min: 1000 + max: 8000 + default: 1250 diff --git a/charts/longhorn/104.2.1+up1.7.2/templates/NOTES.txt b/charts/longhorn/104.2.1+up1.7.2/templates/NOTES.txt new file mode 100644 index 0000000000..cca7cd77b9 --- /dev/null +++ b/charts/longhorn/104.2.1+up1.7.2/templates/NOTES.txt @@ -0,0 +1,5 @@ +Longhorn is now installed on the cluster! + +Please wait a few minutes for other Longhorn components such as CSI deployments, Engine Images, and Instance Managers to be initialized. + +Visit our documentation at https://longhorn.io/docs/ diff --git a/charts/longhorn/104.2.1+up1.7.2/templates/_helpers.tpl b/charts/longhorn/104.2.1+up1.7.2/templates/_helpers.tpl new file mode 100644 index 0000000000..3fbc2ac02f --- /dev/null +++ b/charts/longhorn/104.2.1+up1.7.2/templates/_helpers.tpl @@ -0,0 +1,66 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "longhorn.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +*/}} +{{- define "longhorn.fullname" -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} + + +{{- define "longhorn.managerIP" -}} +{{- $fullname := (include "longhorn.fullname" .) -}} +{{- printf "http://%s-backend:9500" $fullname | trunc 63 | trimSuffix "-" -}} +{{- end -}} + + +{{- define "secret" }} +{{- printf "{\"auths\": {\"%s\": {\"auth\": \"%s\"}}}" .Values.privateRegistry.registryUrl (printf "%s:%s" .Values.privateRegistry.registryUser .Values.privateRegistry.registryPasswd | b64enc) | b64enc }} +{{- end }} + +{{- /* +longhorn.labels generates the standard Helm labels. +*/ -}} +{{- define "longhorn.labels" -}} +app.kubernetes.io/name: {{ template "longhorn.name" . }} +helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +app.kubernetes.io/instance: {{ .Release.Name }} +app.kubernetes.io/version: {{ .Chart.AppVersion }} +{{- end -}} + + +{{- define "system_default_registry" -}} +{{- if .Values.global.cattle.systemDefaultRegistry -}} +{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} +{{- else -}} +{{- "" -}} +{{- end -}} +{{- end -}} + +{{- define "registry_url" -}} +{{- if .Values.privateRegistry.registryUrl -}} +{{- printf "%s/" .Values.privateRegistry.registryUrl -}} +{{- else -}} +{{ include "system_default_registry" . }} +{{- end -}} +{{- end -}} + +{{- /* + define the longhorn release namespace +*/ -}} +{{- define "release_namespace" -}} +{{- if .Values.namespaceOverride -}} +{{- .Values.namespaceOverride -}} +{{- else -}} +{{- .Release.Namespace -}} +{{- end -}} +{{- end -}} diff --git a/charts/longhorn/104.2.1+up1.7.2/templates/clusterrole.yaml b/charts/longhorn/104.2.1+up1.7.2/templates/clusterrole.yaml new file mode 100644 index 0000000000..c065f1726c --- /dev/null +++ b/charts/longhorn/104.2.1+up1.7.2/templates/clusterrole.yaml @@ -0,0 +1,77 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: longhorn-role + labels: {{- include "longhorn.labels" . | nindent 4 }} +rules: +- apiGroups: + - apiextensions.k8s.io + resources: + - customresourcedefinitions + verbs: + - "*" +- apiGroups: [""] + resources: ["pods", "events", "persistentvolumes", "persistentvolumeclaims","persistentvolumeclaims/status", "nodes", "proxy/nodes", "pods/log", "secrets", "services", "endpoints", "configmaps", "serviceaccounts"] + verbs: ["*"] +- apiGroups: [""] + resources: ["namespaces"] + verbs: ["get", "list"] +- apiGroups: ["apps"] + resources: ["daemonsets", "statefulsets", "deployments"] + verbs: ["*"] +- apiGroups: ["batch"] + resources: ["jobs", "cronjobs"] + verbs: ["*"] +- apiGroups: ["policy"] + resources: ["poddisruptionbudgets", "podsecuritypolicies"] + verbs: ["*"] +- apiGroups: ["scheduling.k8s.io"] + resources: ["priorityclasses"] + verbs: ["watch", "list"] +- apiGroups: ["storage.k8s.io"] + resources: ["storageclasses", "volumeattachments", "volumeattachments/status", "csinodes", "csidrivers"] + verbs: ["*"] +- apiGroups: ["snapshot.storage.k8s.io"] + resources: ["volumesnapshotclasses", "volumesnapshots", "volumesnapshotcontents", "volumesnapshotcontents/status"] + verbs: ["*"] +- apiGroups: ["longhorn.io"] + resources: ["volumes", "volumes/status", "engines", "engines/status", "replicas", "replicas/status", "settings", "settings/status", + "engineimages", "engineimages/status", "nodes", "nodes/status", "instancemanagers", "instancemanagers/status", + {{- if .Values.openshift.enabled }} + "engineimages/finalizers", "nodes/finalizers", "instancemanagers/finalizers", + {{- end }} + "sharemanagers", "sharemanagers/status", "backingimages", "backingimages/status", + "backingimagemanagers", "backingimagemanagers/status", "backingimagedatasources", "backingimagedatasources/status", + "backuptargets", "backuptargets/status", "backupvolumes", "backupvolumes/status", "backups", "backups/status", + "recurringjobs", "recurringjobs/status", "orphans", "orphans/status", "snapshots", "snapshots/status", + "supportbundles", "supportbundles/status", "systembackups", "systembackups/status", "systemrestores", "systemrestores/status", + "volumeattachments", "volumeattachments/status", "backupbackingimages", "backupbackingimages/status"] + verbs: ["*"] +- apiGroups: ["coordination.k8s.io"] + resources: ["leases"] + verbs: ["*"] +- apiGroups: ["metrics.k8s.io"] + resources: ["pods", "nodes"] + verbs: ["get", "list"] +- apiGroups: ["apiregistration.k8s.io"] + resources: ["apiservices"] + verbs: ["list", "watch"] +- apiGroups: ["admissionregistration.k8s.io"] + resources: ["mutatingwebhookconfigurations", "validatingwebhookconfigurations"] + verbs: ["get", "list", "create", "patch", "delete"] +- apiGroups: ["rbac.authorization.k8s.io"] + resources: ["roles", "rolebindings", "clusterrolebindings", "clusterroles"] + verbs: ["*"] +{{- if .Values.openshift.enabled }} +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: longhorn-ocp-privileged-role + labels: {{- include "longhorn.labels" . | nindent 4 }} +rules: +- apiGroups: ["security.openshift.io"] + resources: ["securitycontextconstraints"] + resourceNames: ["anyuid", "privileged"] + verbs: ["use"] +{{- end }} diff --git a/charts/longhorn/104.2.1+up1.7.2/templates/clusterrolebinding.yaml b/charts/longhorn/104.2.1+up1.7.2/templates/clusterrolebinding.yaml new file mode 100644 index 0000000000..2e34f014ce --- /dev/null +++ b/charts/longhorn/104.2.1+up1.7.2/templates/clusterrolebinding.yaml @@ -0,0 +1,49 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: longhorn-bind + labels: {{- include "longhorn.labels" . | nindent 4 }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: longhorn-role +subjects: +- kind: ServiceAccount + name: longhorn-service-account + namespace: {{ include "release_namespace" . }} +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: longhorn-support-bundle + labels: {{- include "longhorn.labels" . | nindent 4 }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: cluster-admin +subjects: +- kind: ServiceAccount + name: longhorn-support-bundle + namespace: {{ include "release_namespace" . }} +{{- if .Values.openshift.enabled }} +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: longhorn-ocp-privileged-bind + labels: {{- include "longhorn.labels" . | nindent 4 }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: longhorn-ocp-privileged-role +subjects: +- kind: ServiceAccount + name: longhorn-service-account + namespace: {{ include "release_namespace" . }} +- kind: ServiceAccount + name: longhorn-ui-service-account + namespace: {{ include "release_namespace" . }} +- kind: ServiceAccount + name: default # supportbundle-agent-support-bundle uses default sa + namespace: {{ include "release_namespace" . }} +{{- end }} diff --git a/charts/longhorn/104.2.1+up1.7.2/templates/daemonset-sa.yaml b/charts/longhorn/104.2.1+up1.7.2/templates/daemonset-sa.yaml new file mode 100644 index 0000000000..af7c09a409 --- /dev/null +++ b/charts/longhorn/104.2.1+up1.7.2/templates/daemonset-sa.yaml @@ -0,0 +1,180 @@ +apiVersion: apps/v1 +kind: DaemonSet +metadata: + labels: {{- include "longhorn.labels" . | nindent 4 }} + app: longhorn-manager + name: longhorn-manager + namespace: {{ include "release_namespace" . }} +spec: + selector: + matchLabels: + app: longhorn-manager + template: + metadata: + labels: {{- include "longhorn.labels" . | nindent 8 }} + app: longhorn-manager + {{- with .Values.annotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + spec: + containers: + - name: longhorn-manager + image: {{ template "registry_url" . }}{{ .Values.image.longhorn.manager.repository }}:{{ .Values.image.longhorn.manager.tag }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + securityContext: + privileged: true + command: + - longhorn-manager + - -d + {{- if eq .Values.longhornManager.log.format "json" }} + - -j + {{- end }} + - daemon + - --engine-image + - "{{ template "registry_url" . }}{{ .Values.image.longhorn.engine.repository }}:{{ .Values.image.longhorn.engine.tag }}" + - --instance-manager-image + - "{{ template "registry_url" . }}{{ .Values.image.longhorn.instanceManager.repository }}:{{ .Values.image.longhorn.instanceManager.tag }}" + - --share-manager-image + - "{{ template "registry_url" . }}{{ .Values.image.longhorn.shareManager.repository }}:{{ .Values.image.longhorn.shareManager.tag }}" + - --backing-image-manager-image + - "{{ template "registry_url" . }}{{ .Values.image.longhorn.backingImageManager.repository }}:{{ .Values.image.longhorn.backingImageManager.tag }}" + - --support-bundle-manager-image + - "{{ template "registry_url" . }}{{ .Values.image.longhorn.supportBundleKit.repository }}:{{ .Values.image.longhorn.supportBundleKit.tag }}" + - --manager-image + - "{{ template "registry_url" . }}{{ .Values.image.longhorn.manager.repository }}:{{ .Values.image.longhorn.manager.tag }}" + - --service-account + - longhorn-service-account + {{- if .Values.preUpgradeChecker.upgradeVersionCheck}} + - --upgrade-version-check + {{- end }} + ports: + - containerPort: 9500 + name: manager + - containerPort: 9501 + name: conversion-wh + - containerPort: 9502 + name: admission-wh + - containerPort: 9503 + name: recov-backend + readinessProbe: + httpGet: + path: /v1/healthz + port: 9501 + scheme: HTTPS + volumeMounts: + - name: boot + mountPath: /host/boot/ + - name: dev + mountPath: /host/dev/ + - name: proc + mountPath: /host/proc/ + - name: longhorn + mountPath: /var/lib/longhorn/ + mountPropagation: Bidirectional + - name: longhorn-grpc-tls + mountPath: /tls-files/ + {{- if .Values.enableGoCoverDir }} + - name: go-cover-dir + mountPath: /go-cover-dir/ + {{- end }} + env: + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + {{- if .Values.enableGoCoverDir }} + - name: GOCOVERDIR + value: /go-cover-dir/ + {{- end }} + - name: pre-pull-share-manager-image + imagePullPolicy: {{ .Values.image.pullPolicy }} + image: {{ template "registry_url" . }}{{ .Values.image.longhorn.shareManager.repository }}:{{ .Values.image.longhorn.shareManager.tag }} + command: ["sh", "-c", "echo share-manager image pulled && sleep infinity"] + volumes: + - name: boot + hostPath: + path: /boot/ + - name: dev + hostPath: + path: /dev/ + - name: proc + hostPath: + path: /proc/ + - name: longhorn + hostPath: + path: /var/lib/longhorn/ + {{- if .Values.enableGoCoverDir }} + - name: go-cover-dir + hostPath: + path: /go-cover-dir/ + type: DirectoryOrCreate + {{- end }} + - name: longhorn-grpc-tls + secret: + secretName: longhorn-grpc-tls + optional: true + {{- if .Values.privateRegistry.registrySecret }} + imagePullSecrets: + - name: {{ .Values.privateRegistry.registrySecret }} + {{- end }} + {{- if .Values.longhornManager.priorityClass }} + priorityClassName: {{ .Values.longhornManager.priorityClass | quote }} + {{- end }} + {{- if or .Values.global.tolerations .Values.longhornManager.tolerations .Values.global.cattle.windowsCluster.enabled }} + tolerations: + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.tolerations }} +{{ toYaml .Values.global.cattle.windowsCluster.tolerations | indent 6 }} + {{- end }} + {{- if or .Values.global.tolerations .Values.longhornManager.tolerations }} +{{ default .Values.global.tolerations .Values.longhornManager.tolerations | toYaml | indent 6 }} + {{- end }} + {{- end }} + {{- if or .Values.global.nodeSelector .Values.longhornManager.nodeSelector .Values.global.cattle.windowsCluster.enabled }} + nodeSelector: + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.nodeSelector }} +{{ toYaml .Values.global.cattle.windowsCluster.nodeSelector | indent 8 }} + {{- end }} + {{- if or .Values.global.nodeSelector .Values.longhornManager.nodeSelector }} +{{ default .Values.global.nodeSelector .Values.longhornManager.nodeSelector | toYaml | indent 8 }} + {{- end }} + {{- end }} + serviceAccountName: longhorn-service-account + updateStrategy: + rollingUpdate: + maxUnavailable: "100%" +--- +apiVersion: v1 +kind: Service +metadata: + labels: {{- include "longhorn.labels" . | nindent 4 }} + app: longhorn-manager + name: longhorn-backend + namespace: {{ include "release_namespace" . }} + {{- if .Values.longhornManager.serviceAnnotations }} + annotations: +{{ toYaml .Values.longhornManager.serviceAnnotations | indent 4 }} + {{- end }} +spec: + type: {{ .Values.service.manager.type }} + selector: + app: longhorn-manager + ports: + - name: manager + port: 9500 + targetPort: manager + {{- if .Values.service.manager.nodePort }} + nodePort: {{ .Values.service.manager.nodePort }} + {{- end }} diff --git a/charts/longhorn/104.2.1+up1.7.2/templates/default-setting.yaml b/charts/longhorn/104.2.1+up1.7.2/templates/default-setting.yaml new file mode 100644 index 0000000000..315cdc6ec9 --- /dev/null +++ b/charts/longhorn/104.2.1+up1.7.2/templates/default-setting.yaml @@ -0,0 +1,244 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: longhorn-default-setting + namespace: {{ include "release_namespace" . }} + labels: {{- include "longhorn.labels" . | nindent 4 }} +data: + default-setting.yaml: |- + {{- if not (kindIs "invalid" .Values.defaultSettings.backupTarget) }} + backup-target: {{ .Values.defaultSettings.backupTarget }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.backupTargetCredentialSecret) }} + backup-target-credential-secret: {{ .Values.defaultSettings.backupTargetCredentialSecret }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.allowRecurringJobWhileVolumeDetached) }} + allow-recurring-job-while-volume-detached: {{ .Values.defaultSettings.allowRecurringJobWhileVolumeDetached }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.createDefaultDiskLabeledNodes) }} + create-default-disk-labeled-nodes: {{ .Values.defaultSettings.createDefaultDiskLabeledNodes }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.defaultDataPath) }} + default-data-path: {{ .Values.defaultSettings.defaultDataPath }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.replicaSoftAntiAffinity) }} + replica-soft-anti-affinity: {{ .Values.defaultSettings.replicaSoftAntiAffinity }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.replicaAutoBalance) }} + replica-auto-balance: {{ .Values.defaultSettings.replicaAutoBalance }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.storageOverProvisioningPercentage) }} + storage-over-provisioning-percentage: {{ .Values.defaultSettings.storageOverProvisioningPercentage }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.storageMinimalAvailablePercentage) }} + storage-minimal-available-percentage: {{ .Values.defaultSettings.storageMinimalAvailablePercentage }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.storageReservedPercentageForDefaultDisk) }} + storage-reserved-percentage-for-default-disk: {{ .Values.defaultSettings.storageReservedPercentageForDefaultDisk }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.upgradeChecker) }} + upgrade-checker: {{ .Values.defaultSettings.upgradeChecker }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.defaultReplicaCount) }} + default-replica-count: {{ .Values.defaultSettings.defaultReplicaCount }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.defaultDataLocality) }} + default-data-locality: {{ .Values.defaultSettings.defaultDataLocality }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.defaultLonghornStaticStorageClass) }} + default-longhorn-static-storage-class: {{ .Values.defaultSettings.defaultLonghornStaticStorageClass }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.backupstorePollInterval) }} + backupstore-poll-interval: {{ .Values.defaultSettings.backupstorePollInterval }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.failedBackupTTL) }} + failed-backup-ttl: {{ .Values.defaultSettings.failedBackupTTL }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.restoreVolumeRecurringJobs) }} + restore-volume-recurring-jobs: {{ .Values.defaultSettings.restoreVolumeRecurringJobs }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.recurringSuccessfulJobsHistoryLimit) }} + recurring-successful-jobs-history-limit: {{ .Values.defaultSettings.recurringSuccessfulJobsHistoryLimit }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.recurringJobMaxRetention) }} + recurring-job-max-retention: {{ .Values.defaultSettings.recurringJobMaxRetention }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.recurringFailedJobsHistoryLimit) }} + recurring-failed-jobs-history-limit: {{ .Values.defaultSettings.recurringFailedJobsHistoryLimit }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.supportBundleFailedHistoryLimit) }} + support-bundle-failed-history-limit: {{ .Values.defaultSettings.supportBundleFailedHistoryLimit }} + {{- end }} + {{- if or (not (kindIs "invalid" .Values.defaultSettings.taintToleration)) (.Values.global.cattle.windowsCluster.enabled) }} + taint-toleration: {{ $windowsDefaultSettingTaintToleration := list }}{{ $defaultSettingTaintToleration := list -}} + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.defaultSetting.taintToleration -}} + {{- $windowsDefaultSettingTaintToleration = .Values.global.cattle.windowsCluster.defaultSetting.taintToleration -}} + {{- end -}} + {{- if not (kindIs "invalid" .Values.defaultSettings.taintToleration) -}} + {{- $defaultSettingTaintToleration = .Values.defaultSettings.taintToleration -}} + {{- end -}} + {{- $taintToleration := list $windowsDefaultSettingTaintToleration $defaultSettingTaintToleration }}{{ join ";" (compact $taintToleration) -}} + {{- end }} + {{- if or (not (kindIs "invalid" .Values.defaultSettings.systemManagedComponentsNodeSelector)) (.Values.global.cattle.windowsCluster.enabled) }} + system-managed-components-node-selector: {{ $windowsDefaultSettingNodeSelector := list }}{{ $defaultSettingNodeSelector := list -}} + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.defaultSetting.systemManagedComponentsNodeSelector -}} + {{ $windowsDefaultSettingNodeSelector = .Values.global.cattle.windowsCluster.defaultSetting.systemManagedComponentsNodeSelector -}} + {{- end -}} + {{- if not (kindIs "invalid" .Values.defaultSettings.systemManagedComponentsNodeSelector) -}} + {{- $defaultSettingNodeSelector = .Values.defaultSettings.systemManagedComponentsNodeSelector -}} + {{- end -}} + {{- $nodeSelector := list $windowsDefaultSettingNodeSelector $defaultSettingNodeSelector }}{{ join ";" (compact $nodeSelector) -}} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.priorityClass) }} + priority-class: {{ .Values.defaultSettings.priorityClass }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.autoSalvage) }} + auto-salvage: {{ .Values.defaultSettings.autoSalvage }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.autoDeletePodWhenVolumeDetachedUnexpectedly) }} + auto-delete-pod-when-volume-detached-unexpectedly: {{ .Values.defaultSettings.autoDeletePodWhenVolumeDetachedUnexpectedly }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.disableSchedulingOnCordonedNode) }} + disable-scheduling-on-cordoned-node: {{ .Values.defaultSettings.disableSchedulingOnCordonedNode }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.replicaZoneSoftAntiAffinity) }} + replica-zone-soft-anti-affinity: {{ .Values.defaultSettings.replicaZoneSoftAntiAffinity }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.replicaDiskSoftAntiAffinity) }} + replica-disk-soft-anti-affinity: {{ .Values.defaultSettings.replicaDiskSoftAntiAffinity }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.nodeDownPodDeletionPolicy) }} + node-down-pod-deletion-policy: {{ .Values.defaultSettings.nodeDownPodDeletionPolicy }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.nodeDrainPolicy) }} + node-drain-policy: {{ .Values.defaultSettings.nodeDrainPolicy }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.detachManuallyAttachedVolumesWhenCordoned) }} + detach-manually-attached-volumes-when-cordoned: {{ .Values.defaultSettings.detachManuallyAttachedVolumesWhenCordoned }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.replicaReplenishmentWaitInterval) }} + replica-replenishment-wait-interval: {{ .Values.defaultSettings.replicaReplenishmentWaitInterval }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.concurrentReplicaRebuildPerNodeLimit) }} + concurrent-replica-rebuild-per-node-limit: {{ .Values.defaultSettings.concurrentReplicaRebuildPerNodeLimit }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.concurrentVolumeBackupRestorePerNodeLimit) }} + concurrent-volume-backup-restore-per-node-limit: {{ .Values.defaultSettings.concurrentVolumeBackupRestorePerNodeLimit }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.disableRevisionCounter) }} + disable-revision-counter: {{ .Values.defaultSettings.disableRevisionCounter }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.systemManagedPodsImagePullPolicy) }} + system-managed-pods-image-pull-policy: {{ .Values.defaultSettings.systemManagedPodsImagePullPolicy }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.allowVolumeCreationWithDegradedAvailability) }} + allow-volume-creation-with-degraded-availability: {{ .Values.defaultSettings.allowVolumeCreationWithDegradedAvailability }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.autoCleanupSystemGeneratedSnapshot) }} + auto-cleanup-system-generated-snapshot: {{ .Values.defaultSettings.autoCleanupSystemGeneratedSnapshot }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.autoCleanupRecurringJobBackupSnapshot) }} + auto-cleanup-recurring-job-backup-snapshot: {{ .Values.defaultSettings.autoCleanupRecurringJobBackupSnapshot }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.concurrentAutomaticEngineUpgradePerNodeLimit) }} + concurrent-automatic-engine-upgrade-per-node-limit: {{ .Values.defaultSettings.concurrentAutomaticEngineUpgradePerNodeLimit }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.backingImageCleanupWaitInterval) }} + backing-image-cleanup-wait-interval: {{ .Values.defaultSettings.backingImageCleanupWaitInterval }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.backingImageRecoveryWaitInterval) }} + backing-image-recovery-wait-interval: {{ .Values.defaultSettings.backingImageRecoveryWaitInterval }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.guaranteedInstanceManagerCPU) }} + guaranteed-instance-manager-cpu: {{ .Values.defaultSettings.guaranteedInstanceManagerCPU }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.kubernetesClusterAutoscalerEnabled) }} + kubernetes-cluster-autoscaler-enabled: {{ .Values.defaultSettings.kubernetesClusterAutoscalerEnabled }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.orphanAutoDeletion) }} + orphan-auto-deletion: {{ .Values.defaultSettings.orphanAutoDeletion }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.storageNetwork) }} + storage-network: {{ .Values.defaultSettings.storageNetwork }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.deletingConfirmationFlag) }} + deleting-confirmation-flag: {{ .Values.defaultSettings.deletingConfirmationFlag }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.engineReplicaTimeout) }} + engine-replica-timeout: {{ .Values.defaultSettings.engineReplicaTimeout }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.snapshotDataIntegrity) }} + snapshot-data-integrity: {{ .Values.defaultSettings.snapshotDataIntegrity }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.snapshotDataIntegrityImmediateCheckAfterSnapshotCreation) }} + snapshot-data-integrity-immediate-check-after-snapshot-creation: {{ .Values.defaultSettings.snapshotDataIntegrityImmediateCheckAfterSnapshotCreation }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.snapshotDataIntegrityCronjob) }} + snapshot-data-integrity-cronjob: {{ .Values.defaultSettings.snapshotDataIntegrityCronjob }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.removeSnapshotsDuringFilesystemTrim) }} + remove-snapshots-during-filesystem-trim: {{ .Values.defaultSettings.removeSnapshotsDuringFilesystemTrim }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.fastReplicaRebuildEnabled) }} + fast-replica-rebuild-enabled: {{ .Values.defaultSettings.fastReplicaRebuildEnabled }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.replicaFileSyncHttpClientTimeout) }} + replica-file-sync-http-client-timeout: {{ .Values.defaultSettings.replicaFileSyncHttpClientTimeout }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.longGRPCTimeOut) }} + long-grpc-timeout: {{ .Values.defaultSettings.longGRPCTimeOut }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.logLevel) }} + log-level: {{ .Values.defaultSettings.logLevel }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.backupCompressionMethod) }} + backup-compression-method: {{ .Values.defaultSettings.backupCompressionMethod }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.backupConcurrentLimit) }} + backup-concurrent-limit: {{ .Values.defaultSettings.backupConcurrentLimit }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.restoreConcurrentLimit) }} + restore-concurrent-limit: {{ .Values.defaultSettings.restoreConcurrentLimit }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.v1DataEngine) }} + v1-data-engine: {{ .Values.defaultSettings.v1DataEngine }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.v2DataEngine) }} + v2-data-engine: {{ .Values.defaultSettings.v2DataEngine }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.v2DataEngineHugepageLimit) }} + v2-data-engine-hugepage-limit: {{ .Values.defaultSettings.v2DataEngineHugepageLimit }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.allowEmptyNodeSelectorVolume) }} + allow-empty-node-selector-volume: {{ .Values.defaultSettings.allowEmptyNodeSelectorVolume }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.allowEmptyDiskSelectorVolume) }} + allow-empty-disk-selector-volume: {{ .Values.defaultSettings.allowEmptyDiskSelectorVolume }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.allowCollectingLonghornUsageMetrics) }} + allow-collecting-longhorn-usage-metrics: {{ .Values.defaultSettings.allowCollectingLonghornUsageMetrics }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.disableSnapshotPurge) }} + disable-snapshot-purge: {{ .Values.defaultSettings.disableSnapshotPurge }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.v2DataEngineGuaranteedInstanceManagerCPU) }} + v2-data-engine-guaranteed-instance-manager-cpu: {{ .Values.defaultSettings.v2DataEngineGuaranteedInstanceManagerCPU }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.snapshotMaxCount) }} + snapshot-max-count: {{ .Values.defaultSettings.snapshotMaxCount }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.v2DataEngineLogLevel) }} + v2-data-engine-log-level: {{ .Values.defaultSettings.v2DataEngineLogLevel }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.v2DataEngineLogFlags) }} + v2-data-engine-log-flags: {{ .Values.defaultSettings.v2DataEngineLogFlags }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.freezeFilesystemForSnapshot) }} + freeze-filesystem-for-snapshot: {{ .Values.defaultSettings.freezeFilesystemForSnapshot }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.autoCleanupSnapshotWhenDeleteBackup) }} + auto-cleanup-when-delete-backup: {{ .Values.defaultSettings.autoCleanupSnapshotWhenDeleteBackup }} + {{- end }} + {{- if not (kindIs "invalid" .Values.defaultSettings.rwxVolumeFastFailover) }} + rwx-volume-fast-failover: {{ .Values.defaultSettings.rwxVolumeFastFailover}} + {{- end }} diff --git a/charts/longhorn/104.2.1+up1.7.2/templates/deployment-driver.yaml b/charts/longhorn/104.2.1+up1.7.2/templates/deployment-driver.yaml new file mode 100644 index 0000000000..3ac582dcbc --- /dev/null +++ b/charts/longhorn/104.2.1+up1.7.2/templates/deployment-driver.yaml @@ -0,0 +1,132 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: longhorn-driver-deployer + namespace: {{ include "release_namespace" . }} + labels: {{- include "longhorn.labels" . | nindent 4 }} +spec: + replicas: 1 + selector: + matchLabels: + app: longhorn-driver-deployer + template: + metadata: + labels: {{- include "longhorn.labels" . | nindent 8 }} + app: longhorn-driver-deployer + spec: + initContainers: + - name: wait-longhorn-manager + image: {{ template "registry_url" . }}{{ .Values.image.longhorn.manager.repository }}:{{ .Values.image.longhorn.manager.tag }} + command: ['sh', '-c', 'while [ $(curl -m 1 -s -o /dev/null -w "%{http_code}" http://longhorn-backend:9500/v1) != "200" ]; do echo waiting; sleep 2; done'] + containers: + - name: longhorn-driver-deployer + image: {{ template "registry_url" . }}{{ .Values.image.longhorn.manager.repository }}:{{ .Values.image.longhorn.manager.tag }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + command: + - longhorn-manager + - -d + - deploy-driver + - --manager-image + - "{{ template "registry_url" . }}{{ .Values.image.longhorn.manager.repository }}:{{ .Values.image.longhorn.manager.tag }}" + - --manager-url + - http://longhorn-backend:9500/v1 + env: + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + - name: SERVICE_ACCOUNT + valueFrom: + fieldRef: + fieldPath: spec.serviceAccountName + {{- if .Values.csi.kubeletRootDir }} + - name: KUBELET_ROOT_DIR + value: {{ .Values.csi.kubeletRootDir }} + {{- end }} + {{- if and .Values.image.csi.attacher.repository .Values.image.csi.attacher.tag }} + - name: CSI_ATTACHER_IMAGE + value: "{{ template "registry_url" . }}{{ .Values.image.csi.attacher.repository }}:{{ .Values.image.csi.attacher.tag }}" + {{- end }} + {{- if and .Values.image.csi.provisioner.repository .Values.image.csi.provisioner.tag }} + - name: CSI_PROVISIONER_IMAGE + value: "{{ template "registry_url" . }}{{ .Values.image.csi.provisioner.repository }}:{{ .Values.image.csi.provisioner.tag }}" + {{- end }} + {{- if and .Values.image.csi.nodeDriverRegistrar.repository .Values.image.csi.nodeDriverRegistrar.tag }} + - name: CSI_NODE_DRIVER_REGISTRAR_IMAGE + value: "{{ template "registry_url" . }}{{ .Values.image.csi.nodeDriverRegistrar.repository }}:{{ .Values.image.csi.nodeDriverRegistrar.tag }}" + {{- end }} + {{- if and .Values.image.csi.resizer.repository .Values.image.csi.resizer.tag }} + - name: CSI_RESIZER_IMAGE + value: "{{ template "registry_url" . }}{{ .Values.image.csi.resizer.repository }}:{{ .Values.image.csi.resizer.tag }}" + {{- end }} + {{- if and .Values.image.csi.snapshotter.repository .Values.image.csi.snapshotter.tag }} + - name: CSI_SNAPSHOTTER_IMAGE + value: "{{ template "registry_url" . }}{{ .Values.image.csi.snapshotter.repository }}:{{ .Values.image.csi.snapshotter.tag }}" + {{- end }} + {{- if and .Values.image.csi.livenessProbe.repository .Values.image.csi.livenessProbe.tag }} + - name: CSI_LIVENESS_PROBE_IMAGE + value: "{{ template "registry_url" . }}{{ .Values.image.csi.livenessProbe.repository }}:{{ .Values.image.csi.livenessProbe.tag }}" + {{- end }} + {{- if .Values.csi.attacherReplicaCount }} + - name: CSI_ATTACHER_REPLICA_COUNT + value: {{ .Values.csi.attacherReplicaCount | quote }} + {{- end }} + {{- if .Values.csi.provisionerReplicaCount }} + - name: CSI_PROVISIONER_REPLICA_COUNT + value: {{ .Values.csi.provisionerReplicaCount | quote }} + {{- end }} + {{- if .Values.csi.resizerReplicaCount }} + - name: CSI_RESIZER_REPLICA_COUNT + value: {{ .Values.csi.resizerReplicaCount | quote }} + {{- end }} + {{- if .Values.csi.snapshotterReplicaCount }} + - name: CSI_SNAPSHOTTER_REPLICA_COUNT + value: {{ .Values.csi.snapshotterReplicaCount | quote }} + {{- end }} + {{- if .Values.enableGoCoverDir }} + - name: GOCOVERDIR + value: /go-cover-dir/ + volumeMounts: + - name: go-cover-dir + mountPath: /go-cover-dir/ + {{- end }} + + {{- if .Values.privateRegistry.registrySecret }} + imagePullSecrets: + - name: {{ .Values.privateRegistry.registrySecret }} + {{- end }} + {{- if .Values.longhornDriver.priorityClass }} + priorityClassName: {{ .Values.longhornDriver.priorityClass | quote }} + {{- end }} + {{- if or .Values.global.tolerations .Values.longhornDriver.tolerations .Values.global.cattle.windowsCluster.enabled }} + tolerations: + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.tolerations }} +{{ toYaml .Values.global.cattle.windowsCluster.tolerations | indent 6 }} + {{- end }} + {{- if or .Values.global.tolerations .Values.longhornDriver.tolerations }} +{{ default .Values.global.tolerations .Values.longhornDriver.tolerations | toYaml | indent 6 }} + {{- end }} + {{- end }} + {{- if or .Values.global.nodeSelector .Values.longhornDriver.nodeSelector .Values.global.cattle.windowsCluster.enabled }} + nodeSelector: + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.nodeSelector }} +{{ toYaml .Values.global.cattle.windowsCluster.nodeSelector | indent 8 }} + {{- end }} + {{- if or .Values.global.nodeSelector .Values.longhornDriver.nodeSelector }} +{{ default .Values.global.nodeSelector .Values.longhornDriver.nodeSelector | toYaml | indent 8 }} + {{- end }} + {{- end }} + serviceAccountName: longhorn-service-account + securityContext: + runAsUser: 0 + {{- if .Values.enableGoCoverDir }} + volumes: + - name: go-cover-dir + hostPath: + path: /go-cover-dir/ + type: DirectoryOrCreate + {{- end }} diff --git a/charts/longhorn/104.2.1+up1.7.2/templates/deployment-ui.yaml b/charts/longhorn/104.2.1+up1.7.2/templates/deployment-ui.yaml new file mode 100644 index 0000000000..e4f3e0f8f7 --- /dev/null +++ b/charts/longhorn/104.2.1+up1.7.2/templates/deployment-ui.yaml @@ -0,0 +1,186 @@ +{{- if .Values.openshift.enabled }} +{{- if .Values.openshift.ui.route }} +# https://github.com/openshift/oauth-proxy/blob/master/contrib/sidecar.yaml +# Create a proxy service account and ensure it will use the route "proxy" +# Create a secure connection to the proxy via a route +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + labels: {{- include "longhorn.labels" . | nindent 4 }} + app: longhorn-ui + name: {{ .Values.openshift.ui.route }} + namespace: {{ include "release_namespace" . }} +spec: + to: + kind: Service + name: longhorn-ui + tls: + termination: reencrypt +--- +apiVersion: v1 +kind: Service +metadata: + labels: {{- include "longhorn.labels" . | nindent 4 }} + app: longhorn-ui + name: longhorn-ui + namespace: {{ include "release_namespace" . }} + annotations: + service.alpha.openshift.io/serving-cert-secret-name: longhorn-ui-tls +spec: + ports: + - name: longhorn-ui + port: {{ .Values.openshift.ui.port | default 443 }} + targetPort: {{ .Values.openshift.ui.proxy | default 8443 }} + selector: + app: longhorn-ui +--- +{{- end }} +{{- end }} +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: {{- include "longhorn.labels" . | nindent 4 }} + app: longhorn-ui + name: longhorn-ui + namespace: {{ include "release_namespace" . }} +spec: + replicas: {{ .Values.longhornUI.replicas }} + selector: + matchLabels: + app: longhorn-ui + template: + metadata: + labels: {{- include "longhorn.labels" . | nindent 8 }} + app: longhorn-ui + spec: + serviceAccountName: longhorn-ui-service-account + affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 1 + podAffinityTerm: + labelSelector: + matchExpressions: + - key: app + operator: In + values: + - longhorn-ui + topologyKey: kubernetes.io/hostname + containers: + {{- if .Values.openshift.enabled }} + {{- if .Values.openshift.ui.route }} + - name: oauth-proxy + {{- if .Values.image.openshift.oauthProxy.repository }} + image: {{ template "registry_url" . }}{{ .Values.image.openshift.oauthProxy.repository }}:{{ .Values.image.openshift.oauthProxy.tag }} + {{- else }} + image: "" + {{- end }} + imagePullPolicy: IfNotPresent + ports: + - containerPort: {{ .Values.openshift.ui.proxy | default 8443 }} + name: public + args: + - --https-address=:{{ .Values.openshift.ui.proxy | default 8443 }} + - --provider=openshift + - --openshift-service-account=longhorn-ui-service-account + - --upstream=http://localhost:8000 + - --tls-cert=/etc/tls/private/tls.crt + - --tls-key=/etc/tls/private/tls.key + - --cookie-secret=SECRET + - --openshift-sar={"namespace":"{{ include "release_namespace" . }}","group":"longhorn.io","resource":"setting","verb":"delete"} + volumeMounts: + - mountPath: /etc/tls/private + name: longhorn-ui-tls + {{- end }} + {{- end }} + - name: longhorn-ui + image: {{ template "registry_url" . }}{{ .Values.image.longhorn.ui.repository }}:{{ .Values.image.longhorn.ui.tag }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + volumeMounts: + - name : nginx-cache + mountPath: /var/cache/nginx/ + - name : nginx-config + mountPath: /var/config/nginx/ + - name: var-run + mountPath: /var/run/ + ports: + - containerPort: 8000 + name: http + env: + - name: LONGHORN_MANAGER_IP + value: "http://longhorn-backend:9500" + - name: LONGHORN_UI_PORT + value: "8000" + volumes: + {{- if .Values.openshift.enabled }} + {{- if .Values.openshift.ui.route }} + - name: longhorn-ui-tls + secret: + secretName: longhorn-ui-tls + {{- end }} + {{- end }} + - emptyDir: {} + name: nginx-cache + - emptyDir: {} + name: nginx-config + - emptyDir: {} + name: var-run + {{- if .Values.privateRegistry.registrySecret }} + imagePullSecrets: + - name: {{ .Values.privateRegistry.registrySecret }} + {{- end }} + {{- if .Values.longhornUI.priorityClass }} + priorityClassName: {{ .Values.longhornUI.priorityClass | quote }} + {{- end }} + {{- if or .Values.global.tolerations .Values.longhornUI.tolerations .Values.global.cattle.windowsCluster.enabled }} + tolerations: + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.tolerations }} +{{ toYaml .Values.global.cattle.windowsCluster.tolerations | indent 6 }} + {{- end }} + {{- if or .Values.global.tolerations .Values.longhornUI.tolerations }} +{{ default .Values.global.tolerations .Values.longhornUI.tolerations | toYaml | indent 6 }} + {{- end }} + {{- end }} + {{- if or .Values.global.nodeSelector .Values.longhornUI.nodeSelector .Values.global.cattle.windowsCluster.enabled }} + nodeSelector: + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.nodeSelector }} +{{ toYaml .Values.global.cattle.windowsCluster.nodeSelector | indent 8 }} + {{- end }} + {{- if or .Values.global.nodeSelector .Values.longhornUI.nodeSelector }} +{{ default .Values.global.nodeSelector .Values.longhornUI.nodeSelector | toYaml | indent 8 }} + {{- end }} + {{- end }} +--- +kind: Service +apiVersion: v1 +metadata: + labels: {{- include "longhorn.labels" . | nindent 4 }} + app: longhorn-ui + {{- if eq .Values.service.ui.type "Rancher-Proxy" }} + kubernetes.io/cluster-service: "true" + {{- end }} + name: longhorn-frontend + namespace: {{ include "release_namespace" . }} +spec: + {{- if eq .Values.service.ui.type "Rancher-Proxy" }} + type: ClusterIP + {{- else }} + type: {{ .Values.service.ui.type }} + {{- end }} + {{- if and .Values.service.ui.loadBalancerIP (eq .Values.service.ui.type "LoadBalancer") }} + loadBalancerIP: {{ .Values.service.ui.loadBalancerIP }} + {{- end }} + {{- if and (eq .Values.service.ui.type "LoadBalancer") .Values.service.ui.loadBalancerSourceRanges }} + loadBalancerSourceRanges: {{- toYaml .Values.service.ui.loadBalancerSourceRanges | nindent 4 }} + {{- end }} + selector: + app: longhorn-ui + ports: + - name: http + port: 80 + targetPort: http + {{- if .Values.service.ui.nodePort }} + nodePort: {{ .Values.service.ui.nodePort }} + {{- else }} + nodePort: null + {{- end }} diff --git a/charts/longhorn/104.2.1+up1.7.2/templates/ingress.yaml b/charts/longhorn/104.2.1+up1.7.2/templates/ingress.yaml new file mode 100644 index 0000000000..61175e827b --- /dev/null +++ b/charts/longhorn/104.2.1+up1.7.2/templates/ingress.yaml @@ -0,0 +1,37 @@ +{{- if .Values.ingress.enabled }} +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: longhorn-ingress + namespace: {{ include "release_namespace" . }} + labels: {{- include "longhorn.labels" . | nindent 4 }} + app: longhorn-ingress + annotations: + {{- if .Values.ingress.secureBackends }} + ingress.kubernetes.io/secure-backends: "true" + {{- end }} + {{- range $key, $value := .Values.ingress.annotations }} + {{ $key }}: {{ $value | quote }} + {{- end }} +spec: + {{- if .Values.ingress.ingressClassName }} + ingressClassName: {{ .Values.ingress.ingressClassName }} + {{- end }} + rules: + - host: {{ .Values.ingress.host }} + http: + paths: + - path: {{ default "" .Values.ingress.path }} + pathType: {{ default "ImplementationSpecific" .Values.ingress.pathType }} + backend: + service: + name: longhorn-frontend + port: + number: 80 +{{- if .Values.ingress.tls }} + tls: + - hosts: + - {{ .Values.ingress.host }} + secretName: {{ .Values.ingress.tlsSecret }} +{{- end }} +{{- end }} diff --git a/charts/longhorn/104.2.1+up1.7.2/templates/network-policies/backing-image-data-source-network-policy.yaml b/charts/longhorn/104.2.1+up1.7.2/templates/network-policies/backing-image-data-source-network-policy.yaml new file mode 100644 index 0000000000..7204d63caa --- /dev/null +++ b/charts/longhorn/104.2.1+up1.7.2/templates/network-policies/backing-image-data-source-network-policy.yaml @@ -0,0 +1,27 @@ +{{- if .Values.networkPolicies.enabled }} +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: backing-image-data-source + namespace: {{ include "release_namespace" . }} +spec: + podSelector: + matchLabels: + longhorn.io/component: backing-image-data-source + policyTypes: + - Ingress + ingress: + - from: + - podSelector: + matchLabels: + app: longhorn-manager + - podSelector: + matchLabels: + longhorn.io/component: instance-manager + - podSelector: + matchLabels: + longhorn.io/component: backing-image-manager + - podSelector: + matchLabels: + longhorn.io/component: backing-image-data-source +{{- end }} diff --git a/charts/longhorn/104.2.1+up1.7.2/templates/network-policies/backing-image-manager-network-policy.yaml b/charts/longhorn/104.2.1+up1.7.2/templates/network-policies/backing-image-manager-network-policy.yaml new file mode 100644 index 0000000000..119ebf08a1 --- /dev/null +++ b/charts/longhorn/104.2.1+up1.7.2/templates/network-policies/backing-image-manager-network-policy.yaml @@ -0,0 +1,27 @@ +{{- if .Values.networkPolicies.enabled }} +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: backing-image-manager + namespace: {{ include "release_namespace" . }} +spec: + podSelector: + matchLabels: + longhorn.io/component: backing-image-manager + policyTypes: + - Ingress + ingress: + - from: + - podSelector: + matchLabels: + app: longhorn-manager + - podSelector: + matchLabels: + longhorn.io/component: instance-manager + - podSelector: + matchLabels: + longhorn.io/component: backing-image-manager + - podSelector: + matchLabels: + longhorn.io/component: backing-image-data-source +{{- end }} diff --git a/charts/longhorn/104.2.1+up1.7.2/templates/network-policies/instance-manager-networking.yaml b/charts/longhorn/104.2.1+up1.7.2/templates/network-policies/instance-manager-networking.yaml new file mode 100644 index 0000000000..332aa2c2fe --- /dev/null +++ b/charts/longhorn/104.2.1+up1.7.2/templates/network-policies/instance-manager-networking.yaml @@ -0,0 +1,27 @@ +{{- if .Values.networkPolicies.enabled }} +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: instance-manager + namespace: {{ include "release_namespace" . }} +spec: + podSelector: + matchLabels: + longhorn.io/component: instance-manager + policyTypes: + - Ingress + ingress: + - from: + - podSelector: + matchLabels: + app: longhorn-manager + - podSelector: + matchLabels: + longhorn.io/component: instance-manager + - podSelector: + matchLabels: + longhorn.io/component: backing-image-manager + - podSelector: + matchLabels: + longhorn.io/component: backing-image-data-source +{{- end }} diff --git a/charts/longhorn/104.2.1+up1.7.2/templates/network-policies/manager-network-policy.yaml b/charts/longhorn/104.2.1+up1.7.2/templates/network-policies/manager-network-policy.yaml new file mode 100644 index 0000000000..6f94029a53 --- /dev/null +++ b/charts/longhorn/104.2.1+up1.7.2/templates/network-policies/manager-network-policy.yaml @@ -0,0 +1,35 @@ +{{- if .Values.networkPolicies.enabled }} +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: longhorn-manager + namespace: {{ include "release_namespace" . }} +spec: + podSelector: + matchLabels: + app: longhorn-manager + policyTypes: + - Ingress + ingress: + - from: + - podSelector: + matchLabels: + app: longhorn-manager + - podSelector: + matchLabels: + app: longhorn-ui + - podSelector: + matchLabels: + app: longhorn-csi-plugin + - podSelector: + matchLabels: + longhorn.io/managed-by: longhorn-manager + matchExpressions: + - { key: recurring-job.longhorn.io, operator: Exists } + - podSelector: + matchExpressions: + - { key: longhorn.io/job-task, operator: Exists } + - podSelector: + matchLabels: + app: longhorn-driver-deployer +{{- end }} diff --git a/charts/longhorn/104.2.1+up1.7.2/templates/network-policies/recovery-backend-network-policy.yaml b/charts/longhorn/104.2.1+up1.7.2/templates/network-policies/recovery-backend-network-policy.yaml new file mode 100644 index 0000000000..37bf5f9bcf --- /dev/null +++ b/charts/longhorn/104.2.1+up1.7.2/templates/network-policies/recovery-backend-network-policy.yaml @@ -0,0 +1,17 @@ +{{- if .Values.networkPolicies.enabled }} +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: longhorn-recovery-backend + namespace: {{ include "release_namespace" . }} +spec: + podSelector: + matchLabels: + longhorn.io/recovery-backend: longhorn-recovery-backend + policyTypes: + - Ingress + ingress: + - ports: + - protocol: TCP + port: 9503 +{{- end }} diff --git a/charts/longhorn/104.2.1+up1.7.2/templates/network-policies/ui-frontend-network-policy.yaml b/charts/longhorn/104.2.1+up1.7.2/templates/network-policies/ui-frontend-network-policy.yaml new file mode 100644 index 0000000000..6f37065980 --- /dev/null +++ b/charts/longhorn/104.2.1+up1.7.2/templates/network-policies/ui-frontend-network-policy.yaml @@ -0,0 +1,46 @@ +{{- if and .Values.networkPolicies.enabled .Values.ingress.enabled (not (eq .Values.networkPolicies.type "")) }} +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: longhorn-ui-frontend + namespace: {{ include "release_namespace" . }} +spec: + podSelector: + matchLabels: + app: longhorn-ui + policyTypes: + - Ingress + ingress: + - from: + {{- if eq .Values.networkPolicies.type "rke1"}} + - namespaceSelector: + matchLabels: + kubernetes.io/metadata.name: ingress-nginx + podSelector: + matchLabels: + app.kubernetes.io/component: controller + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/name: ingress-nginx + {{- else if eq .Values.networkPolicies.type "rke2" }} + - namespaceSelector: + matchLabels: + kubernetes.io/metadata.name: kube-system + podSelector: + matchLabels: + app.kubernetes.io/component: controller + app.kubernetes.io/instance: rke2-ingress-nginx + app.kubernetes.io/name: rke2-ingress-nginx + {{- else if eq .Values.networkPolicies.type "k3s" }} + - namespaceSelector: + matchLabels: + kubernetes.io/metadata.name: kube-system + podSelector: + matchLabels: + app.kubernetes.io/name: traefik + ports: + - port: 8000 + protocol: TCP + - port: 80 + protocol: TCP + {{- end }} +{{- end }} diff --git a/charts/longhorn/104.2.1+up1.7.2/templates/network-policies/webhook-network-policy.yaml b/charts/longhorn/104.2.1+up1.7.2/templates/network-policies/webhook-network-policy.yaml new file mode 100644 index 0000000000..3812e0ffa3 --- /dev/null +++ b/charts/longhorn/104.2.1+up1.7.2/templates/network-policies/webhook-network-policy.yaml @@ -0,0 +1,33 @@ +{{- if .Values.networkPolicies.enabled }} +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: longhorn-conversion-webhook + namespace: {{ include "release_namespace" . }} +spec: + podSelector: + matchLabels: + longhorn.io/conversion-webhook: longhorn-conversion-webhook + policyTypes: + - Ingress + ingress: + - ports: + - protocol: TCP + port: 9501 +--- +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: longhorn-admission-webhook + namespace: {{ include "release_namespace" . }} +spec: + podSelector: + matchLabels: + longhorn.io/admission-webhook: longhorn-admission-webhook + policyTypes: + - Ingress + ingress: + - ports: + - protocol: TCP + port: 9502 +{{- end }} diff --git a/charts/longhorn/104.2.1+up1.7.2/templates/postupgrade-job.yaml b/charts/longhorn/104.2.1+up1.7.2/templates/postupgrade-job.yaml new file mode 100644 index 0000000000..56efd38e9b --- /dev/null +++ b/charts/longhorn/104.2.1+up1.7.2/templates/postupgrade-job.yaml @@ -0,0 +1,56 @@ +apiVersion: batch/v1 +kind: Job +metadata: + annotations: + "helm.sh/hook": post-upgrade + "helm.sh/hook-delete-policy": hook-succeeded,before-hook-creation + name: longhorn-post-upgrade + namespace: {{ include "release_namespace" . }} + labels: {{- include "longhorn.labels" . | nindent 4 }} +spec: + activeDeadlineSeconds: 900 + backoffLimit: 1 + template: + metadata: + name: longhorn-post-upgrade + labels: {{- include "longhorn.labels" . | nindent 8 }} + spec: + containers: + - name: longhorn-post-upgrade + image: {{ template "registry_url" . }}{{ .Values.image.longhorn.manager.repository }}:{{ .Values.image.longhorn.manager.tag }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + command: + - longhorn-manager + - post-upgrade + env: + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + restartPolicy: OnFailure + {{- if .Values.privateRegistry.registrySecret }} + imagePullSecrets: + - name: {{ .Values.privateRegistry.registrySecret }} + {{- end }} + {{- if .Values.longhornManager.priorityClass }} + priorityClassName: {{ .Values.longhornManager.priorityClass | quote }} + {{- end }} + serviceAccountName: longhorn-service-account + {{- if or .Values.global.tolerations .Values.longhornManager.tolerations .Values.global.cattle.windowsCluster.enabled }} + tolerations: + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.tolerations }} +{{ toYaml .Values.global.cattle.windowsCluster.tolerations | indent 6 }} + {{- end }} + {{- if or .Values.global.tolerations .Values.longhornManager.tolerations }} +{{ default .Values.global.tolerations .Values.longhornManager.tolerations | toYaml | indent 6 }} + {{- end }} + {{- end }} + {{- if or .Values.global.nodeSelector .Values.longhornManager.nodeSelector .Values.global.cattle.windowsCluster.enabled }} + nodeSelector: + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.nodeSelector }} +{{ toYaml .Values.global.cattle.windowsCluster.nodeSelector | indent 8 }} + {{- end }} + {{- if or .Values.global.nodeSelector .Values.longhornManager.nodeSelector }} +{{ default .Values.global.nodeSelector .Values.longhornManager.nodeSelector | toYaml | indent 8 }} + {{- end }} + {{- end }} diff --git a/charts/longhorn/104.2.1+up1.7.2/templates/preupgrade-job.yaml b/charts/longhorn/104.2.1+up1.7.2/templates/preupgrade-job.yaml new file mode 100644 index 0000000000..9f7a8a6aa6 --- /dev/null +++ b/charts/longhorn/104.2.1+up1.7.2/templates/preupgrade-job.yaml @@ -0,0 +1,64 @@ +{{- if and .Values.preUpgradeChecker.jobEnabled .Values.preUpgradeChecker.upgradeVersionCheck}} +apiVersion: batch/v1 +kind: Job +metadata: + annotations: + "helm.sh/hook": pre-upgrade + "helm.sh/hook-delete-policy": hook-succeeded,before-hook-creation,hook-failed + name: longhorn-pre-upgrade + namespace: {{ include "release_namespace" . }} + labels: {{- include "longhorn.labels" . | nindent 4 }} +spec: + activeDeadlineSeconds: 900 + backoffLimit: 1 + template: + metadata: + name: longhorn-pre-upgrade + labels: {{- include "longhorn.labels" . | nindent 8 }} + spec: + containers: + - name: longhorn-pre-upgrade + image: {{ template "registry_url" . }}{{ .Values.image.longhorn.manager.repository }}:{{ .Values.image.longhorn.manager.tag }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + securityContext: + privileged: true + command: + - longhorn-manager + - pre-upgrade + volumeMounts: + - name: proc + mountPath: /host/proc/ + env: + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + volumes: + - name: proc + hostPath: + path: /proc/ + restartPolicy: OnFailure + {{- if .Values.privateRegistry.registrySecret }} + imagePullSecrets: + - name: {{ .Values.privateRegistry.registrySecret }} + {{- end }} + serviceAccountName: longhorn-service-account + {{- if or .Values.global.tolerations .Values.longhornManager.tolerations .Values.global.cattle.windowsCluster.enabled }} + tolerations: + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.tolerations }} +{{ toYaml .Values.global.cattle.windowsCluster.tolerations | indent 6 }} + {{- end }} + {{- if or .Values.global.tolerations .Values.longhornManager.tolerations }} +{{ default .Values.global.tolerations .Values.longhornManager.tolerations | toYaml | indent 6 }} + {{- end }} + {{- end }} + {{- if or .Values.global.nodeSelector .Values.longhornManager.nodeSelector .Values.global.cattle.windowsCluster.enabled }} + nodeSelector: + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.nodeSelector }} +{{ toYaml .Values.global.cattle.windowsCluster.nodeSelector | indent 8 }} + {{- end }} + {{- if or .Values.global.nodeSelector .Values.longhornManager.nodeSelector }} +{{ default .Values.global.nodeSelector .Values.longhornManager.nodeSelector | toYaml | indent 8 }} + {{- end }} + {{- end }} +{{- end }} diff --git a/charts/longhorn/104.2.1+up1.7.2/templates/priorityclass.yaml b/charts/longhorn/104.2.1+up1.7.2/templates/priorityclass.yaml new file mode 100644 index 0000000000..208adc84a2 --- /dev/null +++ b/charts/longhorn/104.2.1+up1.7.2/templates/priorityclass.yaml @@ -0,0 +1,9 @@ +apiVersion: scheduling.k8s.io/v1 +kind: PriorityClass +metadata: + name: "longhorn-critical" + labels: {{- include "longhorn.labels" . | nindent 4 }} +description: "Ensure Longhorn pods have the highest priority to prevent any unexpected eviction by the Kubernetes scheduler under node pressure" +globalDefault: false +preemptionPolicy: PreemptLowerPriority +value: 1000000000 diff --git a/charts/longhorn/104.2.1+up1.7.2/templates/psp.yaml b/charts/longhorn/104.2.1+up1.7.2/templates/psp.yaml new file mode 100644 index 0000000000..a2dfc05bef --- /dev/null +++ b/charts/longhorn/104.2.1+up1.7.2/templates/psp.yaml @@ -0,0 +1,66 @@ +{{- if .Values.enablePSP }} +apiVersion: policy/v1beta1 +kind: PodSecurityPolicy +metadata: + name: longhorn-psp + labels: {{- include "longhorn.labels" . | nindent 4 }} +spec: + privileged: true + allowPrivilegeEscalation: true + requiredDropCapabilities: + - NET_RAW + allowedCapabilities: + - SYS_ADMIN + hostNetwork: false + hostIPC: false + hostPID: true + runAsUser: + rule: RunAsAny + seLinux: + rule: RunAsAny + fsGroup: + rule: RunAsAny + supplementalGroups: + rule: RunAsAny + volumes: + - configMap + - downwardAPI + - emptyDir + - secret + - projected + - hostPath +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: longhorn-psp-role + labels: {{- include "longhorn.labels" . | nindent 4 }} + namespace: {{ include "release_namespace" . }} +rules: +- apiGroups: + - policy + resources: + - podsecuritypolicies + verbs: + - use + resourceNames: + - longhorn-psp +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: longhorn-psp-binding + labels: {{- include "longhorn.labels" . | nindent 4 }} + namespace: {{ include "release_namespace" . }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: longhorn-psp-role +subjects: +- kind: ServiceAccount + name: longhorn-service-account + namespace: {{ include "release_namespace" . }} +- kind: ServiceAccount + name: default + namespace: {{ include "release_namespace" . }} +{{- end }} diff --git a/charts/longhorn/104.2.1+up1.7.2/templates/registry-secret.yaml b/charts/longhorn/104.2.1+up1.7.2/templates/registry-secret.yaml new file mode 100644 index 0000000000..3c6b1dc510 --- /dev/null +++ b/charts/longhorn/104.2.1+up1.7.2/templates/registry-secret.yaml @@ -0,0 +1,13 @@ +{{- if .Values.privateRegistry.createSecret }} +{{- if .Values.privateRegistry.registrySecret }} +apiVersion: v1 +kind: Secret +metadata: + name: {{ .Values.privateRegistry.registrySecret }} + namespace: {{ include "release_namespace" . }} + labels: {{- include "longhorn.labels" . | nindent 4 }} +type: kubernetes.io/dockerconfigjson +data: + .dockerconfigjson: {{ template "secret" . }} +{{- end }} +{{- end }} \ No newline at end of file diff --git a/charts/longhorn/104.2.1+up1.7.2/templates/serviceaccount.yaml b/charts/longhorn/104.2.1+up1.7.2/templates/serviceaccount.yaml new file mode 100644 index 0000000000..b0d6dd505b --- /dev/null +++ b/charts/longhorn/104.2.1+up1.7.2/templates/serviceaccount.yaml @@ -0,0 +1,40 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: longhorn-service-account + namespace: {{ include "release_namespace" . }} + labels: {{- include "longhorn.labels" . | nindent 4 }} + {{- with .Values.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: longhorn-ui-service-account + namespace: {{ include "release_namespace" . }} + labels: {{- include "longhorn.labels" . | nindent 4 }} + {{- with .Values.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} + {{- if .Values.openshift.enabled }} + {{- if .Values.openshift.ui.route }} + {{- if not .Values.serviceAccount.annotations }} + annotations: + {{- end }} + serviceaccounts.openshift.io/oauth-redirectreference.primary: '{"kind":"OAuthRedirectReference","apiVersion":"v1","reference":{"kind":"Route","name":"longhorn-ui"}}' + {{- end }} + {{- end }} +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: longhorn-support-bundle + namespace: {{ include "release_namespace" . }} + labels: {{- include "longhorn.labels" . | nindent 4 }} + {{- with .Values.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} \ No newline at end of file diff --git a/charts/longhorn/104.2.1+up1.7.2/templates/servicemonitor.yaml b/charts/longhorn/104.2.1+up1.7.2/templates/servicemonitor.yaml new file mode 100644 index 0000000000..3f32961332 --- /dev/null +++ b/charts/longhorn/104.2.1+up1.7.2/templates/servicemonitor.yaml @@ -0,0 +1,40 @@ +{{- if .Values.metrics.serviceMonitor.enabled -}} +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: longhorn-prometheus-servicemonitor + namespace: {{ include "release_namespace" . }} + labels: + {{- include "longhorn.labels" . | nindent 4 }} + name: longhorn-prometheus-servicemonitor + {{- with .Values.metrics.serviceMonitor.additionalLabels }} + {{- toYaml . | nindent 4 }} + {{- end }} + {{- with .Values.metrics.serviceMonitor.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + selector: + matchLabels: + app: longhorn-manager + namespaceSelector: + matchNames: + - {{ include "release_namespace" . }} + endpoints: + - port: manager + {{- with .Values.metrics.serviceMonitor.interval }} + interval: {{ . }} + {{- end }} + {{- with .Values.metrics.serviceMonitor.scrapeTimeout }} + scrapeTimeout: {{ . }} + {{- end }} + {{- with .Values.metrics.serviceMonitor.relabelings }} + relabelings: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.metrics.serviceMonitor.metricRelabelings }} + metricRelabelings: + {{- toYaml . | nindent 8 }} + {{- end }} +{{- end }} \ No newline at end of file diff --git a/charts/longhorn/104.2.1+up1.7.2/templates/services.yaml b/charts/longhorn/104.2.1+up1.7.2/templates/services.yaml new file mode 100644 index 0000000000..4c8c6bc687 --- /dev/null +++ b/charts/longhorn/104.2.1+up1.7.2/templates/services.yaml @@ -0,0 +1,47 @@ +apiVersion: v1 +kind: Service +metadata: + labels: {{- include "longhorn.labels" . | nindent 4 }} + app: longhorn-conversion-webhook + name: longhorn-conversion-webhook + namespace: {{ include "release_namespace" . }} +spec: + type: ClusterIP + selector: + longhorn.io/conversion-webhook: longhorn-conversion-webhook + ports: + - name: conversion-webhook + port: 9501 + targetPort: conversion-wh +--- +apiVersion: v1 +kind: Service +metadata: + labels: {{- include "longhorn.labels" . | nindent 4 }} + app: longhorn-admission-webhook + name: longhorn-admission-webhook + namespace: {{ include "release_namespace" . }} +spec: + type: ClusterIP + selector: + longhorn.io/admission-webhook: longhorn-admission-webhook + ports: + - name: admission-webhook + port: 9502 + targetPort: admission-wh +--- +apiVersion: v1 +kind: Service +metadata: + labels: {{- include "longhorn.labels" . | nindent 4 }} + app: longhorn-recovery-backend + name: longhorn-recovery-backend + namespace: {{ include "release_namespace" . }} +spec: + type: ClusterIP + selector: + longhorn.io/recovery-backend: longhorn-recovery-backend + ports: + - name: recovery-backend + port: 9503 + targetPort: recov-backend diff --git a/charts/longhorn/104.2.1+up1.7.2/templates/storageclass.yaml b/charts/longhorn/104.2.1+up1.7.2/templates/storageclass.yaml new file mode 100644 index 0000000000..884d38d5f3 --- /dev/null +++ b/charts/longhorn/104.2.1+up1.7.2/templates/storageclass.yaml @@ -0,0 +1,57 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: longhorn-storageclass + namespace: {{ include "release_namespace" . }} + labels: {{- include "longhorn.labels" . | nindent 4 }} +data: + storageclass.yaml: | + kind: StorageClass + apiVersion: storage.k8s.io/v1 + metadata: + name: longhorn + annotations: + storageclass.kubernetes.io/is-default-class: {{ .Values.persistence.defaultClass | quote }} + provisioner: driver.longhorn.io + allowVolumeExpansion: true + reclaimPolicy: "{{ .Values.persistence.reclaimPolicy }}" + volumeBindingMode: Immediate + parameters: + numberOfReplicas: "{{ .Values.persistence.defaultClassReplicaCount }}" + staleReplicaTimeout: "30" + fromBackup: "" + {{- if .Values.persistence.defaultFsType }} + fsType: "{{ .Values.persistence.defaultFsType }}" + {{- end }} + {{- if .Values.persistence.defaultMkfsParams }} + mkfsParams: "{{ .Values.persistence.defaultMkfsParams }}" + {{- end }} + {{- if .Values.persistence.migratable }} + migratable: "{{ .Values.persistence.migratable }}" + {{- end }} + {{- if .Values.persistence.nfsOptions }} + nfsOptions: "{{ .Values.persistence.nfsOptions }}" + {{- end }} + {{- if .Values.persistence.backingImage.enable }} + backingImage: {{ .Values.persistence.backingImage.name }} + backingImageDataSourceType: {{ .Values.persistence.backingImage.dataSourceType }} + backingImageDataSourceParameters: {{ .Values.persistence.backingImage.dataSourceParameters }} + backingImageChecksum: {{ .Values.persistence.backingImage.expectedChecksum }} + {{- end }} + {{- if .Values.persistence.recurringJobSelector.enable }} + recurringJobSelector: '{{ .Values.persistence.recurringJobSelector.jobList }}' + {{- end }} + dataLocality: {{ .Values.persistence.defaultDataLocality | quote }} + {{- if .Values.persistence.defaultDiskSelector.enable }} + diskSelector: "{{ .Values.persistence.defaultDiskSelector.selector }}" + {{- end }} + {{- if .Values.persistence.defaultNodeSelector.enable }} + nodeSelector: "{{ .Values.persistence.defaultNodeSelector.selector }}" + {{- end }} + {{- if .Values.persistence.removeSnapshotsDuringFilesystemTrim }} + unmapMarkSnapChainRemoved: "{{ .Values.persistence.removeSnapshotsDuringFilesystemTrim }}" + {{- end }} + {{- if .Values.persistence.disableRevisionCounter }} + disableRevisionCounter: "{{ .Values.persistence.disableRevisionCounter }}" + dataEngine: "{{ .Values.persistence.dataEngine }}" + {{- end }} diff --git a/charts/longhorn/104.2.1+up1.7.2/templates/tls-secrets.yaml b/charts/longhorn/104.2.1+up1.7.2/templates/tls-secrets.yaml new file mode 100644 index 0000000000..74c43426de --- /dev/null +++ b/charts/longhorn/104.2.1+up1.7.2/templates/tls-secrets.yaml @@ -0,0 +1,16 @@ +{{- if .Values.ingress.enabled }} +{{- range .Values.ingress.secrets }} +apiVersion: v1 +kind: Secret +metadata: + name: {{ .name }} + namespace: {{ include "release_namespace" $ }} + labels: {{- include "longhorn.labels" $ | nindent 4 }} + app: longhorn +type: kubernetes.io/tls +data: + tls.crt: {{ .certificate | b64enc }} + tls.key: {{ .key | b64enc }} +--- +{{- end }} +{{- end }} diff --git a/charts/longhorn/104.2.1+up1.7.2/templates/uninstall-job.yaml b/charts/longhorn/104.2.1+up1.7.2/templates/uninstall-job.yaml new file mode 100644 index 0000000000..1ab46207c3 --- /dev/null +++ b/charts/longhorn/104.2.1+up1.7.2/templates/uninstall-job.yaml @@ -0,0 +1,57 @@ +apiVersion: batch/v1 +kind: Job +metadata: + annotations: + "helm.sh/hook": pre-delete + "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded + name: longhorn-uninstall + namespace: {{ include "release_namespace" . }} + labels: {{- include "longhorn.labels" . | nindent 4 }} +spec: + activeDeadlineSeconds: 900 + backoffLimit: 1 + template: + metadata: + name: longhorn-uninstall + labels: {{- include "longhorn.labels" . | nindent 8 }} + spec: + containers: + - name: longhorn-uninstall + image: {{ template "registry_url" . }}{{ .Values.image.longhorn.manager.repository }}:{{ .Values.image.longhorn.manager.tag }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + command: + - longhorn-manager + - uninstall + - --force + env: + - name: LONGHORN_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + restartPolicy: Never + {{- if .Values.privateRegistry.registrySecret }} + imagePullSecrets: + - name: {{ .Values.privateRegistry.registrySecret }} + {{- end }} + {{- if .Values.longhornManager.priorityClass }} + priorityClassName: {{ .Values.longhornManager.priorityClass | quote }} + {{- end }} + serviceAccountName: longhorn-service-account + {{- if or .Values.global.tolerations .Values.longhornManager.tolerations .Values.global.cattle.windowsCluster.enabled }} + tolerations: + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.tolerations }} +{{ toYaml .Values.global.cattle.windowsCluster.tolerations | indent 6 }} + {{- end }} + {{- if or .Values.global.tolerations .Values.longhornManager.tolerations }} +{{ default .Values.global.tolerations .Values.longhornManager.tolerations | toYaml | indent 6 }} + {{- end }} + {{- end }} + {{- if or .Values.global.nodeSelector .Values.longhornManager.nodeSelector .Values.global.cattle.windowsCluster.enabled }} + nodeSelector: + {{- if and .Values.global.cattle.windowsCluster.enabled .Values.global.cattle.windowsCluster.nodeSelector }} +{{ toYaml .Values.global.cattle.windowsCluster.nodeSelector | indent 8 }} + {{- end }} + {{- if or .Values.global.nodeSelector .Values.longhornManager.nodeSelector }} +{{ default .Values.global.nodeSelector .Values.longhornManager.nodeSelector | toYaml | indent 8 }} + {{- end }} + {{- end }} diff --git a/charts/longhorn/104.2.1+up1.7.2/templates/userroles.yaml b/charts/longhorn/104.2.1+up1.7.2/templates/userroles.yaml new file mode 100644 index 0000000000..57a68e130c --- /dev/null +++ b/charts/longhorn/104.2.1+up1.7.2/templates/userroles.yaml @@ -0,0 +1,53 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: "longhorn-admin" + labels: + rbac.authorization.k8s.io/aggregate-to-admin: "true" +rules: +- apiGroups: [ "longhorn.io" ] + resources: ["volumes", "volumes/status", "engines", "engines/status", "replicas", "replicas/status", "settings", "settings/status", + "engineimages", "engineimages/status", "nodes", "nodes/status", "instancemanagers", "instancemanagers/status", + "sharemanagers", "sharemanagers/status", "backingimages", "backingimages/status", + "backingimagemanagers", "backingimagemanagers/status", "backingimagedatasources", "backingimagedatasources/status", "backupbackingimages", "backupbackingimages/status", + "backuptargets", "backuptargets/status", "backupvolumes", "backupvolumes/status", "backups", "backups/status", + "recurringjobs", "recurringjobs/status", "orphans", "orphans/status", "snapshots", "snapshots/status", + "supportbundles", "supportbundles/status", "systembackups", "systembackups/status", "systemrestores", "systemrestores/status", + "volumeattachments", "volumeattachments/status"] + verbs: [ "*" ] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: "longhorn-edit" + labels: + rbac.authorization.k8s.io/aggregate-to-edit: "true" +rules: +- apiGroups: [ "longhorn.io" ] + resources: ["volumes", "volumes/status", "engines", "engines/status", "replicas", "replicas/status", "settings", "settings/status", + "engineimages", "engineimages/status", "nodes", "nodes/status", "instancemanagers", "instancemanagers/status", + "sharemanagers", "sharemanagers/status", "backingimages", "backingimages/status", + "backingimagemanagers", "backingimagemanagers/status", "backingimagedatasources", "backingimagedatasources/status", "backupbackingimages", "backupbackingimages/status", + "backuptargets", "backuptargets/status", "backupvolumes", "backupvolumes/status", "backups", "backups/status", + "recurringjobs", "recurringjobs/status", "orphans", "orphans/status", "snapshots", "snapshots/status", + "supportbundles", "supportbundles/status", "systembackups", "systembackups/status", "systemrestores", "systemrestores/status", + "volumeattachments", "volumeattachments/status"] + verbs: [ "*" ] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: "longhorn-view" + labels: + rbac.authorization.k8s.io/aggregate-to-view: "true" +rules: +- apiGroups: [ "longhorn.io" ] + resources: ["volumes", "volumes/status", "engines", "engines/status", "replicas", "replicas/status", "settings", "settings/status", + "engineimages", "engineimages/status", "nodes", "nodes/status", "instancemanagers", "instancemanagers/status", + "sharemanagers", "sharemanagers/status", "backingimages", "backingimages/status", + "backingimagemanagers", "backingimagemanagers/status", "backingimagedatasources", "backingimagedatasources/status", "backupbackingimages", "backupbackingimages/status", + "backuptargets", "backuptargets/status", "backupvolumes", "backupvolumes/status", "backups", "backups/status", + "recurringjobs", "recurringjobs/status", "orphans", "orphans/status", "snapshots", "snapshots/status", + "supportbundles", "supportbundles/status", "systembackups", "systembackups/status", "systemrestores", "systemrestores/status", + "volumeattachments", "volumeattachments/status"] + verbs: [ "get", "list", "watch" ] diff --git a/charts/longhorn/104.2.1+up1.7.2/templates/validate-install-crd.yaml b/charts/longhorn/104.2.1+up1.7.2/templates/validate-install-crd.yaml new file mode 100644 index 0000000000..7bf81816d0 --- /dev/null +++ b/charts/longhorn/104.2.1+up1.7.2/templates/validate-install-crd.yaml @@ -0,0 +1,35 @@ +#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} +# {{- $found := dict -}} +# {{- set $found "longhorn.io/v1beta1/BackingImageDataSource" false -}} +# {{- set $found "longhorn.io/v1beta1/BackingImageManager" false -}} +# {{- set $found "longhorn.io/v1beta1/BackingImage" false -}} +# {{- set $found "longhorn.io/v1beta2/BackupBackingImage" false -}} +# {{- set $found "longhorn.io/v1beta1/Backup" false -}} +# {{- set $found "longhorn.io/v1beta1/BackupTarget" false -}} +# {{- set $found "longhorn.io/v1beta1/BackupVolume" false -}} +# {{- set $found "longhorn.io/v1beta1/EngineImage" false -}} +# {{- set $found "longhorn.io/v1beta1/Engine" false -}} +# {{- set $found "longhorn.io/v1beta1/InstanceManager" false -}} +# {{- set $found "longhorn.io/v1beta1/Node" false -}} +# {{- set $found "longhorn.io/v1beta2/Orphan" false -}} +# {{- set $found "longhorn.io/v1beta1/RecurringJob" false -}} +# {{- set $found "longhorn.io/v1beta1/Replica" false -}} +# {{- set $found "longhorn.io/v1beta1/Setting" false -}} +# {{- set $found "longhorn.io/v1beta1/ShareManager" false -}} +# {{- set $found "longhorn.io/v1beta2/Snapshot" false -}} +# {{- set $found "longhorn.io/v1beta2/SupportBundle" false -}} +# {{- set $found "longhorn.io/v1beta2/SystemBackup" false -}} +# {{- set $found "longhorn.io/v1beta2/SystemRestore" false -}} +# {{- set $found "longhorn.io/v1beta2/VolumeAttachment" false -}} +# {{- set $found "longhorn.io/v1beta1/Volume" false -}} +# {{- range .Capabilities.APIVersions -}} +# {{- if hasKey $found (toString .) -}} +# {{- set $found (toString .) true -}} +# {{- end -}} +# {{- end -}} +# {{- range $_, $exists := $found -}} +# {{- if (eq $exists false) -}} +# {{- required "Required CRDs are missing. Please install the corresponding CRD chart before installing this chart." "" -}} +# {{- end -}} +# {{- end -}} +#{{- end -}} diff --git a/charts/longhorn/104.2.1+up1.7.2/templates/validate-psp-install.yaml b/charts/longhorn/104.2.1+up1.7.2/templates/validate-psp-install.yaml new file mode 100644 index 0000000000..0df98e3657 --- /dev/null +++ b/charts/longhorn/104.2.1+up1.7.2/templates/validate-psp-install.yaml @@ -0,0 +1,7 @@ +#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} +#{{- if .Values.enablePSP }} +#{{- if not (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} +#{{- fail "The target cluster does not have the PodSecurityPolicy API resource. Please disable PSPs in this chart before proceeding." -}} +#{{- end }} +#{{- end }} +#{{- end }} \ No newline at end of file diff --git a/charts/longhorn/104.2.1+up1.7.2/values.yaml b/charts/longhorn/104.2.1+up1.7.2/values.yaml new file mode 100644 index 0000000000..1fabadb85a --- /dev/null +++ b/charts/longhorn/104.2.1+up1.7.2/values.yaml @@ -0,0 +1,526 @@ +# Default values for longhorn. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. +global: + # -- Toleration for nodes allowed to run user-deployed components such as Longhorn Manager, Longhorn UI, and Longhorn Driver Deployer. + tolerations: [] + # -- Node selector for nodes allowed to run user-deployed components such as Longhorn Manager, Longhorn UI, and Longhorn Driver Deployer. + nodeSelector: {} + cattle: + # -- Default system registry. + systemDefaultRegistry: "" + windowsCluster: + # -- Setting that allows Longhorn to run on a Rancher Windows cluster. + enabled: false + # -- Toleration for Linux nodes that can run user-deployed Longhorn components. + tolerations: + - key: "cattle.io/os" + value: "linux" + effect: "NoSchedule" + operator: "Equal" + # -- Node selector for Linux nodes that can run user-deployed Longhorn components. + nodeSelector: + kubernetes.io/os: "linux" + defaultSetting: + # -- Toleration for system-managed Longhorn components. + taintToleration: cattle.io/os=linux:NoSchedule + # -- Node selector for system-managed Longhorn components. + systemManagedComponentsNodeSelector: kubernetes.io/os:linux + +networkPolicies: + # -- Setting that allows you to enable network policies that control access to Longhorn pods. + enabled: false + # -- Distribution that determines the policy for allowing access for an ingress. (Options: "k3s", "rke2", "rke1") + type: "k3s" + +image: + longhorn: + engine: + # -- Repository for the Longhorn Engine image. + repository: rancher/mirrored-longhornio-longhorn-engine + # -- Tag for the Longhorn Engine image. + tag: v1.7.2 + manager: + # -- Repository for the Longhorn Manager image. + repository: rancher/mirrored-longhornio-longhorn-manager + # -- Tag for the Longhorn Manager image. + tag: v1.7.2 + ui: + # -- Repository for the Longhorn UI image. + repository: rancher/mirrored-longhornio-longhorn-ui + # -- Tag for the Longhorn UI image. + tag: v1.7.2 + instanceManager: + # -- Repository for the Longhorn Instance Manager image. + repository: rancher/mirrored-longhornio-longhorn-instance-manager + # -- Tag for the Longhorn Instance Manager image. + tag: v1.7.2 + shareManager: + # -- Repository for the Longhorn Share Manager image. + repository: rancher/mirrored-longhornio-longhorn-share-manager + # -- Tag for the Longhorn Share Manager image. + tag: v1.7.2 + backingImageManager: + # -- Repository for the Backing Image Manager image. When unspecified, Longhorn uses the default value. + repository: rancher/mirrored-longhornio-backing-image-manager + # -- Tag for the Backing Image Manager image. When unspecified, Longhorn uses the default value. + tag: v1.7.2 + supportBundleKit: + # -- Repository for the Longhorn Support Bundle Manager image. + repository: rancher/mirrored-longhornio-support-bundle-kit + # -- Tag for the Longhorn Support Bundle Manager image. + tag: v0.0.45 + csi: + attacher: + # -- Repository for the CSI attacher image. When unspecified, Longhorn uses the default value. + repository: rancher/mirrored-longhornio-csi-attacher + # -- Tag for the CSI attacher image. When unspecified, Longhorn uses the default value. + tag: v4.7.0 + provisioner: + # -- Repository for the CSI Provisioner image. When unspecified, Longhorn uses the default value. + repository: rancher/mirrored-longhornio-csi-provisioner + # -- Tag for the CSI Provisioner image. When unspecified, Longhorn uses the default value. + tag: v4.0.1-20241007 + nodeDriverRegistrar: + # -- Repository for the CSI Node Driver Registrar image. When unspecified, Longhorn uses the default value. + repository: rancher/mirrored-longhornio-csi-node-driver-registrar + # -- Tag for the CSI Node Driver Registrar image. When unspecified, Longhorn uses the default value. + tag: v2.12.0 + resizer: + # -- Repository for the CSI Resizer image. When unspecified, Longhorn uses the default value. + repository: rancher/mirrored-longhornio-csi-resizer + # -- Tag for the CSI Resizer image. When unspecified, Longhorn uses the default value. + tag: v1.12.0 + snapshotter: + # -- Repository for the CSI Snapshotter image. When unspecified, Longhorn uses the default value. + repository: rancher/mirrored-longhornio-csi-snapshotter + # -- Tag for the CSI Snapshotter image. When unspecified, Longhorn uses the default value. + tag: v7.0.2-20241007 + livenessProbe: + # -- Repository for the CSI liveness probe image. When unspecified, Longhorn uses the default value. + repository: rancher/mirrored-longhornio-livenessprobe + # -- Tag for the CSI liveness probe image. When unspecified, Longhorn uses the default value. + tag: v2.14.0 + openshift: + oauthProxy: + # -- Repository for the OAuth Proxy image. Specify the upstream image (for example, "quay.io/openshift/origin-oauth-proxy"). This setting applies only to OpenShift users. + repository: "" + # -- Tag for the OAuth Proxy image. Specify OCP/OKD version 4.1 or later (including version 4.15, which is available at quay.io/openshift/origin-oauth-proxy:4.15). This setting applies only to OpenShift users. + tag: "" + # -- Image pull policy that applies to all user-deployed Longhorn components, such as Longhorn Manager, Longhorn driver, and Longhorn UI. + pullPolicy: IfNotPresent + +service: + ui: + # -- Service type for Longhorn UI. (Options: "ClusterIP", "NodePort", "LoadBalancer", "Rancher-Proxy") + type: ClusterIP + # -- NodePort port number for Longhorn UI. When unspecified, Longhorn selects a free port between 30000 and 32767. + nodePort: null + manager: + # -- Service type for Longhorn Manager. + type: ClusterIP + # -- NodePort port number for Longhorn Manager. When unspecified, Longhorn selects a free port between 30000 and 32767. + nodePort: "" + +persistence: + # -- Setting that allows you to specify the default Longhorn StorageClass. + defaultClass: true + # -- Filesystem type of the default Longhorn StorageClass. + defaultFsType: ext4 + # -- mkfs parameters of the default Longhorn StorageClass. + defaultMkfsParams: "" + # -- Replica count of the default Longhorn StorageClass. + defaultClassReplicaCount: 3 + # -- Data locality of the default Longhorn StorageClass. (Options: "disabled", "best-effort") + defaultDataLocality: disabled + # -- Reclaim policy that provides instructions for handling of a volume after its claim is released. (Options: "Retain", "Delete") + reclaimPolicy: Delete + # -- Setting that allows you to enable live migration of a Longhorn volume from one node to another. + migratable: false + # -- Setting that disables the revision counter and thereby prevents Longhorn from tracking all write operations to a volume. When salvaging a volume, Longhorn uses properties of the volume-head-xxx.img file (the last file size and the last time the file was modified) to select the replica to be used for volume recovery. + disableRevisionCounter: "true" + # -- Set NFS mount options for Longhorn StorageClass for RWX volumes + nfsOptions: "" + recurringJobSelector: + # -- Setting that allows you to enable the recurring job selector for a Longhorn StorageClass. + enable: false + # -- Recurring job selector for a Longhorn StorageClass. Ensure that quotes are used correctly when specifying job parameters. (Example: `[{"name":"backup", "isGroup":true}]`) + jobList: [] + backingImage: + # -- Setting that allows you to use a backing image in a Longhorn StorageClass. + enable: false + # -- Backing image to be used for creating and restoring volumes in a Longhorn StorageClass. When no backing images are available, specify the data source type and parameters that Longhorn can use to create a backing image. + name: ~ + # -- Data source type of a backing image used in a Longhorn StorageClass. + # If the backing image exists in the cluster, Longhorn uses this setting to verify the image. + # If the backing image does not exist, Longhorn creates one using the specified data source type. + dataSourceType: ~ + # -- Data source parameters of a backing image used in a Longhorn StorageClass. + # You can specify a JSON string of a map. (Example: `'{\"url\":\"https://backing-image-example.s3-region.amazonaws.com/test-backing-image\"}'`) + dataSourceParameters: ~ + # -- Expected SHA-512 checksum of a backing image used in a Longhorn StorageClass. + expectedChecksum: ~ + defaultDiskSelector: + # -- Setting that allows you to enable the disk selector for the default Longhorn StorageClass. + enable: false + # -- Disk selector for the default Longhorn StorageClass. Longhorn uses only disks with the specified tags for storing volume data. (Examples: "nvme,sata") + selector: "" + defaultNodeSelector: + # -- Setting that allows you to enable the node selector for the default Longhorn StorageClass. + enable: false + # -- Node selector for the default Longhorn StorageClass. Longhorn uses only nodes with the specified tags for storing volume data. (Examples: "storage,fast") + selector: "" + # -- Setting that allows you to enable automatic snapshot removal during filesystem trim for a Longhorn StorageClass. (Options: "ignored", "enabled", "disabled") + removeSnapshotsDuringFilesystemTrim: ignored + # -- Setting that allows you to specify the data engine version for the default Longhorn StorageClass. (Options: "v1", "v2") + dataEngine: v1 + +preUpgradeChecker: + # -- Setting that allows Longhorn to perform pre-upgrade checks. Disable this setting when installing Longhorn using Argo CD or other GitOps solutions. + jobEnabled: true + # -- Setting that allows Longhorn to perform upgrade version checks after starting the Longhorn Manager DaemonSet Pods. Disabling this setting also disables `preUpgradeChecker.jobEnabled`. Longhorn recommends keeping this setting enabled. + upgradeVersionCheck: true + +csi: + # -- kubelet root directory. When unspecified, Longhorn uses the default value. + kubeletRootDir: ~ + # -- Replica count of the CSI Attacher. When unspecified, Longhorn uses the default value ("3"). + attacherReplicaCount: ~ + # -- Replica count of the CSI Provisioner. When unspecified, Longhorn uses the default value ("3"). + provisionerReplicaCount: ~ + # -- Replica count of the CSI Resizer. When unspecified, Longhorn uses the default value ("3"). + resizerReplicaCount: ~ + # -- Replica count of the CSI Snapshotter. When unspecified, Longhorn uses the default value ("3"). + snapshotterReplicaCount: ~ + +defaultSettings: + # -- Endpoint used to access the backupstore. (Options: "NFS", "CIFS", "AWS", "GCP", "AZURE") + backupTarget: ~ + # -- Name of the Kubernetes secret associated with the backup target. + backupTargetCredentialSecret: ~ + # -- Setting that allows Longhorn to automatically attach a volume and create snapshots or backups when recurring jobs are run. + allowRecurringJobWhileVolumeDetached: ~ + # -- Setting that allows Longhorn to automatically create a default disk only on nodes with the label "node.longhorn.io/create-default-disk=true" (if no other disks exist). When this setting is disabled, Longhorn creates a default disk on each node that is added to the cluster. + createDefaultDiskLabeledNodes: ~ + # -- Default path for storing data on a host. The default value is "/var/lib/longhorn/". + defaultDataPath: ~ + # -- Default data locality. A Longhorn volume has data locality if a local replica of the volume exists on the same node as the pod that is using the volume. + defaultDataLocality: ~ + # -- Setting that allows scheduling on nodes with healthy replicas of the same volume. This setting is disabled by default. + replicaSoftAntiAffinity: ~ + # -- Setting that automatically rebalances replicas when an available node is discovered. + replicaAutoBalance: ~ + # -- Percentage of storage that can be allocated relative to hard drive capacity. The default value is "100". + storageOverProvisioningPercentage: ~ + # -- Percentage of minimum available disk capacity. When the minimum available capacity exceeds the total available capacity, the disk becomes unschedulable until more space is made available for use. The default value is "25". + storageMinimalAvailablePercentage: ~ + # -- Percentage of disk space that is not allocated to the default disk on each new Longhorn node. + storageReservedPercentageForDefaultDisk: ~ + # -- Upgrade Checker that periodically checks for new Longhorn versions. When a new version is available, a notification appears on the Longhorn UI. This setting is enabled by default + upgradeChecker: ~ + # -- Default number of replicas for volumes created using the Longhorn UI. For Kubernetes configuration, modify the `numberOfReplicas` field in the StorageClass. The default value is "3". + defaultReplicaCount: ~ + # -- Default Longhorn StorageClass. "storageClassName" is assigned to PVs and PVCs that are created for an existing Longhorn volume. "storageClassName" can also be used as a label, so it is possible to use a Longhorn StorageClass to bind a workload to an existing PV without creating a Kubernetes StorageClass object. The default value is "longhorn-static". + defaultLonghornStaticStorageClass: ~ + # -- Number of seconds that Longhorn waits before checking the backupstore for new backups. The default value is "300". When the value is "0", polling is disabled. + backupstorePollInterval: ~ + # -- Number of minutes that Longhorn keeps a failed backup resource. When the value is "0", automatic deletion is disabled. + failedBackupTTL: ~ + # -- Setting that restores recurring jobs from a backup volume on a backup target and creates recurring jobs if none exist during backup restoration. + restoreVolumeRecurringJobs: ~ + # -- Maximum number of successful recurring backup and snapshot jobs to be retained. When the value is "0", a history of successful recurring jobs is not retained. + recurringSuccessfulJobsHistoryLimit: ~ + # -- Maximum number of failed recurring backup and snapshot jobs to be retained. When the value is "0", a history of failed recurring jobs is not retained. + recurringFailedJobsHistoryLimit: ~ + # -- Maximum number of snapshots or backups to be retained. + recurringJobMaxRetention: ~ + # -- Maximum number of failed support bundles that can exist in the cluster. When the value is "0", Longhorn automatically purges all failed support bundles. + supportBundleFailedHistoryLimit: ~ + # -- Taint or toleration for system-managed Longhorn components. + # Specify values using a semicolon-separated list in `kubectl taint` syntax (Example: key1=value1:effect; key2=value2:effect). + taintToleration: ~ + # -- Node selector for system-managed Longhorn components. + systemManagedComponentsNodeSelector: ~ + # -- PriorityClass for system-managed Longhorn components. + # This setting can help prevent Longhorn components from being evicted under Node Pressure. + # Notice that this will be applied to Longhorn user-deployed components by default if there are no priority class values set yet, such as `longhornManager.priorityClass`. + priorityClass: &defaultPriorityClassNameRef "longhorn-critical" + # -- Setting that allows Longhorn to automatically salvage volumes when all replicas become faulty (for example, when the network connection is interrupted). Longhorn determines which replicas are usable and then uses these replicas for the volume. This setting is enabled by default. + autoSalvage: ~ + # -- Setting that allows Longhorn to automatically delete a workload pod that is managed by a controller (for example, daemonset) whenever a Longhorn volume is detached unexpectedly (for example, during Kubernetes upgrades). After deletion, the controller restarts the pod and then Kubernetes handles volume reattachment and remounting. + autoDeletePodWhenVolumeDetachedUnexpectedly: ~ + # -- Setting that prevents Longhorn Manager from scheduling replicas on a cordoned Kubernetes node. This setting is enabled by default. + disableSchedulingOnCordonedNode: ~ + # -- Setting that allows Longhorn to schedule new replicas of a volume to nodes in the same zone as existing healthy replicas. Nodes that do not belong to any zone are treated as existing in the zone that contains healthy replicas. When identifying zones, Longhorn relies on the label "topology.kubernetes.io/zone=" in the Kubernetes node object. + replicaZoneSoftAntiAffinity: ~ + # -- Setting that allows scheduling on disks with existing healthy replicas of the same volume. This setting is enabled by default. + replicaDiskSoftAntiAffinity: ~ + # -- Policy that defines the action Longhorn takes when a volume is stuck with a StatefulSet or Deployment pod on a node that failed. + nodeDownPodDeletionPolicy: ~ + # -- Policy that defines the action Longhorn takes when a node with the last healthy replica of a volume is drained. + nodeDrainPolicy: ~ + # -- Setting that allows automatic detaching of manually-attached volumes when a node is cordoned. + detachManuallyAttachedVolumesWhenCordoned: ~ + # -- Number of seconds that Longhorn waits before reusing existing data on a failed replica instead of creating a new replica of a degraded volume. + replicaReplenishmentWaitInterval: ~ + # -- Maximum number of replicas that can be concurrently rebuilt on each node. + concurrentReplicaRebuildPerNodeLimit: ~ + # -- Maximum number of volumes that can be concurrently restored on each node using a backup. When the value is "0", restoration of volumes using a backup is disabled. + concurrentVolumeBackupRestorePerNodeLimit: ~ + # -- Setting that disables the revision counter and thereby prevents Longhorn from tracking all write operations to a volume. When salvaging a volume, Longhorn uses properties of the "volume-head-xxx.img" file (the last file size and the last time the file was modified) to select the replica to be used for volume recovery. This setting applies only to volumes created using the Longhorn UI. + disableRevisionCounter: "true" + # -- Image pull policy for system-managed pods, such as Instance Manager, engine images, and CSI Driver. Changes to the image pull policy are applied only after the system-managed pods restart. + systemManagedPodsImagePullPolicy: ~ + # -- Setting that allows you to create and attach a volume without having all replicas scheduled at the time of creation. + allowVolumeCreationWithDegradedAvailability: ~ + # -- Setting that allows Longhorn to automatically clean up the system-generated snapshot after replica rebuilding is completed. + autoCleanupSystemGeneratedSnapshot: ~ + # -- Setting that allows Longhorn to automatically clean up the snapshot generated by a recurring backup job. + autoCleanupRecurringJobBackupSnapshot: ~ + # -- Maximum number of engines that are allowed to concurrently upgrade on each node after Longhorn Manager is upgraded. When the value is "0", Longhorn does not automatically upgrade volume engines to the new default engine image version. + concurrentAutomaticEngineUpgradePerNodeLimit: ~ + # -- Number of minutes that Longhorn waits before cleaning up the backing image file when no replicas in the disk are using it. + backingImageCleanupWaitInterval: ~ + # -- Number of seconds that Longhorn waits before downloading a backing image file again when the status of all image disk files changes to "failed" or "unknown". + backingImageRecoveryWaitInterval: ~ + # -- Percentage of the total allocatable CPU resources on each node to be reserved for each instance manager pod when the V1 Data Engine is enabled. The default value is "12". + guaranteedInstanceManagerCPU: ~ + # -- Setting that notifies Longhorn that the cluster is using the Kubernetes Cluster Autoscaler. + kubernetesClusterAutoscalerEnabled: ~ + # -- Setting that allows Longhorn to automatically delete an orphaned resource and the corresponding data (for example, stale replicas). Orphaned resources on failed or unknown nodes are not automatically cleaned up. + orphanAutoDeletion: ~ + # -- Storage network for in-cluster traffic. When unspecified, Longhorn uses the Kubernetes cluster network. + storageNetwork: ~ + # -- Flag that prevents accidental uninstallation of Longhorn. + deletingConfirmationFlag: ~ + # -- Timeout between the Longhorn Engine and replicas. Specify a value between "8" and "30" seconds. The default value is "8". + engineReplicaTimeout: ~ + # -- Setting that allows you to enable and disable snapshot hashing and data integrity checks. + snapshotDataIntegrity: ~ + # -- Setting that allows disabling of snapshot hashing after snapshot creation to minimize impact on system performance. + snapshotDataIntegrityImmediateCheckAfterSnapshotCreation: ~ + # -- Setting that defines when Longhorn checks the integrity of data in snapshot disk files. You must use the Unix cron expression format. + snapshotDataIntegrityCronjob: ~ + # -- Setting that allows Longhorn to automatically mark the latest snapshot and its parent files as removed during a filesystem trim. Longhorn does not remove snapshots containing multiple child files. + removeSnapshotsDuringFilesystemTrim: ~ + # -- Setting that allows fast rebuilding of replicas using the checksum of snapshot disk files. Before enabling this setting, you must set the snapshot-data-integrity value to "enable" or "fast-check". + fastReplicaRebuildEnabled: ~ + # -- Number of seconds that an HTTP client waits for a response from a File Sync server before considering the connection to have failed. + replicaFileSyncHttpClientTimeout: ~ + # -- Number of seconds that Longhorn allows for the completion of replica rebuilding and snapshot cloning operations. + longGRPCTimeOut: ~ + # -- Log levels that indicate the type and severity of logs in Longhorn Manager. The default value is "Info". (Options: "Panic", "Fatal", "Error", "Warn", "Info", "Debug", "Trace") + logLevel: ~ + # -- Setting that allows you to specify a backup compression method. + backupCompressionMethod: ~ + # -- Maximum number of worker threads that can concurrently run for each backup. + backupConcurrentLimit: ~ + # -- Maximum number of worker threads that can concurrently run for each restore operation. + restoreConcurrentLimit: ~ + # -- Setting that allows you to enable the V1 Data Engine. + v1DataEngine: ~ + # -- Setting that allows you to enable the V2 Data Engine, which is based on the Storage Performance Development Kit (SPDK). The V2 Data Engine is a preview feature and should not be used in production environments. + v2DataEngine: ~ + # -- Setting that allows you to configure maximum huge page size (in MiB) for the V2 Data Engine. + v2DataEngineHugepageLimit: ~ + # -- Number of millicpus on each node to be reserved for each Instance Manager pod when the V2 Data Engine is enabled. The default value is "1250". + v2DataEngineGuaranteedInstanceManagerCPU: ~ + # -- Setting that allows scheduling of empty node selector volumes to any node. + allowEmptyNodeSelectorVolume: ~ + # -- Setting that allows scheduling of empty disk selector volumes to any disk. + allowEmptyDiskSelectorVolume: ~ + # -- Setting that allows Longhorn to periodically collect anonymous usage data for product improvement purposes. Longhorn sends collected data to the [Upgrade Responder](https://github.com/longhorn/upgrade-responder) server, which is the data source of the Longhorn Public Metrics Dashboard (https://metrics.longhorn.io). The Upgrade Responder server does not store data that can be used to identify clients, including IP addresses. + allowCollectingLonghornUsageMetrics: ~ + # -- Setting that temporarily prevents all attempts to purge volume snapshots. + disableSnapshotPurge: ~ + # -- Maximum snapshot count for a volume. The value should be between 2 to 250 + snapshotMaxCount: ~ + # -- Setting that allows you to configure the log level of the SPDK target daemon (spdk_tgt) of the V2 Data Engine. + v2DataEngineLogLevel: ~ + # -- Setting that allows you to configure the log flags of the SPDK target daemon (spdk_tgt) of the V2 Data Engine. + v2DataEngineLogFlags: ~ + # -- Setting that freezes the filesystem on the root partition before a snapshot is created. + freezeFilesystemForSnapshot: ~ + # -- Setting that automatically cleans up the snapshot when the backup is deleted. + autoCleanupSnapshotWhenDeleteBackup: ~ + # -- Turn on logic to detect and move RWX volumes quickly on node failure. + rwxVolumeFastFailover: ~ + +privateRegistry: + # -- Setting that allows you to create a private registry secret. + createSecret: ~ + # -- URL of a private registry. When unspecified, Longhorn uses the default system registry. + registryUrl: ~ + # -- User account used for authenticating with a private registry. + registryUser: ~ + # -- Password for authenticating with a private registry. + registryPasswd: ~ + # -- Kubernetes secret that allows you to pull images from a private registry. This setting applies only when creation of private registry secrets is enabled. You must include the private registry name in the secret name. + registrySecret: ~ + +longhornManager: + log: + # -- Format of Longhorn Manager logs. (Options: "plain", "json") + format: plain + # -- PriorityClass for Longhorn Manager. + priorityClass: *defaultPriorityClassNameRef + # -- Toleration for Longhorn Manager on nodes allowed to run Longhorn components. + tolerations: [] + ## If you want to set tolerations for Longhorn Manager DaemonSet, delete the `[]` in the line above + ## and uncomment this example block + # - key: "key" + # operator: "Equal" + # value: "value" + # effect: "NoSchedule" + # -- Node selector for Longhorn Manager. Specify the nodes allowed to run Longhorn Manager. + nodeSelector: {} + ## If you want to set node selector for Longhorn Manager DaemonSet, delete the `{}` in the line above + ## and uncomment this example block + # label-key1: "label-value1" + # label-key2: "label-value2" + # -- Annotation for the Longhorn Manager service. + serviceAnnotations: {} + ## If you want to set annotations for the Longhorn Manager service, delete the `{}` in the line above + ## and uncomment this example block + # annotation-key1: "annotation-value1" + # annotation-key2: "annotation-value2" + +longhornDriver: + # -- PriorityClass for Longhorn Driver. + priorityClass: *defaultPriorityClassNameRef + # -- Toleration for Longhorn Driver on nodes allowed to run Longhorn components. + tolerations: [] + ## If you want to set tolerations for Longhorn Driver Deployer Deployment, delete the `[]` in the line above + ## and uncomment this example block + # - key: "key" + # operator: "Equal" + # value: "value" + # effect: "NoSchedule" + # -- Node selector for Longhorn Driver. Specify the nodes allowed to run Longhorn Driver. + nodeSelector: {} + ## If you want to set node selector for Longhorn Driver Deployer Deployment, delete the `{}` in the line above + ## and uncomment this example block + # label-key1: "label-value1" + # label-key2: "label-value2" + +longhornUI: + # -- Replica count for Longhorn UI. + replicas: 2 + # -- PriorityClass for Longhorn UI. + priorityClass: *defaultPriorityClassNameRef + # -- Toleration for Longhorn UI on nodes allowed to run Longhorn components. + tolerations: [] + ## If you want to set tolerations for Longhorn UI Deployment, delete the `[]` in the line above + ## and uncomment this example block + # - key: "key" + # operator: "Equal" + # value: "value" + # effect: "NoSchedule" + # -- Node selector for Longhorn UI. Specify the nodes allowed to run Longhorn UI. + nodeSelector: {} + ## If you want to set node selector for Longhorn UI Deployment, delete the `{}` in the line above + ## and uncomment this example block + # label-key1: "label-value1" + # label-key2: "label-value2" + +ingress: + # -- Setting that allows Longhorn to generate ingress records for the Longhorn UI service. + enabled: false + + # -- IngressClass resource that contains ingress configuration, including the name of the Ingress controller. + # ingressClassName can replace the kubernetes.io/ingress.class annotation used in earlier Kubernetes releases. + ingressClassName: ~ + + # -- Hostname of the Layer 7 load balancer. + host: sslip.io + + # -- Setting that allows you to enable TLS on ingress records. + tls: false + + # -- Setting that allows you to enable secure connections to the Longhorn UI service via port 443. + secureBackends: false + + # -- TLS secret that contains the private key and certificate to be used for TLS. This setting applies only when TLS is enabled on ingress records. + tlsSecret: longhorn.local-tls + + # -- Default ingress path. You can access the Longhorn UI by following the full ingress path {{host}}+{{path}}. + path: / + + # -- Ingress path type. To maintain backward compatibility, the default value is "ImplementationSpecific". + pathType: ImplementationSpecific + + ## If you're using kube-lego, you will want to add: + ## kubernetes.io/tls-acme: true + ## + ## For a full list of possible ingress annotations, please see + ## ref: https://github.com/kubernetes/ingress-nginx/blob/master/docs/annotations.md + ## + ## If tls is set to true, annotation ingress.kubernetes.io/secure-backends: "true" will automatically be set + # -- Ingress annotations in the form of key-value pairs. + annotations: + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: true + + # -- Secret that contains a TLS private key and certificate. Use secrets if you want to use your own certificates to secure ingresses. + secrets: + ## If you're providing your own certificates, please use this to add the certificates as secrets + ## key and certificate should start with -----BEGIN CERTIFICATE----- or + ## -----BEGIN RSA PRIVATE KEY----- + ## + ## name should line up with a tlsSecret set further up + ## If you're using kube-lego, this is unneeded, as it will create the secret for you if it is not set + ## + ## It is also possible to create and manage the certificates outside of this helm chart + ## Please see README.md for more information + # - name: longhorn.local-tls + # key: + # certificate: + +# -- Setting that allows you to enable pod security policies (PSPs) that allow privileged Longhorn pods to start. This setting applies only to clusters running Kubernetes 1.25 and earlier, and with the built-in Pod Security admission controller enabled. +enablePSP: false + +# -- Specify override namespace, specifically this is useful for using longhorn as sub-chart and its release namespace is not the `longhorn-system`. +namespaceOverride: "" + +# -- Annotation for the Longhorn Manager DaemonSet pods. This setting is optional. +annotations: {} + +serviceAccount: + # -- Annotations to add to the service account + annotations: {} + +metrics: + serviceMonitor: + # -- Setting that allows the creation of a Prometheus ServiceMonitor resource for Longhorn Manager components. + enabled: false + # -- Additional labels for the Prometheus ServiceMonitor resource. + additionalLabels: {} + # -- Annotations for the Prometheus ServiceMonitor resource. + annotations: {} + # -- Interval at which Prometheus scrapes the metrics from the target. + interval: "" + # -- Timeout after which Prometheus considers the scrape to be failed. + scrapeTimeout: "" + # -- Configures the relabeling rules to apply the target’s metadata labels. See the [Prometheus Operator + # documentation](https://prometheus-operator.dev/docs/api-reference/api/#monitoring.coreos.com/v1.Endpoint) for + # formatting details. + relabelings: [] + # -- Configures the relabeling rules to apply to the samples before ingestion. See the [Prometheus Operator + # documentation](https://prometheus-operator.dev/docs/api-reference/api/#monitoring.coreos.com/v1.Endpoint) for + # formatting details. + metricRelabelings: [] + +## openshift settings +openshift: + # -- Setting that allows Longhorn to integrate with OpenShift. + enabled: false + ui: + # -- Route for connections between Longhorn and the OpenShift web console. + route: "longhorn-ui" + # -- Port for accessing the OpenShift web console. + port: 443 + # -- Port for proxy that provides access to the OpenShift web console. + proxy: 8443 + +# -- Setting that allows Longhorn to generate code coverage profiles. +enableGoCoverDir: false diff --git a/index.yaml b/index.yaml index 78c7238225..79c9c0a4d6 100755 --- a/index.yaml +++ b/index.yaml @@ -3362,6 +3362,50 @@ entries: - assets/harvester-csi-driver/harvester-csi-driver-101.0.0+up0.1.14.tgz version: 101.0.0+up0.1.14 longhorn: + - annotations: + catalog.cattle.io/auto-install: longhorn-crd=match + catalog.cattle.io/certified: rancher + catalog.cattle.io/display-name: Longhorn + catalog.cattle.io/kube-version: '>= 1.21.0-0' + catalog.cattle.io/namespace: longhorn-system + catalog.cattle.io/permits-os: linux,windows + catalog.cattle.io/provides-gvr: longhorn.io/v1beta1 + catalog.cattle.io/rancher-version: '>= 2.9.0-0 < 2.10.0-0' + catalog.cattle.io/release-name: longhorn + catalog.cattle.io/type: cluster-tool + catalog.cattle.io/upstream-version: 1.7.2 + apiVersion: v1 + appVersion: v1.7.2 + created: "2024-11-14T16:35:22.71789928-03:00" + description: Longhorn is a distributed block storage system for Kubernetes. + digest: ff9766826609d5c711137e926bb297a7d33e171bebb00415f3ded1a5fec5ad22 + home: https://github.com/longhorn/longhorn + icon: https://raw.githubusercontent.com/cncf/artwork/master/projects/longhorn/icon/color/longhorn-icon-color.png + keywords: + - longhorn + - storage + - distributed + - block + - device + - iscsi + - nfs + kubeVersion: '>=1.21.0-0' + maintainers: + - email: maintainers@longhorn.io + name: Longhorn maintainers + name: longhorn + sources: + - https://github.com/longhorn/longhorn + - https://github.com/longhorn/longhorn-engine + - https://github.com/longhorn/longhorn-instance-manager + - https://github.com/longhorn/longhorn-share-manager + - https://github.com/longhorn/longhorn-manager + - https://github.com/longhorn/longhorn-ui + - https://github.com/longhorn/longhorn-tests + - https://github.com/longhorn/backing-image-manager + urls: + - assets/longhorn/longhorn-104.2.1+up1.7.2.tgz + version: 104.2.1+up1.7.2 - annotations: catalog.cattle.io/auto-install: longhorn-crd=match catalog.cattle.io/certified: rancher @@ -3538,6 +3582,50 @@ entries: urls: - assets/longhorn/longhorn-104.0.0+up1.5.5.tgz version: 104.0.0+up1.5.5 + - annotations: + catalog.cattle.io/auto-install: longhorn-crd=match + catalog.cattle.io/certified: rancher + catalog.cattle.io/display-name: Longhorn + catalog.cattle.io/kube-version: '>= 1.21.0-0' + catalog.cattle.io/namespace: longhorn-system + catalog.cattle.io/permits-os: linux,windows + catalog.cattle.io/provides-gvr: longhorn.io/v1beta1 + catalog.cattle.io/rancher-version: '>= 2.8.0-0 < 2.9.0-0' + catalog.cattle.io/release-name: longhorn + catalog.cattle.io/type: cluster-tool + catalog.cattle.io/upstream-version: 1.7.2 + apiVersion: v1 + appVersion: v1.7.2 + created: "2024-11-14T16:35:50.612278834-03:00" + description: Longhorn is a distributed block storage system for Kubernetes. + digest: 5f395639996cad174e58ab16e12dc5536e8c4eeaa2c651271a319c70c203e7b6 + home: https://github.com/longhorn/longhorn + icon: https://raw.githubusercontent.com/cncf/artwork/master/projects/longhorn/icon/color/longhorn-icon-color.png + keywords: + - longhorn + - storage + - distributed + - block + - device + - iscsi + - nfs + kubeVersion: '>=1.21.0-0' + maintainers: + - email: maintainers@longhorn.io + name: Longhorn maintainers + name: longhorn + sources: + - https://github.com/longhorn/longhorn + - https://github.com/longhorn/longhorn-engine + - https://github.com/longhorn/longhorn-instance-manager + - https://github.com/longhorn/longhorn-share-manager + - https://github.com/longhorn/longhorn-manager + - https://github.com/longhorn/longhorn-ui + - https://github.com/longhorn/longhorn-tests + - https://github.com/longhorn/backing-image-manager + urls: + - assets/longhorn/longhorn-103.4.1+up1.7.2.tgz + version: 103.4.1+up1.7.2 - annotations: catalog.cattle.io/auto-install: longhorn-crd=match catalog.cattle.io/certified: rancher @@ -4023,6 +4111,50 @@ entries: urls: - assets/longhorn/longhorn-103.0.0+up1.3.3.tgz version: 103.0.0+up1.3.3 + - annotations: + catalog.cattle.io/auto-install: longhorn-crd=match + catalog.cattle.io/certified: rancher + catalog.cattle.io/display-name: Longhorn + catalog.cattle.io/kube-version: '>= 1.21.0-0' + catalog.cattle.io/namespace: longhorn-system + catalog.cattle.io/permits-os: linux,windows + catalog.cattle.io/provides-gvr: longhorn.io/v1beta1 + catalog.cattle.io/rancher-version: '>= 2.7.0-0 < 2.8.0-0' + catalog.cattle.io/release-name: longhorn + catalog.cattle.io/type: cluster-tool + catalog.cattle.io/upstream-version: 1.7.2 + apiVersion: v1 + appVersion: v1.7.2 + created: "2024-11-14T16:36:36.697742211-03:00" + description: Longhorn is a distributed block storage system for Kubernetes. + digest: 8fb53cd5cff05a04d52a48d6249de5ba3aa4e397402cf8e7c9f4bcf39bb9ce9a + home: https://github.com/longhorn/longhorn + icon: https://raw.githubusercontent.com/cncf/artwork/master/projects/longhorn/icon/color/longhorn-icon-color.png + keywords: + - longhorn + - storage + - distributed + - block + - device + - iscsi + - nfs + kubeVersion: '>=1.21.0-0' + maintainers: + - email: maintainers@longhorn.io + name: Longhorn maintainers + name: longhorn + sources: + - https://github.com/longhorn/longhorn + - https://github.com/longhorn/longhorn-engine + - https://github.com/longhorn/longhorn-instance-manager + - https://github.com/longhorn/longhorn-share-manager + - https://github.com/longhorn/longhorn-manager + - https://github.com/longhorn/longhorn-ui + - https://github.com/longhorn/longhorn-tests + - https://github.com/longhorn/backing-image-manager + urls: + - assets/longhorn/longhorn-102.5.1+up1.7.2.tgz + version: 102.5.1+up1.7.2 - annotations: catalog.cattle.io/auto-install: longhorn-crd=match catalog.cattle.io/certified: rancher @@ -4732,6 +4864,21 @@ entries: - assets/longhorn/longhorn-101.0.0+up1.2.6.tgz version: 101.0.0+up1.2.6 longhorn-crd: + - annotations: + catalog.cattle.io/certified: rancher + catalog.cattle.io/hidden: "true" + catalog.cattle.io/namespace: longhorn-system + catalog.cattle.io/release-name: longhorn-crd + apiVersion: v1 + appVersion: v1.7.2 + created: "2024-11-14T16:35:33.04510563-03:00" + description: Installs the CRDs for longhorn. + digest: 4dd78a15aaa54937f5748e2ca4aa18e8df9dee50f1fe92c5b607334bca03f747 + name: longhorn-crd + type: application + urls: + - assets/longhorn-crd/longhorn-crd-104.2.1+up1.7.2.tgz + version: 104.2.1+up1.7.2 - annotations: catalog.cattle.io/certified: rancher catalog.cattle.io/hidden: "true" @@ -4792,6 +4939,21 @@ entries: urls: - assets/longhorn-crd/longhorn-crd-104.0.0+up1.5.5.tgz version: 104.0.0+up1.5.5 + - annotations: + catalog.cattle.io/certified: rancher + catalog.cattle.io/hidden: "true" + catalog.cattle.io/namespace: longhorn-system + catalog.cattle.io/release-name: longhorn-crd + apiVersion: v1 + appVersion: v1.7.2 + created: "2024-11-14T16:36:01.602556962-03:00" + description: Installs the CRDs for longhorn. + digest: 9df2d00080c28d52171bbcc24768f5d64cf064ea7ebc19f190f900a858afef52 + name: longhorn-crd + type: application + urls: + - assets/longhorn-crd/longhorn-crd-103.4.1+up1.7.2.tgz + version: 103.4.1+up1.7.2 - annotations: catalog.cattle.io/certified: rancher catalog.cattle.io/hidden: "true" @@ -4957,6 +5119,21 @@ entries: urls: - assets/longhorn-crd/longhorn-crd-103.0.0+up1.3.3.tgz version: 103.0.0+up1.3.3 + - annotations: + catalog.cattle.io/certified: rancher + catalog.cattle.io/hidden: "true" + catalog.cattle.io/namespace: longhorn-system + catalog.cattle.io/release-name: longhorn-crd + apiVersion: v1 + appVersion: v1.7.2 + created: "2024-11-14T16:37:31.136248918-03:00" + description: Installs the CRDs for longhorn. + digest: 3e1e910cafef23c2eefb4a06b1d2b0e893579714f9cb9553350c0e739838eb45 + name: longhorn-crd + type: application + urls: + - assets/longhorn-crd/longhorn-crd-102.5.1+up1.7.2.tgz + version: 102.5.1+up1.7.2 - annotations: catalog.cattle.io/certified: rancher catalog.cattle.io/hidden: "true" diff --git a/release.yaml b/release.yaml index 17239fb216..d7fdb40f2b 100644 --- a/release.yaml +++ b/release.yaml @@ -1,3 +1,11 @@ +longhorn: + - 104.2.1+up1.7.2 + - 103.4.1+up1.7.2 + - 102.5.1+up1.7.2 +longhorn-crd: + - 104.2.1+up1.7.2 + - 103.4.1+up1.7.2 + - 102.5.1+up1.7.2 prometheus-federator: - 105.0.1+up0.4.3 rancher-cis-benchmark: From 38b8e3ceff04271d94d2b0012d77ef01efda5759 Mon Sep 17 00:00:00 2001 From: Nicholas openSUSE Software Engineer Date: Mon, 18 Nov 2024 13:00:55 -0300 Subject: [PATCH 2/3] [release-v2.10] 5th batch release (#4767) Co-authored-by: rancherbot --- .../fleet-agent-105.0.1+up0.11.1.tgz | Bin 0 -> 3592 bytes .../fleet-crd/fleet-crd-105.0.1+up0.11.1.tgz | Bin 0 -> 36648 bytes assets/fleet/fleet-105.0.1+up0.11.1.tgz | Bin 0 -> 6446 bytes ...rvester-cloud-provider-105.0.0+up0.2.6.tgz | Bin 0 -> 4522 bytes .../harvester-csi-driver-105.0.0+up0.1.21.tgz | Bin 0 -> 3846 bytes .../fleet-agent/105.0.1+up0.11.1/Chart.yaml | 15 + charts/fleet-agent/105.0.1+up0.11.1/README.md | 8 + .../105.0.1+up0.11.1/templates/_helpers.tpl | 22 + .../105.0.1+up0.11.1/templates/configmap.yaml | 16 + .../templates/deployment.yaml | 111 + .../templates/network_policy_allow_all.yaml | 15 + .../patch_default_serviceaccount.yaml | 28 + .../105.0.1+up0.11.1/templates/rbac.yaml | 28 + .../105.0.1+up0.11.1/templates/secret.yaml | 10 + .../105.0.1+up0.11.1/templates/service.yaml | 9 + .../templates/serviceaccount.yaml | 4 + .../105.0.1+up0.11.1/templates/validate.yaml | 11 + .../fleet-agent/105.0.1+up0.11.1/values.yaml | 75 + charts/fleet-crd/105.0.1+up0.11.1/Chart.yaml | 13 + charts/fleet-crd/105.0.1+up0.11.1/README.md | 5 + .../105.0.1+up0.11.1/templates/crds.yaml | 7104 +++++++++++++++++ charts/fleet-crd/105.0.1+up0.11.1/values.yaml | 1 + charts/fleet/105.0.1+up0.11.1/Chart.yaml | 18 + charts/fleet/105.0.1+up0.11.1/README.md | 30 + .../105.0.1+up0.11.1/templates/_helpers.tpl | 22 + .../105.0.1+up0.11.1/templates/configmap.yaml | 30 + .../templates/deployment.yaml | 241 + .../templates/deployment_gitjob.yaml | 137 + .../job_cleanup_clusterregistrations.yaml | 41 + .../templates/job_cleanup_gitrepojobs.yaml | 44 + .../105.0.1+up0.11.1/templates/rbac.yaml | 113 + .../templates/rbac_gitjob.yaml | 133 + .../105.0.1+up0.11.1/templates/service.yaml | 36 + .../templates/service_gitjob.yaml | 51 + .../templates/serviceaccount.yaml | 12 + .../templates/serviceaccount_gitjob.yaml | 6 + charts/fleet/105.0.1+up0.11.1/values.yaml | 122 + .../105.0.0+up0.2.6/.helmignore | 23 + .../105.0.0+up0.2.6/Chart.lock | 6 + .../105.0.0+up0.2.6/Chart.yaml | 25 + .../charts/kube-vip/.helmignore | 23 + .../charts/kube-vip/Chart.yaml | 6 + .../charts/kube-vip/templates/_helpers.tpl | 74 + .../charts/kube-vip/templates/daemonset.yaml | 51 + .../charts/kube-vip/templates/rbac.yaml | 36 + .../charts/kube-vip/values.yaml | 79 + .../105.0.0+up0.2.6/ci/kind-values.yaml | 3 + .../dependency_charts/kube-vip/.helmignore | 23 + .../dependency_charts/kube-vip/Chart.yaml | 6 + .../kube-vip/templates/_helpers.tpl | 74 + .../kube-vip/templates/daemonset.yaml | 51 + .../kube-vip/templates/rbac.yaml | 36 + .../dependency_charts/kube-vip/values.yaml | 79 + .../105.0.0+up0.2.6/questions.yml | 11 + .../105.0.0+up0.2.6/templates/_helpers.tpl | 69 + .../105.0.0+up0.2.6/templates/deployment.yaml | 57 + .../105.0.0+up0.2.6/templates/rbac.yaml | 37 + .../105.0.0+up0.2.6/values.yaml | 106 + .../105.0.0+up0.1.21/.helmignore | 23 + .../105.0.0+up0.1.21/Chart.yaml | 22 + .../105.0.0+up0.1.21/questions.yml | 11 + .../105.0.0+up0.1.21/templates/NOTES.txt | 1 + .../105.0.0+up0.1.21/templates/_helpers.tpl | 62 + .../105.0.0+up0.1.21/templates/csidriver.yaml | 10 + .../105.0.0+up0.1.21/templates/daemonset.yaml | 152 + .../templates/deployment.yaml | 95 + .../105.0.0+up0.1.21/templates/rbac.yaml | 75 + .../templates/storageclass.yaml | 10 + .../105.0.0+up0.1.21/values.yaml | 56 + index.yaml | 113 + regsync.yaml | 12 + release.yaml | 24 +- 72 files changed, 10038 insertions(+), 14 deletions(-) create mode 100644 assets/fleet-agent/fleet-agent-105.0.1+up0.11.1.tgz create mode 100644 assets/fleet-crd/fleet-crd-105.0.1+up0.11.1.tgz create mode 100644 assets/fleet/fleet-105.0.1+up0.11.1.tgz create mode 100644 assets/harvester-cloud-provider/harvester-cloud-provider-105.0.0+up0.2.6.tgz create mode 100644 assets/harvester-csi-driver/harvester-csi-driver-105.0.0+up0.1.21.tgz create mode 100644 charts/fleet-agent/105.0.1+up0.11.1/Chart.yaml create mode 100644 charts/fleet-agent/105.0.1+up0.11.1/README.md create mode 100644 charts/fleet-agent/105.0.1+up0.11.1/templates/_helpers.tpl create mode 100644 charts/fleet-agent/105.0.1+up0.11.1/templates/configmap.yaml create mode 100644 charts/fleet-agent/105.0.1+up0.11.1/templates/deployment.yaml create mode 100644 charts/fleet-agent/105.0.1+up0.11.1/templates/network_policy_allow_all.yaml create mode 100644 charts/fleet-agent/105.0.1+up0.11.1/templates/patch_default_serviceaccount.yaml create mode 100644 charts/fleet-agent/105.0.1+up0.11.1/templates/rbac.yaml create mode 100644 charts/fleet-agent/105.0.1+up0.11.1/templates/secret.yaml create mode 100644 charts/fleet-agent/105.0.1+up0.11.1/templates/service.yaml create mode 100644 charts/fleet-agent/105.0.1+up0.11.1/templates/serviceaccount.yaml create mode 100644 charts/fleet-agent/105.0.1+up0.11.1/templates/validate.yaml create mode 100644 charts/fleet-agent/105.0.1+up0.11.1/values.yaml create mode 100644 charts/fleet-crd/105.0.1+up0.11.1/Chart.yaml create mode 100644 charts/fleet-crd/105.0.1+up0.11.1/README.md create mode 100644 charts/fleet-crd/105.0.1+up0.11.1/templates/crds.yaml create mode 100644 charts/fleet-crd/105.0.1+up0.11.1/values.yaml create mode 100644 charts/fleet/105.0.1+up0.11.1/Chart.yaml create mode 100644 charts/fleet/105.0.1+up0.11.1/README.md create mode 100644 charts/fleet/105.0.1+up0.11.1/templates/_helpers.tpl create mode 100644 charts/fleet/105.0.1+up0.11.1/templates/configmap.yaml create mode 100644 charts/fleet/105.0.1+up0.11.1/templates/deployment.yaml create mode 100644 charts/fleet/105.0.1+up0.11.1/templates/deployment_gitjob.yaml create mode 100644 charts/fleet/105.0.1+up0.11.1/templates/job_cleanup_clusterregistrations.yaml create mode 100644 charts/fleet/105.0.1+up0.11.1/templates/job_cleanup_gitrepojobs.yaml create mode 100644 charts/fleet/105.0.1+up0.11.1/templates/rbac.yaml create mode 100644 charts/fleet/105.0.1+up0.11.1/templates/rbac_gitjob.yaml create mode 100644 charts/fleet/105.0.1+up0.11.1/templates/service.yaml create mode 100644 charts/fleet/105.0.1+up0.11.1/templates/service_gitjob.yaml create mode 100644 charts/fleet/105.0.1+up0.11.1/templates/serviceaccount.yaml create mode 100644 charts/fleet/105.0.1+up0.11.1/templates/serviceaccount_gitjob.yaml create mode 100644 charts/fleet/105.0.1+up0.11.1/values.yaml create mode 100644 charts/harvester-cloud-provider/105.0.0+up0.2.6/.helmignore create mode 100644 charts/harvester-cloud-provider/105.0.0+up0.2.6/Chart.lock create mode 100644 charts/harvester-cloud-provider/105.0.0+up0.2.6/Chart.yaml create mode 100644 charts/harvester-cloud-provider/105.0.0+up0.2.6/charts/kube-vip/.helmignore create mode 100644 charts/harvester-cloud-provider/105.0.0+up0.2.6/charts/kube-vip/Chart.yaml create mode 100644 charts/harvester-cloud-provider/105.0.0+up0.2.6/charts/kube-vip/templates/_helpers.tpl create mode 100644 charts/harvester-cloud-provider/105.0.0+up0.2.6/charts/kube-vip/templates/daemonset.yaml create mode 100644 charts/harvester-cloud-provider/105.0.0+up0.2.6/charts/kube-vip/templates/rbac.yaml create mode 100644 charts/harvester-cloud-provider/105.0.0+up0.2.6/charts/kube-vip/values.yaml create mode 100644 charts/harvester-cloud-provider/105.0.0+up0.2.6/ci/kind-values.yaml create mode 100644 charts/harvester-cloud-provider/105.0.0+up0.2.6/dependency_charts/kube-vip/.helmignore create mode 100644 charts/harvester-cloud-provider/105.0.0+up0.2.6/dependency_charts/kube-vip/Chart.yaml create mode 100644 charts/harvester-cloud-provider/105.0.0+up0.2.6/dependency_charts/kube-vip/templates/_helpers.tpl create mode 100644 charts/harvester-cloud-provider/105.0.0+up0.2.6/dependency_charts/kube-vip/templates/daemonset.yaml create mode 100644 charts/harvester-cloud-provider/105.0.0+up0.2.6/dependency_charts/kube-vip/templates/rbac.yaml create mode 100644 charts/harvester-cloud-provider/105.0.0+up0.2.6/dependency_charts/kube-vip/values.yaml create mode 100644 charts/harvester-cloud-provider/105.0.0+up0.2.6/questions.yml create mode 100644 charts/harvester-cloud-provider/105.0.0+up0.2.6/templates/_helpers.tpl create mode 100644 charts/harvester-cloud-provider/105.0.0+up0.2.6/templates/deployment.yaml create mode 100644 charts/harvester-cloud-provider/105.0.0+up0.2.6/templates/rbac.yaml create mode 100644 charts/harvester-cloud-provider/105.0.0+up0.2.6/values.yaml create mode 100644 charts/harvester-csi-driver/105.0.0+up0.1.21/.helmignore create mode 100644 charts/harvester-csi-driver/105.0.0+up0.1.21/Chart.yaml create mode 100644 charts/harvester-csi-driver/105.0.0+up0.1.21/questions.yml create mode 100644 charts/harvester-csi-driver/105.0.0+up0.1.21/templates/NOTES.txt create mode 100644 charts/harvester-csi-driver/105.0.0+up0.1.21/templates/_helpers.tpl create mode 100644 charts/harvester-csi-driver/105.0.0+up0.1.21/templates/csidriver.yaml create mode 100644 charts/harvester-csi-driver/105.0.0+up0.1.21/templates/daemonset.yaml create mode 100644 charts/harvester-csi-driver/105.0.0+up0.1.21/templates/deployment.yaml create mode 100644 charts/harvester-csi-driver/105.0.0+up0.1.21/templates/rbac.yaml create mode 100644 charts/harvester-csi-driver/105.0.0+up0.1.21/templates/storageclass.yaml create mode 100644 charts/harvester-csi-driver/105.0.0+up0.1.21/values.yaml diff --git a/assets/fleet-agent/fleet-agent-105.0.1+up0.11.1.tgz b/assets/fleet-agent/fleet-agent-105.0.1+up0.11.1.tgz new file mode 100644 index 0000000000000000000000000000000000000000..daf0b0a5d35b7d9a07d022e4aba45c8db4d72560 GIT binary patch literal 3592 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

Oj`{=IPz0x9T=zZ5uQaJf959QHrX*! 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 B;-UZm literal 0 HcmV?d00001 diff --git a/assets/fleet/fleet-105.0.1+up0.11.1.tgz b/assets/fleet/fleet-105.0.1+up0.11.1.tgz new file mode 100644 index 0000000000000000000000000000000000000000..7ab0973d5a4070aad8e9a2b1ac919f8ecc6822f9 GIT binary patch literal 6446 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 I5dfwD01z#wKmY&$ literal 0 HcmV?d00001 diff --git a/assets/harvester-cloud-provider/harvester-cloud-provider-105.0.0+up0.2.6.tgz b/assets/harvester-cloud-provider/harvester-cloud-provider-105.0.0+up0.2.6.tgz new file mode 100644 index 0000000000000000000000000000000000000000..98249cb753d44e5b74550ccd77e54b5dcf5dd208 GIT binary patch literal 4522 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 IP5`0+01h-hHUIzs literal 0 HcmV?d00001 diff --git a/assets/harvester-csi-driver/harvester-csi-driver-105.0.0+up0.1.21.tgz b/assets/harvester-csi-driver/harvester-csi-driver-105.0.0+up0.1.21.tgz new file mode 100644 index 0000000000000000000000000000000000000000..2e0a4a4ecaca0ceeb202594a6bf660dc56567cbd GIT binary patch literal 3846 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 I0{~= 1.28.0-0 < 1.32.0-0' + catalog.cattle.io/namespace: cattle-fleet-system + catalog.cattle.io/os: linux + catalog.cattle.io/permits-os: linux,windows + catalog.cattle.io/rancher-version: '>= 2.10.0-0 < 2.11.0-0' + catalog.cattle.io/release-name: fleet-agent +apiVersion: v2 +appVersion: 0.11.1 +description: Fleet Agent - GitOps at Scale +icon: https://charts.rancher.io/assets/logos/fleet.svg +name: fleet-agent +version: 105.0.1+up0.11.1 diff --git a/charts/fleet-agent/105.0.1+up0.11.1/README.md b/charts/fleet-agent/105.0.1+up0.11.1/README.md new file mode 100644 index 0000000000..2c5724dcef --- /dev/null +++ b/charts/fleet-agent/105.0.1+up0.11.1/README.md @@ -0,0 +1,8 @@ +## Fleet Agent Helm Chart + +Every Fleet-managed downstream cluster will run an agent that communicates back to the Fleet controller. This agent is just another set of Kubernetes controllers running in the downstream cluster. + +Standalone Fleet users use this chart for agent-initiated registration. For more details see [agent-initiated registration](https://fleet.rancher.io/cluster-registration#agent-initiated). +Fleet in Rancher does not use this chart, but creates the agent deployments programmatically. + +The Fleet documentation is centralized in the [doc website](https://fleet.rancher.io/). \ No newline at end of file diff --git a/charts/fleet-agent/105.0.1+up0.11.1/templates/_helpers.tpl b/charts/fleet-agent/105.0.1+up0.11.1/templates/_helpers.tpl new file mode 100644 index 0000000000..6cd96c3ace --- /dev/null +++ b/charts/fleet-agent/105.0.1+up0.11.1/templates/_helpers.tpl @@ -0,0 +1,22 @@ +{{- define "system_default_registry" -}} +{{- if .Values.global.cattle.systemDefaultRegistry -}} +{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} +{{- else -}} +{{- "" -}} +{{- end -}} +{{- end -}} + +{{/* +Windows cluster will add default taint for linux nodes, +add below linux tolerations to workloads could be scheduled to those linux nodes +*/}} +{{- define "linux-node-tolerations" -}} +- key: "cattle.io/os" + value: "linux" + effect: "NoSchedule" + operator: "Equal" +{{- end -}} + +{{- define "linux-node-selector" -}} +kubernetes.io/os: linux +{{- end -}} \ No newline at end of file diff --git a/charts/fleet-agent/105.0.1+up0.11.1/templates/configmap.yaml b/charts/fleet-agent/105.0.1+up0.11.1/templates/configmap.yaml new file mode 100644 index 0000000000..76e0866978 --- /dev/null +++ b/charts/fleet-agent/105.0.1+up0.11.1/templates/configmap.yaml @@ -0,0 +1,16 @@ +kind: ConfigMap +apiVersion: v1 +metadata: + name: fleet-agent +data: + config: |- + { + {{ if .Values.labels }} + "labels":{{toJson .Values.labels}}, + {{ end }} + "clientID":"{{.Values.clientID}}", + {{ if .Values.garbageCollectionInterval }} + "garbageCollectionInterval": "{{.Values.garbageCollectionInterval}}", + {{ end }} + "agentTLSMode": "{{.Values.agentTLSMode}}" + } diff --git a/charts/fleet-agent/105.0.1+up0.11.1/templates/deployment.yaml b/charts/fleet-agent/105.0.1+up0.11.1/templates/deployment.yaml new file mode 100644 index 0000000000..571f346783 --- /dev/null +++ b/charts/fleet-agent/105.0.1+up0.11.1/templates/deployment.yaml @@ -0,0 +1,111 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: fleet-agent +spec: + serviceName: fleet-agent + selector: + matchLabels: + app: fleet-agent + template: + metadata: + labels: + app: fleet-agent + spec: + initContainers: + - env: + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + image: '{{ template "system_default_registry" . }}{{.Values.image.repository}}:{{.Values.image.tag}}' + name: fleet-agent-register + command: + - fleetagent + - register + {{- if .Values.debug }} + - --debug + - --debug-level + - {{ quote .Values.debugLevel }} + {{- end }} + {{- if not .Values.disableSecurityContext }} + securityContext: + allowPrivilegeEscalation: false + readOnlyRootFilesystem: true + privileged: false + capabilities: + drop: + - ALL + {{- end }} + containers: + - env: + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + image: '{{ template "system_default_registry" . }}{{.Values.image.repository}}:{{.Values.image.tag}}' + name: fleet-agent + command: + - fleetagent + {{- if .Values.debug }} + - --debug + - --debug-level + - {{ quote .Values.debugLevel }} + {{- end }} + {{- if not .Values.disableSecurityContext }} + securityContext: + allowPrivilegeEscalation: false + readOnlyRootFilesystem: true + privileged: false + capabilities: + drop: + - ALL + {{- end }} + volumeMounts: + - mountPath: /.kube + name: kube + - env: + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + image: '{{ template "system_default_registry" . }}{{.Values.image.repository}}:{{.Values.image.tag}}' + name: fleet-agent-clusterstatus + command: + - fleetagent + - clusterstatus + {{- if .Values.debug }} + - --debug + - --debug-level + - {{ quote .Values.debugLevel }} + {{- end }} + {{- if not .Values.disableSecurityContext }} + securityContext: + allowPrivilegeEscalation: false + readOnlyRootFilesystem: true + privileged: false + capabilities: + drop: + - ALL + {{- end }} + volumes: + - name: kube + emptyDir: {} + serviceAccountName: fleet-agent + {{- if .Values.fleetAgent.hostNetwork }} + hostNetwork: true + {{- end }} + nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} +{{- if .Values.fleetAgent.nodeSelector }} +{{ toYaml .Values.fleetAgent.nodeSelector | indent 8 }} +{{- end }} + tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} +{{- if .Values.fleetAgent.tolerations }} +{{ toYaml .Values.fleetAgent.tolerations | indent 8 }} +{{- end }} +{{- if not .Values.disableSecurityContext }} + securityContext: + runAsNonRoot: true + runAsUser: 1000 + runAsGroup: 1000 +{{- end }} diff --git a/charts/fleet-agent/105.0.1+up0.11.1/templates/network_policy_allow_all.yaml b/charts/fleet-agent/105.0.1+up0.11.1/templates/network_policy_allow_all.yaml new file mode 100644 index 0000000000..a72109a062 --- /dev/null +++ b/charts/fleet-agent/105.0.1+up0.11.1/templates/network_policy_allow_all.yaml @@ -0,0 +1,15 @@ +--- +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: default-allow-all + namespace: {{ .Values.internal.systemNamespace }} +spec: + podSelector: {} + ingress: + - {} + egress: + - {} + policyTypes: + - Ingress + - Egress diff --git a/charts/fleet-agent/105.0.1+up0.11.1/templates/patch_default_serviceaccount.yaml b/charts/fleet-agent/105.0.1+up0.11.1/templates/patch_default_serviceaccount.yaml new file mode 100644 index 0000000000..aad4eea415 --- /dev/null +++ b/charts/fleet-agent/105.0.1+up0.11.1/templates/patch_default_serviceaccount.yaml @@ -0,0 +1,28 @@ +--- +apiVersion: batch/v1 +kind: Job +metadata: + name: patch-fleet-sa + annotations: + "helm.sh/hook": post-install, post-upgrade + "helm.sh/hook-delete-policy": hook-succeeded, before-hook-creation +spec: + template: + spec: + serviceAccountName: fleet-agent + restartPolicy: Never + containers: + - name: sa + image: "{{ template "system_default_registry" . }}{{ .Values.global.kubectl.repository }}:{{ .Values.global.kubectl.tag }}" + imagePullPolicy: {{ .Values.global.imagePullPolicy }} + command: ["kubectl", "patch", "serviceaccount", "default", "-p", "{\"automountServiceAccountToken\": false}"] + args: ["-n", {{ .Values.internal.systemNamespace }}] + nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} +{{- if .Values.kubectl.nodeSelector }} +{{ toYaml .Values.kubectl.nodeSelector | indent 8 }} +{{- end }} + tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} +{{- if .Values.kubectl.tolerations }} +{{ toYaml .Values.kubectl.tolerations | indent 8 }} +{{- end }} + backoffLimit: 1 diff --git a/charts/fleet-agent/105.0.1+up0.11.1/templates/rbac.yaml b/charts/fleet-agent/105.0.1+up0.11.1/templates/rbac.yaml new file mode 100644 index 0000000000..1a7e8d8841 --- /dev/null +++ b/charts/fleet-agent/105.0.1+up0.11.1/templates/rbac.yaml @@ -0,0 +1,28 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: fleet-agent-system-fleet-agent-role +rules: +- apiGroups: + - '*' + resources: + - '*' + verbs: + - '*' +- nonResourceURLs: + - "*" + verbs: + - "*" +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: fleet-agent-system-fleet-agent-role-binding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: fleet-agent-system-fleet-agent-role +subjects: +- kind: ServiceAccount + name: fleet-agent + namespace: {{.Release.Namespace}} diff --git a/charts/fleet-agent/105.0.1+up0.11.1/templates/secret.yaml b/charts/fleet-agent/105.0.1+up0.11.1/templates/secret.yaml new file mode 100644 index 0000000000..4715882047 --- /dev/null +++ b/charts/fleet-agent/105.0.1+up0.11.1/templates/secret.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +data: + systemRegistrationNamespace: "{{b64enc .Values.systemRegistrationNamespace}}" + clusterNamespace: "{{b64enc .Values.clusterNamespace}}" + token: "{{b64enc .Values.token}}" + apiServerURL: "{{b64enc .Values.apiServerURL}}" + apiServerCA: "{{b64enc .Values.apiServerCA}}" +kind: Secret +metadata: + name: fleet-agent-bootstrap diff --git a/charts/fleet-agent/105.0.1+up0.11.1/templates/service.yaml b/charts/fleet-agent/105.0.1+up0.11.1/templates/service.yaml new file mode 100644 index 0000000000..36d35588f3 --- /dev/null +++ b/charts/fleet-agent/105.0.1+up0.11.1/templates/service.yaml @@ -0,0 +1,9 @@ +apiVersion: v1 +kind: Service +metadata: + name: fleet-agent +spec: + type: ClusterIP + clusterIP: None + selector: + app: fleet-agent diff --git a/charts/fleet-agent/105.0.1+up0.11.1/templates/serviceaccount.yaml b/charts/fleet-agent/105.0.1+up0.11.1/templates/serviceaccount.yaml new file mode 100644 index 0000000000..73e27f0be9 --- /dev/null +++ b/charts/fleet-agent/105.0.1+up0.11.1/templates/serviceaccount.yaml @@ -0,0 +1,4 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: fleet-agent diff --git a/charts/fleet-agent/105.0.1+up0.11.1/templates/validate.yaml b/charts/fleet-agent/105.0.1+up0.11.1/templates/validate.yaml new file mode 100644 index 0000000000..d53ff1c508 --- /dev/null +++ b/charts/fleet-agent/105.0.1+up0.11.1/templates/validate.yaml @@ -0,0 +1,11 @@ +{{if ne .Release.Namespace .Values.internal.systemNamespace }} +{{ fail (printf "This chart must be installed in the namespace %s as the release name fleet-agent" .Values.internal.systemNamespace) }} +{{end}} + +{{if ne .Release.Name .Values.internal.managedReleaseName }} +{{ fail (printf "This chart must be installed in the namespace %s as the release name fleet-agent" .Values.internal.managedReleaseName) }} +{{end}} + +{{if not .Values.apiServerURL }} +{{ fail "apiServerURL is required to be set, and most likely also apiServerCA" }} +{{end}} diff --git a/charts/fleet-agent/105.0.1+up0.11.1/values.yaml b/charts/fleet-agent/105.0.1+up0.11.1/values.yaml new file mode 100644 index 0000000000..3af367c3a0 --- /dev/null +++ b/charts/fleet-agent/105.0.1+up0.11.1/values.yaml @@ -0,0 +1,75 @@ +image: + os: "windows,linux" + repository: rancher/fleet-agent + tag: v0.11.1 + +# The public URL of the Kubernetes API server running the Fleet Controller must be set here +# Example: https://example.com:6443 +apiServerURL: "" + +# The pem encoded value of the CA of the Kubernetes API server running the Fleet Controller. +# If left empty it is assumed this Kubernetes API TLS is signed by a well known CA. +apiServerCA: "" + +# Determines whether the agent should trust CA bundles from the operating system's trust store when connecting to a +# management cluster. True in `system-store` mode, false in `strict` mode. +agentTLSMode: "system-store" + +# The amount of time that agents will wait before they clean up old Helm releases. +# A non-existent value or 0 will result in an interval of 15 minutes. +garbageCollectionInterval: "15m" + +# The cluster registration value +token: "" + +# Labels to add to the cluster upon registration only. They are not added after the fact. +# labels: +# foo: bar + +# The client ID of the cluster to associate with +clientID: "" + +# The namespace of the cluster we are register with +clusterNamespace: "" + +# The namespace containing the clusters registration secrets +systemRegistrationNamespace: cattle-fleet-clusters-system + +# Please do not change the below setting unless you really know what you are doing +internal: + systemNamespace: cattle-fleet-system + managedReleaseName: fleet-agent + +# The nodeSelector and tolerations for the agent deployment +fleetAgent: + ## Node labels for pod assignment + ## Ref: https://kubernetes.io/docs/user-guide/node-selection/ + ## + nodeSelector: {} + ## List of node taints to tolerate (requires Kubernetes >= 1.6) + tolerations: [] + ## HostNetwork setting for the agent deployment. + ## When set allows for provisioning of network related bundles (CNI configuration) in a cluster without CNI. + hostNetwork: false +kubectl: + ## Node labels for pod assignment + ## Ref: https://kubernetes.io/docs/user-guide/node-selection/ + ## + nodeSelector: {} + ## List of node taints to tolerate (requires Kubernetes >= 1.6) + tolerations: + - key: node.cloudprovider.kubernetes.io/uninitialized + operator: "Equal" + value: "true" + effect: NoSchedule + +global: + cattle: + systemDefaultRegistry: "" + kubectl: + repository: rancher/kubectl + tag: v1.29.0 + +debug: false +debugLevel: 0 +disableSecurityContext: false diff --git a/charts/fleet-crd/105.0.1+up0.11.1/Chart.yaml b/charts/fleet-crd/105.0.1+up0.11.1/Chart.yaml new file mode 100644 index 0000000000..131e9852fb --- /dev/null +++ b/charts/fleet-crd/105.0.1+up0.11.1/Chart.yaml @@ -0,0 +1,13 @@ +annotations: + catalog.cattle.io/certified: rancher + catalog.cattle.io/hidden: "true" + catalog.cattle.io/namespace: cattle-fleet-system + catalog.cattle.io/os: linux + catalog.cattle.io/permits-os: linux,windows + catalog.cattle.io/release-name: fleet-crd +apiVersion: v2 +appVersion: 0.11.1 +description: Fleet CustomResourceDefinitions +icon: https://charts.rancher.io/assets/logos/fleet.svg +name: fleet-crd +version: 105.0.1+up0.11.1 diff --git a/charts/fleet-crd/105.0.1+up0.11.1/README.md b/charts/fleet-crd/105.0.1+up0.11.1/README.md new file mode 100644 index 0000000000..172aae46c7 --- /dev/null +++ b/charts/fleet-crd/105.0.1+up0.11.1/README.md @@ -0,0 +1,5 @@ +# Fleet CRD Helm Chart + +Fleet CustomResourceDefinitions Helm chart is a requirement for the Fleet Helm Chart. + +The Fleet documentation is centralized in the [doc website](https://fleet.rancher.io/). diff --git a/charts/fleet-crd/105.0.1+up0.11.1/templates/crds.yaml b/charts/fleet-crd/105.0.1+up0.11.1/templates/crds.yaml new file mode 100644 index 0000000000..1ad01686a0 --- /dev/null +++ b/charts/fleet-crd/105.0.1+up0.11.1/templates/crds.yaml @@ -0,0 +1,7104 @@ +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.16.4 + name: bundledeployments.fleet.cattle.io +spec: + group: fleet.cattle.io + names: + kind: BundleDeployment + listKind: BundleDeploymentList + plural: bundledeployments + singular: bundledeployment + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .status.display.deployed + name: Deployed + type: string + - jsonPath: .status.display.monitored + name: Monitored + type: string + - jsonPath: .status.conditions[?(@.type=="Ready")].message + name: Status + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: 'BundleDeployment is used internally by Fleet and should not + be used directly. + + When a Bundle is deployed to a cluster an instance of a Bundle is called + a + + BundleDeployment. A BundleDeployment represents the state of that Bundle + on + + a specific cluster with its cluster-specific customizations. The Fleet + agent + + is only aware of BundleDeployment resources that are created for the cluster + + the agent is managing.' + 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 + metadata: + type: object + spec: + properties: + correctDrift: + description: CorrectDrift specifies how drift correction should + work. + properties: + enabled: + description: Enabled correct drift if true. + type: boolean + force: + description: Force helm rollback with --force option will be + used if true. This will try to recreate all resources in the + release. + type: boolean + keepFailHistory: + description: KeepFailHistory keeps track of failed rollbacks + in the helm history. + type: boolean + type: object + dependsOn: + description: DependsOn refers to the bundles which must be ready + before this bundle can be deployed. + items: + properties: + name: + description: Name of the bundle. + nullable: true + type: string + selector: + description: Selector matching bundle's labels. + nullable: true + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: 'A label selector requirement is a selector + that contains values, a key, and an operator that + + relates the key and values.' + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: 'operator represents a key''s relationship + to a set of values. + + Valid operators are In, NotIn, Exists and DoesNotExist.' + type: string + values: + description: 'values is an array of string values. + If the operator is In or NotIn, + + the values array must be non-empty. If the operator + is Exists or DoesNotExist, + + the values array must be empty. This array is + replaced during a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} pairs. + A single {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, + whose key field is "key", the + + operator is "In", and the values array contains only + "value". The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + type: object + nullable: true + type: array + deploymentID: + description: DeploymentID is the ID of the currently applied deployment. + nullable: true + type: string + ociContents: + description: OCIContents is true when this deployment's contents + is stored in an oci registry + type: boolean + options: + description: Options are the deployment options, that are currently + applied. + properties: + correctDrift: + description: CorrectDrift specifies how drift correction should + work. + properties: + enabled: + description: Enabled correct drift if true. + type: boolean + force: + description: Force helm rollback with --force option will + be used if true. This will try to recreate all resources + in the release. + type: boolean + keepFailHistory: + description: KeepFailHistory keeps track of failed rollbacks + in the helm history. + type: boolean + type: object + defaultNamespace: + description: 'DefaultNamespace is the namespace to use for resources + that do not + + specify a namespace. This field is not used to enforce or + lock down + + the deployment to a specific namespace.' + nullable: true + type: string + deleteCRDResources: + description: DeleteCRDResources deletes CRDs. Warning! this + will also delete all your Custom Resources. + type: boolean + deleteNamespace: + description: DeleteNamespace can be used to delete the deployed + namespace when removing the bundle + type: boolean + diff: + description: Diff can be used to ignore the modified state of + objects which are amended at runtime. + nullable: true + properties: + comparePatches: + description: ComparePatches match a resource and remove + fields from the check for modifications. + items: + description: ComparePatch matches a resource and removes + fields from the check for modifications. + properties: + apiVersion: + description: APIVersion is the apiVersion of the resource + to match. + nullable: true + type: string + jsonPointers: + description: JSONPointers ignore diffs at a certain + JSON path. + items: + type: string + nullable: true + type: array + kind: + description: Kind is the kind of the resource to match. + nullable: true + type: string + name: + description: Name is the name of the resource to match. + nullable: true + type: string + namespace: + description: Namespace is the namespace of the resource + to match. + nullable: true + type: string + operations: + description: Operations remove a JSON path from the + resource. + items: + description: Operation of a ComparePatch, usually + "remove". + properties: + op: + description: Op is usually "remove" + nullable: true + type: string + path: + description: Path is the JSON path to remove. + nullable: true + type: string + value: + description: Value is usually empty. + nullable: true + type: string + type: object + nullable: true + type: array + type: object + nullable: true + type: array + type: object + forceSyncGeneration: + description: ForceSyncGeneration is used to force a redeployment + format: int64 + type: integer + helm: + description: Helm options for the deployment, like the chart + name, repo and values. + properties: + atomic: + description: Atomic sets the --atomic flag when Helm is + performing an upgrade + type: boolean + chart: + description: 'Chart can refer to any go-getter URL or OCI + registry based helm + + chart URL. The chart will be downloaded.' + nullable: true + type: string + disableDNS: + description: DisableDNS can be used to customize Helm's + EnableDNS option, which Fleet sets to `true` by default. + type: boolean + disableDependencyUpdate: + description: DisableDependencyUpdate allows skipping chart + dependencies update + type: boolean + disablePreProcess: + description: DisablePreProcess disables template processing + in values + type: boolean + force: + description: Force allows to override immutable resources. + This could be dangerous. + type: boolean + maxHistory: + description: MaxHistory limits the maximum number of revisions + saved per release by Helm. + type: integer + releaseName: + description: 'ReleaseName sets a custom release name to + deploy the chart as. If + + not specified a release name will be generated by combining + the + + invoking GitRepo.name + GitRepo.path.' + maxLength: 53 + nullable: true + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + type: string + repo: + description: Repo is the name of the HTTPS helm repo to + download the chart from. + nullable: true + type: string + skipSchemaValidation: + description: SkipSchemaValidation allows skipping schema + validation against the chart values + type: boolean + takeOwnership: + description: TakeOwnership makes helm skip the check for + its own annotations + type: boolean + timeoutSeconds: + description: TimeoutSeconds is the time to wait for Helm + operations. + type: integer + values: + description: 'Values passed to Helm. It is possible to specify + the keys and values + + as go template strings.' + nullable: true + type: object + x-kubernetes-preserve-unknown-fields: true + valuesFiles: + description: ValuesFiles is a list of files to load values + from. + items: + type: string + nullable: true + type: array + valuesFrom: + description: ValuesFrom loads the values from configmaps + and secrets. + items: + description: 'Define helm values that can come from configmap, + secret or external. Credit: https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439' + properties: + configMapKeyRef: + description: The reference to a config map with release + values. + nullable: true + properties: + key: + nullable: true + type: string + name: + description: Name of a resource in the same namespace + as the referent. + nullable: true + type: string + namespace: + nullable: true + type: string + type: object + secretKeyRef: + description: The reference to a secret with release + values. + nullable: true + properties: + key: + nullable: true + type: string + name: + description: Name of a resource in the same namespace + as the referent. + nullable: true + type: string + namespace: + nullable: true + type: string + type: object + type: object + nullable: true + type: array + version: + description: Version of the chart to download + nullable: true + type: string + waitForJobs: + description: 'WaitForJobs if set and timeoutSeconds provided, + will wait until all + + Jobs have been completed before marking the GitRepo as + ready. It + + will wait for as long as timeoutSeconds' + type: boolean + type: object + ignore: + description: IgnoreOptions can be used to ignore fields when + monitoring the bundle. + properties: + conditions: + description: Conditions is a list of conditions to be ignored + when monitoring the Bundle. + items: + additionalProperties: + type: string + type: object + nullable: true + type: array + type: object + keepResources: + description: KeepResources can be used to keep the deployed + resources when removing the bundle + type: boolean + kustomize: + description: 'Kustomize options for the deployment, like the + dir containing the + + kustomization.yaml file.' + nullable: true + properties: + dir: + description: 'Dir points to a custom folder for kustomize + resources. This folder must contain + + a kustomization.yaml file.' + nullable: true + type: string + type: object + namespace: + description: 'TargetNamespace if present will assign all resource + to this + + namespace and if any cluster scoped resource exists the deployment + + will fail.' + nullable: true + type: string + namespaceAnnotations: + additionalProperties: + type: string + description: NamespaceAnnotations are annotations that will + be appended to the namespace created by Fleet. + nullable: true + type: object + namespaceLabels: + additionalProperties: + type: string + description: NamespaceLabels are labels that will be appended + to the namespace created by Fleet. + nullable: true + type: object + serviceAccount: + description: ServiceAccount which will be used to perform this + deployment. + nullable: true + type: string + yaml: + description: 'YAML options, if using raw YAML these are names + that map to + + overlays/{name} files that will be used to replace or patch + a resource.' + nullable: true + properties: + overlays: + description: 'Overlays is a list of names that maps to folders + in "overlays/". + + If you wish to customize the file ./subdir/resource.yaml + then a file + + ./overlays/myoverlay/subdir/resource.yaml will replace + the base + + file. + + A file named ./overlays/myoverlay/subdir/resource_patch.yaml + will patch the base file.' + items: + type: string + nullable: true + type: array + type: object + type: object + paused: + description: 'Paused if set to true, will stop any BundleDeployments + from being + + updated. If true, BundleDeployments will be marked as out of sync + + when changes are detected.' + type: boolean + stagedDeploymentID: + description: StagedDeploymentID is the ID of the staged deployment. + nullable: true + type: string + stagedOptions: + description: 'StagedOptions are the deployment options, that are + staged for + + the next deployment.' + properties: + correctDrift: + description: CorrectDrift specifies how drift correction should + work. + properties: + enabled: + description: Enabled correct drift if true. + type: boolean + force: + description: Force helm rollback with --force option will + be used if true. This will try to recreate all resources + in the release. + type: boolean + keepFailHistory: + description: KeepFailHistory keeps track of failed rollbacks + in the helm history. + type: boolean + type: object + defaultNamespace: + description: 'DefaultNamespace is the namespace to use for resources + that do not + + specify a namespace. This field is not used to enforce or + lock down + + the deployment to a specific namespace.' + nullable: true + type: string + deleteCRDResources: + description: DeleteCRDResources deletes CRDs. Warning! this + will also delete all your Custom Resources. + type: boolean + deleteNamespace: + description: DeleteNamespace can be used to delete the deployed + namespace when removing the bundle + type: boolean + diff: + description: Diff can be used to ignore the modified state of + objects which are amended at runtime. + nullable: true + properties: + comparePatches: + description: ComparePatches match a resource and remove + fields from the check for modifications. + items: + description: ComparePatch matches a resource and removes + fields from the check for modifications. + properties: + apiVersion: + description: APIVersion is the apiVersion of the resource + to match. + nullable: true + type: string + jsonPointers: + description: JSONPointers ignore diffs at a certain + JSON path. + items: + type: string + nullable: true + type: array + kind: + description: Kind is the kind of the resource to match. + nullable: true + type: string + name: + description: Name is the name of the resource to match. + nullable: true + type: string + namespace: + description: Namespace is the namespace of the resource + to match. + nullable: true + type: string + operations: + description: Operations remove a JSON path from the + resource. + items: + description: Operation of a ComparePatch, usually + "remove". + properties: + op: + description: Op is usually "remove" + nullable: true + type: string + path: + description: Path is the JSON path to remove. + nullable: true + type: string + value: + description: Value is usually empty. + nullable: true + type: string + type: object + nullable: true + type: array + type: object + nullable: true + type: array + type: object + forceSyncGeneration: + description: ForceSyncGeneration is used to force a redeployment + format: int64 + type: integer + helm: + description: Helm options for the deployment, like the chart + name, repo and values. + properties: + atomic: + description: Atomic sets the --atomic flag when Helm is + performing an upgrade + type: boolean + chart: + description: 'Chart can refer to any go-getter URL or OCI + registry based helm + + chart URL. The chart will be downloaded.' + nullable: true + type: string + disableDNS: + description: DisableDNS can be used to customize Helm's + EnableDNS option, which Fleet sets to `true` by default. + type: boolean + disableDependencyUpdate: + description: DisableDependencyUpdate allows skipping chart + dependencies update + type: boolean + disablePreProcess: + description: DisablePreProcess disables template processing + in values + type: boolean + force: + description: Force allows to override immutable resources. + This could be dangerous. + type: boolean + maxHistory: + description: MaxHistory limits the maximum number of revisions + saved per release by Helm. + type: integer + releaseName: + description: 'ReleaseName sets a custom release name to + deploy the chart as. If + + not specified a release name will be generated by combining + the + + invoking GitRepo.name + GitRepo.path.' + maxLength: 53 + nullable: true + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + type: string + repo: + description: Repo is the name of the HTTPS helm repo to + download the chart from. + nullable: true + type: string + skipSchemaValidation: + description: SkipSchemaValidation allows skipping schema + validation against the chart values + type: boolean + takeOwnership: + description: TakeOwnership makes helm skip the check for + its own annotations + type: boolean + timeoutSeconds: + description: TimeoutSeconds is the time to wait for Helm + operations. + type: integer + values: + description: 'Values passed to Helm. It is possible to specify + the keys and values + + as go template strings.' + nullable: true + type: object + x-kubernetes-preserve-unknown-fields: true + valuesFiles: + description: ValuesFiles is a list of files to load values + from. + items: + type: string + nullable: true + type: array + valuesFrom: + description: ValuesFrom loads the values from configmaps + and secrets. + items: + description: 'Define helm values that can come from configmap, + secret or external. Credit: https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439' + properties: + configMapKeyRef: + description: The reference to a config map with release + values. + nullable: true + properties: + key: + nullable: true + type: string + name: + description: Name of a resource in the same namespace + as the referent. + nullable: true + type: string + namespace: + nullable: true + type: string + type: object + secretKeyRef: + description: The reference to a secret with release + values. + nullable: true + properties: + key: + nullable: true + type: string + name: + description: Name of a resource in the same namespace + as the referent. + nullable: true + type: string + namespace: + nullable: true + type: string + type: object + type: object + nullable: true + type: array + version: + description: Version of the chart to download + nullable: true + type: string + waitForJobs: + description: 'WaitForJobs if set and timeoutSeconds provided, + will wait until all + + Jobs have been completed before marking the GitRepo as + ready. It + + will wait for as long as timeoutSeconds' + type: boolean + type: object + ignore: + description: IgnoreOptions can be used to ignore fields when + monitoring the bundle. + properties: + conditions: + description: Conditions is a list of conditions to be ignored + when monitoring the Bundle. + items: + additionalProperties: + type: string + type: object + nullable: true + type: array + type: object + keepResources: + description: KeepResources can be used to keep the deployed + resources when removing the bundle + type: boolean + kustomize: + description: 'Kustomize options for the deployment, like the + dir containing the + + kustomization.yaml file.' + nullable: true + properties: + dir: + description: 'Dir points to a custom folder for kustomize + resources. This folder must contain + + a kustomization.yaml file.' + nullable: true + type: string + type: object + namespace: + description: 'TargetNamespace if present will assign all resource + to this + + namespace and if any cluster scoped resource exists the deployment + + will fail.' + nullable: true + type: string + namespaceAnnotations: + additionalProperties: + type: string + description: NamespaceAnnotations are annotations that will + be appended to the namespace created by Fleet. + nullable: true + type: object + namespaceLabels: + additionalProperties: + type: string + description: NamespaceLabels are labels that will be appended + to the namespace created by Fleet. + nullable: true + type: object + serviceAccount: + description: ServiceAccount which will be used to perform this + deployment. + nullable: true + type: string + yaml: + description: 'YAML options, if using raw YAML these are names + that map to + + overlays/{name} files that will be used to replace or patch + a resource.' + nullable: true + properties: + overlays: + description: 'Overlays is a list of names that maps to folders + in "overlays/". + + If you wish to customize the file ./subdir/resource.yaml + then a file + + ./overlays/myoverlay/subdir/resource.yaml will replace + the base + + file. + + A file named ./overlays/myoverlay/subdir/resource_patch.yaml + will patch the base file.' + items: + type: string + nullable: true + type: array + type: object + type: object + type: object + status: + properties: + appliedDeploymentID: + nullable: true + type: string + conditions: + items: + properties: + lastTransitionTime: + description: Last time the condition transitioned from one + status to another. + type: string + lastUpdateTime: + description: The last time this condition was updated. + type: string + message: + description: Human-readable message indicating details about + last transition + type: string + reason: + description: The reason for the condition's last transition. + type: string + status: + description: Status of the condition, one of True, False, + Unknown. + type: string + type: + description: Type of cluster condition. + type: string + required: + - status + - type + type: object + nullable: true + type: array + display: + nullable: true + properties: + deployed: + nullable: true + type: string + monitored: + nullable: true + type: string + state: + nullable: true + type: string + type: object + modifiedStatus: + items: + description: 'ModifiedStatus is used to report the status of a + resource that is modified. + + It indicates if the modification was a create, a delete or a + patch.' + properties: + apiVersion: + nullable: true + type: string + delete: + type: boolean + exist: + description: Exist is true if the resource exists but is not + owned by us. This can happen if a resource was adopted by + another bundle whereas the first bundle still exists and + due to that reports that it does not own it. + type: boolean + kind: + nullable: true + type: string + missing: + type: boolean + name: + nullable: true + type: string + namespace: + nullable: true + type: string + patch: + nullable: true + type: string + type: object + nullable: true + type: array + nonModified: + type: boolean + nonReadyStatus: + items: + description: NonReadyStatus is used to report the status of a + resource that is not ready. It includes a summary. + properties: + apiVersion: + nullable: true + type: string + kind: + nullable: true + type: string + name: + nullable: true + type: string + namespace: + nullable: true + type: string + summary: + properties: + error: + type: boolean + message: + items: + type: string + type: array + state: + type: string + transitioning: + type: boolean + type: object + uid: + description: 'UID is a type that holds unique ID values, including + UUIDs. Because we + + don''t ONLY use UUIDs, this is an alias to string. Being + a type captures + + intent and helps make sure that UIDs and names do not get + conflated.' + nullable: true + type: string + type: object + nullable: true + type: array + ready: + type: boolean + release: + description: Release is the Helm release ID + nullable: true + type: string + resources: + description: 'Resources lists the metadata of resources that were + deployed + + according to the helm release history.' + items: + description: BundleDeploymentResource contains the metadata of + a deployed resource. + properties: + apiVersion: + nullable: true + type: string + createdAt: + format: date-time + nullable: true + type: string + kind: + nullable: true + type: string + name: + nullable: true + type: string + namespace: + nullable: true + type: string + type: object + nullable: true + type: array + syncGeneration: + format: int64 + nullable: true + type: integer + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.16.4 + name: bundlenamespacemappings.fleet.cattle.io +spec: + group: fleet.cattle.io + names: + kind: BundleNamespaceMapping + listKind: BundleNamespaceMappingList + plural: bundlenamespacemappings + singular: bundlenamespacemapping + scope: Namespaced + versions: + - name: v1alpha1 + schema: + openAPIV3Schema: + description: BundleNamespaceMapping maps bundles to clusters in other namespaces. + 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 + bundleSelector: + description: 'A label selector is a label query over a set of resources. + The result of matchLabels and + + matchExpressions are ANDed. An empty label selector matches all objects. + A null + + label selector matches no objects.' + nullable: true + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. + The requirements are ANDed. + items: + description: 'A label selector requirement is a selector that + contains values, a key, and an operator that + + relates the key and values.' + properties: + key: + description: key is the label key that the selector applies + to. + type: string + operator: + description: 'operator represents a key''s relationship to + a set of values. + + Valid operators are In, NotIn, Exists and DoesNotExist.' + type: string + values: + description: 'values is an array of string values. If the + operator is In or NotIn, + + the values array must be non-empty. If the operator is Exists + or DoesNotExist, + + the values array must be empty. This array is replaced during + a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} pairs. A single + {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, whose key + field is "key", the + + operator is "In", and the values array contains only "value". + The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + 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 + metadata: + type: object + namespaceSelector: + description: 'A label selector is a label query over a set of resources. + The result of matchLabels and + + matchExpressions are ANDed. An empty label selector matches all objects. + A null + + label selector matches no objects.' + nullable: true + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. + The requirements are ANDed. + items: + description: 'A label selector requirement is a selector that + contains values, a key, and an operator that + + relates the key and values.' + properties: + key: + description: key is the label key that the selector applies + to. + type: string + operator: + description: 'operator represents a key''s relationship to + a set of values. + + Valid operators are In, NotIn, Exists and DoesNotExist.' + type: string + values: + description: 'values is an array of string values. If the + operator is In or NotIn, + + the values array must be non-empty. If the operator is Exists + or DoesNotExist, + + the values array must be empty. This array is replaced during + a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} pairs. A single + {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, whose key + field is "key", the + + operator is "In", and the values array contains only "value". + The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.16.4 + name: bundles.fleet.cattle.io +spec: + group: fleet.cattle.io + names: + kind: Bundle + listKind: BundleList + plural: bundles + singular: bundle + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .status.display.readyClusters + name: BundleDeployments-Ready + type: string + - jsonPath: .status.conditions[?(@.type=="Ready")].message + name: Status + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: 'Bundle contains the resources of an application and its deployment + options. + + It will be deployed as a Helm chart to target clusters. + + + When a GitRepo is scanned it will produce one or more bundles. Bundles + are + + a collection of resources that get deployed to one or more cluster(s). + Bundle is the + + fundamental deployment unit used in Fleet. The contents of a Bundle may + be + + Kubernetes manifests, Kustomize configuration, or Helm charts. Regardless + + of the source the contents are dynamically rendered into a Helm chart + by + + the agent and installed into the downstream cluster as a Helm release.' + 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 + metadata: + type: object + spec: + properties: + contentsId: + description: ContentsID stores the contents id when deploying contents + using an OCI registry. + nullable: true + type: string + correctDrift: + description: CorrectDrift specifies how drift correction should + work. + properties: + enabled: + description: Enabled correct drift if true. + type: boolean + force: + description: Force helm rollback with --force option will be + used if true. This will try to recreate all resources in the + release. + type: boolean + keepFailHistory: + description: KeepFailHistory keeps track of failed rollbacks + in the helm history. + type: boolean + type: object + defaultNamespace: + description: 'DefaultNamespace is the namespace to use for resources + that do not + + specify a namespace. This field is not used to enforce or lock + down + + the deployment to a specific namespace.' + nullable: true + type: string + deleteCRDResources: + description: DeleteCRDResources deletes CRDs. Warning! this will + also delete all your Custom Resources. + type: boolean + deleteNamespace: + description: DeleteNamespace can be used to delete the deployed + namespace when removing the bundle + type: boolean + dependsOn: + description: DependsOn refers to the bundles which must be ready + before this bundle can be deployed. + items: + properties: + name: + description: Name of the bundle. + nullable: true + type: string + selector: + description: Selector matching bundle's labels. + nullable: true + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: 'A label selector requirement is a selector + that contains values, a key, and an operator that + + relates the key and values.' + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: 'operator represents a key''s relationship + to a set of values. + + Valid operators are In, NotIn, Exists and DoesNotExist.' + type: string + values: + description: 'values is an array of string values. + If the operator is In or NotIn, + + the values array must be non-empty. If the operator + is Exists or DoesNotExist, + + the values array must be empty. This array is + replaced during a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} pairs. + A single {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, + whose key field is "key", the + + operator is "In", and the values array contains only + "value". The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + type: object + nullable: true + type: array + diff: + description: Diff can be used to ignore the modified state of objects + which are amended at runtime. + nullable: true + properties: + comparePatches: + description: ComparePatches match a resource and remove fields + from the check for modifications. + items: + description: ComparePatch matches a resource and removes fields + from the check for modifications. + properties: + apiVersion: + description: APIVersion is the apiVersion of the resource + to match. + nullable: true + type: string + jsonPointers: + description: JSONPointers ignore diffs at a certain JSON + path. + items: + type: string + nullable: true + type: array + kind: + description: Kind is the kind of the resource to match. + nullable: true + type: string + name: + description: Name is the name of the resource to match. + nullable: true + type: string + namespace: + description: Namespace is the namespace of the resource + to match. + nullable: true + type: string + operations: + description: Operations remove a JSON path from the resource. + items: + description: Operation of a ComparePatch, usually "remove". + properties: + op: + description: Op is usually "remove" + nullable: true + type: string + path: + description: Path is the JSON path to remove. + nullable: true + type: string + value: + description: Value is usually empty. + nullable: true + type: string + type: object + nullable: true + type: array + type: object + nullable: true + type: array + type: object + forceSyncGeneration: + description: ForceSyncGeneration is used to force a redeployment + format: int64 + type: integer + helm: + description: Helm options for the deployment, like the chart name, + repo and values. + properties: + atomic: + description: Atomic sets the --atomic flag when Helm is performing + an upgrade + type: boolean + chart: + description: 'Chart can refer to any go-getter URL or OCI registry + based helm + + chart URL. The chart will be downloaded.' + nullable: true + type: string + disableDNS: + description: DisableDNS can be used to customize Helm's EnableDNS + option, which Fleet sets to `true` by default. + type: boolean + disableDependencyUpdate: + description: DisableDependencyUpdate allows skipping chart dependencies + update + type: boolean + disablePreProcess: + description: DisablePreProcess disables template processing + in values + type: boolean + force: + description: Force allows to override immutable resources. This + could be dangerous. + type: boolean + maxHistory: + description: MaxHistory limits the maximum number of revisions + saved per release by Helm. + type: integer + releaseName: + description: 'ReleaseName sets a custom release name to deploy + the chart as. If + + not specified a release name will be generated by combining + the + + invoking GitRepo.name + GitRepo.path.' + maxLength: 53 + nullable: true + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + type: string + repo: + description: Repo is the name of the HTTPS helm repo to download + the chart from. + nullable: true + type: string + skipSchemaValidation: + description: SkipSchemaValidation allows skipping schema validation + against the chart values + type: boolean + takeOwnership: + description: TakeOwnership makes helm skip the check for its + own annotations + type: boolean + timeoutSeconds: + description: TimeoutSeconds is the time to wait for Helm operations. + type: integer + values: + description: 'Values passed to Helm. It is possible to specify + the keys and values + + as go template strings.' + nullable: true + type: object + x-kubernetes-preserve-unknown-fields: true + valuesFiles: + description: ValuesFiles is a list of files to load values from. + items: + type: string + nullable: true + type: array + valuesFrom: + description: ValuesFrom loads the values from configmaps and + secrets. + items: + description: 'Define helm values that can come from configmap, + secret or external. Credit: https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439' + properties: + configMapKeyRef: + description: The reference to a config map with release + values. + nullable: true + properties: + key: + nullable: true + type: string + name: + description: Name of a resource in the same namespace + as the referent. + nullable: true + type: string + namespace: + nullable: true + type: string + type: object + secretKeyRef: + description: The reference to a secret with release values. + nullable: true + properties: + key: + nullable: true + type: string + name: + description: Name of a resource in the same namespace + as the referent. + nullable: true + type: string + namespace: + nullable: true + type: string + type: object + type: object + nullable: true + type: array + version: + description: Version of the chart to download + nullable: true + type: string + waitForJobs: + description: 'WaitForJobs if set and timeoutSeconds provided, + will wait until all + + Jobs have been completed before marking the GitRepo as ready. + It + + will wait for as long as timeoutSeconds' + type: boolean + type: object + ignore: + description: IgnoreOptions can be used to ignore fields when monitoring + the bundle. + properties: + conditions: + description: Conditions is a list of conditions to be ignored + when monitoring the Bundle. + items: + additionalProperties: + type: string + type: object + nullable: true + type: array + type: object + keepResources: + description: KeepResources can be used to keep the deployed resources + when removing the bundle + type: boolean + kustomize: + description: 'Kustomize options for the deployment, like the dir + containing the + + kustomization.yaml file.' + nullable: true + properties: + dir: + description: 'Dir points to a custom folder for kustomize resources. + This folder must contain + + a kustomization.yaml file.' + nullable: true + type: string + type: object + namespace: + description: 'TargetNamespace if present will assign all resource + to this + + namespace and if any cluster scoped resource exists the deployment + + will fail.' + nullable: true + type: string + namespaceAnnotations: + additionalProperties: + type: string + description: NamespaceAnnotations are annotations that will be appended + to the namespace created by Fleet. + nullable: true + type: object + namespaceLabels: + additionalProperties: + type: string + description: NamespaceLabels are labels that will be appended to + the namespace created by Fleet. + nullable: true + type: object + paused: + description: Paused if set to true, will stop any BundleDeployments + from being updated. It will be marked as out of sync. + type: boolean + resources: + description: 'Resources contains the resources that were read from + the bundle''s + + path. This includes the content of downloaded helm charts.' + items: + description: BundleResource represents the content of a single + resource from the bundle, like a YAML manifest. + properties: + content: + description: The content of the resource, can be compressed. + nullable: true + type: string + encoding: + description: Encoding is either empty or "base64+gz". + nullable: true + type: string + name: + description: Name of the resource, can include the bundle's + internal path. + nullable: true + type: string + type: object + nullable: true + type: array + rolloutStrategy: + description: 'RolloutStrategy controls the rollout of bundles, by + defining + + partitions, canaries and percentages for cluster availability.' + nullable: true + properties: + autoPartitionSize: + anyOf: + - type: integer + - type: string + description: 'A number or percentage of how to automatically + partition clusters if no + + specific partitioning strategy is configured. + + default: 25%' + nullable: true + x-kubernetes-int-or-string: true + maxUnavailable: + anyOf: + - type: integer + - type: string + description: 'A number or percentage of clusters that can be + unavailable during an update + + of a bundle. This follows the same basic approach as a deployment + rollout + + strategy. Once the number of clusters meets unavailable state + update will be + + paused. Default value is 100% which doesn''t take effect on + update. + + default: 100%' + nullable: true + x-kubernetes-int-or-string: true + maxUnavailablePartitions: + anyOf: + - type: integer + - type: string + description: 'A number or percentage of cluster partitions that + can be unavailable during + + an update of a bundle. + + default: 0' + nullable: true + x-kubernetes-int-or-string: true + partitions: + description: 'A list of definitions of partitions. If any target + clusters do not match + + the configuration they are added to partitions at the end + following the + + autoPartitionSize.' + items: + description: Partition defines a separate rollout strategy + for a set of clusters. + properties: + clusterGroup: + description: A cluster group name to include in this partition + type: string + clusterGroupSelector: + description: Selector matching cluster group labels to + include in this partition + nullable: true + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: 'A label selector requirement is a + selector that contains values, a key, and an operator + that + + relates the key and values.' + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: 'operator represents a key''s relationship + to a set of values. + + Valid operators are In, NotIn, Exists and + DoesNotExist.' + type: string + values: + description: 'values is an array of string values. + If the operator is In or NotIn, + + the values array must be non-empty. If the + operator is Exists or DoesNotExist, + + the values array must be empty. This array + is replaced during a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, + whose key field is "key", the + + operator is "In", and the values array contains + only "value". The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + clusterName: + description: ClusterName is the name of a cluster to include + in this partition + type: string + clusterSelector: + description: Selector matching cluster labels to include + in this partition + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: 'A label selector requirement is a + selector that contains values, a key, and an operator + that + + relates the key and values.' + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: 'operator represents a key''s relationship + to a set of values. + + Valid operators are In, NotIn, Exists and + DoesNotExist.' + type: string + values: + description: 'values is an array of string values. + If the operator is In or NotIn, + + the values array must be non-empty. If the + operator is Exists or DoesNotExist, + + the values array must be empty. This array + is replaced during a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, + whose key field is "key", the + + operator is "In", and the values array contains + only "value". The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + maxUnavailable: + anyOf: + - type: integer + - type: string + description: 'A number or percentage of clusters that + can be unavailable in this + + partition before this partition is treated as done. + + default: 10%' + x-kubernetes-int-or-string: true + name: + description: A user-friendly name given to the partition + used for Display (optional). + nullable: true + type: string + type: object + nullable: true + type: array + type: object + serviceAccount: + description: ServiceAccount which will be used to perform this deployment. + nullable: true + type: string + targetRestrictions: + description: TargetRestrictions is an allow list, which controls + if a bundledeployment is created for a target. + items: + description: 'BundleTargetRestriction is used internally by Fleet + and should not be modified. + + It acts as an allow list, to prevent the creation of BundleDeployments + from + + Targets created by TargetCustomizations in fleet.yaml.' + properties: + clusterGroup: + nullable: true + type: string + clusterGroupSelector: + description: 'A label selector is a label query over a set + of resources. The result of matchLabels and + + matchExpressions are ANDed. An empty label selector matches + all objects. A null + + label selector matches no objects.' + nullable: true + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: 'A label selector requirement is a selector + that contains values, a key, and an operator that + + relates the key and values.' + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: 'operator represents a key''s relationship + to a set of values. + + Valid operators are In, NotIn, Exists and DoesNotExist.' + type: string + values: + description: 'values is an array of string values. + If the operator is In or NotIn, + + the values array must be non-empty. If the operator + is Exists or DoesNotExist, + + the values array must be empty. This array is + replaced during a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} pairs. + A single {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, + whose key field is "key", the + + operator is "In", and the values array contains only + "value". The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + clusterName: + nullable: true + type: string + clusterSelector: + description: 'A label selector is a label query over a set + of resources. The result of matchLabels and + + matchExpressions are ANDed. An empty label selector matches + all objects. A null + + label selector matches no objects.' + nullable: true + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: 'A label selector requirement is a selector + that contains values, a key, and an operator that + + relates the key and values.' + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: 'operator represents a key''s relationship + to a set of values. + + Valid operators are In, NotIn, Exists and DoesNotExist.' + type: string + values: + description: 'values is an array of string values. + If the operator is In or NotIn, + + the values array must be non-empty. If the operator + is Exists or DoesNotExist, + + the values array must be empty. This array is + replaced during a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} pairs. + A single {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, + whose key field is "key", the + + operator is "In", and the values array contains only + "value". The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + name: + nullable: true + type: string + type: object + type: array + targets: + description: 'Targets refer to the clusters which will be deployed + to. + + Targets are evaluated in order and the first one to match is used.' + items: + description: 'BundleTarget declares clusters to deploy to. Fleet + will merge the + + BundleDeploymentOptions from customizations into this struct.' + properties: + clusterGroup: + description: ClusterGroup to match a specific cluster group + by name. + nullable: true + type: string + clusterGroupSelector: + description: ClusterGroupSelector is a selector to match cluster + groups. + nullable: true + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: 'A label selector requirement is a selector + that contains values, a key, and an operator that + + relates the key and values.' + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: 'operator represents a key''s relationship + to a set of values. + + Valid operators are In, NotIn, Exists and DoesNotExist.' + type: string + values: + description: 'values is an array of string values. + If the operator is In or NotIn, + + the values array must be non-empty. If the operator + is Exists or DoesNotExist, + + the values array must be empty. This array is + replaced during a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} pairs. + A single {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, + whose key field is "key", the + + operator is "In", and the values array contains only + "value". The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + clusterName: + description: 'ClusterName to match a specific cluster by name + that will be + + selected' + nullable: true + type: string + clusterSelector: + description: 'ClusterSelector is a selector to match clusters. + The structure is + + the standard metav1.LabelSelector format. If clusterGroupSelector + or + + clusterGroup is specified, clusterSelector will be used + only to + + further refine the selection after clusterGroupSelector + and + + clusterGroup is evaluated.' + nullable: true + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: 'A label selector requirement is a selector + that contains values, a key, and an operator that + + relates the key and values.' + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: 'operator represents a key''s relationship + to a set of values. + + Valid operators are In, NotIn, Exists and DoesNotExist.' + type: string + values: + description: 'values is an array of string values. + If the operator is In or NotIn, + + the values array must be non-empty. If the operator + is Exists or DoesNotExist, + + the values array must be empty. This array is + replaced during a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} pairs. + A single {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, + whose key field is "key", the + + operator is "In", and the values array contains only + "value". The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + correctDrift: + description: CorrectDrift specifies how drift correction should + work. + properties: + enabled: + description: Enabled correct drift if true. + type: boolean + force: + description: Force helm rollback with --force option will + be used if true. This will try to recreate all resources + in the release. + type: boolean + keepFailHistory: + description: KeepFailHistory keeps track of failed rollbacks + in the helm history. + type: boolean + type: object + defaultNamespace: + description: 'DefaultNamespace is the namespace to use for + resources that do not + + specify a namespace. This field is not used to enforce or + lock down + + the deployment to a specific namespace.' + nullable: true + type: string + deleteCRDResources: + description: DeleteCRDResources deletes CRDs. Warning! this + will also delete all your Custom Resources. + type: boolean + deleteNamespace: + description: DeleteNamespace can be used to delete the deployed + namespace when removing the bundle + type: boolean + diff: + description: Diff can be used to ignore the modified state + of objects which are amended at runtime. + nullable: true + properties: + comparePatches: + description: ComparePatches match a resource and remove + fields from the check for modifications. + items: + description: ComparePatch matches a resource and removes + fields from the check for modifications. + properties: + apiVersion: + description: APIVersion is the apiVersion of the + resource to match. + nullable: true + type: string + jsonPointers: + description: JSONPointers ignore diffs at a certain + JSON path. + items: + type: string + nullable: true + type: array + kind: + description: Kind is the kind of the resource to + match. + nullable: true + type: string + name: + description: Name is the name of the resource to + match. + nullable: true + type: string + namespace: + description: Namespace is the namespace of the resource + to match. + nullable: true + type: string + operations: + description: Operations remove a JSON path from + the resource. + items: + description: Operation of a ComparePatch, usually + "remove". + properties: + op: + description: Op is usually "remove" + nullable: true + type: string + path: + description: Path is the JSON path to remove. + nullable: true + type: string + value: + description: Value is usually empty. + nullable: true + type: string + type: object + nullable: true + type: array + type: object + nullable: true + type: array + type: object + doNotDeploy: + description: DoNotDeploy if set to true, will not deploy to + this target. + type: boolean + forceSyncGeneration: + description: ForceSyncGeneration is used to force a redeployment + format: int64 + type: integer + helm: + description: Helm options for the deployment, like the chart + name, repo and values. + properties: + atomic: + description: Atomic sets the --atomic flag when Helm is + performing an upgrade + type: boolean + chart: + description: 'Chart can refer to any go-getter URL or + OCI registry based helm + + chart URL. The chart will be downloaded.' + nullable: true + type: string + disableDNS: + description: DisableDNS can be used to customize Helm's + EnableDNS option, which Fleet sets to `true` by default. + type: boolean + disableDependencyUpdate: + description: DisableDependencyUpdate allows skipping chart + dependencies update + type: boolean + disablePreProcess: + description: DisablePreProcess disables template processing + in values + type: boolean + force: + description: Force allows to override immutable resources. + This could be dangerous. + type: boolean + maxHistory: + description: MaxHistory limits the maximum number of revisions + saved per release by Helm. + type: integer + releaseName: + description: 'ReleaseName sets a custom release name to + deploy the chart as. If + + not specified a release name will be generated by combining + the + + invoking GitRepo.name + GitRepo.path.' + maxLength: 53 + nullable: true + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + type: string + repo: + description: Repo is the name of the HTTPS helm repo to + download the chart from. + nullable: true + type: string + skipSchemaValidation: + description: SkipSchemaValidation allows skipping schema + validation against the chart values + type: boolean + takeOwnership: + description: TakeOwnership makes helm skip the check for + its own annotations + type: boolean + timeoutSeconds: + description: TimeoutSeconds is the time to wait for Helm + operations. + type: integer + values: + description: 'Values passed to Helm. It is possible to + specify the keys and values + + as go template strings.' + nullable: true + type: object + x-kubernetes-preserve-unknown-fields: true + valuesFiles: + description: ValuesFiles is a list of files to load values + from. + items: + type: string + nullable: true + type: array + valuesFrom: + description: ValuesFrom loads the values from configmaps + and secrets. + items: + description: 'Define helm values that can come from + configmap, secret or external. Credit: https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439' + properties: + configMapKeyRef: + description: The reference to a config map with + release values. + nullable: true + properties: + key: + nullable: true + type: string + name: + description: Name of a resource in the same + namespace as the referent. + nullable: true + type: string + namespace: + nullable: true + type: string + type: object + secretKeyRef: + description: The reference to a secret with release + values. + nullable: true + properties: + key: + nullable: true + type: string + name: + description: Name of a resource in the same + namespace as the referent. + nullable: true + type: string + namespace: + nullable: true + type: string + type: object + type: object + nullable: true + type: array + version: + description: Version of the chart to download + nullable: true + type: string + waitForJobs: + description: 'WaitForJobs if set and timeoutSeconds provided, + will wait until all + + Jobs have been completed before marking the GitRepo + as ready. It + + will wait for as long as timeoutSeconds' + type: boolean + type: object + ignore: + description: IgnoreOptions can be used to ignore fields when + monitoring the bundle. + properties: + conditions: + description: Conditions is a list of conditions to be + ignored when monitoring the Bundle. + items: + additionalProperties: + type: string + type: object + nullable: true + type: array + type: object + keepResources: + description: KeepResources can be used to keep the deployed + resources when removing the bundle + type: boolean + kustomize: + description: 'Kustomize options for the deployment, like the + dir containing the + + kustomization.yaml file.' + nullable: true + properties: + dir: + description: 'Dir points to a custom folder for kustomize + resources. This folder must contain + + a kustomization.yaml file.' + nullable: true + type: string + type: object + name: + description: 'Name of target. This value is largely for display + and logging. If + + not specified a default name of the format "target000" will + be used' + type: string + namespace: + description: 'TargetNamespace if present will assign all resource + to this + + namespace and if any cluster scoped resource exists the + deployment + + will fail.' + nullable: true + type: string + namespaceAnnotations: + additionalProperties: + type: string + description: NamespaceAnnotations are annotations that will + be appended to the namespace created by Fleet. + nullable: true + type: object + namespaceLabels: + additionalProperties: + type: string + description: NamespaceLabels are labels that will be appended + to the namespace created by Fleet. + nullable: true + type: object + serviceAccount: + description: ServiceAccount which will be used to perform + this deployment. + nullable: true + type: string + yaml: + description: 'YAML options, if using raw YAML these are names + that map to + + overlays/{name} files that will be used to replace or patch + a resource.' + nullable: true + properties: + overlays: + description: 'Overlays is a list of names that maps to + folders in "overlays/". + + If you wish to customize the file ./subdir/resource.yaml + then a file + + ./overlays/myoverlay/subdir/resource.yaml will replace + the base + + file. + + A file named ./overlays/myoverlay/subdir/resource_patch.yaml + will patch the base file.' + items: + type: string + nullable: true + type: array + type: object + type: object + type: array + yaml: + description: 'YAML options, if using raw YAML these are names that + map to + + overlays/{name} files that will be used to replace or patch a + resource.' + nullable: true + properties: + overlays: + description: 'Overlays is a list of names that maps to folders + in "overlays/". + + If you wish to customize the file ./subdir/resource.yaml then + a file + + ./overlays/myoverlay/subdir/resource.yaml will replace the + base + + file. + + A file named ./overlays/myoverlay/subdir/resource_patch.yaml + will patch the base file.' + items: + type: string + nullable: true + type: array + type: object + type: object + status: + properties: + conditions: + description: 'Conditions is a list of Wrangler conditions that describe + the state + + of the bundle.' + items: + properties: + lastTransitionTime: + description: Last time the condition transitioned from one + status to another. + type: string + lastUpdateTime: + description: The last time this condition was updated. + type: string + message: + description: Human-readable message indicating details about + last transition + type: string + reason: + description: The reason for the condition's last transition. + type: string + status: + description: Status of the condition, one of True, False, + Unknown. + type: string + type: + description: Type of cluster condition. + type: string + required: + - status + - type + type: object + type: array + display: + description: 'Display contains the number of ready, desiredready + clusters and a + + summary state for the bundle''s resources.' + properties: + readyClusters: + description: 'ReadyClusters is a string in the form "%d/%d", + that describes the + + number of clusters that are ready vs. the number of clusters + desired + + to be ready.' + nullable: true + type: string + state: + description: State is a summary state for the bundle, calculated + over the non-ready resources. + nullable: true + type: string + type: object + maxNew: + description: 'MaxNew is always 50. A bundle change can only stage + 50 + + bundledeployments at a time.' + type: integer + maxUnavailable: + description: 'MaxUnavailable is the maximum number of unavailable + deployments. See + + rollout configuration.' + type: integer + maxUnavailablePartitions: + description: 'MaxUnavailablePartitions is the maximum number of + unavailable + + partitions. The rollout configuration defines a maximum number + or + + percentage of unavailable partitions.' + type: integer + newlyCreated: + description: 'NewlyCreated is the number of bundle deployments that + have been created, + + not updated.' + type: integer + observedGeneration: + description: ObservedGeneration is the current generation of the + bundle. + format: int64 + type: integer + ociReference: + description: 'OCIReference is the OCI reference used to store contents, + this is + + only for informational purposes.' + type: string + partitions: + description: PartitionStatus lists the status of each partition. + items: + description: PartitionStatus is the status of a single rollout + partition. + properties: + count: + description: Count is the number of clusters in the partition. + type: integer + maxUnavailable: + description: MaxUnavailable is the maximum number of unavailable + clusters in the partition. + type: integer + name: + description: Name is the name of the partition. + nullable: true + type: string + summary: + description: Summary is a summary state for the partition, + calculated over its non-ready resources. + properties: + desiredReady: + description: 'DesiredReady is the number of bundle deployments + that should be + + ready.' + type: integer + errApplied: + description: 'ErrApplied is the number of bundle deployments + that have been synced + + from the Fleet controller and the downstream cluster, + but with some + + errors when deploying the bundle.' + type: integer + modified: + description: 'Modified is the number of bundle deployments + that have been deployed + + and for which all resources are ready, but where some + changes from the + + Git repository have not yet been synced.' + type: integer + nonReadyResources: + description: 'NonReadyClusters is a list of states, which + is filled for a bundle + + that is not ready.' + items: + description: 'NonReadyResource contains information + about a bundle that is not ready for a + + given state like "ErrApplied". It contains a list + of non-ready or modified + + resources and their states.' + properties: + bundleState: + description: State is the state of the resource, + like e.g. "NotReady" or "ErrApplied". + nullable: true + type: string + message: + description: Message contains information why the + bundle is not ready. + nullable: true + type: string + modifiedStatus: + description: ModifiedStatus lists the state for + each modified resource. + items: + description: 'ModifiedStatus is used to report + the status of a resource that is modified. + + It indicates if the modification was a create, + a delete or a patch.' + properties: + apiVersion: + nullable: true + type: string + delete: + type: boolean + exist: + description: Exist is true if the resource + exists but is not owned by us. This can + happen if a resource was adopted by another + bundle whereas the first bundle still exists + and due to that reports that it does not + own it. + type: boolean + kind: + nullable: true + type: string + missing: + type: boolean + name: + nullable: true + type: string + namespace: + nullable: true + type: string + patch: + nullable: true + type: string + type: object + nullable: true + type: array + name: + description: Name is the name of the resource. + nullable: true + type: string + nonReadyStatus: + description: NonReadyStatus lists the state for + each non-ready resource. + items: + description: NonReadyStatus is used to report + the status of a resource that is not ready. + It includes a summary. + properties: + apiVersion: + nullable: true + type: string + kind: + nullable: true + type: string + name: + nullable: true + type: string + namespace: + nullable: true + type: string + summary: + properties: + error: + type: boolean + message: + items: + type: string + type: array + state: + type: string + transitioning: + type: boolean + type: object + uid: + description: 'UID is a type that holds unique + ID values, including UUIDs. Because we + + don''t ONLY use UUIDs, this is an alias + to string. Being a type captures + + intent and helps make sure that UIDs and + names do not get conflated.' + nullable: true + type: string + type: object + nullable: true + type: array + type: object + nullable: true + type: array + notReady: + description: 'NotReady is the number of bundle deployments + that have been deployed + + where some resources are not ready.' + type: integer + outOfSync: + description: 'OutOfSync is the number of bundle deployments + that have been synced + + from Fleet controller, but not yet by the downstream + agent.' + type: integer + pending: + description: 'Pending is the number of bundle deployments + that are being processed + + by Fleet controller.' + type: integer + ready: + description: 'Ready is the number of bundle deployments + that have been deployed + + where all resources are ready.' + type: integer + waitApplied: + description: 'WaitApplied is the number of bundle deployments + that have been + + synced from Fleet controller and downstream cluster, + but are waiting + + to be deployed.' + type: integer + type: object + unavailable: + description: Unavailable is the number of unavailable clusters + in the partition. + type: integer + type: object + type: array + resourceKey: + description: 'ResourceKey lists resources, which will likely be + deployed. The + + actual list of resources on a cluster might differ, depending + on the + + helm chart, value templating, etc..' + items: + description: ResourceKey lists resources, which will likely be + deployed. + properties: + apiVersion: + description: APIVersion is the k8s api version of the resource. + nullable: true + type: string + kind: + description: Kind is the k8s api kind of the resource. + nullable: true + type: string + name: + description: Name is the name of the resource. + nullable: true + type: string + namespace: + description: Namespace is the namespace of the resource. + nullable: true + type: string + type: object + nullable: true + type: array + resourcesSha256Sum: + description: ResourcesSHA256Sum corresponds to the JSON serialization + of the .Spec.Resources field + type: string + summary: + description: 'Summary contains the number of bundle deployments + in each state and + + a list of non-ready resources.' + properties: + desiredReady: + description: 'DesiredReady is the number of bundle deployments + that should be + + ready.' + type: integer + errApplied: + description: 'ErrApplied is the number of bundle deployments + that have been synced + + from the Fleet controller and the downstream cluster, but + with some + + errors when deploying the bundle.' + type: integer + modified: + description: 'Modified is the number of bundle deployments that + have been deployed + + and for which all resources are ready, but where some changes + from the + + Git repository have not yet been synced.' + type: integer + nonReadyResources: + description: 'NonReadyClusters is a list of states, which is + filled for a bundle + + that is not ready.' + items: + description: 'NonReadyResource contains information about + a bundle that is not ready for a + + given state like "ErrApplied". It contains a list of non-ready + or modified + + resources and their states.' + properties: + bundleState: + description: State is the state of the resource, like + e.g. "NotReady" or "ErrApplied". + nullable: true + type: string + message: + description: Message contains information why the bundle + is not ready. + nullable: true + type: string + modifiedStatus: + description: ModifiedStatus lists the state for each modified + resource. + items: + description: 'ModifiedStatus is used to report the status + of a resource that is modified. + + It indicates if the modification was a create, a delete + or a patch.' + properties: + apiVersion: + nullable: true + type: string + delete: + type: boolean + exist: + description: Exist is true if the resource exists + but is not owned by us. This can happen if a resource + was adopted by another bundle whereas the first + bundle still exists and due to that reports that + it does not own it. + type: boolean + kind: + nullable: true + type: string + missing: + type: boolean + name: + nullable: true + type: string + namespace: + nullable: true + type: string + patch: + nullable: true + type: string + type: object + nullable: true + type: array + name: + description: Name is the name of the resource. + nullable: true + type: string + nonReadyStatus: + description: NonReadyStatus lists the state for each non-ready + resource. + items: + description: NonReadyStatus is used to report the status + of a resource that is not ready. It includes a summary. + properties: + apiVersion: + nullable: true + type: string + kind: + nullable: true + type: string + name: + nullable: true + type: string + namespace: + nullable: true + type: string + summary: + properties: + error: + type: boolean + message: + items: + type: string + type: array + state: + type: string + transitioning: + type: boolean + type: object + uid: + description: 'UID is a type that holds unique ID + values, including UUIDs. Because we + + don''t ONLY use UUIDs, this is an alias to string. Being + a type captures + + intent and helps make sure that UIDs and names + do not get conflated.' + nullable: true + type: string + type: object + nullable: true + type: array + type: object + nullable: true + type: array + notReady: + description: 'NotReady is the number of bundle deployments that + have been deployed + + where some resources are not ready.' + type: integer + outOfSync: + description: 'OutOfSync is the number of bundle deployments + that have been synced + + from Fleet controller, but not yet by the downstream agent.' + type: integer + pending: + description: 'Pending is the number of bundle deployments that + are being processed + + by Fleet controller.' + type: integer + ready: + description: 'Ready is the number of bundle deployments that + have been deployed + + where all resources are ready.' + type: integer + waitApplied: + description: 'WaitApplied is the number of bundle deployments + that have been + + synced from Fleet controller and downstream cluster, but are + waiting + + to be deployed.' + type: integer + type: object + unavailable: + description: 'Unavailable is the number of bundle deployments that + are not ready or + + where the AppliedDeploymentID in the status does not match the + + DeploymentID from the spec.' + type: integer + unavailablePartitions: + description: UnavailablePartitions is the number of unavailable + partitions. + type: integer + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.16.4 + name: clustergroups.fleet.cattle.io +spec: + group: fleet.cattle.io + names: + categories: + - fleet + kind: ClusterGroup + listKind: ClusterGroupList + plural: clustergroups + singular: clustergroup + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .status.display.readyClusters + name: Clusters-Ready + type: string + - jsonPath: .status.display.readyBundles + name: Bundles-Ready + type: string + - jsonPath: .status.conditions[?(@.type=="Ready")].message + name: Status + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: ClusterGroup is a re-usable selector to target a group of clusters. + 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 + metadata: + type: object + spec: + properties: + selector: + description: Selector is a label selector, used to select clusters + for this group. + nullable: true + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. + The requirements are ANDed. + items: + description: 'A label selector requirement is a selector that + contains values, a key, and an operator that + + relates the key and values.' + properties: + key: + description: key is the label key that the selector applies + to. + type: string + operator: + description: 'operator represents a key''s relationship + to a set of values. + + Valid operators are In, NotIn, Exists and DoesNotExist.' + type: string + values: + description: 'values is an array of string values. If + the operator is In or NotIn, + + the values array must be non-empty. If the operator + is Exists or DoesNotExist, + + the values array must be empty. This array is replaced + during a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} pairs. A single + {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, whose + key field is "key", the + + operator is "In", and the values array contains only "value". + The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + type: object + status: + properties: + clusterCount: + description: ClusterCount is the number of clusters in the cluster + group. + type: integer + conditions: + description: Conditions is a list of conditions and their statuses + for the cluster group. + items: + properties: + lastTransitionTime: + description: Last time the condition transitioned from one + status to another. + type: string + lastUpdateTime: + description: The last time this condition was updated. + type: string + message: + description: Human-readable message indicating details about + last transition + type: string + reason: + description: The reason for the condition's last transition. + type: string + status: + description: Status of the condition, one of True, False, + Unknown. + type: string + type: + description: Type of cluster condition. + type: string + required: + - status + - type + type: object + type: array + display: + description: 'Display contains the number of ready, desiredready + clusters and a + + summary state for the bundle''s resources.' + properties: + readyBundles: + description: 'ReadyBundles is a string in the form "%d/%d", + that describes the + + number of bundles that are ready vs. the number of bundles + desired + + to be ready.' + nullable: true + type: string + readyClusters: + description: 'ReadyClusters is a string in the form "%d/%d", + that describes the + + number of clusters that are ready vs. the number of clusters + desired + + to be ready.' + nullable: true + type: string + state: + description: 'State is a summary state for the cluster group, + showing "NotReady" if + + there are non-ready resources.' + nullable: true + type: string + type: object + nonReadyClusterCount: + description: NonReadyClusterCount is the number of clusters that + are not ready. + type: integer + nonReadyClusters: + description: NonReadyClusters is a list of cluster names that are + not ready. + items: + type: string + nullable: true + type: array + resourceCounts: + description: 'ResourceCounts contains the number of resources in + each state over + + all bundles in the cluster group.' + properties: + desiredReady: + description: DesiredReady is the number of resources that should + be ready. + type: integer + missing: + description: Missing is the number of missing resources. + type: integer + modified: + description: Modified is the number of resources that have been + modified. + type: integer + notReady: + description: 'NotReady is the number of not ready resources. + Resources are not + + ready if they do not match any other state.' + type: integer + orphaned: + description: Orphaned is the number of orphaned resources. + type: integer + ready: + description: Ready is the number of ready resources. + type: integer + unknown: + description: Unknown is the number of resources in an unknown + state. + type: integer + waitApplied: + description: WaitApplied is the number of resources that are + waiting to be applied. + type: integer + type: object + summary: + description: 'Summary is a summary of the bundle deployments and + their resources + + in the cluster group.' + properties: + desiredReady: + description: 'DesiredReady is the number of bundle deployments + that should be + + ready.' + type: integer + errApplied: + description: 'ErrApplied is the number of bundle deployments + that have been synced + + from the Fleet controller and the downstream cluster, but + with some + + errors when deploying the bundle.' + type: integer + modified: + description: 'Modified is the number of bundle deployments that + have been deployed + + and for which all resources are ready, but where some changes + from the + + Git repository have not yet been synced.' + type: integer + nonReadyResources: + description: 'NonReadyClusters is a list of states, which is + filled for a bundle + + that is not ready.' + items: + description: 'NonReadyResource contains information about + a bundle that is not ready for a + + given state like "ErrApplied". It contains a list of non-ready + or modified + + resources and their states.' + properties: + bundleState: + description: State is the state of the resource, like + e.g. "NotReady" or "ErrApplied". + nullable: true + type: string + message: + description: Message contains information why the bundle + is not ready. + nullable: true + type: string + modifiedStatus: + description: ModifiedStatus lists the state for each modified + resource. + items: + description: 'ModifiedStatus is used to report the status + of a resource that is modified. + + It indicates if the modification was a create, a delete + or a patch.' + properties: + apiVersion: + nullable: true + type: string + delete: + type: boolean + exist: + description: Exist is true if the resource exists + but is not owned by us. This can happen if a resource + was adopted by another bundle whereas the first + bundle still exists and due to that reports that + it does not own it. + type: boolean + kind: + nullable: true + type: string + missing: + type: boolean + name: + nullable: true + type: string + namespace: + nullable: true + type: string + patch: + nullable: true + type: string + type: object + nullable: true + type: array + name: + description: Name is the name of the resource. + nullable: true + type: string + nonReadyStatus: + description: NonReadyStatus lists the state for each non-ready + resource. + items: + description: NonReadyStatus is used to report the status + of a resource that is not ready. It includes a summary. + properties: + apiVersion: + nullable: true + type: string + kind: + nullable: true + type: string + name: + nullable: true + type: string + namespace: + nullable: true + type: string + summary: + properties: + error: + type: boolean + message: + items: + type: string + type: array + state: + type: string + transitioning: + type: boolean + type: object + uid: + description: 'UID is a type that holds unique ID + values, including UUIDs. Because we + + don''t ONLY use UUIDs, this is an alias to string. Being + a type captures + + intent and helps make sure that UIDs and names + do not get conflated.' + nullable: true + type: string + type: object + nullable: true + type: array + type: object + nullable: true + type: array + notReady: + description: 'NotReady is the number of bundle deployments that + have been deployed + + where some resources are not ready.' + type: integer + outOfSync: + description: 'OutOfSync is the number of bundle deployments + that have been synced + + from Fleet controller, but not yet by the downstream agent.' + type: integer + pending: + description: 'Pending is the number of bundle deployments that + are being processed + + by Fleet controller.' + type: integer + ready: + description: 'Ready is the number of bundle deployments that + have been deployed + + where all resources are ready.' + type: integer + waitApplied: + description: 'WaitApplied is the number of bundle deployments + that have been + + synced from Fleet controller and downstream cluster, but are + waiting + + to be deployed.' + type: integer + type: object + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.16.4 + name: clusterregistrations.fleet.cattle.io +spec: + group: fleet.cattle.io + names: + kind: ClusterRegistration + listKind: ClusterRegistrationList + plural: clusterregistrations + singular: clusterregistration + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .status.clusterName + name: Cluster-Name + type: string + - jsonPath: .spec.clusterLabels + name: Labels + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: ClusterRegistration is used internally by Fleet and should + not be used directly. + 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 + metadata: + type: object + spec: + properties: + clientID: + description: 'ClientID is a unique string that will identify the + cluster. The + + agent either uses the configured ID or the kubeSystem.UID.' + nullable: true + type: string + clientRandom: + description: 'ClientRandom is a random string that the agent generates. + When + + fleet-controller grants a registration, it creates a registration + + secret with this string in the name.' + nullable: true + type: string + clusterLabels: + additionalProperties: + type: string + description: ClusterLabels are copied to the cluster resource during + the registration. + nullable: true + type: object + type: object + status: + properties: + clusterName: + description: 'ClusterName is only set after the registration is + being processed by + + fleet-controller.' + nullable: true + type: string + granted: + description: 'Granted is set to true, if the request service account + is present + + and its token secret exists. This happens directly before creating + + the registration secret, roles and rolebindings.' + type: boolean + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.16.4 + name: clusterregistrationtokens.fleet.cattle.io +spec: + group: fleet.cattle.io + names: + kind: ClusterRegistrationToken + listKind: ClusterRegistrationTokenList + plural: clusterregistrationtokens + singular: clusterregistrationtoken + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .status.secretName + name: Secret-Name + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: ClusterRegistrationToken is used by agents to register a new + cluster. + 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 + metadata: + type: object + spec: + properties: + ttl: + description: 'TTL is the time to live for the token. It is used + to calculate the + + expiration time. If the token expires, it will be deleted.' + nullable: true + type: string + type: object + status: + properties: + expires: + description: Expires is the time when the token expires. + format: date-time + type: string + secretName: + description: SecretName is the name of the secret containing the + token. + nullable: true + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.16.4 + name: clusters.fleet.cattle.io +spec: + group: fleet.cattle.io + names: + kind: Cluster + listKind: ClusterList + plural: clusters + singular: cluster + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .status.display.readyBundles + name: Bundles-Ready + type: string + - jsonPath: .status.agent.lastSeen + name: Last-Seen + type: string + - jsonPath: .status.conditions[?(@.type=="Ready")].message + name: Status + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: 'Cluster corresponds to a Kubernetes cluster. Fleet deploys + bundles to targeted clusters. + + Clusters to which Fleet deploys manifests are referred to as downstream + + clusters. In the single cluster use case, the Fleet Kubernetes + + cluster is both the manager and downstream cluster at the same time.' + 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 + metadata: + type: object + spec: + properties: + agentAffinity: + description: 'AgentAffinity overrides the default affinity for the + cluster''s agent + + deployment. If this value is nil the default affinity is used.' + nullable: true + properties: + nodeAffinity: + description: Describes node affinity scheduling rules for the + pod. + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: 'The scheduler will prefer to schedule pods + to nodes that satisfy + + the affinity expressions specified by this field, but + it may choose + + a node that violates one or more of the expressions. The + node that is + + most preferred is the one with the greatest sum of weights, + i.e. + + for each node that meets all of the scheduling requirements + (resource + + request, requiredDuringScheduling affinity expressions, + etc.), + + compute a sum by iterating through the elements of this + field and adding + + "weight" to the sum if the node matches the corresponding + matchExpressions; the + + node(s) with the highest sum are the most preferred.' + items: + description: 'An empty preferred scheduling term matches + all objects with implicit weight 0 + + (i.e. it''s a no-op). A null preferred scheduling term + matches no objects (i.e. is also a no-op).' + properties: + preference: + description: A node selector term, associated with + the corresponding weight. + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + items: + description: 'A node selector requirement is + a selector that contains values, a key, and + an operator + + that relates the key and values.' + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: 'Represents a key''s relationship + to a set of values. + + Valid operators are In, NotIn, Exists, + DoesNotExist. Gt, and Lt.' + type: string + values: + description: 'An array of string values. + If the operator is In or NotIn, + + the values array must be non-empty. If + the operator is Exists or DoesNotExist, + + the values array must be empty. If the + operator is Gt or Lt, the values + + array must have a single element, which + will be interpreted as an integer. + + This array is replaced during a strategic + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchFields: + description: A list of node selector requirements + by node's fields. + items: + description: 'A node selector requirement is + a selector that contains values, a key, and + an operator + + that relates the key and values.' + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: 'Represents a key''s relationship + to a set of values. + + Valid operators are In, NotIn, Exists, + DoesNotExist. Gt, and Lt.' + type: string + values: + description: 'An array of string values. + If the operator is In or NotIn, + + the values array must be non-empty. If + the operator is Exists or DoesNotExist, + + the values array must be empty. If the + operator is Gt or Lt, the values + + array must have a single element, which + will be interpreted as an integer. + + This array is replaced during a strategic + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + type: object + x-kubernetes-map-type: atomic + weight: + description: Weight associated with matching the corresponding + nodeSelectorTerm, in the range 1-100. + format: int32 + type: integer + required: + - preference + - weight + type: object + type: array + x-kubernetes-list-type: atomic + requiredDuringSchedulingIgnoredDuringExecution: + description: 'If the affinity requirements specified by + this field are not met at + + scheduling time, the pod will not be scheduled onto the + node. + + If the affinity requirements specified by this field cease + to be met + + at some point during pod execution (e.g. due to an update), + the system + + may or may not try to eventually evict the pod from its + node.' + properties: + nodeSelectorTerms: + description: Required. A list of node selector terms. + The terms are ORed. + items: + description: 'A null or empty node selector term matches + no objects. The requirements of + + them are ANDed. + + The TopologySelectorTerm type implements a subset + of the NodeSelectorTerm.' + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + items: + description: 'A node selector requirement is + a selector that contains values, a key, and + an operator + + that relates the key and values.' + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: 'Represents a key''s relationship + to a set of values. + + Valid operators are In, NotIn, Exists, + DoesNotExist. Gt, and Lt.' + type: string + values: + description: 'An array of string values. + If the operator is In or NotIn, + + the values array must be non-empty. If + the operator is Exists or DoesNotExist, + + the values array must be empty. If the + operator is Gt or Lt, the values + + array must have a single element, which + will be interpreted as an integer. + + This array is replaced during a strategic + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchFields: + description: A list of node selector requirements + by node's fields. + items: + description: 'A node selector requirement is + a selector that contains values, a key, and + an operator + + that relates the key and values.' + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: 'Represents a key''s relationship + to a set of values. + + Valid operators are In, NotIn, Exists, + DoesNotExist. Gt, and Lt.' + type: string + values: + description: 'An array of string values. + If the operator is In or NotIn, + + the values array must be non-empty. If + the operator is Exists or DoesNotExist, + + the values array must be empty. If the + operator is Gt or Lt, the values + + array must have a single element, which + will be interpreted as an integer. + + This array is replaced during a strategic + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + type: object + x-kubernetes-map-type: atomic + type: array + x-kubernetes-list-type: atomic + required: + - nodeSelectorTerms + type: object + x-kubernetes-map-type: atomic + type: object + podAffinity: + description: Describes pod affinity scheduling rules (e.g. co-locate + this pod in the same node, zone, etc. as some other pod(s)). + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: 'The scheduler will prefer to schedule pods + to nodes that satisfy + + the affinity expressions specified by this field, but + it may choose + + a node that violates one or more of the expressions. The + node that is + + most preferred is the one with the greatest sum of weights, + i.e. + + for each node that meets all of the scheduling requirements + (resource + + request, requiredDuringScheduling affinity expressions, + etc.), + + compute a sum by iterating through the elements of this + field and adding + + "weight" to the sum if the node has pods which matches + the corresponding podAffinityTerm; the + + node(s) with the highest sum are the most preferred.' + items: + description: The weights of all of the matched WeightedPodAffinityTerm + fields are added per-node to find the most preferred + node(s) + properties: + podAffinityTerm: + description: Required. A pod affinity term, associated + with the corresponding weight. + properties: + labelSelector: + description: 'A label query over a set of resources, + in this case pods. + + If it''s null, this PodAffinityTerm matches + with no Pods.' + properties: + matchExpressions: + description: matchExpressions is a list of + label selector requirements. The requirements + are ANDed. + items: + description: 'A label selector requirement + is a selector that contains values, a + key, and an operator that + + relates the key and values.' + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: 'operator represents a + key''s relationship to a set of values. + + Valid operators are In, NotIn, Exists + and DoesNotExist.' + type: string + values: + description: 'values is an array of + string values. If the operator is + In or NotIn, + + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + + the values array must be empty. This + array is replaced during a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, + whose key field is "key", the + + operator is "In", and the values array contains + only "value". The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + matchLabelKeys: + description: 'MatchLabelKeys is a set of pod label + keys to select which pods will + + be taken into consideration. The keys are used + to lookup values from the + + incoming pod labels, those key-value labels + are merged with `labelSelector` as `key in (value)` + + to select the group of existing pods which pods + will be taken into consideration + + for the incoming pod''s pod (anti) affinity. + Keys that don''t exist in the incoming + + pod labels will be ignored. The default value + is empty. + + The same key is forbidden to exist in both matchLabelKeys + and labelSelector. + + Also, matchLabelKeys cannot be set when labelSelector + isn''t set. + + This is a beta field and requires enabling MatchLabelKeysInPodAffinity + feature gate (enabled by default).' + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + description: 'MismatchLabelKeys is a set of pod + label keys to select which pods will + + be taken into consideration. The keys are used + to lookup values from the + + incoming pod labels, those key-value labels + are merged with `labelSelector` as `key notin + (value)` + + to select the group of existing pods which pods + will be taken into consideration + + for the incoming pod''s pod (anti) affinity. + Keys that don''t exist in the incoming + + pod labels will be ignored. The default value + is empty. + + The same key is forbidden to exist in both mismatchLabelKeys + and labelSelector. + + Also, mismatchLabelKeys cannot be set when labelSelector + isn''t set. + + This is a beta field and requires enabling MatchLabelKeysInPodAffinity + feature gate (enabled by default).' + items: + type: string + type: array + x-kubernetes-list-type: atomic + namespaceSelector: + description: 'A label query over the set of namespaces + that the term applies to. + + The term is applied to the union of the namespaces + selected by this field + + and the ones listed in the namespaces field. + + null selector and null or empty namespaces list + means "this pod''s namespace". + + An empty selector ({}) matches all namespaces.' + properties: + matchExpressions: + description: matchExpressions is a list of + label selector requirements. The requirements + are ANDed. + items: + description: 'A label selector requirement + is a selector that contains values, a + key, and an operator that + + relates the key and values.' + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: 'operator represents a + key''s relationship to a set of values. + + Valid operators are In, NotIn, Exists + and DoesNotExist.' + type: string + values: + description: 'values is an array of + string values. If the operator is + In or NotIn, + + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + + the values array must be empty. This + array is replaced during a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, + whose key field is "key", the + + operator is "In", and the values array contains + only "value". The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + description: 'namespaces specifies a static list + of namespace names that the term applies to. + + The term is applied to the union of the namespaces + listed in this field + + and the ones selected by namespaceSelector. + + null or empty namespaces list and null namespaceSelector + means "this pod''s namespace".' + items: + type: string + type: array + x-kubernetes-list-type: atomic + topologyKey: + description: 'This pod should be co-located (affinity) + or not co-located (anti-affinity) with the pods + matching + + the labelSelector in the specified namespaces, + where co-located is defined as running on a + node + + whose value of the label with key topologyKey + matches that of any node on which any of the + + selected pods is running. + + Empty topologyKey is not allowed.' + type: string + required: + - topologyKey + type: object + weight: + description: 'weight associated with matching the + corresponding podAffinityTerm, + + in the range 1-100.' + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + x-kubernetes-list-type: atomic + requiredDuringSchedulingIgnoredDuringExecution: + description: 'If the affinity requirements specified by + this field are not met at + + scheduling time, the pod will not be scheduled onto the + node. + + If the affinity requirements specified by this field cease + to be met + + at some point during pod execution (e.g. due to a pod + label update), the + + system may or may not try to eventually evict the pod + from its node. + + When there are multiple elements, the lists of nodes corresponding + to each + + podAffinityTerm are intersected, i.e. all terms must be + satisfied.' + items: + description: 'Defines a set of pods (namely those matching + the labelSelector + + relative to the given namespace(s)) that this pod should + be + + co-located (affinity) or not co-located (anti-affinity) + with, + + where co-located is defined as running on a node whose + value of + + the label with key matches that of any + node on which + + a pod of the set of pods is running' + properties: + labelSelector: + description: 'A label query over a set of resources, + in this case pods. + + If it''s null, this PodAffinityTerm matches with + no Pods.' + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + items: + description: 'A label selector requirement is + a selector that contains values, a key, and + an operator that + + relates the key and values.' + properties: + key: + description: key is the label key that the + selector applies to. + type: string + operator: + description: 'operator represents a key''s + relationship to a set of values. + + Valid operators are In, NotIn, Exists + and DoesNotExist.' + type: string + values: + description: 'values is an array of string + values. If the operator is In or NotIn, + + the values array must be non-empty. If + the operator is Exists or DoesNotExist, + + the values array must be empty. This array + is replaced during a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, + whose key field is "key", the + + operator is "In", and the values array contains + only "value". The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + matchLabelKeys: + description: 'MatchLabelKeys is a set of pod label + keys to select which pods will + + be taken into consideration. The keys are used to + lookup values from the + + incoming pod labels, those key-value labels are + merged with `labelSelector` as `key in (value)` + + to select the group of existing pods which pods + will be taken into consideration + + for the incoming pod''s pod (anti) affinity. Keys + that don''t exist in the incoming + + pod labels will be ignored. The default value is + empty. + + The same key is forbidden to exist in both matchLabelKeys + and labelSelector. + + Also, matchLabelKeys cannot be set when labelSelector + isn''t set. + + This is a beta field and requires enabling MatchLabelKeysInPodAffinity + feature gate (enabled by default).' + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + description: 'MismatchLabelKeys is a set of pod label + keys to select which pods will + + be taken into consideration. The keys are used to + lookup values from the + + incoming pod labels, those key-value labels are + merged with `labelSelector` as `key notin (value)` + + to select the group of existing pods which pods + will be taken into consideration + + for the incoming pod''s pod (anti) affinity. Keys + that don''t exist in the incoming + + pod labels will be ignored. The default value is + empty. + + The same key is forbidden to exist in both mismatchLabelKeys + and labelSelector. + + Also, mismatchLabelKeys cannot be set when labelSelector + isn''t set. + + This is a beta field and requires enabling MatchLabelKeysInPodAffinity + feature gate (enabled by default).' + items: + type: string + type: array + x-kubernetes-list-type: atomic + namespaceSelector: + description: 'A label query over the set of namespaces + that the term applies to. + + The term is applied to the union of the namespaces + selected by this field + + and the ones listed in the namespaces field. + + null selector and null or empty namespaces list + means "this pod''s namespace". + + An empty selector ({}) matches all namespaces.' + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + items: + description: 'A label selector requirement is + a selector that contains values, a key, and + an operator that + + relates the key and values.' + properties: + key: + description: key is the label key that the + selector applies to. + type: string + operator: + description: 'operator represents a key''s + relationship to a set of values. + + Valid operators are In, NotIn, Exists + and DoesNotExist.' + type: string + values: + description: 'values is an array of string + values. If the operator is In or NotIn, + + the values array must be non-empty. If + the operator is Exists or DoesNotExist, + + the values array must be empty. This array + is replaced during a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, + whose key field is "key", the + + operator is "In", and the values array contains + only "value". The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + description: 'namespaces specifies a static list of + namespace names that the term applies to. + + The term is applied to the union of the namespaces + listed in this field + + and the ones selected by namespaceSelector. + + null or empty namespaces list and null namespaceSelector + means "this pod''s namespace".' + items: + type: string + type: array + x-kubernetes-list-type: atomic + topologyKey: + description: 'This pod should be co-located (affinity) + or not co-located (anti-affinity) with the pods + matching + + the labelSelector in the specified namespaces, where + co-located is defined as running on a node + + whose value of the label with key topologyKey matches + that of any node on which any of the + + selected pods is running. + + Empty topologyKey is not allowed.' + type: string + required: + - topologyKey + type: object + type: array + x-kubernetes-list-type: atomic + type: object + podAntiAffinity: + description: Describes pod anti-affinity scheduling rules (e.g. + avoid putting this pod in the same node, zone, etc. as some + other pod(s)). + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: 'The scheduler will prefer to schedule pods + to nodes that satisfy + + the anti-affinity expressions specified by this field, + but it may choose + + a node that violates one or more of the expressions. The + node that is + + most preferred is the one with the greatest sum of weights, + i.e. + + for each node that meets all of the scheduling requirements + (resource + + request, requiredDuringScheduling anti-affinity expressions, + etc.), + + compute a sum by iterating through the elements of this + field and adding + + "weight" to the sum if the node has pods which matches + the corresponding podAffinityTerm; the + + node(s) with the highest sum are the most preferred.' + items: + description: The weights of all of the matched WeightedPodAffinityTerm + fields are added per-node to find the most preferred + node(s) + properties: + podAffinityTerm: + description: Required. A pod affinity term, associated + with the corresponding weight. + properties: + labelSelector: + description: 'A label query over a set of resources, + in this case pods. + + If it''s null, this PodAffinityTerm matches + with no Pods.' + properties: + matchExpressions: + description: matchExpressions is a list of + label selector requirements. The requirements + are ANDed. + items: + description: 'A label selector requirement + is a selector that contains values, a + key, and an operator that + + relates the key and values.' + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: 'operator represents a + key''s relationship to a set of values. + + Valid operators are In, NotIn, Exists + and DoesNotExist.' + type: string + values: + description: 'values is an array of + string values. If the operator is + In or NotIn, + + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + + the values array must be empty. This + array is replaced during a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, + whose key field is "key", the + + operator is "In", and the values array contains + only "value". The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + matchLabelKeys: + description: 'MatchLabelKeys is a set of pod label + keys to select which pods will + + be taken into consideration. The keys are used + to lookup values from the + + incoming pod labels, those key-value labels + are merged with `labelSelector` as `key in (value)` + + to select the group of existing pods which pods + will be taken into consideration + + for the incoming pod''s pod (anti) affinity. + Keys that don''t exist in the incoming + + pod labels will be ignored. The default value + is empty. + + The same key is forbidden to exist in both matchLabelKeys + and labelSelector. + + Also, matchLabelKeys cannot be set when labelSelector + isn''t set. + + This is a beta field and requires enabling MatchLabelKeysInPodAffinity + feature gate (enabled by default).' + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + description: 'MismatchLabelKeys is a set of pod + label keys to select which pods will + + be taken into consideration. The keys are used + to lookup values from the + + incoming pod labels, those key-value labels + are merged with `labelSelector` as `key notin + (value)` + + to select the group of existing pods which pods + will be taken into consideration + + for the incoming pod''s pod (anti) affinity. + Keys that don''t exist in the incoming + + pod labels will be ignored. The default value + is empty. + + The same key is forbidden to exist in both mismatchLabelKeys + and labelSelector. + + Also, mismatchLabelKeys cannot be set when labelSelector + isn''t set. + + This is a beta field and requires enabling MatchLabelKeysInPodAffinity + feature gate (enabled by default).' + items: + type: string + type: array + x-kubernetes-list-type: atomic + namespaceSelector: + description: 'A label query over the set of namespaces + that the term applies to. + + The term is applied to the union of the namespaces + selected by this field + + and the ones listed in the namespaces field. + + null selector and null or empty namespaces list + means "this pod''s namespace". + + An empty selector ({}) matches all namespaces.' + properties: + matchExpressions: + description: matchExpressions is a list of + label selector requirements. The requirements + are ANDed. + items: + description: 'A label selector requirement + is a selector that contains values, a + key, and an operator that + + relates the key and values.' + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: 'operator represents a + key''s relationship to a set of values. + + Valid operators are In, NotIn, Exists + and DoesNotExist.' + type: string + values: + description: 'values is an array of + string values. If the operator is + In or NotIn, + + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + + the values array must be empty. This + array is replaced during a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, + whose key field is "key", the + + operator is "In", and the values array contains + only "value". The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + description: 'namespaces specifies a static list + of namespace names that the term applies to. + + The term is applied to the union of the namespaces + listed in this field + + and the ones selected by namespaceSelector. + + null or empty namespaces list and null namespaceSelector + means "this pod''s namespace".' + items: + type: string + type: array + x-kubernetes-list-type: atomic + topologyKey: + description: 'This pod should be co-located (affinity) + or not co-located (anti-affinity) with the pods + matching + + the labelSelector in the specified namespaces, + where co-located is defined as running on a + node + + whose value of the label with key topologyKey + matches that of any node on which any of the + + selected pods is running. + + Empty topologyKey is not allowed.' + type: string + required: + - topologyKey + type: object + weight: + description: 'weight associated with matching the + corresponding podAffinityTerm, + + in the range 1-100.' + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + x-kubernetes-list-type: atomic + requiredDuringSchedulingIgnoredDuringExecution: + description: 'If the anti-affinity requirements specified + by this field are not met at + + scheduling time, the pod will not be scheduled onto the + node. + + If the anti-affinity requirements specified by this field + cease to be met + + at some point during pod execution (e.g. due to a pod + label update), the + + system may or may not try to eventually evict the pod + from its node. + + When there are multiple elements, the lists of nodes corresponding + to each + + podAffinityTerm are intersected, i.e. all terms must be + satisfied.' + items: + description: 'Defines a set of pods (namely those matching + the labelSelector + + relative to the given namespace(s)) that this pod should + be + + co-located (affinity) or not co-located (anti-affinity) + with, + + where co-located is defined as running on a node whose + value of + + the label with key matches that of any + node on which + + a pod of the set of pods is running' + properties: + labelSelector: + description: 'A label query over a set of resources, + in this case pods. + + If it''s null, this PodAffinityTerm matches with + no Pods.' + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + items: + description: 'A label selector requirement is + a selector that contains values, a key, and + an operator that + + relates the key and values.' + properties: + key: + description: key is the label key that the + selector applies to. + type: string + operator: + description: 'operator represents a key''s + relationship to a set of values. + + Valid operators are In, NotIn, Exists + and DoesNotExist.' + type: string + values: + description: 'values is an array of string + values. If the operator is In or NotIn, + + the values array must be non-empty. If + the operator is Exists or DoesNotExist, + + the values array must be empty. This array + is replaced during a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, + whose key field is "key", the + + operator is "In", and the values array contains + only "value". The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + matchLabelKeys: + description: 'MatchLabelKeys is a set of pod label + keys to select which pods will + + be taken into consideration. The keys are used to + lookup values from the + + incoming pod labels, those key-value labels are + merged with `labelSelector` as `key in (value)` + + to select the group of existing pods which pods + will be taken into consideration + + for the incoming pod''s pod (anti) affinity. Keys + that don''t exist in the incoming + + pod labels will be ignored. The default value is + empty. + + The same key is forbidden to exist in both matchLabelKeys + and labelSelector. + + Also, matchLabelKeys cannot be set when labelSelector + isn''t set. + + This is a beta field and requires enabling MatchLabelKeysInPodAffinity + feature gate (enabled by default).' + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + description: 'MismatchLabelKeys is a set of pod label + keys to select which pods will + + be taken into consideration. The keys are used to + lookup values from the + + incoming pod labels, those key-value labels are + merged with `labelSelector` as `key notin (value)` + + to select the group of existing pods which pods + will be taken into consideration + + for the incoming pod''s pod (anti) affinity. Keys + that don''t exist in the incoming + + pod labels will be ignored. The default value is + empty. + + The same key is forbidden to exist in both mismatchLabelKeys + and labelSelector. + + Also, mismatchLabelKeys cannot be set when labelSelector + isn''t set. + + This is a beta field and requires enabling MatchLabelKeysInPodAffinity + feature gate (enabled by default).' + items: + type: string + type: array + x-kubernetes-list-type: atomic + namespaceSelector: + description: 'A label query over the set of namespaces + that the term applies to. + + The term is applied to the union of the namespaces + selected by this field + + and the ones listed in the namespaces field. + + null selector and null or empty namespaces list + means "this pod''s namespace". + + An empty selector ({}) matches all namespaces.' + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + items: + description: 'A label selector requirement is + a selector that contains values, a key, and + an operator that + + relates the key and values.' + properties: + key: + description: key is the label key that the + selector applies to. + type: string + operator: + description: 'operator represents a key''s + relationship to a set of values. + + Valid operators are In, NotIn, Exists + and DoesNotExist.' + type: string + values: + description: 'values is an array of string + values. If the operator is In or NotIn, + + the values array must be non-empty. If + the operator is Exists or DoesNotExist, + + the values array must be empty. This array + is replaced during a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, + whose key field is "key", the + + operator is "In", and the values array contains + only "value". The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + description: 'namespaces specifies a static list of + namespace names that the term applies to. + + The term is applied to the union of the namespaces + listed in this field + + and the ones selected by namespaceSelector. + + null or empty namespaces list and null namespaceSelector + means "this pod''s namespace".' + items: + type: string + type: array + x-kubernetes-list-type: atomic + topologyKey: + description: 'This pod should be co-located (affinity) + or not co-located (anti-affinity) with the pods + matching + + the labelSelector in the specified namespaces, where + co-located is defined as running on a node + + whose value of the label with key topologyKey matches + that of any node on which any of the + + selected pods is running. + + Empty topologyKey is not allowed.' + type: string + required: + - topologyKey + type: object + type: array + x-kubernetes-list-type: atomic + type: object + type: object + agentEnvVars: + description: AgentEnvVars are extra environment variables to be + added to the agent deployment. + items: + description: EnvVar represents an environment variable present + in a Container. + properties: + name: + description: Name of the environment variable. Must be a C_IDENTIFIER. + type: string + value: + description: 'Variable references $(VAR_NAME) are expanded + + using the previously defined environment variables in the + container and + + any service environment variables. If a variable cannot + be resolved, + + the reference in the input string will be unchanged. Double + $$ are reduced + + to a single $, which allows for escaping the $(VAR_NAME) + syntax: i.e. + + "$$(VAR_NAME)" will produce the string literal "$(VAR_NAME)". + + Escaped references will never be expanded, regardless of + whether the variable + + exists or not. + + Defaults to "".' + type: string + valueFrom: + description: Source for the environment variable's value. + Cannot be used if value is not empty. + properties: + configMapKeyRef: + description: Selects a key of a ConfigMap. + properties: + key: + description: The key to select. + type: string + name: + default: '' + description: 'Name of the referent. + + This field is effectively required, but due to backwards + compatibility is + + allowed to be empty. Instances of this type with + an empty value here are + + almost certainly wrong. + + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap or its + key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + description: 'Selects a field of the pod: supports metadata.name, + metadata.namespace, `metadata.labels['''']`, `metadata.annotations['''']`, + + spec.nodeName, spec.serviceAccountName, status.hostIP, + status.podIP, status.podIPs.' + properties: + apiVersion: + description: Version of the schema the FieldPath is + written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the specified + API version. + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + description: 'Selects a resource of the container: only + resources limits and requests + + (limits.cpu, limits.memory, limits.ephemeral-storage, + requests.cpu, requests.memory and requests.ephemeral-storage) + are currently supported.' + properties: + containerName: + description: 'Container name: required for volumes, + optional for env vars' + type: string + divisor: + anyOf: + - type: integer + - type: string + description: Specifies the output format of the exposed + resources, defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + description: Selects a key of a secret in the pod's namespace + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + default: '' + description: 'Name of the referent. + + This field is effectively required, but due to backwards + compatibility is + + allowed to be empty. Instances of this type with + an empty value here are + + almost certainly wrong. + + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + nullable: true + type: array + agentNamespace: + description: AgentNamespace defaults to the system namespace, e.g. + cattle-fleet-system. + nullable: true + type: string + agentResources: + description: AgentResources sets the resources for the cluster's + agent deployment. + nullable: true + properties: + claims: + description: 'Claims lists the names of resources, defined in + spec.resourceClaims, + + that are used by this container. + + + This is an alpha field and requires enabling the + + DynamicResourceAllocation feature gate. + + + This field is immutable. It can only be set for containers.' + items: + description: ResourceClaim references one entry in PodSpec.ResourceClaims. + properties: + name: + description: 'Name must match the name of one entry in + pod.spec.resourceClaims of + + the Pod where this field is used. It makes that resource + available + + inside a container.' + type: string + request: + description: 'Request is the name chosen for a request + in the referenced claim. + + If empty, everything from the claim is made available, + otherwise + + only the result of this request.' + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: 'Limits describes the maximum amount of compute + resources allowed. + + More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: 'Requests describes the minimum amount of compute + resources required. + + If Requests is omitted for a container, it defaults to Limits + if that is explicitly specified, + + otherwise to an implementation-defined value. Requests cannot + exceed Limits. + + More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' + type: object + type: object + agentTolerations: + description: AgentTolerations defines an extra set of Tolerations + to be added to the Agent deployment. + items: + description: 'The pod this Toleration is attached to tolerates + any taint that matches + + the triple using the matching operator .' + properties: + effect: + description: 'Effect indicates the taint effect to match. + Empty means match all taint effects. + + When specified, allowed values are NoSchedule, PreferNoSchedule + and NoExecute.' + type: string + key: + description: 'Key is the taint key that the toleration applies + to. Empty means match all taint keys. + + If the key is empty, operator must be Exists; this combination + means to match all values and all keys.' + type: string + operator: + description: 'Operator represents a key''s relationship to + the value. + + Valid operators are Exists and Equal. Defaults to Equal. + + Exists is equivalent to wildcard for value, so that a pod + can + + tolerate all taints of a particular category.' + type: string + tolerationSeconds: + description: 'TolerationSeconds represents the period of time + the toleration (which must be + + of effect NoExecute, otherwise this field is ignored) tolerates + the taint. By default, + + it is not set, which means tolerate the taint forever (do + not evict). Zero and + + negative values will be treated as 0 (evict immediately) + by the system.' + format: int64 + type: integer + value: + description: 'Value is the taint value the toleration matches + to. + + If the operator is Exists, the value should be empty, otherwise + just a regular string.' + type: string + type: object + nullable: true + type: array + clientID: + description: 'ClientID is a unique string that will identify the + cluster. It can + + either be predefined, or generated when importing the cluster.' + nullable: true + type: string + hostNetwork: + description: 'HostNetwork sets the agent StatefulSet to use hostNetwork: + true setting. + + Allows for provisioning of network related bundles (CNI configuration).' + nullable: true + type: boolean + kubeConfigSecret: + description: 'KubeConfigSecret is the name of the secret containing + the kubeconfig for the downstream cluster. + + It can optionally contain a APIServerURL and CA to override the + + values in the fleet-controller''s configmap.' + nullable: true + type: string + kubeConfigSecretNamespace: + description: 'KubeConfigSecretNamespace is the namespace of the + secret containing the kubeconfig for the downstream cluster. + + If unset, it will be assumed the secret can be found in the namespace + that the Cluster object resides within.' + nullable: true + type: string + paused: + description: Paused if set to true, will stop any BundleDeployments + from being updated. + type: boolean + privateRepoURL: + description: PrivateRepoURL prefixes the image name and overrides + a global repo URL from the agents config. + nullable: true + type: string + redeployAgentGeneration: + description: RedeployAgentGeneration can be used to force redeploying + the agent. + format: int64 + type: integer + templateValues: + description: TemplateValues defines a cluster specific mapping of + values to be sent to fleet.yaml values templating. + nullable: true + type: object + x-kubernetes-preserve-unknown-fields: true + type: object + status: + properties: + agent: + description: AgentStatus contains information about the agent. + properties: + lastSeen: + description: 'LastSeen is the last time the agent checked in + to update the status + + of the cluster resource.' + format: date-time + nullable: true + type: string + namespace: + description: Namespace is the namespace of the agent deployment, + e.g. "cattle-fleet-system". + nullable: true + type: string + type: object + agentAffinityHash: + description: 'AgentAffinityHash is a hash of the agent''s affinity + configuration, + + used to detect changes.' + type: string + agentConfigChanged: + description: 'AgentConfigChanged is set to true if any of the agent + configuration + + changed, like the API server URL or CA. Setting it to true will + + trigger a re-import of the cluster.' + type: boolean + agentDeployedGeneration: + description: AgentDeployedGeneration is the generation of the agent + that is currently deployed. + format: int64 + nullable: true + type: integer + agentEnvVarsHash: + description: AgentEnvVarsHash is a hash of the agent's env vars, + used to detect changes. + nullable: true + type: string + agentHostNetwork: + description: AgentHostNetwork defines observed state of spec.hostNetwork + setting that is currently used. + nullable: true + type: boolean + agentMigrated: + description: 'AgentMigrated is always set to true after importing + a cluster. If + + false, it will trigger a migration. Old agents don''t have + + this in their status.' + type: boolean + agentNamespaceMigrated: + description: 'AgentNamespaceMigrated is always set to true after + importing a + + cluster. If false, it will trigger a migration. Old Fleet agents + + don''t have this in their status.' + type: boolean + agentPrivateRepoURL: + description: AgentPrivateRepoURL is the private repo URL for the + agent that is currently used. + nullable: true + type: string + agentResourcesHash: + description: 'AgentResourcesHash is a hash of the agent''s resources + configuration, + + used to detect changes.' + nullable: true + type: string + agentTLSMode: + description: 'AgentTLSMode supports two values: `system-store` and + `strict`. If set to + + `system-store`, instructs the agent to trust CA bundles from the + operating + + system''s store. If set to `strict`, then the agent shall only + connect to a + + server which uses the exact CA configured when creating/updating + the agent.' + nullable: true + type: string + agentTolerationsHash: + description: 'AgentTolerationsHash is a hash of the agent''s tolerations + + configuration, used to detect changes.' + nullable: true + type: string + apiServerCAHash: + description: APIServerCAHash is a hash of the upstream API server + CA, used to detect changes. + nullable: true + type: string + apiServerURL: + description: 'APIServerURL is the currently used URL of the API + server that the + + cluster uses to connect to upstream.' + nullable: true + type: string + cattleNamespaceMigrated: + description: 'CattleNamespaceMigrated is always set to true after + importing a + + cluster. If false, it will trigger a migration. Old Fleet agents, + + don''t have this in their status.' + type: boolean + conditions: + items: + properties: + lastTransitionTime: + description: Last time the condition transitioned from one + status to another. + type: string + lastUpdateTime: + description: The last time this condition was updated. + type: string + message: + description: Human-readable message indicating details about + last transition + type: string + reason: + description: The reason for the condition's last transition. + type: string + status: + description: Status of the condition, one of True, False, + Unknown. + type: string + type: + description: Type of cluster condition. + type: string + required: + - status + - type + type: object + type: array + desiredReadyGitRepos: + description: 'DesiredReadyGitRepos is the number of gitrepos for + this cluster that + + are desired to be ready.' + type: integer + display: + description: Display contains the number of ready bundles, nodes + and a summary state. + properties: + readyBundles: + description: 'ReadyBundles is a string in the form "%d/%d", + that describes the + + number of bundles that are ready vs. the number of bundles + desired + + to be ready.' + type: string + state: + description: State of the cluster, either one of the bundle + states, or "WaitCheckIn". + nullable: true + type: string + type: object + garbageCollectionInterval: + description: GarbageCollectionInterval determines how often agents + clean up obsolete Helm releases. + type: string + namespace: + description: 'Namespace is the cluster namespace, it contains the + clusters service + + account as well as any bundledeployments. Example: + + "cluster-fleet-local-cluster-294db1acfa77-d9ccf852678f"' + type: string + readyGitRepos: + description: ReadyGitRepos is the number of gitrepos for this cluster + that are ready. + type: integer + resourceCounts: + description: ResourceCounts is an aggregate over the GitRepoResourceCounts. + properties: + desiredReady: + description: DesiredReady is the number of resources that should + be ready. + type: integer + missing: + description: Missing is the number of missing resources. + type: integer + modified: + description: Modified is the number of resources that have been + modified. + type: integer + notReady: + description: 'NotReady is the number of not ready resources. + Resources are not + + ready if they do not match any other state.' + type: integer + orphaned: + description: Orphaned is the number of orphaned resources. + type: integer + ready: + description: Ready is the number of ready resources. + type: integer + unknown: + description: Unknown is the number of resources in an unknown + state. + type: integer + waitApplied: + description: WaitApplied is the number of resources that are + waiting to be applied. + type: integer + type: object + summary: + description: 'Summary is a summary of the bundledeployments. The + resource counts + + are copied from the gitrepo resource.' + properties: + desiredReady: + description: 'DesiredReady is the number of bundle deployments + that should be + + ready.' + type: integer + errApplied: + description: 'ErrApplied is the number of bundle deployments + that have been synced + + from the Fleet controller and the downstream cluster, but + with some + + errors when deploying the bundle.' + type: integer + modified: + description: 'Modified is the number of bundle deployments that + have been deployed + + and for which all resources are ready, but where some changes + from the + + Git repository have not yet been synced.' + type: integer + nonReadyResources: + description: 'NonReadyClusters is a list of states, which is + filled for a bundle + + that is not ready.' + items: + description: 'NonReadyResource contains information about + a bundle that is not ready for a + + given state like "ErrApplied". It contains a list of non-ready + or modified + + resources and their states.' + properties: + bundleState: + description: State is the state of the resource, like + e.g. "NotReady" or "ErrApplied". + nullable: true + type: string + message: + description: Message contains information why the bundle + is not ready. + nullable: true + type: string + modifiedStatus: + description: ModifiedStatus lists the state for each modified + resource. + items: + description: 'ModifiedStatus is used to report the status + of a resource that is modified. + + It indicates if the modification was a create, a delete + or a patch.' + properties: + apiVersion: + nullable: true + type: string + delete: + type: boolean + exist: + description: Exist is true if the resource exists + but is not owned by us. This can happen if a resource + was adopted by another bundle whereas the first + bundle still exists and due to that reports that + it does not own it. + type: boolean + kind: + nullable: true + type: string + missing: + type: boolean + name: + nullable: true + type: string + namespace: + nullable: true + type: string + patch: + nullable: true + type: string + type: object + nullable: true + type: array + name: + description: Name is the name of the resource. + nullable: true + type: string + nonReadyStatus: + description: NonReadyStatus lists the state for each non-ready + resource. + items: + description: NonReadyStatus is used to report the status + of a resource that is not ready. It includes a summary. + properties: + apiVersion: + nullable: true + type: string + kind: + nullable: true + type: string + name: + nullable: true + type: string + namespace: + nullable: true + type: string + summary: + properties: + error: + type: boolean + message: + items: + type: string + type: array + state: + type: string + transitioning: + type: boolean + type: object + uid: + description: 'UID is a type that holds unique ID + values, including UUIDs. Because we + + don''t ONLY use UUIDs, this is an alias to string. Being + a type captures + + intent and helps make sure that UIDs and names + do not get conflated.' + nullable: true + type: string + type: object + nullable: true + type: array + type: object + nullable: true + type: array + notReady: + description: 'NotReady is the number of bundle deployments that + have been deployed + + where some resources are not ready.' + type: integer + outOfSync: + description: 'OutOfSync is the number of bundle deployments + that have been synced + + from Fleet controller, but not yet by the downstream agent.' + type: integer + pending: + description: 'Pending is the number of bundle deployments that + are being processed + + by Fleet controller.' + type: integer + ready: + description: 'Ready is the number of bundle deployments that + have been deployed + + where all resources are ready.' + type: integer + waitApplied: + description: 'WaitApplied is the number of bundle deployments + that have been + + synced from Fleet controller and downstream cluster, but are + waiting + + to be deployed.' + type: integer + type: object + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.16.4 + name: contents.fleet.cattle.io +spec: + group: fleet.cattle.io + names: + kind: Content + listKind: ContentList + plural: contents + singular: content + scope: Cluster + versions: + - name: v1alpha1 + schema: + openAPIV3Schema: + description: 'Content is used internally by Fleet and should not be used + directly. It + + contains the resources from a bundle for a specific target cluster.' + 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 + content: + description: 'Content is a byte array, which contains the manifests + of a bundle. + + The bundle resources are copied into the bundledeployment''s content + + resource, so the downstream agent can deploy them.' + format: byte + nullable: true + 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 + metadata: + type: object + sha256sum: + description: SHA256Sum of the Content field + type: string + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.16.4 + name: gitreporestrictions.fleet.cattle.io +spec: + group: fleet.cattle.io + names: + kind: GitRepoRestriction + listKind: GitRepoRestrictionList + plural: gitreporestrictions + singular: gitreporestriction + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .defaultServiceAccount + name: Default-ServiceAccount + type: string + - jsonPath: .allowedServiceAccounts + name: Allowed-ServiceAccounts + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: 'GitRepoRestriction is a resource that can optionally be used + to restrict + + the options of GitRepos in the same namespace.' + properties: + allowedClientSecretNames: + description: AllowedClientSecretNames is a list of client secret names + that GitRepos are allowed to use. + items: + type: string + nullable: true + type: array + allowedRepoPatterns: + description: 'AllowedRepoPatterns is a list of regex patterns that restrict + the + + valid values of the Repo field of a GitRepo.' + items: + type: string + nullable: true + type: array + allowedServiceAccounts: + description: AllowedServiceAccounts is a list of service accounts that + GitRepos are allowed to use. + items: + type: string + nullable: true + type: array + allowedTargetNamespaces: + description: 'AllowedTargetNamespaces restricts TargetNamespace to the + given + + namespaces. If AllowedTargetNamespaces is set, TargetNamespace must + + be set.' + items: + type: string + nullable: true + type: array + 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 + defaultClientSecretName: + description: DefaultClientSecretName overrides the GitRepo's default + client secret. + nullable: true + type: string + defaultServiceAccount: + description: DefaultServiceAccount overrides the GitRepo's default service + account. + nullable: true + 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 + metadata: + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.16.4 + name: gitrepos.fleet.cattle.io +spec: + group: fleet.cattle.io + names: + categories: + - fleet + kind: GitRepo + listKind: GitRepoList + plural: gitrepos + singular: gitrepo + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .spec.repo + name: Repo + type: string + - jsonPath: .status.commit + name: Commit + type: string + - jsonPath: .status.display.readyBundleDeployments + name: BundleDeployments-Ready + type: string + - jsonPath: .status.conditions[?(@.type=="Ready")].message + name: Status + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: 'GitRepo describes a git repository that is watched by Fleet. + + The resource contains the necessary information to deploy the repo, or + parts + + of it, to target clusters.' + 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 + metadata: + type: object + spec: + properties: + branch: + description: Branch The git branch to follow. + nullable: true + type: string + caBundle: + description: CABundle is a PEM encoded CA bundle which will be used + to validate the repo's certificate. + format: byte + nullable: true + type: string + clientSecretName: + description: 'ClientSecretName is the name of the client secret + to be used to connect to the repo + + It is expected the secret be of type "kubernetes.io/basic-auth" + or "kubernetes.io/ssh-auth".' + nullable: true + type: string + correctDrift: + description: CorrectDrift specifies how drift correction should + work. + properties: + enabled: + description: Enabled correct drift if true. + type: boolean + force: + description: Force helm rollback with --force option will be + used if true. This will try to recreate all resources in the + release. + type: boolean + keepFailHistory: + description: KeepFailHistory keeps track of failed rollbacks + in the helm history. + type: boolean + type: object + deleteNamespace: + description: DeleteNamespace specifies if the namespace created + must be deleted after deleting the GitRepo. + type: boolean + disablePolling: + description: Disables git polling. When enabled only webhooks will + be used. + type: boolean + forceSyncGeneration: + description: Increment this number to force a redeployment of contents + from Git. + format: int64 + type: integer + helmRepoURLRegex: + description: 'HelmRepoURLRegex Helm credentials will be used if + the helm repo matches this regex + + Credentials will always be used if this is empty or not provided.' + nullable: true + type: string + helmSecretName: + description: HelmSecretName contains the auth secret for a private + Helm repository. + nullable: true + type: string + helmSecretNameForPaths: + description: HelmSecretNameForPaths contains the auth secret for + private Helm repository for each path. + nullable: true + type: string + imageScanCommit: + description: Commit specifies how to commit to the git repo when + a new image is scanned and written back to git repo. + properties: + authorEmail: + description: AuthorEmail gives the email to provide when making + a commit + type: string + authorName: + description: AuthorName gives the name to provide when making + a commit + type: string + messageTemplate: + description: 'MessageTemplate provides a template for the commit + message, + + into which will be interpolated the details of the change + made.' + type: string + type: object + imageScanInterval: + description: ImageScanInterval is the interval of syncing scanned + images and writing back to git repo. + type: string + insecureSkipTLSVerify: + description: InsecureSkipTLSverify will use insecure HTTPS to clone + the repo. + type: boolean + keepResources: + description: KeepResources specifies if the resources created must + be kept after deleting the GitRepo. + type: boolean + ociRegistry: + description: OCIRegistry specifies the OCI registry related parameters + properties: + authSecretName: + description: AuthSecretName contains the auth secret where the + OCI regristry credentials are stored. + nullable: true + type: string + basicHTTP: + description: BasicHTTP uses HTTP connections to the OCI registry + when enabled. + nullable: true + type: boolean + insecureSkipTLS: + description: InsecureSkipTLS allows connections to OCI registry + without certs when enabled. + nullable: true + type: boolean + reference: + description: Reference of the OCI Registry + type: string + type: object + paths: + description: 'Paths is the directories relative to the git repo + root that contain resources to be applied. + + Path globbing is supported, for example ["charts/*"] will match + all folders as a subdirectory of charts/ + + If empty, "/" is the default.' + items: + type: string + nullable: true + type: array + paused: + description: 'Paused, when true, causes changes in Git not to be + propagated down to the clusters but instead to mark + + resources as OutOfSync.' + type: boolean + pollingInterval: + description: PollingInterval is how often to check git for new updates. + nullable: true + type: string + repo: + description: Repo is a URL to a git repo to clone and index. + nullable: true + type: string + revision: + description: Revision A specific commit or tag to operate on. + nullable: true + type: string + serviceAccount: + description: ServiceAccount used in the downstream cluster for deployment. + nullable: true + type: string + targetNamespace: + description: 'Ensure that all resources are created in this namespace + + Any cluster scoped resource will be rejected if this is set + + Additionally this namespace will be created on demand.' + nullable: true + type: string + targets: + description: Targets is a list of targets this repo will deploy + to. + items: + description: GitTarget is a cluster or cluster group to deploy + to. + properties: + clusterGroup: + description: ClusterGroup is the name of a cluster group in + the same namespace as the clusters. + nullable: true + type: string + clusterGroupSelector: + description: ClusterGroupSelector is a label selector to select + cluster groups. + nullable: true + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: 'A label selector requirement is a selector + that contains values, a key, and an operator that + + relates the key and values.' + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: 'operator represents a key''s relationship + to a set of values. + + Valid operators are In, NotIn, Exists and DoesNotExist.' + type: string + values: + description: 'values is an array of string values. + If the operator is In or NotIn, + + the values array must be non-empty. If the operator + is Exists or DoesNotExist, + + the values array must be empty. This array is + replaced during a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} pairs. + A single {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, + whose key field is "key", the + + operator is "In", and the values array contains only + "value". The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + clusterName: + description: ClusterName is the name of a cluster. + nullable: true + type: string + clusterSelector: + description: ClusterSelector is a label selector to select + clusters. + nullable: true + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: 'A label selector requirement is a selector + that contains values, a key, and an operator that + + relates the key and values.' + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: 'operator represents a key''s relationship + to a set of values. + + Valid operators are In, NotIn, Exists and DoesNotExist.' + type: string + values: + description: 'values is an array of string values. + If the operator is In or NotIn, + + the values array must be non-empty. If the operator + is Exists or DoesNotExist, + + the values array must be empty. This array is + replaced during a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} pairs. + A single {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, + whose key field is "key", the + + operator is "In", and the values array contains only + "value". The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + name: + description: Name is the name of this target. + nullable: true + type: string + type: object + type: array + type: object + status: + properties: + commit: + description: Commit is the Git commit hash from the last git job + run. + type: string + conditions: + description: 'Conditions is a list of Wrangler conditions that describe + the state + + of the GitRepo.' + items: + properties: + lastTransitionTime: + description: Last time the condition transitioned from one + status to another. + type: string + lastUpdateTime: + description: The last time this condition was updated. + type: string + message: + description: Human-readable message indicating details about + last transition + type: string + reason: + description: The reason for the condition's last transition. + type: string + status: + description: Status of the condition, one of True, False, + Unknown. + type: string + type: + description: Type of cluster condition. + type: string + required: + - status + - type + type: object + type: array + desiredReadyClusters: + description: "DesiredReadyClusters\tis the number of clusters that\ + \ should be ready for bundles of this GitRepo." + type: integer + display: + description: Display contains a human readable summary of the status. + properties: + error: + description: Error is true if a message is present. + type: boolean + message: + description: Message contains the relevant message from the + deployment conditions. + type: string + readyBundleDeployments: + description: 'ReadyBundleDeployments is a string in the form + "%d/%d", that describes the + + number of ready bundledeployments over the total number of + bundledeployments.' + type: string + state: + description: 'State is the state of the GitRepo, e.g. "GitUpdating" + or the maximal + + BundleState according to StateRank.' + type: string + type: object + gitJobStatus: + description: GitJobStatus is the status of the last Git job run, + e.g. "Current" if there was no error. + type: string + lastPollingTriggered: + description: LastPollingTime is the last time the polling check + was triggered + format: date-time + type: string + lastSyncedImageScanTime: + description: LastSyncedImageScanTime is the time of the last image + scan. + format: date-time + type: string + observedGeneration: + description: 'ObservedGeneration is the current generation of the + resource in the cluster. It is copied from k8s + + metadata.Generation. The value is incremented for all changes, + except for changes to .metadata or .status.' + format: int64 + type: integer + readyClusters: + description: 'ReadyClusters is the lowest number of clusters that + are ready over + + all the bundles of this GitRepo.' + type: integer + resourceCounts: + description: ResourceCounts contains the number of resources in + each state over all bundles. + properties: + desiredReady: + description: DesiredReady is the number of resources that should + be ready. + type: integer + missing: + description: Missing is the number of missing resources. + type: integer + modified: + description: Modified is the number of resources that have been + modified. + type: integer + notReady: + description: 'NotReady is the number of not ready resources. + Resources are not + + ready if they do not match any other state.' + type: integer + orphaned: + description: Orphaned is the number of orphaned resources. + type: integer + ready: + description: Ready is the number of ready resources. + type: integer + unknown: + description: Unknown is the number of resources in an unknown + state. + type: integer + waitApplied: + description: WaitApplied is the number of resources that are + waiting to be applied. + type: integer + type: object + resourceErrors: + description: ResourceErrors is a sorted list of errors from the + resources. + items: + type: string + type: array + resources: + description: Resources contains metadata about the resources of + each bundle. + items: + description: GitRepoResource contains metadata about the resources + of a bundle. + properties: + apiVersion: + description: APIVersion is the API version of the resource. + nullable: true + type: string + error: + description: Error is true if any Error in the PerClusterState + is true. + type: boolean + id: + description: ID is the name of the resource, e.g. "namespace1/my-config" + or "backingimagemanagers.storage.io". + nullable: true + type: string + incompleteState: + description: 'IncompleteState is true if a bundle summary + has 10 or more non-ready + + resources or a non-ready resource has more 10 or more non-ready + or + + modified states.' + type: boolean + kind: + description: Kind is the k8s kind of the resource. + nullable: true + type: string + message: + description: Message is the first message from the PerClusterStates. + nullable: true + type: string + name: + description: Name of the resource. + nullable: true + type: string + namespace: + description: Namespace of the resource. + nullable: true + type: string + perClusterState: + description: PerClusterState is a list of states for each + cluster. Derived from the summaries non-ready resources. + items: + description: ResourcePerClusterState is generated for each + non-ready resource of the bundles. + properties: + clusterId: + description: ClusterID is the id of the cluster. + nullable: true + type: string + error: + description: Error is true if the resource is in an + error state, copied from the bundle's summary for + non-ready resources. + type: boolean + message: + description: Message combines the messages from the + bundle's summary. Messages are joined with the delimiter + ';'. + nullable: true + type: string + patch: + description: Patch for modified resources. + nullable: true + type: object + x-kubernetes-preserve-unknown-fields: true + state: + description: State is the state of the resource. + nullable: true + type: string + transitioning: + description: 'Transitioning is true if the resource + is in a transitioning state, + + copied from the bundle''s summary for non-ready resources.' + type: boolean + type: object + nullable: true + type: array + state: + description: State is the state of the resource, e.g. "Unknown", + "WaitApplied", "ErrApplied" or "Ready". + type: string + transitioning: + description: Transitioning is true if any Transitioning in + the PerClusterState is true. + type: boolean + type: + description: Type is the type of the resource, e.g. "apiextensions.k8s.io.customresourcedefinition" + or "configmap". + type: string + type: object + type: array + summary: + description: Summary contains the number of bundle deployments in + each state and a list of non-ready resources. + properties: + desiredReady: + description: 'DesiredReady is the number of bundle deployments + that should be + + ready.' + type: integer + errApplied: + description: 'ErrApplied is the number of bundle deployments + that have been synced + + from the Fleet controller and the downstream cluster, but + with some + + errors when deploying the bundle.' + type: integer + modified: + description: 'Modified is the number of bundle deployments that + have been deployed + + and for which all resources are ready, but where some changes + from the + + Git repository have not yet been synced.' + type: integer + nonReadyResources: + description: 'NonReadyClusters is a list of states, which is + filled for a bundle + + that is not ready.' + items: + description: 'NonReadyResource contains information about + a bundle that is not ready for a + + given state like "ErrApplied". It contains a list of non-ready + or modified + + resources and their states.' + properties: + bundleState: + description: State is the state of the resource, like + e.g. "NotReady" or "ErrApplied". + nullable: true + type: string + message: + description: Message contains information why the bundle + is not ready. + nullable: true + type: string + modifiedStatus: + description: ModifiedStatus lists the state for each modified + resource. + items: + description: 'ModifiedStatus is used to report the status + of a resource that is modified. + + It indicates if the modification was a create, a delete + or a patch.' + properties: + apiVersion: + nullable: true + type: string + delete: + type: boolean + exist: + description: Exist is true if the resource exists + but is not owned by us. This can happen if a resource + was adopted by another bundle whereas the first + bundle still exists and due to that reports that + it does not own it. + type: boolean + kind: + nullable: true + type: string + missing: + type: boolean + name: + nullable: true + type: string + namespace: + nullable: true + type: string + patch: + nullable: true + type: string + type: object + nullable: true + type: array + name: + description: Name is the name of the resource. + nullable: true + type: string + nonReadyStatus: + description: NonReadyStatus lists the state for each non-ready + resource. + items: + description: NonReadyStatus is used to report the status + of a resource that is not ready. It includes a summary. + properties: + apiVersion: + nullable: true + type: string + kind: + nullable: true + type: string + name: + nullable: true + type: string + namespace: + nullable: true + type: string + summary: + properties: + error: + type: boolean + message: + items: + type: string + type: array + state: + type: string + transitioning: + type: boolean + type: object + uid: + description: 'UID is a type that holds unique ID + values, including UUIDs. Because we + + don''t ONLY use UUIDs, this is an alias to string. Being + a type captures + + intent and helps make sure that UIDs and names + do not get conflated.' + nullable: true + type: string + type: object + nullable: true + type: array + type: object + nullable: true + type: array + notReady: + description: 'NotReady is the number of bundle deployments that + have been deployed + + where some resources are not ready.' + type: integer + outOfSync: + description: 'OutOfSync is the number of bundle deployments + that have been synced + + from Fleet controller, but not yet by the downstream agent.' + type: integer + pending: + description: 'Pending is the number of bundle deployments that + are being processed + + by Fleet controller.' + type: integer + ready: + description: 'Ready is the number of bundle deployments that + have been deployed + + where all resources are ready.' + type: integer + waitApplied: + description: 'WaitApplied is the number of bundle deployments + that have been + + synced from Fleet controller and downstream cluster, but are + waiting + + to be deployed.' + type: integer + type: object + updateGeneration: + description: Update generation is the force update generation if + spec.forceSyncGeneration is set + format: int64 + type: integer + webhookCommit: + description: WebhookCommit is the latest Git commit hash received + from a webhook + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.16.4 + name: imagescans.fleet.cattle.io +spec: + group: fleet.cattle.io + names: + kind: ImageScan + listKind: ImageScanList + plural: imagescans + singular: imagescan + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .spec.image + name: Repository + type: string + - jsonPath: .status.latestTag + name: Latest + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + 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 + metadata: + type: object + spec: + description: API is taken from https://github.com/fluxcd/image-reflector-controller + properties: + gitrepoName: + description: GitRepo reference name + nullable: true + type: string + image: + description: Image is the name of the image repository + nullable: true + type: string + interval: + description: 'Interval is the length of time to wait between + + scans of the image repository.' + nullable: true + type: string + policy: + description: 'Policy gives the particulars of the policy to be followed + in + + selecting the most recent image' + properties: + alphabetical: + description: Alphabetical set of rules to use for alphabetical + ordering of the tags. + nullable: true + properties: + order: + description: 'Order specifies the sorting order of the tags. + Given the letters of the + + alphabet as tags, ascending order would select Z, and + descending order + + would select A.' + nullable: true + type: string + type: object + semver: + description: 'SemVer gives a semantic version range to check + against the tags + + available.' + nullable: true + properties: + range: + description: 'Range gives a semver range for the image tag; + the highest + + version within the range that''s a tag yields the latest + image.' + nullable: true + type: string + type: object + type: object + secretRef: + description: 'SecretRef can be given the name of a secret containing + + credentials to use for the image registry. The secret should be + + created with `kubectl create secret docker-registry`, or the + + equivalent.' + nullable: true + properties: + name: + default: '' + description: 'Name of the referent. + + This field is effectively required, but due to backwards compatibility + is + + allowed to be empty. Instances of this type with an empty + value here are + + almost certainly wrong. + + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + type: object + x-kubernetes-map-type: atomic + suspend: + description: 'This flag tells the controller to suspend subsequent + image scans. + + It does not apply to already started scans. Defaults to false.' + type: boolean + tagName: + description: TagName is the tag ref that needs to be put in manifest + to replace fields + nullable: true + type: string + required: + - image + - interval + type: object + status: + properties: + canonicalImageName: + description: 'CanonicalName is the name of the image repository + with all the + + implied bits made explicit; e.g., `docker.io/library/alpine` + + rather than `alpine`.' + type: string + conditions: + items: + properties: + lastTransitionTime: + description: Last time the condition transitioned from one + status to another. + type: string + lastUpdateTime: + description: The last time this condition was updated. + type: string + message: + description: Human-readable message indicating details about + last transition + type: string + reason: + description: The reason for the condition's last transition. + type: string + status: + description: Status of the condition, one of True, False, + Unknown. + type: string + type: + description: Type of cluster condition. + type: string + required: + - status + - type + type: object + type: array + lastScanTime: + description: LastScanTime is the last time image was scanned + format: date-time + type: string + latestDigest: + description: LatestDigest is the digest of latest tag + type: string + latestImage: + description: 'LatestImage gives the first in the list of images + scanned by + + the image repository, when filtered and ordered according to + + the policy.' + type: string + latestTag: + description: Latest tag is the latest tag filtered by the policy + type: string + observedGeneration: + format: int64 + type: integer + type: object + type: object + served: true + storage: true + subresources: + status: {} diff --git a/charts/fleet-crd/105.0.1+up0.11.1/values.yaml b/charts/fleet-crd/105.0.1+up0.11.1/values.yaml new file mode 100644 index 0000000000..d41d3a2444 --- /dev/null +++ b/charts/fleet-crd/105.0.1+up0.11.1/values.yaml @@ -0,0 +1 @@ +# This file is intentionally empty diff --git a/charts/fleet/105.0.1+up0.11.1/Chart.yaml b/charts/fleet/105.0.1+up0.11.1/Chart.yaml new file mode 100644 index 0000000000..c42ab58775 --- /dev/null +++ b/charts/fleet/105.0.1+up0.11.1/Chart.yaml @@ -0,0 +1,18 @@ +annotations: + catalog.cattle.io/auto-install: fleet-crd=match + catalog.cattle.io/certified: rancher + catalog.cattle.io/experimental: "true" + catalog.cattle.io/hidden: "true" + catalog.cattle.io/kube-version: '>= 1.28.0-0 < 1.32.0-0' + catalog.cattle.io/namespace: cattle-fleet-system + catalog.cattle.io/os: linux + catalog.cattle.io/permits-os: linux,windows + catalog.cattle.io/provides-gvr: clusters.fleet.cattle.io/v1alpha1 + catalog.cattle.io/rancher-version: '>= 2.10.0-0 < 2.11.0-0' + catalog.cattle.io/release-name: fleet +apiVersion: v2 +appVersion: 0.11.1 +description: Fleet Controller - GitOps at Scale +icon: https://charts.rancher.io/assets/logos/fleet.svg +name: fleet +version: 105.0.1+up0.11.1 diff --git a/charts/fleet/105.0.1+up0.11.1/README.md b/charts/fleet/105.0.1+up0.11.1/README.md new file mode 100644 index 0000000000..2f2a4c302a --- /dev/null +++ b/charts/fleet/105.0.1+up0.11.1/README.md @@ -0,0 +1,30 @@ +# Fleet Helm Chart + +Fleet is GitOps at scale. Fleet is designed to manage multiple clusters. + +## What is Fleet? + +* Cluster engine: Fleet is a container management and deployment engine designed to offer users more control on the local cluster and constant monitoring through GitOps. Fleet focuses not only on the ability to scale, but it also gives users a high degree of control and visibility to monitor exactly what is installed on the cluster. + +* Deployment management: Fleet can manage deployments from git of raw Kubernetes YAML, Helm charts, Kustomize, or any combination of the three. Regardless of the source, all resources are dynamically turned into Helm charts, and Helm is used as the engine to deploy all resources in the cluster. As a result, users can enjoy a high degree of control, consistency, and auditability of their clusters. + +## Introduction + +This chart deploys Fleet on a Kubernetes cluster. It also deploys some of its dependencies as subcharts. + +The documentation is centralized in the [doc website](https://fleet.rancher.io/). + +## Prerequisites + +Get helm if you don't have it. Helm 3 is just a CLI. + + +## Install Fleet + +Install the Fleet Helm charts (there are two because we separate out CRDs for ultimate flexibility.): + +``` +$ helm repo add fleet https://rancher.github.io/fleet-helm-charts/ +$ helm -n cattle-fleet-system install --create-namespace --wait fleet-crd fleet/fleet-crd +$ helm -n cattle-fleet-system install --create-namespace --wait fleet fleet/fleet +``` \ No newline at end of file diff --git a/charts/fleet/105.0.1+up0.11.1/templates/_helpers.tpl b/charts/fleet/105.0.1+up0.11.1/templates/_helpers.tpl new file mode 100644 index 0000000000..6cd96c3ace --- /dev/null +++ b/charts/fleet/105.0.1+up0.11.1/templates/_helpers.tpl @@ -0,0 +1,22 @@ +{{- define "system_default_registry" -}} +{{- if .Values.global.cattle.systemDefaultRegistry -}} +{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} +{{- else -}} +{{- "" -}} +{{- end -}} +{{- end -}} + +{{/* +Windows cluster will add default taint for linux nodes, +add below linux tolerations to workloads could be scheduled to those linux nodes +*/}} +{{- define "linux-node-tolerations" -}} +- key: "cattle.io/os" + value: "linux" + effect: "NoSchedule" + operator: "Equal" +{{- end -}} + +{{- define "linux-node-selector" -}} +kubernetes.io/os: linux +{{- end -}} \ No newline at end of file diff --git a/charts/fleet/105.0.1+up0.11.1/templates/configmap.yaml b/charts/fleet/105.0.1+up0.11.1/templates/configmap.yaml new file mode 100644 index 0000000000..e2af6ca76c --- /dev/null +++ b/charts/fleet/105.0.1+up0.11.1/templates/configmap.yaml @@ -0,0 +1,30 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: fleet-controller +data: + config: | + { + "systemDefaultRegistry": "{{ template "system_default_registry" . }}", + "agentImage": "{{ template "system_default_registry" . }}{{.Values.agentImage.repository}}:{{.Values.agentImage.tag}}", + "agentImagePullPolicy": "{{ .Values.agentImage.imagePullPolicy }}", + "apiServerURL": "{{.Values.apiServerURL}}", + "apiServerCA": "{{b64enc .Values.apiServerCA}}", + "agentCheckinInterval": "{{.Values.agentCheckinInterval}}", + "agentTLSMode": "{{.Values.agentTLSMode}}", + {{ if .Values.garbageCollectionInterval }} + "garbageCollectionInterval": "{{.Values.garbageCollectionInterval}}", + {{ end }} + "ignoreClusterRegistrationLabels": {{.Values.ignoreClusterRegistrationLabels}}, + "bootstrap": { + "paths": "{{.Values.bootstrap.paths}}", + "repo": "{{.Values.bootstrap.repo}}", + "secret": "{{.Values.bootstrap.secret}}", + "branch": "{{.Values.bootstrap.branch}}", + "namespace": "{{.Values.bootstrap.namespace}}", + "agentNamespace": "{{.Values.bootstrap.agentNamespace}}" + }, + "webhookReceiverURL": "{{.Values.webhookReceiverURL}}", + "githubURLPrefix": "{{.Values.githubURLPrefix}}", + "gitClientTimeout": "{{.Values.gitClientTimeout}}" + } diff --git a/charts/fleet/105.0.1+up0.11.1/templates/deployment.yaml b/charts/fleet/105.0.1+up0.11.1/templates/deployment.yaml new file mode 100644 index 0000000000..5f207b6301 --- /dev/null +++ b/charts/fleet/105.0.1+up0.11.1/templates/deployment.yaml @@ -0,0 +1,241 @@ +{{- $shards := list (dict "id" "" "nodeSelector" dict) -}} +{{- $uniqueShards := list -}} +{{- if .Values.shards -}} + {{- range .Values.shards -}} + {{- if not (has .id $uniqueShards) -}} + {{- $shards = append $shards . -}} + {{- $uniqueShards = append $uniqueShards .id -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{ range $shard := $shards }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: "fleet-controller{{if $shard.id }}-shard-{{ $shard.id }}{{end}}" +spec: + selector: + matchLabels: + app: fleet-controller + template: + metadata: + labels: + app: fleet-controller + fleet.cattle.io/shard-id: "{{ $shard.id }}" + {{- if empty $shard.id }} + fleet.cattle.io/shard-default: "true" + {{- end }} + spec: + containers: + - env: + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + {{- if $.Values.clusterEnqueueDelay }} + - name: FLEET_CLUSTER_ENQUEUE_DELAY + value: {{ $.Values.clusterEnqueueDelay }} + {{- end }} + {{- if $.Values.proxy }} + - name: HTTP_PROXY + value: {{ $.Values.proxy }} + - name: HTTPS_PROXY + value: {{ $.Values.proxy }} + - name: NO_PROXY + value: {{ $.Values.noProxy }} + {{- end }} + {{- if $.Values.leaderElection.leaseDuration }} + - name: CATTLE_ELECTION_LEASE_DURATION + value: {{$.Values.leaderElection.leaseDuration}} + {{- end }} + {{- if $.Values.leaderElection.retryPeriod }} + - name: CATTLE_ELECTION_RETRY_PERIOD + value: {{$.Values.leaderElection.retryPeriod}} + {{- end }} + {{- if $.Values.leaderElection.renewDeadline }} + - name: CATTLE_ELECTION_RENEW_DEADLINE + value: {{$.Values.leaderElection.renewDeadline}} + {{- end }} + {{- if $.Values.debug }} + - name: CATTLE_DEV_MODE + value: "true" + {{- end }} + {{- if $.Values.controller.reconciler.workers.bundle }} + - name: BUNDLE_RECONCILER_WORKERS + value: {{ quote $.Values.controller.reconciler.workers.bundle }} + {{- end }} + {{- if $.Values.controller.reconciler.workers.bundledeployment }} + - name: BUNDLEDEPLOYMENT_RECONCILER_WORKERS + value: {{ quote $.Values.controller.reconciler.workers.bundledeployment }} + {{- end }} +{{- if $.Values.extraEnv }} +{{ toYaml $.Values.extraEnv | indent 8}} +{{- end }} + image: '{{ template "system_default_registry" $ }}{{ $.Values.image.repository }}:{{ $.Values.image.tag }}' + name: fleet-controller + imagePullPolicy: "{{ $.Values.image.imagePullPolicy }}" + {{- if $.Values.metrics.enabled }} + ports: + - containerPort: 8080 + name: metrics + {{- end }} + command: + - fleetcontroller + {{- if $shard.id }} + - --shard-id + - {{ quote $shard.id }} + {{- end }} + {{- if not $.Values.metrics.enabled }} + - --disable-metrics + {{- end }} + {{- if $.Values.debug }} + - --debug + - --debug-level + - {{ quote $.Values.debugLevel }} + {{- end }} + {{- if not $.Values.disableSecurityContext }} + securityContext: + allowPrivilegeEscalation: false + readOnlyRootFilesystem: true + privileged: false + capabilities: + drop: + - ALL + {{- end }} + volumeMounts: + - mountPath: /tmp + name: tmp + {{- if not $shard.id }} # Only deploy cleanup and agent management through sharding-less deployment + - env: + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + {{- if $.Values.debug }} + - name: CATTLE_DEV_MODE + value: "true" + {{- end }} + {{- if $.Values.leaderElection.leaseDuration }} + - name: CATTLE_ELECTION_LEASE_DURATION + value: {{$.Values.leaderElection.leaseDuration}} + {{- end }} + {{- if $.Values.leaderElection.retryPeriod }} + - name: CATTLE_ELECTION_RETRY_PERIOD + value: {{$.Values.leaderElection.retryPeriod}} + {{- end }} + {{- if $.Values.leaderElection.renewDeadline }} + - name: CATTLE_ELECTION_RENEW_DEADLINE + value: {{$.Values.leaderElection.renewDeadline}} + {{- end }} + {{- if $.Values.controller.reconciler.workers.gitrepo }} + - name: GITREPO_RECONCILER_WORKERS + value: {{ quote $.Values.controller.reconciler.workers.gitrepo }} + {{- end }} + {{- if $.Values.controller.reconciler.workers.bundle }} + - name: BUNDLE_RECONCILER_WORKERS + value: {{ quote $.Values.controller.reconciler.workers.bundle }} + {{- end }} + {{- if $.Values.controller.reconciler.workers.bundledeployment }} + - name: BUNDLEDEPLOYMENT_RECONCILER_WORKERS + value: {{ quote $.Values.controller.reconciler.workers.bundledeployment }} + {{- end }} + image: '{{ template "system_default_registry" $ }}{{ $.Values.image.repository }}:{{ $.Values.image.tag }}' + name: fleet-cleanup + imagePullPolicy: "{{ $.Values.image.imagePullPolicy }}" + command: + - fleetcontroller + - cleanup + {{- if $.Values.debug }} + - --debug + - --debug-level + - {{ quote $.Values.debugLevel }} + {{- end }} + {{- if not $.Values.disableSecurityContext }} + securityContext: + allowPrivilegeEscalation: false + readOnlyRootFilesystem: true + privileged: false + capabilities: + drop: + - ALL + {{- end }} + - env: + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: FLEET_PROPAGATE_DEBUG_SETTINGS_TO_AGENTS + value: {{ quote $.Values.propagateDebugSettingsToAgents }} + - name: FLEET_DEBUG_DISABLE_SECURITY_CONTEXT + value: {{ quote $.Values.disableSecurityContext }} + {{- if $.Values.debug }} + - name: CATTLE_DEV_MODE + value: "true" + {{- end }} + {{- if $.Values.leaderElection.leaseDuration }} + - name: CATTLE_ELECTION_LEASE_DURATION + value: {{$.Values.leaderElection.leaseDuration}} + {{- end }} + {{- if $.Values.leaderElection.retryPeriod }} + - name: CATTLE_ELECTION_RETRY_PERIOD + value: {{$.Values.leaderElection.retryPeriod}} + {{- end }} + {{- if $.Values.leaderElection.renewDeadline }} + - name: CATTLE_ELECTION_RENEW_DEADLINE + value: {{$.Values.leaderElection.renewDeadline}} + {{- end }} + image: '{{ template "system_default_registry" $ }}{{ $.Values.image.repository }}:{{ $.Values.image.tag }}' + name: fleet-agentmanagement + imagePullPolicy: "{{ $.Values.image.imagePullPolicy }}" + command: + - fleetcontroller + - agentmanagement + {{- if not $.Values.bootstrap.enabled }} + - --disable-bootstrap + {{- end }} + {{- if $.Values.debug }} + - --debug + - --debug-level + - {{ quote $.Values.debugLevel }} + {{- end }} + {{- if not $.Values.disableSecurityContext }} + securityContext: + allowPrivilegeEscalation: false + readOnlyRootFilesystem: true + privileged: false + capabilities: + drop: + - ALL + {{- end }} + {{- end }} + volumes: + - name: tmp + emptyDir: {} + + serviceAccountName: fleet-controller + nodeSelector: {{ include "linux-node-selector" $shard.id | nindent 8 }} +{{- if $.Values.nodeSelector }} +{{ toYaml $.Values.nodeSelector | indent 8 }} +{{- end }} +{{- if $shard.nodeSelector -}} +{{- range $key, $value := $shard.nodeSelector }} +{{ $key | indent 8}}: {{ $value }} +{{- end }} +{{- end }} + tolerations: {{ include "linux-node-tolerations" $shard.id | nindent 8 }} +{{- if $.Values.tolerations }} +{{ toYaml $.Values.tolerations | indent 8 }} +{{- end }} + {{- if $.Values.priorityClassName }} + priorityClassName: "{{$.Values.priorityClassName}}" + {{- end }} + +{{- if not $.Values.disableSecurityContext }} + securityContext: + runAsNonRoot: true + runAsUser: 1000 + runAsGroup: 1000 +{{- end }} +--- +{{- end }} diff --git a/charts/fleet/105.0.1+up0.11.1/templates/deployment_gitjob.yaml b/charts/fleet/105.0.1+up0.11.1/templates/deployment_gitjob.yaml new file mode 100644 index 0000000000..686608d1cb --- /dev/null +++ b/charts/fleet/105.0.1+up0.11.1/templates/deployment_gitjob.yaml @@ -0,0 +1,137 @@ +{{- $shards := list (dict "id" "" "nodeSelector" dict) -}} +{{- $uniqueShards := list -}} +{{- if .Values.shards -}} + {{- range .Values.shards -}} + {{- if not (has .id $uniqueShards) -}} + {{- $shards = append $shards . -}} + {{- $uniqueShards = append $uniqueShards .id -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{ range $shard := $shards }} +{{- if $.Values.gitops.enabled }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: "gitjob{{if $shard.id }}-shard-{{ $shard.id }}{{end}}" +spec: + selector: + matchLabels: + app: "gitjob" + template: + metadata: + labels: + app: "gitjob" + fleet.cattle.io/shard-id: "{{ $shard.id }}" + {{- if empty $shard.id }} + fleet.cattle.io/shard-default: "true" + {{- end }} + spec: + serviceAccountName: gitjob + containers: + - image: "{{ template "system_default_registry" $ }}{{ $.Values.image.repository }}:{{ $.Values.image.tag }}" + name: gitjob + {{- if $.Values.metrics.enabled }} + ports: + - containerPort: 8081 + name: metrics + {{- end }} + args: + - fleetcontroller + - gitjob + - --gitjob-image + - "{{ template "system_default_registry" $ }}{{ $.Values.image.repository }}:{{ $.Values.image.tag }}" + {{- if $.Values.debug }} + - --debug + - --debug-level + - {{ quote $.Values.debugLevel }} + {{- end }} + {{- if $shard.id }} + - --shard-id + - {{ quote $shard.id }} + {{- end }} + {{- if $shard.nodeSelector }} + - --shard-node-selector + - {{ toJson $shard.nodeSelector | squote }} + {{- end }} + {{- if not $.Values.metrics.enabled }} + - --disable-metrics + {{- end }} + env: + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + {{- if $.Values.leaderElection.leaseDuration }} + - name: CATTLE_ELECTION_LEASE_DURATION + value: {{$.Values.leaderElection.leaseDuration}} + {{- end }} + {{- if $.Values.leaderElection.retryPeriod }} + - name: CATTLE_ELECTION_RETRY_PERIOD + value: {{$.Values.leaderElection.retryPeriod}} + {{- end }} + {{- if $.Values.leaderElection.renewDeadline }} + - name: CATTLE_ELECTION_RENEW_DEADLINE + value: {{$.Values.leaderElection.renewDeadline}} + {{- end }} + {{- if $.Values.proxy }} + - name: HTTP_PROXY + value: {{ $.Values.proxy }} + - name: HTTPS_PROXY + value: {{ $.Values.proxy }} + - name: NO_PROXY + value: {{ $.Values.noProxy }} + {{- end }} + {{- if $.Values.controller.reconciler.workers.gitrepo }} + - name: GITREPO_RECONCILER_WORKERS + value: {{ quote $.Values.controller.reconciler.workers.gitrepo }} + {{- end }} +{{- if $.Values.extraEnv }} +{{ toYaml $.Values.extraEnv | indent 12}} +{{- end }} + {{- if $.Values.debug }} + - name: CATTLE_DEV_MODE + value: "true" + {{- end }} + {{- if not $.Values.disableSecurityContext }} + securityContext: + allowPrivilegeEscalation: false + readOnlyRootFilesystem: true + privileged: false + capabilities: + drop: + - ALL + {{- end }} + volumeMounts: + - mountPath: /tmp + name: tmp + nodeSelector: {{ include "linux-node-selector" $shard.id | nindent 8 }} +{{- if $.Values.nodeSelector }} +{{ toYaml $.Values.nodeSelector | indent 8 }} +{{- end }} +{{- if $shard.nodeSelector -}} +{{- range $key, $value := $shard.nodeSelector }} +{{ $key | indent 8}}: {{ $value }} +{{- end }} +{{- end }} + tolerations: {{ include "linux-node-tolerations" $shard.id | nindent 8 }} +{{- if $.Values.tolerations }} +{{ toYaml $.Values.tolerations | indent 8 }} +{{- end }} + {{- if $.Values.priorityClassName }} + priorityClassName: "{{$.Values.priorityClassName}}" + {{- end }} + +{{- if not $.Values.disableSecurityContext }} + securityContext: + runAsNonRoot: true + runAsUser: 1000 + runAsGroup: 1000 +{{- end }} + volumes: + - name: tmp + emptyDir: {} +{{- end }} +--- +{{- end }} diff --git a/charts/fleet/105.0.1+up0.11.1/templates/job_cleanup_clusterregistrations.yaml b/charts/fleet/105.0.1+up0.11.1/templates/job_cleanup_clusterregistrations.yaml new file mode 100644 index 0000000000..d039fd40b3 --- /dev/null +++ b/charts/fleet/105.0.1+up0.11.1/templates/job_cleanup_clusterregistrations.yaml @@ -0,0 +1,41 @@ +{{- if .Values.migrations.clusterRegistrationCleanup }} +--- +apiVersion: batch/v1 +kind: Job +metadata: + name: fleet-cleanup-clusterregistrations + annotations: + "helm.sh/hook": post-install, post-upgrade + "helm.sh/hook-delete-policy": hook-succeeded, before-hook-creation +spec: + template: + metadata: + labels: + app: fleet-job + spec: + serviceAccountName: fleet-controller + restartPolicy: Never + securityContext: + runAsNonRoot: true + runAsGroup: 1000 + runAsUser: 1000 + containers: + - name: cleanup + image: "{{ template "system_default_registry" . }}{{.Values.image.repository}}:{{.Values.image.tag}}" + imagePullPolicy: {{ .Values.global.imagePullPolicy }} + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: false + privileged: false + command: + - fleet + args: + - cleanup + - clusterregistration + nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} + tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} + backoffLimit: 1 +{{- end }} diff --git a/charts/fleet/105.0.1+up0.11.1/templates/job_cleanup_gitrepojobs.yaml b/charts/fleet/105.0.1+up0.11.1/templates/job_cleanup_gitrepojobs.yaml new file mode 100644 index 0000000000..0c58024476 --- /dev/null +++ b/charts/fleet/105.0.1+up0.11.1/templates/job_cleanup_gitrepojobs.yaml @@ -0,0 +1,44 @@ +{{- if .Values.migrations.gitrepoJobsCleanup }} +--- +apiVersion: batch/v1 +kind: CronJob +metadata: + name: fleet-cleanup-gitrepo-jobs +spec: + schedule: "@daily" + concurrencyPolicy: Forbid + successfulJobsHistoryLimit: 0 + failedJobsHistoryLimit: 1 + jobTemplate: + spec: + template: + metadata: + labels: + app: fleet-job + spec: + serviceAccountName: gitjob + restartPolicy: Never + securityContext: + runAsNonRoot: true + runAsGroup: 1000 + runAsUser: 1000 + containers: + - name: cleanup + image: "{{ template "system_default_registry" . }}{{.Values.image.repository}}:{{.Values.image.tag}}" + imagePullPolicy: {{ .Values.global.imagePullPolicy }} + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: false + privileged: false + command: + - fleet + args: + - cleanup + - gitjob + nodeSelector: {{ include "linux-node-selector" . | nindent 12 }} + tolerations: {{ include "linux-node-tolerations" . | nindent 12 }} + backoffLimit: 1 +{{- end }} diff --git a/charts/fleet/105.0.1+up0.11.1/templates/rbac.yaml b/charts/fleet/105.0.1+up0.11.1/templates/rbac.yaml new file mode 100644 index 0000000000..026c1c26d2 --- /dev/null +++ b/charts/fleet/105.0.1+up0.11.1/templates/rbac.yaml @@ -0,0 +1,113 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: fleet-controller +rules: +- apiGroups: + - fleet.cattle.io + resources: + - '*' + verbs: + - '*' +- apiGroups: + - "" + resources: + - namespaces + - serviceaccounts + verbs: + - '*' +- apiGroups: + - "" + resources: + - secrets + - configmaps + verbs: + - '*' +- apiGroups: + - rbac.authorization.k8s.io + resources: + - clusterroles + - clusterrolebindings + - roles + - rolebindings + verbs: + - '*' +- apiGroups: + - "" + resources: + - 'events' + verbs: + - '*' +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: fleet-controller +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: fleet-controller +subjects: +- kind: ServiceAccount + name: fleet-controller + namespace: {{.Release.Namespace}} + +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: fleet-controller +rules: +- apiGroups: + - "" + resources: + - configmaps + verbs: + - '*' +- apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - '*' + +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: fleet-controller +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: fleet-controller +subjects: +- kind: ServiceAccount + name: fleet-controller + +{{- if .Values.bootstrap.enabled }} +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: fleet-controller-bootstrap +rules: +- apiGroups: + - '*' + resources: + - '*' + verbs: + - '*' +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: fleet-controller-bootstrap +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: fleet-controller-bootstrap +subjects: +- kind: ServiceAccount + name: fleet-controller-bootstrap + namespace: {{.Release.Namespace}} +{{- end }} diff --git a/charts/fleet/105.0.1+up0.11.1/templates/rbac_gitjob.yaml b/charts/fleet/105.0.1+up0.11.1/templates/rbac_gitjob.yaml new file mode 100644 index 0000000000..e2c93169de --- /dev/null +++ b/charts/fleet/105.0.1+up0.11.1/templates/rbac_gitjob.yaml @@ -0,0 +1,133 @@ +{{- if .Values.gitops.enabled }} +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: gitjob +rules: + - apiGroups: + - "batch" + resources: + - 'jobs' + verbs: + - '*' + - apiGroups: + - "" + resources: + - 'pods' + verbs: + - 'list' + - 'get' + - 'watch' + - apiGroups: + - "" + resources: + - 'secrets' + verbs: + - '*' + - apiGroups: + - "" + resources: + - 'configmaps' + verbs: + - '*' + - apiGroups: + - "fleet.cattle.io" + resources: + - "gitrepos" + - "gitrepos/status" + verbs: + - "*" + - apiGroups: + - "fleet.cattle.io" + resources: + - "gitreporestrictions" + verbs: + - list + - get + - watch + - apiGroups: + - "fleet.cattle.io" + resources: + - "bundles" + - "bundledeployments" + - "imagescans" + - "contents" + verbs: + - list + - delete + - get + - watch + - update + - apiGroups: + - "" + resources: + - 'events' + verbs: + - '*' + - apiGroups: + - "" + resources: + - serviceaccounts + verbs: + - "create" + - apiGroups: + - "" + resources: + - namespaces + verbs: + - "create" + - "delete" + - apiGroups: + - rbac.authorization.k8s.io + resources: + - roles + verbs: + - escalate + - create + - bind + - apiGroups: + - rbac.authorization.k8s.io + resources: + - rolebindings + verbs: + - create + +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: gitjob-binding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: gitjob +subjects: + - kind: ServiceAccount + name: gitjob + namespace: {{ .Release.Namespace }} + +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: gitjob +rules: + - apiGroups: + - "coordination.k8s.io" + resources: + - "leases" + verbs: + - "*" +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: gitjob +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: gitjob +subjects: + - kind: ServiceAccount + name: gitjob +{{- end }} diff --git a/charts/fleet/105.0.1+up0.11.1/templates/service.yaml b/charts/fleet/105.0.1+up0.11.1/templates/service.yaml new file mode 100644 index 0000000000..49aefb490a --- /dev/null +++ b/charts/fleet/105.0.1+up0.11.1/templates/service.yaml @@ -0,0 +1,36 @@ +{{- if .Values.metrics.enabled }} +{{- $shards := list (dict "id" "" "nodeSelector" dict) -}} +{{- $uniqueShards := list -}} +{{- if .Values.shards -}} + {{- range .Values.shards -}} + {{- if not (has .id $uniqueShards) -}} + {{- $shards = append $shards . -}} + {{- $uniqueShards = append $uniqueShards .id -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{ range $shard := $shards }} +apiVersion: v1 +kind: Service +metadata: + name: "monitoring-fleet-controller{{if $shard.id }}-shard-{{ $shard.id }}{{end}}" + labels: + app: fleet-controller +spec: + type: ClusterIP + ports: + - port: 8080 + targetPort: 8080 + protocol: TCP + name: metrics + selector: + app: fleet-controller + {{- if empty $shard.id }} + fleet.cattle.io/shard-default: "true" + {{- else }} + fleet.cattle.io/shard-id: "{{ $shard.id }}" + {{- end }} +--- +{{- end }} +{{- end }} diff --git a/charts/fleet/105.0.1+up0.11.1/templates/service_gitjob.yaml b/charts/fleet/105.0.1+up0.11.1/templates/service_gitjob.yaml new file mode 100644 index 0000000000..f33c9a5457 --- /dev/null +++ b/charts/fleet/105.0.1+up0.11.1/templates/service_gitjob.yaml @@ -0,0 +1,51 @@ +{{- if .Values.gitops.enabled }} +apiVersion: v1 +kind: Service +metadata: + name: gitjob +spec: + ports: + - name: http-80 + port: 80 + protocol: TCP + targetPort: 8080 + selector: + app: "gitjob" +--- +{{- if .Values.metrics.enabled }} +{{- $shards := list (dict "id" "" "nodeSelector" dict) -}} +{{- $uniqueShards := list -}} +{{- if .Values.shards -}} + {{- range .Values.shards -}} + {{- if not (has .id $uniqueShards) -}} + {{- $shards = append $shards . -}} + {{- $uniqueShards = append $uniqueShards .id -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{ range $shard := $shards }} +apiVersion: v1 +kind: Service +metadata: + name: "monitoring-gitjob{{if $shard.id }}-shard-{{ $shard.id }}{{end}}" + labels: + app: gitjob +spec: + type: ClusterIP + ports: + - port: 8081 + targetPort: 8081 + protocol: TCP + name: metrics + selector: + app: gitjob + {{- if empty $shard.id }} + fleet.cattle.io/shard-default: "true" + {{- else }} + fleet.cattle.io/shard-id: "{{ $shard.id }}" + {{- end }} +--- +{{- end }} +{{- end }} +{{- end }} diff --git a/charts/fleet/105.0.1+up0.11.1/templates/serviceaccount.yaml b/charts/fleet/105.0.1+up0.11.1/templates/serviceaccount.yaml new file mode 100644 index 0000000000..ba27c748d7 --- /dev/null +++ b/charts/fleet/105.0.1+up0.11.1/templates/serviceaccount.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: fleet-controller + +{{- if .Values.bootstrap.enabled }} +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: fleet-controller-bootstrap +{{- end }} diff --git a/charts/fleet/105.0.1+up0.11.1/templates/serviceaccount_gitjob.yaml b/charts/fleet/105.0.1+up0.11.1/templates/serviceaccount_gitjob.yaml new file mode 100644 index 0000000000..c769b47cfd --- /dev/null +++ b/charts/fleet/105.0.1+up0.11.1/templates/serviceaccount_gitjob.yaml @@ -0,0 +1,6 @@ +{{- if .Values.gitops.enabled }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: gitjob +{{- end }} diff --git a/charts/fleet/105.0.1+up0.11.1/values.yaml b/charts/fleet/105.0.1+up0.11.1/values.yaml new file mode 100644 index 0000000000..da4ad9fe99 --- /dev/null +++ b/charts/fleet/105.0.1+up0.11.1/values.yaml @@ -0,0 +1,122 @@ +image: + repository: rancher/fleet + tag: v0.11.1 + imagePullPolicy: IfNotPresent + +agentImage: + repository: rancher/fleet-agent + tag: v0.11.1 + imagePullPolicy: IfNotPresent + +# For cluster registration the public URL of the Kubernetes API server must be set here +# Example: https://example.com:6443 +apiServerURL: "" + +# For cluster registration the pem encoded value of the CA of the Kubernetes API server must be set here +# If left empty it is assumed this Kubernetes API TLS is signed by a well known CA. +apiServerCA: "" + +# Determines whether the agent should trust CA bundles from the operating system's trust store when connecting to a +# management cluster. True in `system-store` mode, false in `strict` mode. +agentTLSMode: "system-store" + +# A duration string for how often agents should report a heartbeat +agentCheckinInterval: "15m" + +# The amount of time that agents will wait before they clean up old Helm releases. +# A non-existent value or 0 will result in an interval of 15 minutes. +garbageCollectionInterval: "15m" + +# Whether you want to allow cluster upon registration to specify their labels. +ignoreClusterRegistrationLabels: false + +# Counts from gitrepo are out of sync with bundleDeployment state. +# Just retry in a number of seconds as there is no great way to trigger an event that doesn't cause a loop. +# If not set default is 15 seconds. +# clusterEnqueueDelay: 120s + +# http[s] proxy server +# proxy: http://@:: + +# comma separated list of domains or ip addresses that will not use the proxy +noProxy: 127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,.svc,.cluster.local + +# The amount of time to wait for a response from the server before canceling the +# request. Used to retrieve the latest commit of configured git repositories. +# A non-existent value or 0 will result in a timeout of 30 seconds. +gitClientTimeout: 30s + +bootstrap: + enabled: true + # The namespace that will be autocreated and the local cluster will be registered in + namespace: fleet-local + # The namespace where the fleet agent for the local cluster will be ran, if empty + # this will default to cattle-fleet-system + agentNamespace: "" + # A repo to add at install time that will deploy to the local cluster. This allows + # one to fully bootstrap fleet, its configuration and all its downstream clusters + # in one shot. + repo: "" + secret: "" + branch: master + paths: "" + +global: + cattle: + systemDefaultRegistry: "" + +## Node labels for pod assignment +## Ref: https://kubernetes.io/docs/user-guide/node-selection/ +## +nodeSelector: {} +## List of node taints to tolerate (requires Kubernetes >= 1.6) +tolerations: [] + +## PriorityClassName assigned to deployment. +priorityClassName: "" + +gitops: + enabled: true + +metrics: + enabled: true + +debug: false +debugLevel: 0 +propagateDebugSettingsToAgents: true +disableSecurityContext: false + +migrations: + clusterRegistrationCleanup: true + gitrepoJobsCleanup: true + +## Leader election configuration +leaderElection: + leaseDuration: 30s + retryPeriod: 10s + renewDeadline: 25s + +## Fleet controller configuration +controller: + reconciler: + # The number of workers that are allowed to each type of reconciler + workers: + gitrepo: "50" + bundle: "50" + bundledeployment: "50" + +# Extra environment variables passed to the fleet pods. +# extraEnv: +# - name: EXPERIMENTAL_OCI_STORAGE +# value: "true" + +# shards: +# - id: shard0 +# nodeSelector: +# kubernetes.io/hostname: k3d-upstream-server-0 +# - id: shard1 +# nodeSelector: +# kubernetes.io/hostname: k3d-upstream-server-1 +# - id: shard2 +# nodeSelector: +# kubernetes.io/hostname: k3d-upstream-server-2 diff --git a/charts/harvester-cloud-provider/105.0.0+up0.2.6/.helmignore b/charts/harvester-cloud-provider/105.0.0+up0.2.6/.helmignore new file mode 100644 index 0000000000..0e8a0eb36f --- /dev/null +++ b/charts/harvester-cloud-provider/105.0.0+up0.2.6/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/charts/harvester-cloud-provider/105.0.0+up0.2.6/Chart.lock b/charts/harvester-cloud-provider/105.0.0+up0.2.6/Chart.lock new file mode 100644 index 0000000000..c6f7db6a91 --- /dev/null +++ b/charts/harvester-cloud-provider/105.0.0+up0.2.6/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: kube-vip + repository: file://dependency_charts/kube-vip + version: 0.4.2 +digest: sha256:bbbff44d39375203f4880e5a76f0d9705f25edc53f89532e8ef39cd23d9ca92b +generated: "2023-06-07T17:47:05.632456+08:00" diff --git a/charts/harvester-cloud-provider/105.0.0+up0.2.6/Chart.yaml b/charts/harvester-cloud-provider/105.0.0+up0.2.6/Chart.yaml new file mode 100644 index 0000000000..9f06385a36 --- /dev/null +++ b/charts/harvester-cloud-provider/105.0.0+up0.2.6/Chart.yaml @@ -0,0 +1,25 @@ +annotations: + catalog.cattle.io/certified: rancher + catalog.cattle.io/display-name: Harvester Cloud Provider + catalog.cattle.io/kube-version: '>= 1.23.0-0 < 1.32.0-0' + catalog.cattle.io/namespace: kube-system + catalog.cattle.io/os: linux + catalog.cattle.io/permits-os: linux + catalog.cattle.io/rancher-version: '>= 2.10.0-0 < 2.11.0-0' + catalog.cattle.io/release-name: harvester-cloud-provider + catalog.cattle.io/ui-component: harvester-cloud-provider + catalog.cattle.io/upstream-version: 0.2.6 +apiVersion: v2 +appVersion: v0.2.2 +dependencies: +- name: kube-vip + repository: file://./charts/kube-vip +description: A Helm chart for Harvester Cloud Provider +keywords: +- infrastructure +- harvester +maintainers: +- name: harvester +name: harvester-cloud-provider +type: application +version: 105.0.0+up0.2.6 diff --git a/charts/harvester-cloud-provider/105.0.0+up0.2.6/charts/kube-vip/.helmignore b/charts/harvester-cloud-provider/105.0.0+up0.2.6/charts/kube-vip/.helmignore new file mode 100644 index 0000000000..0e8a0eb36f --- /dev/null +++ b/charts/harvester-cloud-provider/105.0.0+up0.2.6/charts/kube-vip/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/charts/harvester-cloud-provider/105.0.0+up0.2.6/charts/kube-vip/Chart.yaml b/charts/harvester-cloud-provider/105.0.0+up0.2.6/charts/kube-vip/Chart.yaml new file mode 100644 index 0000000000..77d865f6bc --- /dev/null +++ b/charts/harvester-cloud-provider/105.0.0+up0.2.6/charts/kube-vip/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +appVersion: v0.4.1 +description: A Helm chart for kube-vip +name: kube-vip +type: application +version: 0.4.2 diff --git a/charts/harvester-cloud-provider/105.0.0+up0.2.6/charts/kube-vip/templates/_helpers.tpl b/charts/harvester-cloud-provider/105.0.0+up0.2.6/charts/kube-vip/templates/_helpers.tpl new file mode 100644 index 0000000000..699c16299e --- /dev/null +++ b/charts/harvester-cloud-provider/105.0.0+up0.2.6/charts/kube-vip/templates/_helpers.tpl @@ -0,0 +1,74 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "kube-vip.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "kube-vip.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "kube-vip.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "kube-vip.labels" -}} +helm.sh/chart: {{ include "kube-vip.chart" . }} +{{ include "kube-vip.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "kube-vip.selectorLabels" -}} +app.kubernetes.io/name: {{ include "kube-vip.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Create the name of the service account to use +*/}} +{{- define "kube-vip.serviceAccountName" -}} +{{- if .Values.serviceAccount.create }} +{{- default (include "kube-vip.fullname" .) .Values.serviceAccount.name }} +{{- else }} +{{- default "default" .Values.serviceAccount.name }} +{{- end }} +{{- end }} + +{{/* +Global system default registry +*/}} +{{- define "system_default_registry" -}} +{{- if .Values.global.cattle.systemDefaultRegistry -}} +{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} +{{- else -}} +{{- "" -}} +{{- end -}} +{{- end -}} diff --git a/charts/harvester-cloud-provider/105.0.0+up0.2.6/charts/kube-vip/templates/daemonset.yaml b/charts/harvester-cloud-provider/105.0.0+up0.2.6/charts/kube-vip/templates/daemonset.yaml new file mode 100644 index 0000000000..cf8a845423 --- /dev/null +++ b/charts/harvester-cloud-provider/105.0.0+up0.2.6/charts/kube-vip/templates/daemonset.yaml @@ -0,0 +1,51 @@ +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: {{ include "kube-vip.name" . }} + namespace: {{ .Release.Namespace | default "kube-system" }} +spec: + selector: + matchLabels: + {{- include "kube-vip.selectorLabels" . | nindent 6 }} + template: + metadata: + labels: + {{- include "kube-vip.selectorLabels" . | nindent 8 }} + spec: + containers: + - args: + - manager + env: + {{- if eq .Values.env.cp_enable "true" }} + - name: vip_address + value: {{ required "A valid config.address required!" .Values.config.address}} + {{- end }} + {{- with .Values.env }} + {{- range $k, $v := . }} + {{- $name := $k }} + {{- $value := $v }} + - name: {{ quote $name }} + value: {{ quote $value }} + {{- end }} + {{- end }} + image: {{ template "system_default_registry" . }}{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + name: kube-vip + resources: + {{- toYaml .Values.resources | nindent 10 }} + securityContext: + {{- toYaml .Values.securityContext | nindent 10 }} + hostNetwork: true + serviceAccountName: {{ include "kube-vip.name" . }} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} diff --git a/charts/harvester-cloud-provider/105.0.0+up0.2.6/charts/kube-vip/templates/rbac.yaml b/charts/harvester-cloud-provider/105.0.0+up0.2.6/charts/kube-vip/templates/rbac.yaml new file mode 100644 index 0000000000..0aee28c9bb --- /dev/null +++ b/charts/harvester-cloud-provider/105.0.0+up0.2.6/charts/kube-vip/templates/rbac.yaml @@ -0,0 +1,36 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "kube-vip.name" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "kube-vip.labels" . | nindent 4 }} +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + annotations: + rbac.authorization.kubernetes.io/autoupdate: "true" + name: {{ include "kube-vip.name" . }} +rules: + - apiGroups: [""] + resources: ["services", "services/status", "nodes"] + verbs: ["list","get","watch", "update"] + - apiGroups: ["coordination.k8s.io"] + resources: ["leases"] + verbs: ["list", "get", "watch", "update", "create"] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: {{ include "kube-vip.name" . }} + labels: + {{- include "kube-vip.labels" . | nindent 4 }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: {{ include "kube-vip.name" . }} +subjects: +- kind: ServiceAccount + name: {{ include "kube-vip.name" . }} + namespace: {{ .Release.Namespace }} diff --git a/charts/harvester-cloud-provider/105.0.0+up0.2.6/charts/kube-vip/values.yaml b/charts/harvester-cloud-provider/105.0.0+up0.2.6/charts/kube-vip/values.yaml new file mode 100644 index 0000000000..307bf8304b --- /dev/null +++ b/charts/harvester-cloud-provider/105.0.0+up0.2.6/charts/kube-vip/values.yaml @@ -0,0 +1,79 @@ +# Default values for kube-vip. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +image: + repository: rancher/mirrored-kube-vip-kube-vip-iptables + pullPolicy: IfNotPresent + # Overrides the image tag whose default is the chart appVersion. + tag: "v0.6.0" + +config: + address: "" + +env: + vip_interface: "" + vip_arp: "true" + lb_enable: "true" + lb_port: "6443" + vip_cidr: "32" + cp_enable: "false" + svc_enable: "true" + vip_leaderelection: "false" + +imagePullSecrets: [ ] +nameOverride: "" +fullnameOverride: "" + +serviceAccount: + # Specifies whether a service account should be created + create: true + # Annotations to add to the service account + annotations: { } + # The name of the service account to use. + # If not set and create is true, a name is generated using the fullname template + name: "" + +podAnnotations: { } + +podSecurityContext: { } +# fsGroup: 2000 + +securityContext: + capabilities: + add: + - NET_ADMIN + - NET_RAW + +resources: { } + # We usually recommend not to specify default resources and to leave this as a conscious + # choice for the user. This also increases chances charts run on environments with little + # resources, such as Minikube. If you do want to specify resources, uncomment the following + # lines, adjust them as necessary, and remove the curly braces after 'resources:'. +# limits: +# cpu: 100m +# memory: 128Mi +# requests: +# cpu: 100m +# memory: 128Mi + +nodeSelector: {} + +tolerations: + - effect: NoSchedule + key: node-role.kubernetes.io/control-plane + operator: Exists +affinity: { } + # nodeAffinity: + # requiredDuringSchedulingIgnoredDuringExecution: + # nodeSelectorTerms: + # - matchExpressions: + # - key: node-role.kubernetes.io/master + # operator: Exists + # - matchExpressions: + # - key: node-role.kubernetes.io/control-plane + # operator: Exists + +global: + cattle: + systemDefaultRegistry: "" diff --git a/charts/harvester-cloud-provider/105.0.0+up0.2.6/ci/kind-values.yaml b/charts/harvester-cloud-provider/105.0.0+up0.2.6/ci/kind-values.yaml new file mode 100644 index 0000000000..2f3796b7a2 --- /dev/null +++ b/charts/harvester-cloud-provider/105.0.0+up0.2.6/ci/kind-values.yaml @@ -0,0 +1,3 @@ +replicasCount: 1 +# It's an existent but invalid kubeconfig, just for helm installation testing in kind +cloudConfigPath: "/etc/kubernetes/admin.conf" diff --git a/charts/harvester-cloud-provider/105.0.0+up0.2.6/dependency_charts/kube-vip/.helmignore b/charts/harvester-cloud-provider/105.0.0+up0.2.6/dependency_charts/kube-vip/.helmignore new file mode 100644 index 0000000000..0e8a0eb36f --- /dev/null +++ b/charts/harvester-cloud-provider/105.0.0+up0.2.6/dependency_charts/kube-vip/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/charts/harvester-cloud-provider/105.0.0+up0.2.6/dependency_charts/kube-vip/Chart.yaml b/charts/harvester-cloud-provider/105.0.0+up0.2.6/dependency_charts/kube-vip/Chart.yaml new file mode 100644 index 0000000000..77d865f6bc --- /dev/null +++ b/charts/harvester-cloud-provider/105.0.0+up0.2.6/dependency_charts/kube-vip/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +appVersion: v0.4.1 +description: A Helm chart for kube-vip +name: kube-vip +type: application +version: 0.4.2 diff --git a/charts/harvester-cloud-provider/105.0.0+up0.2.6/dependency_charts/kube-vip/templates/_helpers.tpl b/charts/harvester-cloud-provider/105.0.0+up0.2.6/dependency_charts/kube-vip/templates/_helpers.tpl new file mode 100644 index 0000000000..699c16299e --- /dev/null +++ b/charts/harvester-cloud-provider/105.0.0+up0.2.6/dependency_charts/kube-vip/templates/_helpers.tpl @@ -0,0 +1,74 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "kube-vip.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "kube-vip.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "kube-vip.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "kube-vip.labels" -}} +helm.sh/chart: {{ include "kube-vip.chart" . }} +{{ include "kube-vip.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "kube-vip.selectorLabels" -}} +app.kubernetes.io/name: {{ include "kube-vip.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Create the name of the service account to use +*/}} +{{- define "kube-vip.serviceAccountName" -}} +{{- if .Values.serviceAccount.create }} +{{- default (include "kube-vip.fullname" .) .Values.serviceAccount.name }} +{{- else }} +{{- default "default" .Values.serviceAccount.name }} +{{- end }} +{{- end }} + +{{/* +Global system default registry +*/}} +{{- define "system_default_registry" -}} +{{- if .Values.global.cattle.systemDefaultRegistry -}} +{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} +{{- else -}} +{{- "" -}} +{{- end -}} +{{- end -}} diff --git a/charts/harvester-cloud-provider/105.0.0+up0.2.6/dependency_charts/kube-vip/templates/daemonset.yaml b/charts/harvester-cloud-provider/105.0.0+up0.2.6/dependency_charts/kube-vip/templates/daemonset.yaml new file mode 100644 index 0000000000..cf8a845423 --- /dev/null +++ b/charts/harvester-cloud-provider/105.0.0+up0.2.6/dependency_charts/kube-vip/templates/daemonset.yaml @@ -0,0 +1,51 @@ +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: {{ include "kube-vip.name" . }} + namespace: {{ .Release.Namespace | default "kube-system" }} +spec: + selector: + matchLabels: + {{- include "kube-vip.selectorLabels" . | nindent 6 }} + template: + metadata: + labels: + {{- include "kube-vip.selectorLabels" . | nindent 8 }} + spec: + containers: + - args: + - manager + env: + {{- if eq .Values.env.cp_enable "true" }} + - name: vip_address + value: {{ required "A valid config.address required!" .Values.config.address}} + {{- end }} + {{- with .Values.env }} + {{- range $k, $v := . }} + {{- $name := $k }} + {{- $value := $v }} + - name: {{ quote $name }} + value: {{ quote $value }} + {{- end }} + {{- end }} + image: {{ template "system_default_registry" . }}{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + name: kube-vip + resources: + {{- toYaml .Values.resources | nindent 10 }} + securityContext: + {{- toYaml .Values.securityContext | nindent 10 }} + hostNetwork: true + serviceAccountName: {{ include "kube-vip.name" . }} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} diff --git a/charts/harvester-cloud-provider/105.0.0+up0.2.6/dependency_charts/kube-vip/templates/rbac.yaml b/charts/harvester-cloud-provider/105.0.0+up0.2.6/dependency_charts/kube-vip/templates/rbac.yaml new file mode 100644 index 0000000000..0aee28c9bb --- /dev/null +++ b/charts/harvester-cloud-provider/105.0.0+up0.2.6/dependency_charts/kube-vip/templates/rbac.yaml @@ -0,0 +1,36 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "kube-vip.name" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "kube-vip.labels" . | nindent 4 }} +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + annotations: + rbac.authorization.kubernetes.io/autoupdate: "true" + name: {{ include "kube-vip.name" . }} +rules: + - apiGroups: [""] + resources: ["services", "services/status", "nodes"] + verbs: ["list","get","watch", "update"] + - apiGroups: ["coordination.k8s.io"] + resources: ["leases"] + verbs: ["list", "get", "watch", "update", "create"] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: {{ include "kube-vip.name" . }} + labels: + {{- include "kube-vip.labels" . | nindent 4 }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: {{ include "kube-vip.name" . }} +subjects: +- kind: ServiceAccount + name: {{ include "kube-vip.name" . }} + namespace: {{ .Release.Namespace }} diff --git a/charts/harvester-cloud-provider/105.0.0+up0.2.6/dependency_charts/kube-vip/values.yaml b/charts/harvester-cloud-provider/105.0.0+up0.2.6/dependency_charts/kube-vip/values.yaml new file mode 100644 index 0000000000..307bf8304b --- /dev/null +++ b/charts/harvester-cloud-provider/105.0.0+up0.2.6/dependency_charts/kube-vip/values.yaml @@ -0,0 +1,79 @@ +# Default values for kube-vip. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +image: + repository: rancher/mirrored-kube-vip-kube-vip-iptables + pullPolicy: IfNotPresent + # Overrides the image tag whose default is the chart appVersion. + tag: "v0.6.0" + +config: + address: "" + +env: + vip_interface: "" + vip_arp: "true" + lb_enable: "true" + lb_port: "6443" + vip_cidr: "32" + cp_enable: "false" + svc_enable: "true" + vip_leaderelection: "false" + +imagePullSecrets: [ ] +nameOverride: "" +fullnameOverride: "" + +serviceAccount: + # Specifies whether a service account should be created + create: true + # Annotations to add to the service account + annotations: { } + # The name of the service account to use. + # If not set and create is true, a name is generated using the fullname template + name: "" + +podAnnotations: { } + +podSecurityContext: { } +# fsGroup: 2000 + +securityContext: + capabilities: + add: + - NET_ADMIN + - NET_RAW + +resources: { } + # We usually recommend not to specify default resources and to leave this as a conscious + # choice for the user. This also increases chances charts run on environments with little + # resources, such as Minikube. If you do want to specify resources, uncomment the following + # lines, adjust them as necessary, and remove the curly braces after 'resources:'. +# limits: +# cpu: 100m +# memory: 128Mi +# requests: +# cpu: 100m +# memory: 128Mi + +nodeSelector: {} + +tolerations: + - effect: NoSchedule + key: node-role.kubernetes.io/control-plane + operator: Exists +affinity: { } + # nodeAffinity: + # requiredDuringSchedulingIgnoredDuringExecution: + # nodeSelectorTerms: + # - matchExpressions: + # - key: node-role.kubernetes.io/master + # operator: Exists + # - matchExpressions: + # - key: node-role.kubernetes.io/control-plane + # operator: Exists + +global: + cattle: + systemDefaultRegistry: "" diff --git a/charts/harvester-cloud-provider/105.0.0+up0.2.6/questions.yml b/charts/harvester-cloud-provider/105.0.0+up0.2.6/questions.yml new file mode 100644 index 0000000000..9a85c90295 --- /dev/null +++ b/charts/harvester-cloud-provider/105.0.0+up0.2.6/questions.yml @@ -0,0 +1,11 @@ +categories: +- infrastructure +- harvester +namespace: kube-system +questions: +- variable: cloudConfigPath + label: Cloud config file path + description: "Specify the path of the cloud config." + group: "Default" + type: string + default: "/etc/kubernetes/cloud-config" diff --git a/charts/harvester-cloud-provider/105.0.0+up0.2.6/templates/_helpers.tpl b/charts/harvester-cloud-provider/105.0.0+up0.2.6/templates/_helpers.tpl new file mode 100644 index 0000000000..f637aa2397 --- /dev/null +++ b/charts/harvester-cloud-provider/105.0.0+up0.2.6/templates/_helpers.tpl @@ -0,0 +1,69 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "harvester-cloud-provider.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "harvester-cloud-provider.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "harvester-cloud-provider.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "harvester-cloud-provider.labels" -}} +helm.sh/chart: {{ include "harvester-cloud-provider.chart" . }} +{{ include "harvester-cloud-provider.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "harvester-cloud-provider.selectorLabels" -}} +app.kubernetes.io/name: {{ include "harvester-cloud-provider.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Create the name of the service account to use +*/}} +{{- define "harvester-cloud-provider.serviceAccountName" -}} +{{- default (include "harvester-cloud-provider.fullname" .) .Values.serviceAccount.name }} +{{- end }} + +{{/* +Global system default registry +*/}} +{{- define "system_default_registry" -}} +{{- if .Values.global.cattle.systemDefaultRegistry -}} +{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} +{{- else -}} +{{- "" -}} +{{- end -}} +{{- end -}} diff --git a/charts/harvester-cloud-provider/105.0.0+up0.2.6/templates/deployment.yaml b/charts/harvester-cloud-provider/105.0.0+up0.2.6/templates/deployment.yaml new file mode 100644 index 0000000000..2145c4c575 --- /dev/null +++ b/charts/harvester-cloud-provider/105.0.0+up0.2.6/templates/deployment.yaml @@ -0,0 +1,57 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + namespace: {{ .Release.Namespace }} + labels: + {{- include "harvester-cloud-provider.labels" . | nindent 4 }} + name: {{ include "harvester-cloud-provider.name" . }} +spec: + replicas: {{ .Values.replicasCount}} + selector: + matchLabels: + {{- include "harvester-cloud-provider.selectorLabels" . | nindent 6 }} + strategy: + rollingUpdate: + maxUnavailable: 1 + type: RollingUpdate + template: + metadata: + labels: + {{- include "harvester-cloud-provider.selectorLabels" . | nindent 8 }} + spec: + serviceAccountName: {{ include "harvester-cloud-provider.name" . }} + hostNetwork: true + containers: + - name: {{ include "harvester-cloud-provider.name" . }} + image: {{ template "system_default_registry" . }}{{ .Values.image.repository }}:{{ .Values.image.tag }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + args: + - --cloud-config=/etc/kubernetes/cloud-config + {{- if ne .Values.global.cattle.clusterName "" }} + - --cluster-name={{ .Values.global.cattle.clusterName }} + {{- end }} + command: + - harvester-cloud-provider + resources: + {{- toYaml .Values.resources | nindent 12 }} + volumeMounts: + - mountPath: /etc/kubernetes/cloud-config + name: cloud-config + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} + volumes: + - name: cloud-config + hostPath: + path: {{ required "A valid cloudConfigPath is required!" .Values.cloudConfigPath }} + type: File diff --git a/charts/harvester-cloud-provider/105.0.0+up0.2.6/templates/rbac.yaml b/charts/harvester-cloud-provider/105.0.0+up0.2.6/templates/rbac.yaml new file mode 100644 index 0000000000..f695cfdc2c --- /dev/null +++ b/charts/harvester-cloud-provider/105.0.0+up0.2.6/templates/rbac.yaml @@ -0,0 +1,37 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "harvester-cloud-provider.name" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "harvester-cloud-provider.labels" . | nindent 4 }} +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: {{ include "harvester-cloud-provider.name" . }} +rules: + - apiGroups: [ "" ] + resources: [ "services", "nodes", "events" ] + verbs: [ "get", "watch", "list", "update", "create", "patch" ] + - apiGroups: [ "" ] + resources: [ "nodes/status", "services/status" ] + verbs: [ "update", "patch" ] + - apiGroups: [ "coordination.k8s.io" ] + resources: [ "leases" ] + verbs: [ "get", "update", "create" ] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: {{ include "harvester-cloud-provider.name" . }} + labels: + {{- include "harvester-cloud-provider.labels" . | nindent 4 }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: {{ include "harvester-cloud-provider.name" . }} +subjects: + - kind: ServiceAccount + name: {{ include "harvester-cloud-provider.name" . }} + namespace: {{ .Release.Namespace }} diff --git a/charts/harvester-cloud-provider/105.0.0+up0.2.6/values.yaml b/charts/harvester-cloud-provider/105.0.0+up0.2.6/values.yaml new file mode 100644 index 0000000000..4b892e60a0 --- /dev/null +++ b/charts/harvester-cloud-provider/105.0.0+up0.2.6/values.yaml @@ -0,0 +1,106 @@ +# Default values for harvester-cloud-provider. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicasCount: 1 + +image: + repository: rancher/harvester-cloud-provider + pullPolicy: IfNotPresent + # Overrides the image tag whose default is the chart appVersion. + tag: v0.2.2 + +cloudConfigPath: "/etc/kubernetes/cloud-config" + +imagePullSecrets: [] +nameOverride: "" +fullnameOverride: "" + +serviceAccount: + # Annotations to add to the service account + annotations: {} + # The name of the service account to use. + # If not set and create is true, a name is generated using the fullname template + name: "" + +resources: {} + # We usually recommend not to specify default resources and to leave this as a conscious + # choice for the user. This also increases chances charts run on environments with little + # resources, such as Minikube. If you do want to specify resources, uncomment the following + # lines, adjust them as necessary, and remove the curly braces after 'resources:'. + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + +nodeSelector: + kubernetes.io/os: linux + +tolerations: +- effect: NoSchedule + key: node.cloudprovider.kubernetes.io/uninitialized + operator: Equal + value: "true" +- effect: NoSchedule + key: node-role.kubernetes.io/control-plane + operator: Equal +- effect: NoExecute + key: node-role.kubernetes.io/etcd + operator: Equal +- key: cattle.io/os + operator: Equal + value: "linux" + effect: NoSchedule + +affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: app.kubernetes.io/name + operator: In + values: + - harvester-cloud-provider + topologyKey: kubernetes.io/hostname + +global: + cattle: + systemDefaultRegistry: "" + clusterName: "" + +kube-vip: + enabled: true + tolerations: + - effect: NoSchedule + key: node-role.kubernetes.io/control-plane + operator: Exists + - effect: NoExecute + key: node-role.kubernetes.io/etcd + operator: Exists + image: + repository: rancher/mirrored-kube-vip-kube-vip-iptables + tag: v0.6.0 + env: + vip_interface: "" + vip_arp: "true" + lb_enable: "true" + lb_port: "6443" + vip_cidr: "32" + cp_enable: "false" + svc_enable: "true" + vip_leaderelection: "false" + enable_service_security: "true" + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + # For RKE1 + - matchExpressions: + - key: node-role.kubernetes.io/controlplane + operator: Exists + # For RKE2 + - matchExpressions: + - key: node-role.kubernetes.io/control-plane + operator: Exists diff --git a/charts/harvester-csi-driver/105.0.0+up0.1.21/.helmignore b/charts/harvester-csi-driver/105.0.0+up0.1.21/.helmignore new file mode 100644 index 0000000000..0e8a0eb36f --- /dev/null +++ b/charts/harvester-csi-driver/105.0.0+up0.1.21/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/charts/harvester-csi-driver/105.0.0+up0.1.21/Chart.yaml b/charts/harvester-csi-driver/105.0.0+up0.1.21/Chart.yaml new file mode 100644 index 0000000000..0162246725 --- /dev/null +++ b/charts/harvester-csi-driver/105.0.0+up0.1.21/Chart.yaml @@ -0,0 +1,22 @@ +annotations: + catalog.cattle.io/certified: rancher + catalog.cattle.io/display-name: Harvester CSI Driver + catalog.cattle.io/kube-version: '>= 1.23.0-0 < 1.32.0-0' + catalog.cattle.io/namespace: kube-system + catalog.cattle.io/os: linux + catalog.cattle.io/permits-os: linux + catalog.cattle.io/rancher-version: '>= 2.10.0-0 < 2.11.0-0' + catalog.cattle.io/release-name: harvester-csi-driver + catalog.cattle.io/ui-component: harvester-csi-driver + catalog.cattle.io/upstream-version: 0.1.21 +apiVersion: v2 +appVersion: v0.2.2 +description: A Helm chart for Harvester CSI driver +keywords: +- infrastructure +- harvester +maintainers: +- name: harvester +name: harvester-csi-driver +type: application +version: 105.0.0+up0.1.21 diff --git a/charts/harvester-csi-driver/105.0.0+up0.1.21/questions.yml b/charts/harvester-csi-driver/105.0.0+up0.1.21/questions.yml new file mode 100644 index 0000000000..0c703a0f29 --- /dev/null +++ b/charts/harvester-csi-driver/105.0.0+up0.1.21/questions.yml @@ -0,0 +1,11 @@ +categories: +- infrastructure +- harvester +namespace: kube-system +questions: +- variable: cloudConfig.hostPath + label: Cloud config file path + description: "Specify the path of the cloud config." + group: "Default" + type: string + default: "/etc/kubernetes/cloud-config" diff --git a/charts/harvester-csi-driver/105.0.0+up0.1.21/templates/NOTES.txt b/charts/harvester-csi-driver/105.0.0+up0.1.21/templates/NOTES.txt new file mode 100644 index 0000000000..ba09c6d518 --- /dev/null +++ b/charts/harvester-csi-driver/105.0.0+up0.1.21/templates/NOTES.txt @@ -0,0 +1 @@ +Successfully deployed Harvester CSI driver to the {{ .Release.Namespace }} namespace. diff --git a/charts/harvester-csi-driver/105.0.0+up0.1.21/templates/_helpers.tpl b/charts/harvester-csi-driver/105.0.0+up0.1.21/templates/_helpers.tpl new file mode 100644 index 0000000000..def471b21d --- /dev/null +++ b/charts/harvester-csi-driver/105.0.0+up0.1.21/templates/_helpers.tpl @@ -0,0 +1,62 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "harvester-csi-driver.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "harvester-csi-driver.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "harvester-csi-driver.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "harvester-csi-driver.labels" -}} +helm.sh/chart: {{ include "harvester-csi-driver.chart" . }} +{{ include "harvester-csi-driver.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "harvester-csi-driver.selectorLabels" -}} +app.kubernetes.io/name: {{ include "harvester-csi-driver.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Global system default registry +*/}} +{{- define "system_default_registry" -}} +{{- if .Values.global.cattle.systemDefaultRegistry -}} +{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} +{{- else -}} +{{- "" -}} +{{- end -}} +{{- end -}} diff --git a/charts/harvester-csi-driver/105.0.0+up0.1.21/templates/csidriver.yaml b/charts/harvester-csi-driver/105.0.0+up0.1.21/templates/csidriver.yaml new file mode 100644 index 0000000000..5fc6ec84a2 --- /dev/null +++ b/charts/harvester-csi-driver/105.0.0+up0.1.21/templates/csidriver.yaml @@ -0,0 +1,10 @@ +apiVersion: storage.k8s.io/v1 +kind: CSIDriver +metadata: + name: driver.harvesterhci.io +spec: + attachRequired: true + fsGroupPolicy: ReadWriteOnceWithFSType + podInfoOnMount: true + volumeLifecycleModes: + - Persistent diff --git a/charts/harvester-csi-driver/105.0.0+up0.1.21/templates/daemonset.yaml b/charts/harvester-csi-driver/105.0.0+up0.1.21/templates/daemonset.yaml new file mode 100644 index 0000000000..6ccb3203a0 --- /dev/null +++ b/charts/harvester-csi-driver/105.0.0+up0.1.21/templates/daemonset.yaml @@ -0,0 +1,152 @@ +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: {{ include "harvester-csi-driver.name" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "harvester-csi-driver.labels" . | nindent 4 }} +spec: + selector: + matchLabels: + component: csi-driver + {{- include "harvester-csi-driver.selectorLabels" . | nindent 6 }} + template: + metadata: + labels: + component: csi-driver + {{- include "harvester-csi-driver.selectorLabels" . | nindent 8 }} + spec: + containers: + - args: + - --v=5 + - --csi-address=$(ADDRESS) + - --kubelet-registration-path={{ .Values.kubeletRootDir }}/harvester-plugins/driver.harvesterhci.io/csi.sock + env: + - name: ADDRESS + value: /csi/csi.sock + image: {{ template "system_default_registry" . }}{{ .Values.image.csi.nodeDriverRegistrar.repository }}:{{ .Values.image.csi.nodeDriverRegistrar.tag }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + lifecycle: + preStop: + exec: + command: + - /bin/sh + - -c + - rm -rf /registration/driver.harvesterhci.io-reg.sock + /csi//* + name: node-driver-registrar + securityContext: + privileged: true + volumeMounts: + - mountPath: /csi/ + name: socket-dir + - mountPath: /registration + name: registration-dir + - args: + - --nodeid=$(NODE_ID) + - --endpoint=$(CSI_ENDPOINT) + - --kubeconfig=/var/lib/harvester/cloud-provider-config + {{- if .Values.hostStorageClass }} + - --host-storage-class={{ .Values.hostStorageClass }} + {{- end }} + env: + - name: NODE_ID + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: spec.nodeName + - name: CSI_ENDPOINT + value: unix:///csi/csi.sock + image: {{ template "system_default_registry" . }}{{ .Values.image.harvester.csiDriver.repository }}:{{ .Values.image.harvester.csiDriver.tag | default .Chart.AppVersion }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + lifecycle: + preStop: + exec: + command: + - /bin/sh + - -c + - rm -f /csi//* + name: harvester-csi-driver + securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - SYS_ADMIN + privileged: true + volumeMounts: + - name: cloud-config + readOnly: true + mountPath: /var/lib/harvester + - name: kubernetes + readOnly: true + mountPath: /etc/kubernetes + - mountPath: {{ .Values.kubeletRootDir }}/plugins/kubernetes.io/csi + mountPropagation: Bidirectional + name: kubernetes-csi-dir + - mountPath: /csi/ + name: socket-dir + - mountPath: {{ .Values.kubeletRootDir }}/pods + mountPropagation: Bidirectional + name: pods-mount-dir + - mountPath: /dev + name: host-dev + - mountPath: /sys + name: host-sys + - mountPath: /rootfs + mountPropagation: Bidirectional + name: host + - mountPath: /lib/modules + name: lib-modules + readOnly: true + hostPID: true + serviceAccountName: {{ include "harvester-csi-driver.name" . }} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} + volumes: + - name: cloud-config + {{- if .Values.cloudConfig.secretName }} + secret: + secretName: {{ .Values.cloudConfig.secretName }} + {{- else }} + hostPath: + path: {{ .Values.cloudConfig.hostPath }} + type: DirectoryOrCreate + {{- end }} + - hostPath: + path: /etc/kubernetes + type: DirectoryOrCreate + name: kubernetes + - hostPath: + path: {{ .Values.kubeletRootDir }}/plugins/kubernetes.io/csi + type: DirectoryOrCreate + name: kubernetes-csi-dir + - hostPath: + path: {{ .Values.kubeletRootDir }}/plugins_registry + type: Directory + name: registration-dir + - hostPath: + path: {{ .Values.kubeletRootDir }}/harvester-plugins/driver.harvesterhci.io + type: DirectoryOrCreate + name: socket-dir + - hostPath: + path: {{ .Values.kubeletRootDir }}/pods + type: DirectoryOrCreate + name: pods-mount-dir + - hostPath: + path: /dev + name: host-dev + - hostPath: + path: /sys + name: host-sys + - hostPath: + path: / + name: host + - hostPath: + path: /lib/modules + name: lib-modules diff --git a/charts/harvester-csi-driver/105.0.0+up0.1.21/templates/deployment.yaml b/charts/harvester-csi-driver/105.0.0+up0.1.21/templates/deployment.yaml new file mode 100644 index 0000000000..bb511dfa7b --- /dev/null +++ b/charts/harvester-csi-driver/105.0.0+up0.1.21/templates/deployment.yaml @@ -0,0 +1,95 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "harvester-csi-driver.name" . }}-controllers + namespace: {{ .Release.Namespace }} + labels: + {{- include "harvester-csi-driver.labels" . | nindent 4 }} +spec: + replicas: {{ .Values.replicasCount }} + selector: + matchLabels: + component: csi-controllers + {{- include "harvester-csi-driver.selectorLabels" . | nindent 6 }} + template: + metadata: + labels: + component: csi-controllers + {{- include "harvester-csi-driver.selectorLabels" . | nindent 8 }} + spec: + containers: + - args: + - --v=5 + - --csi-address=$(ADDRESS) + - --timeout=1m50s + - --leader-election + - --leader-election-namespace=$(POD_NAMESPACE) + env: + - name: ADDRESS + value: /csi/csi.sock + - name: POD_NAMESPACE + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + image: {{ template "system_default_registry" . }}{{ .Values.image.csi.resizer.repository }}:{{ .Values.image.csi.resizer.tag }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + name: csi-resizer + volumeMounts: + - mountPath: /csi/ + name: socket-dir + - args: + - --v=5 + - --csi-address=$(ADDRESS) + - --timeout=1m50s + - --leader-election + - --leader-election-namespace=$(POD_NAMESPACE) + - --default-fstype=ext4 + env: + - name: ADDRESS + value: /csi/csi.sock + - name: POD_NAMESPACE + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + image: {{ template "system_default_registry" . }}{{ .Values.image.csi.provisioner.repository }}:{{ .Values.image.csi.provisioner.tag }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + name: csi-provisioner + volumeMounts: + - mountPath: /csi/ + name: socket-dir + - args: + - --v=5 + - --csi-address=$(ADDRESS) + - --timeout=1m50s + - --leader-election + - --leader-election-namespace=$(POD_NAMESPACE) + env: + - name: ADDRESS + value: /csi/csi.sock + - name: POD_NAMESPACE + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + image: {{ template "system_default_registry" . }}{{ .Values.image.csi.attacher.repository }}:{{ .Values.image.csi.attacher.tag }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + name: csi-attacher + volumeMounts: + - mountPath: /csi/ + name: socket-dir + serviceAccountName: {{ include "harvester-csi-driver.name" . }} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} + volumes: + - hostPath: + path: {{ .Values.kubeletRootDir }}/harvester-plugins/driver.harvesterhci.io + type: DirectoryOrCreate + name: socket-dir diff --git a/charts/harvester-csi-driver/105.0.0+up0.1.21/templates/rbac.yaml b/charts/harvester-csi-driver/105.0.0+up0.1.21/templates/rbac.yaml new file mode 100644 index 0000000000..2ba042a26b --- /dev/null +++ b/charts/harvester-csi-driver/105.0.0+up0.1.21/templates/rbac.yaml @@ -0,0 +1,75 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "harvester-csi-driver.name" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "harvester-csi-driver.labels" . | nindent 4 }} +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: {{ include "harvester-csi-driver.name" . }} + labels: + {{- include "harvester-csi-driver.labels" . | nindent 4 }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: {{ include "harvester-csi-driver.name" . }} +subjects: + - kind: ServiceAccount + name: {{ include "harvester-csi-driver.name" . }} + namespace: {{ .Release.Namespace }} +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: {{ include "harvester-csi-driver.name" . }} + labels: + {{- include "harvester-csi-driver.labels" . | nindent 4 }} +rules: + - apiGroups: [ "coordination.k8s.io" ] + resources: [ "leases" ] + verbs: [ "get", "watch", "list", "delete", "update", "create" ] + - apiGroups: [ "storage.k8s.io" ] + resources: [ "csistoragecapacities" ] + verbs: [ "get", "list", "watch", "create", "update", "patch", "delete" ] + - apiGroups: [""] + resources: ["persistentvolumes"] + verbs: [ "get", "list", "watch", "create","update", "patch", "delete" ] + - apiGroups: [""] + resources: ["persistentvolumeclaims"] + verbs: ["get", "list", "watch", "create","update", "patch", "delete" ] + - apiGroups: [""] + resources: ["persistentvolumeclaims/status"] + verbs: ["patch"] + - apiGroups: ["storage.k8s.io"] + resources: ["storageclasses"] + verbs: ["get", "list", "watch"] + - apiGroups: ["snapshot.storage.k8s.io"] + resources: ["volumesnapshots"] + verbs: ["get", "list"] + - apiGroups: ["snapshot.storage.k8s.io"] + resources: ["volumesnapshotcontents"] + verbs: ["get", "list"] + - apiGroups: [ "storage.k8s.io" ] + resources: [ "csinodes" ] + verbs: [ "get", "list", "watch" ] + - apiGroups: [ "" ] + resources: [ "events" ] + verbs: [ "list", "watch", "create", "update", "patch" ] + - apiGroups: [ "" ] + resources: [ "pods" ] + verbs: [ "get", "list", "watch" ] + - apiGroups: [ "apps" ] + resources: [ "replicasets" ] + verbs: [ "get" ] + - apiGroups: [""] + resources: ["nodes"] + verbs: ["get", "list", "watch"] + - apiGroups: ["storage.k8s.io"] + resources: ["volumeattachments"] + verbs: ["get", "list", "watch", "patch"] + - apiGroups: [ "storage.k8s.io" ] + resources: [ "volumeattachments/status" ] + verbs: [ "patch" ] diff --git a/charts/harvester-csi-driver/105.0.0+up0.1.21/templates/storageclass.yaml b/charts/harvester-csi-driver/105.0.0+up0.1.21/templates/storageclass.yaml new file mode 100644 index 0000000000..a29c9c7da0 --- /dev/null +++ b/charts/harvester-csi-driver/105.0.0+up0.1.21/templates/storageclass.yaml @@ -0,0 +1,10 @@ +apiVersion: storage.k8s.io/v1 +kind: StorageClass +metadata: + name: harvester + annotations: + storageclass.kubernetes.io/is-default-class: "true" +allowVolumeExpansion: true +provisioner: driver.harvesterhci.io +reclaimPolicy: Delete +volumeBindingMode: Immediate diff --git a/charts/harvester-csi-driver/105.0.0+up0.1.21/values.yaml b/charts/harvester-csi-driver/105.0.0+up0.1.21/values.yaml new file mode 100644 index 0000000000..fe6b120cbd --- /dev/null +++ b/charts/harvester-csi-driver/105.0.0+up0.1.21/values.yaml @@ -0,0 +1,56 @@ +# Default values for harvester-csi-driver. + +replicasCount: 3 + +image: + harvester: + csiDriver: + repository: rancher/harvester-csi-driver + # Overrides the image tag whose default is the chart appVersion. + tag: "v0.2.2" + csi: + nodeDriverRegistrar: + repository: rancher/mirrored-longhornio-csi-node-driver-registrar + tag: v2.3.0 + resizer: + repository: rancher/mirrored-longhornio-csi-resizer + tag: v1.2.0 + provisioner: + repository: rancher/mirrored-longhornio-csi-provisioner + tag: v2.1.2 + attacher: + repository: rancher/mirrored-longhornio-csi-attacher + tag: v3.2.1 + pullPolicy: IfNotPresent + +nameOverride: "" +fullnameOverride: "" + +# This field can be used to specify the corresponding StorageClass on the host cluster. +hostStorageClass: "" +kubeletRootDir: /var/lib/kubelet +cloudConfig: + secretName: "" + hostPath: "/var/lib/rancher/rke2/etc/config-files/" + +nodeSelector: + kubernetes.io/os: linux + +tolerations: + - effect: NoSchedule + key: kubevirt.io/drain + operator: Exists + - effect: NoSchedule + key: node-role.kubernetes.io/control-plane + operator: Equal + - effect: NoExecute + key: node-role.kubernetes.io/etcd + operator: Equal + - key: cattle.io/os + operator: Equal + value: "linux" + effect: NoSchedule + +global: + cattle: + systemDefaultRegistry: "" diff --git a/index.yaml b/index.yaml index 79c9c0a4d6..549a27b7f0 100755 --- a/index.yaml +++ b/index.yaml @@ -962,6 +962,28 @@ entries: - assets/epinio-crd/epinio-crd-102.0.1+up1.6.2.tgz version: 102.0.1+up1.6.2 fleet: + - annotations: + catalog.cattle.io/auto-install: fleet-crd=match + catalog.cattle.io/certified: rancher + catalog.cattle.io/experimental: "true" + catalog.cattle.io/hidden: "true" + catalog.cattle.io/kube-version: '>= 1.28.0-0 < 1.32.0-0' + catalog.cattle.io/namespace: cattle-fleet-system + catalog.cattle.io/os: linux + catalog.cattle.io/permits-os: linux,windows + catalog.cattle.io/provides-gvr: clusters.fleet.cattle.io/v1alpha1 + catalog.cattle.io/rancher-version: '>= 2.10.0-0 < 2.11.0-0' + catalog.cattle.io/release-name: fleet + apiVersion: v2 + appVersion: 0.11.1 + created: "2024-11-18T11:41:10.135642586-03:00" + description: Fleet Controller - GitOps at Scale + digest: 803ac606314cc22a041b95aac56a733bc5d11ff27794046630fe67ae9a85e206 + icon: https://charts.rancher.io/assets/logos/fleet.svg + name: fleet + urls: + - assets/fleet/fleet-105.0.1+up0.11.1.tgz + version: 105.0.1+up0.11.1 - annotations: catalog.cattle.io/auto-install: fleet-crd=match catalog.cattle.io/certified: rancher @@ -1691,6 +1713,25 @@ entries: - assets/fleet/fleet-101.0.0+up0.5.0.tgz version: 101.0.0+up0.5.0 fleet-agent: + - annotations: + catalog.cattle.io/certified: rancher + catalog.cattle.io/hidden: "true" + catalog.cattle.io/kube-version: '>= 1.28.0-0 < 1.32.0-0' + catalog.cattle.io/namespace: cattle-fleet-system + catalog.cattle.io/os: linux + catalog.cattle.io/permits-os: linux,windows + catalog.cattle.io/rancher-version: '>= 2.10.0-0 < 2.11.0-0' + catalog.cattle.io/release-name: fleet-agent + apiVersion: v2 + appVersion: 0.11.1 + created: "2024-11-18T11:41:38.142572444-03:00" + description: Fleet Agent - GitOps at Scale + digest: 7d6e9e68f55481fa866ebc215bd3a9955529743bd7f519efeb03384e8f45d64c + icon: https://charts.rancher.io/assets/logos/fleet.svg + name: fleet-agent + urls: + - assets/fleet-agent/fleet-agent-105.0.1+up0.11.1.tgz + version: 105.0.1+up0.11.1 - annotations: catalog.cattle.io/certified: rancher catalog.cattle.io/hidden: "true" @@ -2243,6 +2284,23 @@ entries: - assets/fleet-agent/fleet-agent-101.0.0+up0.5.0.tgz version: 101.0.0+up0.5.0 fleet-crd: + - annotations: + catalog.cattle.io/certified: rancher + catalog.cattle.io/hidden: "true" + catalog.cattle.io/namespace: cattle-fleet-system + catalog.cattle.io/os: linux + catalog.cattle.io/permits-os: linux,windows + catalog.cattle.io/release-name: fleet-crd + apiVersion: v2 + appVersion: 0.11.1 + created: "2024-11-18T11:41:26.354924966-03:00" + description: Fleet CustomResourceDefinitions + digest: 446418858c2e23e12dbfa04cb369e3e90ed1cf0a55829ca56f32fc3bfab726a3 + icon: https://charts.rancher.io/assets/logos/fleet.svg + name: fleet-crd + urls: + - assets/fleet-crd/fleet-crd-105.0.1+up0.11.1.tgz + version: 105.0.1+up0.11.1 - annotations: catalog.cattle.io/certified: rancher catalog.cattle.io/hidden: "true" @@ -2737,6 +2795,35 @@ entries: - assets/fleet-crd/fleet-crd-101.0.0+up0.5.0.tgz version: 101.0.0+up0.5.0 harvester-cloud-provider: + - annotations: + catalog.cattle.io/certified: rancher + catalog.cattle.io/display-name: Harvester Cloud Provider + catalog.cattle.io/kube-version: '>= 1.23.0-0 < 1.32.0-0' + catalog.cattle.io/namespace: kube-system + catalog.cattle.io/os: linux + catalog.cattle.io/permits-os: linux + catalog.cattle.io/rancher-version: '>= 2.10.0-0 < 2.11.0-0' + catalog.cattle.io/release-name: harvester-cloud-provider + catalog.cattle.io/ui-component: harvester-cloud-provider + catalog.cattle.io/upstream-version: 0.2.6 + apiVersion: v2 + appVersion: v0.2.2 + created: "2024-11-18T11:42:00.692060675-03:00" + dependencies: + - name: kube-vip + repository: file://./charts/kube-vip + description: A Helm chart for Harvester Cloud Provider + digest: 36f3afba563392a89f5e9d0658dc96b093777b98aefafd9a3ff27a1fe9f36d8e + keywords: + - infrastructure + - harvester + maintainers: + - name: harvester + name: harvester-cloud-provider + type: application + urls: + - assets/harvester-cloud-provider/harvester-cloud-provider-105.0.0+up0.2.6.tgz + version: 105.0.0+up0.2.6 - annotations: catalog.cattle.io/certified: rancher catalog.cattle.io/display-name: Harvester Cloud Provider @@ -3075,6 +3162,32 @@ entries: - assets/harvester-cloud-provider/harvester-cloud-provider-101.0.0+up0.1.13.tgz version: 101.0.0+up0.1.13 harvester-csi-driver: + - annotations: + catalog.cattle.io/certified: rancher + catalog.cattle.io/display-name: Harvester CSI Driver + catalog.cattle.io/kube-version: '>= 1.23.0-0 < 1.32.0-0' + catalog.cattle.io/namespace: kube-system + catalog.cattle.io/os: linux + catalog.cattle.io/permits-os: linux + catalog.cattle.io/rancher-version: '>= 2.10.0-0 < 2.11.0-0' + catalog.cattle.io/release-name: harvester-csi-driver + catalog.cattle.io/ui-component: harvester-csi-driver + catalog.cattle.io/upstream-version: 0.1.21 + apiVersion: v2 + appVersion: v0.2.2 + created: "2024-11-18T11:47:19.566572998-03:00" + description: A Helm chart for Harvester CSI driver + digest: 40894ce82f86712f7d20395214b8a066a0d970cea792d9481d8b773a0fb44391 + keywords: + - infrastructure + - harvester + maintainers: + - name: harvester + name: harvester-csi-driver + type: application + urls: + - assets/harvester-csi-driver/harvester-csi-driver-105.0.0+up0.1.21.tgz + version: 105.0.0+up0.1.21 - annotations: catalog.cattle.io/certified: rancher catalog.cattle.io/display-name: Harvester CSI Driver diff --git a/regsync.yaml b/regsync.yaml index b6e3cca87c..09da8e8029 100644 --- a/regsync.yaml +++ b/regsync.yaml @@ -131,6 +131,7 @@ sync: - v0.10.4 - v0.10.5 - v0.11.0 + - v0.11.1 - v0.5.0 - v0.5.1 - v0.6.0 @@ -164,6 +165,7 @@ sync: - v0.10.4 - v0.10.5 - v0.11.0 + - v0.11.1 - v0.5.0 - v0.5.1 - v0.6.0 @@ -332,6 +334,7 @@ sync: - v0.1.5 - v0.1.7 - v0.2.1 + - v0.2.2 - source: docker.io/rancher/helm-project-operator target: '{{ env "REGISTRY_ENDPOINT" }}/rancher/helm-project-operator' type: repository @@ -793,6 +796,7 @@ sync: - v1.6.2 - v1.6.3 - v1.7.1 + - v1.7.2 - v2_20221027 - v3_20221003 - v3_20230320 @@ -828,6 +832,7 @@ sync: - v3.6.2 - v3.6.4 - v4.0.1 + - v4.0.1-20241007 - source: docker.io/rancher/mirrored-longhornio-csi-resizer target: '{{ env "REGISTRY_ENDPOINT" }}/rancher/mirrored-longhornio-csi-resizer' type: repository @@ -851,6 +856,7 @@ sync: - v6.3.2 - v6.3.4 - v7.0.2 + - v7.0.2-20241007 - source: docker.io/rancher/mirrored-longhornio-livenessprobe target: '{{ env "REGISTRY_ENDPOINT" }}/rancher/mirrored-longhornio-livenessprobe' type: repository @@ -881,6 +887,7 @@ sync: - v1.6.2 - v1.6.3 - v1.7.1 + - v1.7.2 - source: docker.io/rancher/mirrored-longhornio-longhorn-instance-manager target: '{{ env "REGISTRY_ENDPOINT" }}/rancher/mirrored-longhornio-longhorn-instance-manager' type: repository @@ -899,6 +906,7 @@ sync: - v1.6.2 - v1.6.3 - v1.7.1 + - v1.7.2 - v1_20220303_patch2 - v1_20221003 - v1_20230407 @@ -923,6 +931,7 @@ sync: - v1.6.2 - v1.6.3 - v1.7.1 + - v1.7.2 - source: docker.io/rancher/mirrored-longhornio-longhorn-share-manager target: '{{ env "REGISTRY_ENDPOINT" }}/rancher/mirrored-longhornio-longhorn-share-manager' type: repository @@ -941,6 +950,7 @@ sync: - v1.6.2 - v1.6.3 - v1.7.1 + - v1.7.2 - v1_20211020_patch2 - v1_20221003 - v1_20230320 @@ -965,6 +975,7 @@ sync: - v1.6.2 - v1.6.3 - v1.7.1 + - v1.7.2 - source: docker.io/rancher/mirrored-longhornio-openshift-origin-oauth-proxy target: '{{ env "REGISTRY_ENDPOINT" }}/rancher/mirrored-longhornio-openshift-origin-oauth-proxy' type: repository @@ -987,6 +998,7 @@ sync: - v0.0.37 - v0.0.42 - v0.0.43 + - v0.0.45 - source: docker.io/rancher/mirrored-messagebird-sachet target: '{{ env "REGISTRY_ENDPOINT" }}/rancher/mirrored-messagebird-sachet' type: repository diff --git a/release.yaml b/release.yaml index d7fdb40f2b..d153739f84 100644 --- a/release.yaml +++ b/release.yaml @@ -1,18 +1,14 @@ -longhorn: - - 104.2.1+up1.7.2 - - 103.4.1+up1.7.2 - - 102.5.1+up1.7.2 -longhorn-crd: - - 104.2.1+up1.7.2 - - 103.4.1+up1.7.2 - - 102.5.1+up1.7.2 -prometheus-federator: - - 105.0.1+up0.4.3 +fleet: + - 105.0.1+up0.11.1 +fleet-agent: + - 105.0.1+up0.11.1 +fleet-crd: + - 105.0.1+up0.11.1 +harvester-cloud-provider: + - 105.0.0+up0.2.6 +harvester-csi-driver: + - 105.0.0+up0.1.21 rancher-cis-benchmark: - 105.0.0+up7.0.0 rancher-cis-benchmark-crd: - 105.0.0+up7.0.0 -rancher-vsphere-cpi: - - 104.0.1+up1.8.1 -rancher-vsphere-csi: - - 104.0.1+up3.3.0-rancher2 From d8aab90d8207fb6c3e3c501ca05ef987975f63d8 Mon Sep 17 00:00:00 2001 From: Nicholas openSUSE Software Engineer Date: Mon, 18 Nov 2024 16:26:27 -0300 Subject: [PATCH 3/3] [release-v2.10] forward port fleet/harvester 2.9.4 to release 2.10 (#4770) --- .../fleet-agent-104.1.2+up0.10.6.tgz | Bin 0 -> 3488 bytes .../fleet-crd/fleet-crd-104.1.2+up0.10.6.tgz | Bin 0 -> 36273 bytes assets/fleet/fleet-104.1.2+up0.10.6.tgz | Bin 0 -> 6436 bytes .../harvester-csi-driver-104.0.3+up0.1.21.tgz | Bin 0 -> 3846 bytes .../fleet-agent/104.1.2+up0.10.6/Chart.yaml | 15 + charts/fleet-agent/104.1.2+up0.10.6/README.md | 8 + .../104.1.2+up0.10.6/templates/_helpers.tpl | 22 + .../104.1.2+up0.10.6/templates/configmap.yaml | 16 + .../templates/deployment.yaml | 108 + .../templates/network_policy_allow_all.yaml | 15 + .../patch_default_serviceaccount.yaml | 28 + .../104.1.2+up0.10.6/templates/rbac.yaml | 28 + .../104.1.2+up0.10.6/templates/secret.yaml | 10 + .../104.1.2+up0.10.6/templates/service.yaml | 9 + .../templates/serviceaccount.yaml | 4 + .../104.1.2+up0.10.6/templates/validate.yaml | 11 + .../fleet-agent/104.1.2+up0.10.6/values.yaml | 70 + charts/fleet-crd/104.1.2+up0.10.6/Chart.yaml | 13 + charts/fleet-crd/104.1.2+up0.10.6/README.md | 5 + .../104.1.2+up0.10.6/templates/crds.yaml | 7076 +++++++++++++++++ charts/fleet-crd/104.1.2+up0.10.6/values.yaml | 1 + charts/fleet/104.1.2+up0.10.6/Chart.yaml | 18 + charts/fleet/104.1.2+up0.10.6/README.md | 30 + .../104.1.2+up0.10.6/templates/_helpers.tpl | 22 + .../104.1.2+up0.10.6/templates/configmap.yaml | 29 + .../templates/deployment.yaml | 251 + .../templates/deployment_gitjob.yaml | 136 + .../job_cleanup_clusterregistrations.yaml | 41 + .../templates/job_cleanup_gitrepojobs.yaml | 44 + .../104.1.2+up0.10.6/templates/rbac.yaml | 113 + .../templates/rbac_gitjob.yaml | 133 + .../104.1.2+up0.10.6/templates/service.yaml | 36 + .../templates/service_gitjob.yaml | 51 + .../templates/serviceaccount.yaml | 12 + .../templates/serviceaccount_gitjob.yaml | 6 + charts/fleet/104.1.2+up0.10.6/values.yaml | 121 + .../104.0.3+up0.1.21/.helmignore | 23 + .../104.0.3+up0.1.21/Chart.yaml | 22 + .../104.0.3+up0.1.21/questions.yml | 11 + .../104.0.3+up0.1.21/templates/NOTES.txt | 1 + .../104.0.3+up0.1.21/templates/_helpers.tpl | 62 + .../104.0.3+up0.1.21/templates/csidriver.yaml | 10 + .../104.0.3+up0.1.21/templates/daemonset.yaml | 152 + .../templates/deployment.yaml | 95 + .../104.0.3+up0.1.21/templates/rbac.yaml | 75 + .../templates/storageclass.yaml | 10 + .../104.0.3+up0.1.21/values.yaml | 56 + index.yaml | 84 + release.yaml | 4 + 49 files changed, 9087 insertions(+) create mode 100644 assets/fleet-agent/fleet-agent-104.1.2+up0.10.6.tgz create mode 100644 assets/fleet-crd/fleet-crd-104.1.2+up0.10.6.tgz create mode 100644 assets/fleet/fleet-104.1.2+up0.10.6.tgz create mode 100644 assets/harvester-csi-driver/harvester-csi-driver-104.0.3+up0.1.21.tgz create mode 100644 charts/fleet-agent/104.1.2+up0.10.6/Chart.yaml create mode 100644 charts/fleet-agent/104.1.2+up0.10.6/README.md create mode 100644 charts/fleet-agent/104.1.2+up0.10.6/templates/_helpers.tpl create mode 100644 charts/fleet-agent/104.1.2+up0.10.6/templates/configmap.yaml create mode 100644 charts/fleet-agent/104.1.2+up0.10.6/templates/deployment.yaml create mode 100644 charts/fleet-agent/104.1.2+up0.10.6/templates/network_policy_allow_all.yaml create mode 100644 charts/fleet-agent/104.1.2+up0.10.6/templates/patch_default_serviceaccount.yaml create mode 100644 charts/fleet-agent/104.1.2+up0.10.6/templates/rbac.yaml create mode 100644 charts/fleet-agent/104.1.2+up0.10.6/templates/secret.yaml create mode 100644 charts/fleet-agent/104.1.2+up0.10.6/templates/service.yaml create mode 100644 charts/fleet-agent/104.1.2+up0.10.6/templates/serviceaccount.yaml create mode 100644 charts/fleet-agent/104.1.2+up0.10.6/templates/validate.yaml create mode 100644 charts/fleet-agent/104.1.2+up0.10.6/values.yaml create mode 100644 charts/fleet-crd/104.1.2+up0.10.6/Chart.yaml create mode 100644 charts/fleet-crd/104.1.2+up0.10.6/README.md create mode 100644 charts/fleet-crd/104.1.2+up0.10.6/templates/crds.yaml create mode 100644 charts/fleet-crd/104.1.2+up0.10.6/values.yaml create mode 100644 charts/fleet/104.1.2+up0.10.6/Chart.yaml create mode 100644 charts/fleet/104.1.2+up0.10.6/README.md create mode 100644 charts/fleet/104.1.2+up0.10.6/templates/_helpers.tpl create mode 100644 charts/fleet/104.1.2+up0.10.6/templates/configmap.yaml create mode 100644 charts/fleet/104.1.2+up0.10.6/templates/deployment.yaml create mode 100644 charts/fleet/104.1.2+up0.10.6/templates/deployment_gitjob.yaml create mode 100644 charts/fleet/104.1.2+up0.10.6/templates/job_cleanup_clusterregistrations.yaml create mode 100644 charts/fleet/104.1.2+up0.10.6/templates/job_cleanup_gitrepojobs.yaml create mode 100644 charts/fleet/104.1.2+up0.10.6/templates/rbac.yaml create mode 100644 charts/fleet/104.1.2+up0.10.6/templates/rbac_gitjob.yaml create mode 100644 charts/fleet/104.1.2+up0.10.6/templates/service.yaml create mode 100644 charts/fleet/104.1.2+up0.10.6/templates/service_gitjob.yaml create mode 100644 charts/fleet/104.1.2+up0.10.6/templates/serviceaccount.yaml create mode 100644 charts/fleet/104.1.2+up0.10.6/templates/serviceaccount_gitjob.yaml create mode 100644 charts/fleet/104.1.2+up0.10.6/values.yaml create mode 100644 charts/harvester-csi-driver/104.0.3+up0.1.21/.helmignore create mode 100644 charts/harvester-csi-driver/104.0.3+up0.1.21/Chart.yaml create mode 100644 charts/harvester-csi-driver/104.0.3+up0.1.21/questions.yml create mode 100644 charts/harvester-csi-driver/104.0.3+up0.1.21/templates/NOTES.txt create mode 100644 charts/harvester-csi-driver/104.0.3+up0.1.21/templates/_helpers.tpl create mode 100644 charts/harvester-csi-driver/104.0.3+up0.1.21/templates/csidriver.yaml create mode 100644 charts/harvester-csi-driver/104.0.3+up0.1.21/templates/daemonset.yaml create mode 100644 charts/harvester-csi-driver/104.0.3+up0.1.21/templates/deployment.yaml create mode 100644 charts/harvester-csi-driver/104.0.3+up0.1.21/templates/rbac.yaml create mode 100644 charts/harvester-csi-driver/104.0.3+up0.1.21/templates/storageclass.yaml create mode 100644 charts/harvester-csi-driver/104.0.3+up0.1.21/values.yaml diff --git a/assets/fleet-agent/fleet-agent-104.1.2+up0.10.6.tgz b/assets/fleet-agent/fleet-agent-104.1.2+up0.10.6.tgz new file mode 100644 index 0000000000000000000000000000000000000000..ef857907e0bfbcba3f00b783ae441a6f8be30fa7 GIT binary patch literal 3488 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 O0RR8*)Nm*OSO5SbU)g^E literal 0 HcmV?d00001 diff --git a/assets/fleet-crd/fleet-crd-104.1.2+up0.10.6.tgz b/assets/fleet-crd/fleet-crd-104.1.2+up0.10.6.tgz new file mode 100644 index 0000000000000000000000000000000000000000..ca38733037aa9347c06ed572741c08fbe54c1ec7 GIT binary patch literal 36273 zcmbTd<9jHv+P7WXwr$(ys@qlDwr$(CZQFLcYTNePy`Ovk18H z5&{L_KjDWGfLdQdk-<q)co_(24BSi%lgxWhMf1yq!Tt|Xi85Mhz39^ z$K|8f7oHBF2Nu$gnRwkiOc%*g0-+6n?)u_{j#+4l2J!4{7z>(pXP4(A6}YwWH|+3u zg8lGvb6Jk!hNdcQqJ?tC7vpP2T(r8bu4=6c^9_2xAS!xz;iE9&3Tn|k_I za<}J73`W@pqaMld`3A`cpw7HnxHQ*}<_wlG!Cd|#vA$zwQZ!gZngG))EaL>3yO)X`}Xz$YIJ&(Cw zi9R}8Z+u&PGwr2==B^m5^7a0K9-`prrUH`tQ09J`bAZHx(PDu{IRax$ru!u?_`x5vVInBH~2?6nip| zImRMWszKAX6QJrzEYj1Wf4A&fO&>~ir)Kd8jp+JC#}}fCipE~a$YsXc+sP`azv5{m z3i#`hx@az|*I(D2jKKBDZaq&Q8qSe@Cd!m|p1(g6q#h*VlYvZm4FhyZjVqZ34L)AP zA;yEy4>>)qigF(jggdSbp|)S;WNl>bN8$M9+W=EGN~uxtUexs>Yv!w_WXQyJOB&P z+TXNwl0MR^OC=1bP)_l-ul=n@Xha!jrEf%GtikdoY9cspPJ&7(vtssLdVh?z8 zvnq0$v(+NQ(Mc+lNWMoc_M__k=RCS(6p+cUqJ84jg~rHlR*^7o26t?!iMe%uWpB5BsPXh{CVKQ z!xXA8ItTeWXv*PUs#0x6)){Gp?p%pc!&iX1|BBq7GP9O^;#h$W#Ee2+s1D_gUKf{H z(F6Taif|E2pHRiu%qv-Da7P1A50TTD$V~TH`X2jpF$^6eBg?=SxTj$EmFTgUSh{#5 z(z6eain5Mf9%8plm9v&ZB0>e=R}KE~6_UyL6g+f}c1E>vE3j+=IQRnY3}dr;?;$Pb z)@IyR1=l@PQnri}NP}z8pvEeDOZgJHCB4#>j3#be8wkpt5tfe-so`O=2%?>q9e+L& zMIogS`gtU!ZoQbl8>8E-%QoXjnTNQ{&@H zNjo$bjiT=rfqaoPWG-=Ue;v?3Xy)6ZkS6cA5< zTT>xpF$mO+GWdNbb++L6*oU6Zi6q3~`$P_LtIzgHhRIb=)+QkyGzuZ;B#EA}oH9xv z4M9>X^n9n4_4(AIviTns?KRCArRDIAWo7$UsQsu?pp5V2W2Mu*et+G+-y3{2m!}*1 z!Ak7BwlPf~I#oZzG69)@>Uta)jTa^i$RP@`8#n=zMJHoH5&!z@MJ+!M_sF6lAnTLw z#KArq1b1CeZ(7?|+Wv#ZG>V#DDagWuOIA%+<}DkiYRwy}#a>g4~vt9$kUz-vvMN8_a zPl+flD-SRoHuZN?Wt1b+AJb?1OJ2EGxg&YEpc&yKW-3P_D4Cv`jH8Foviv|N0s94H2P{PbQv~)RJ zt-xOvb&Mh+Fxx!f+$xFfcr_RMMf%k)mUG-bophZT{z71t)%y5jX2Comm1*{cb%2(Z zr`(wJ@=1W;!BOg(ftZGK_YMpv(pZ*D_ZMZyEsz*3`{u~zyZ;In@}soOvht~24EiGp zNu{++D(+vzaO)2yXEbBT)dU?qRHP;Q+);JpcZn#$=?`~>k11>sYI>Pm_XM6ROtsRh zOE`$8t{3#v84t!`rQUF{zs*8#FuxYxfG_M}wD%OqO7d7z6QU>_?yeVtnP3{SW{TIn zr=LmYhdZS?#eIhY6k6W-?XY2)1-<3%$=bcK;m$%*>9P=1wr*^6*mz?%f>N(svyPUk zdvUG0{fyFPS2xh;Oa&c$E^rJZt;z4p(&vwuY`C1-FK7H~Fj`Y>XOzM$tF<-*6B$Fd zF!P_bq8tYl6NswfDAEhw2zsOb)iSc{4mXL6_;{B%y0YssFYphbf&;qasG6>6 zRbn#)g{(5FCmw>i#SN)4wmI3nT$1#8;vSOgM_&j;aT)kFtwRu`keP7Z~LdbU> zf#5ogk@r^tAuO;KEu<0Uj%OdKT0*a?+xoYV9IXQ|*!}%8)ALT^61`Kr!cA{i&1zI4 z=c2QHvBumESbkeNjuxd&ak(tKfz{+WfA14?@t|%03PHsYfE!2t2)`6`_B)p&D^DPq z3QDJ%i<{(#GtPuD*06$1BD`#_Y|0>z$P{4d8Oaf|Cz}()K0ve#{&DoIe2M2Zei{La z)|h3QA$^o@1W`Kuv-pW;u!2=-_Q{z$cUgc7&kaNI91@Kq{J1)}1M7pRe0u>a{VkAo z#BkTIeDzWxVKOY+N}yeOwf4G=c=(rBJgIz#=i!g=qz(0gE$!b#npmt?c9O|#=cb6w zYH;@eCJ*7Nzp=x&OlQ;&Adrf;CUpbemewPv2-Vfug9j2w*xtOE>2PyQgVcpmz`Q^` zD*+JQQoB0FWi+ZlrF-6(Os9a}g{2NKZ$o*$!V;->BGz*ev#KJLM02h;Iz)7HnUT~t zMp-I&v~}B69tW>me;EF3b>1PS`~D*kWcXu@Qwm5wKSqqZYeAXZ(KxxfI)B(%rE`|S zpf$zgUu}1}13B_t?a3&9I)ue2(-E+4it|-Q{zj}}m38Ofdr_OoH1vd+V$~Cvwm<)H z(-mu%a>pHh2ulmq-TM`ary>{@M4BXlz3x@E-i>-#y$czC_nbC)omoR4t_751Li3(F z$19nBWPm>$t&c8bKV%z@z(N{!>|Xw;WdYo*TL7Tx2;>g=Zf4Lz6p*@|x=)sL0B^Vj zS6iVbFGlFG{kqLR*ENMm{Q!!nk%E4h5^%7|%^YqkS@Bl)PNWHKx)PI-{|-XQvSW`22LHU_gcJA^U}BO0EorHe@sQj#?r zDTkf{+WJTD70|f#Q|uv(U;Zfu#S2dN)A>n`0rHK`AIH~Ca!sl_w~(HXf5=!t&->K$LHw#@z6E)$MX8?YrNK{{U*BTDDQNuuzcB6^X>TSqjhy9 zw;Uhx3eWS2?KxI;&6|9`Zndt5MWzEEgx(|ggqBF_rK`&sJ6)NI9@PfhwwA$Ik@eJ` zz^CRG*4=S5EY9*=!7gQF zr{zYowwVilqzfZ{elTJkBn zvd!@%B#o?t5PN;j|5FAq2Sl_HiGy)KT13=&5PapOd4Oq5?!3Ff{`k|>O;O!^K30osZu3^zqGrcXv1w}^R6-l_<*K-FLzJdu`L96g{& zx%nP{^~fOS_R}dn89(7s+1LA+h*%CCQ#UJzR64--;|M*He!+AW4aE0p8Qo2==kv4C zwAcH6xp9`C`{SNQn{MH-sZBk5KS1i#$cBpr0=6^`=MDYK6@8#_zt`>U@}c%~KJJdq zP&h@c?KQ<}J6;g~6W~g=?KlBqAc`Gq1CG!Pbs+DujW{Z>{_c(VD&XMqBz~NdJ6&2F zOZouE#Eb&JdQYVlQAzPf(LJ4rw(GBkE=pCyYSslyW9_Pmll!0@E%l>k8@1C>tsGJJ`c|7U5;HUo zYC&}ls^8XJO0jnrRE$`DTdKsYq}i?)30PPAKr;X>$gfDv2qa3DOq*wPe?*jA;{sv8 z2NG3rt{Lt4$AMS5+SDMNX-3t~LlgNW+zcF2itSEG0j`zWZK;^*aa8VKSVt%8-I^XO zk23eUWA54y7L$d@W1(kp^}w?BnIvskcIpib;epS^)cK1)%{K+^kq+_-pCJA-Ea7ll z--T_at|QPO%6;Je3sqYvY5!dKB0qU=h7$1SpJdA!G=g z*CN=gg8V;=#AjYK>V+u=bs}g2J!Yh$BI=b146K$>hs1q`R{`AovRd~Jkey!OAYh51 zrj(#?Nd;TmpS>RaCTW>Q&l#lhW4mq9rcIjzH@Bhl7jQo|F#{w-tRFDx6n0lDK?FLe z#11_`mvd)_Q#ZINyV|w1*Y1niQy+qce<(Jx3W4@Y$c>ULKlZO~LrEf=3qe`rko4+W ze@>h)P_a?>k1uRgvBeK(P3}#>VzY`&uULR%44r(re4iTrlod-WOL=ocd4=whHdo-bJE4_4^D;cAjR)R^L%w)U*gYj&u#L>WTCwS+3W98gMCy*gS_~1cixTa z&f8vMTgPKbsK?7>uhi63>~LKeg03#84;8MjN6b5ui= zwMOd-u#Hu|JO8Ynlr9TAM1SpU&!z{rR^q<11vS6%!zhOS#5*#3cSD#j3H%rUCkTT-k)O>$*(u!2g07fyr0w{AqIGszN%nCRihCP`QJ~TbK%EOMKjS0ZiqM9U z$=%$*6(Z~T?^0`islrf^q+1NlKrx&5!l{@=RFzeQ#L{#S{6+U$Q$NPvRn-vJ>31~y8n9&Iuk7Wkk2$N(T% zaGTG{c!z$?u)f6Xwl z-{cw*z~Gj=ypF1s?3~-Vje-daOmq#tr>~a66ODX|o{47J(?31vdq*jkwrQAE$Dq9G zz+3hlkx0c^O!2_`V5)T{H zPVE$(O16#Yy#5l-l78Vi_n*JLcIMY{RE>=Uxku)CZx8roa;-gC_^jDmcDU-A<>svf z2`f8j)C{H8a@z}rAAv7zImXC#n)(3TcUAA)hoK*{IMbldcCMnjQQN8~$|d^{Tz0p4 z7*S}vXZ7%14?nQ_?aLeF4OOSn=S6?xS$oUB{j*9{wP_M`K`6Q;V8n(|4+@RiKRC-o zw8_f|;H34`M;LT~_~NikdPq}yHhrqBJc4V0RCbIU5X41Kks5oGTx5v6ihU6aRZmtz z6YV>(dva!cn|~dl_MSdqS8gErHuZ?JDndUnF55nS=DZucM$!)ey^-(eX%8-O`_D{# z#U4AB7x!Kf4l17ch$a%MWB@URQ`}=h0b=-AZSLgBzjE*6{w3pmD{DEyA_jPBGuO|r zBc4M=Oc&vwt-+Aqc?@SL=vFnu-%R`O8~z*2Sx@kQlhnL?o6#dRI9*|gWSvzEmlFHY z0P-tFMl9at!j3L(-B8xb9-BNNPMV4BqbYc_Rm)3~ZH)vZ(?eMwp=h zYu=i}^mvZ#n<42BrV8el$z~EwgQQSTtcr{4@-w2OA$&C3RWmGNX)`ku^@^|?SZ5j( z9!o9xLa`BUqZ-)>WD~f(9iiNF{B%uR$?D{*{0!t&;24I=ROWfbc#d(5j{NlU~UF0S$Qy(5RuZvpPv$%6s+z|j>Ic5t&Tgr z`Eg^(oW^5?E8@#K3?zbCh&o~KO(q*WK)h6oL_BkYFlxe3sx~Be$8N)}&r^@yRTmqw z5?%W&(TWq5Y)pbU-SmEcw)%dId|M~(G`Ch(ZmxHLagTB60V#C}NS+wWx)*OC@N@VN z=gcX*o^`R!$WJrJDEaHYtDBy)2RMDz`^58@Ak_#WstT0_8-tWH@8OfK&-l1RY&4*N zH4kuBNX4}Z=Wa4?|AAsUjK%Lv4SkmLlyM(W_t2`gn!q<~3!eGynRlZPSB6k<;@CR9H-2em5u?9+>Af->d!U;RsCtUYQ_&;J zc=de=!aTmQAK}2eZLtOFeF54m95=Hc1#BB$fIB zGF_$qMX;I{g2;M8D^uGhp^RHjYE;EEWfpk{1uFVI3u!9}cd`@fAd$L~C=zW$&VIm* zp2t*C%<&mLmDpS|IT&ZnI{fM{5&E~X!Ub(!pcdC8rwPydc~wh_h<*DkOciDUDZgP5 zbT>N26bKH;FatXNxTsEgfsX&!6Q^Rg@OB}cFf-4|e5$zBuacIdeoUa+I%*F$<@FH= z?9Hg-yj)!OqIfGQv(*j?x=L%%1VqY3+-id=aCwt@Jf*lK$7{wyE-LBa>mNAn-eH8k+ra&KJNN z=+ZF;WW@eP*6763{ROAk;OQ%(0hK)^zWvJ#BcE;NXk;c%bHO%t|0)({>W2;+9Fm6%` z;3WDA%1}hrslYPAq63lY&_#m~qgWq>qgK>iZ7_CT`^{7jXq-iNZLs$yyU}T2qlLcf zeA*{67H9H^^A>yJYu>*;jV5?qB?-R|;?ZC}AKz7Upvy_$JRl{)lT)0bdw-|M;|DhJ zhI!{7xTV|zq_d;W;dE-6K7{cp?_;C1k!r7i>lLkpe$;9U0-UY5>G^Rx2hj%}eC>K- z$2V)-k@J#6nvFc-S8IUfWyb^f)ICh}j+J#KPP&j*<=pI|#2EvHV*AL|6}3d^2KQf( z`(@_4Z=&Zy`potQmCNaP|c;;@AJ1)^h#kwz{S)2058ADIHH}`OCZbNGVt^4vx7vj_F z)A8IBwi;_okku{a&>VQYC1W?M<4risa$vovS=b<9Y%4hP7pVe&4>&g77GhIvR=<1g zGDwhW;bng)2MNFgfur0kevhT=<5;rd1;I1pu0 z)|9Fy$lbEjfN+TBCfZuP?k7^(PCa+l!(a+AnA%9?hmaNVLNHne<^x23;)bhPD~V1{ zan<$n&sN$qwAPK#MK>{UQQWo}vKB!i`XB}riS*b2dK6xE@Lo&4K+BX{9T44;B!e5L zo`CY;K4TD~+JTsyP7kZ7gdN{L9Sftb-xOkf$df+D$x_Svd;gqY z?CrYSwkKp$*IazG^-4EsHal0cz`0Q=>*+5q&VL7z5$2x%rcT;==yz68gF&v%> zBHx2;761o!*|bAH!7&Jf=0$>z^Vn^~8^%ZjMBP!q$>>Mf&Tmj#c;bnBU|yglYqeFL zFwRwXQ^M^9S|u14u{YQl_AL|VFT38Vh&`SI#22kvs<$ef?&!-M_dV`=XDBE&?S9m6 zPj}#M&aPuDVhDv$qqVbbLt}}C;e{Gk@i#FZ-Q~=e`B2}SQQ(^owY_&0EAYDTRMh({ zb_~1AU!Z9dc{>UEw~^Scy4*Ic&>lKgXU=~7^P+OVj;>NfARC!6f_SyOaH$PD>hy2~ z-f`{O&i?Fh-WVRlK5e-F8Ts(IXo*~9pDTWVjD7l9p|y|}=S9IU##+D1F*BIl7UIc9 z>YY3i*b2fziYNlh5V}Ffrd+cv0j`G0%W(wWj6y{sRbshWwt5C*m3Gt76Wq=a7@^2q z5WPTc{K^crc?<#3UPX<;(7Kv9)KST>A~b`|x$6UE;rPe(+-Tdx#Im^sjze8IdU$3# zUAOnupy;s`y%-$`aZ^HRBXMY2Lwx=!vJJFbcCt%=U6}m+U$DsPdi!4)b>&(~+B{7hIKX<{*Ch4rSZSt(oe{L=lV_T31o?2S2_<5Tn_`}^rl19!) zOLtoIe^_Gdwb@;Vs&P)Mk-5<$NbGY&nI=( zu<)s1fz&MR@(>hIl@uqy9?qbPb$Np$zF{*Tyic*jA|n?VXZ93G!iNDfr>7>(()W_> zOZzv=om8Z~LIIeS(Ww0wx1fChzY0Qpya0<q!9gkJYSIP=b@M| zao&M0WJ}ox>x}!Vu72U+KQob6Q`9x{3sH}x*FgfQQswhMbh^6Y@n;PlU6nkm&U}wZ z_|n*F4sY)saX`lqS%04}iI}gp_fExm%kk$84g#QEV*BirKvt>r$45|*F<5tIIw4Fk zdlMzLX3H6RUt>s&zZKs@ z;h`IXRB;*DCON0yxW6 zuK3x>+5{V7pF_5ggTP)pi`OyVmblwq;(y1Mfus3)8lEJ*Cf}4v${G!Vg z;e2&$O#V>%ua0+e4BU`3hZz1Y6072s*?IKbo542dDtg>!oUa#nx98Tzbv0j~&%vqh zo!ZUZoX_h!-|6mN{7t4)(>bax9QI(Bc#BSa*(ZD*HP@DgR%V^c8Sby|XSR*cZ4UQe z2v`SVg&ns?O4XL6ykip4DKC0+*Y?W*G>fzv(P67FOo}@?9Et<`th4?2yQ5w2BJSRv1k}L3x%m(M+rrtH=>vz;e{`t=G*pr)n}y(3>XK!p zYOyX#w+@P@z3dPW-m8T5ErL~udrzJC#@B}(q7z3^wUZyWhI!F}MBMvmn-vtn;(?Xp z7*eR;EOwVE3EZ__6m$y{#Gzt2VE_u}Z^@^PZUV-rFnaXccf|<)1O2A!c$e#iNSXRm z?*lkb8uTNirK*`s0n%GcDH%G9!XWGyp}-`{Tn!Bud34*%+Cyq42r(usD%R(u@4)6j zW24m*EO&B6~JQodt6yMe$<`B)K z@RzyWge4GjkDsj{&aSr?w3{6UfYw96Cm}oSzZ2{ljH2lfk62{Pdxr@zv->5e zB!>gXqmv=T-NnR$yCJom!*te4)v?8iJ$hXTKpWOH3CMn^B~+e|vMwNV?~L&24T>qO zQ)Mj3tm-^re4TwRPeKJ-tP(l8@WhvFy|{Y zax=yXdmsdR$b#8sKsz<{CH#uBYSnxnf};48huiyu-q^aYdTesQbg4vwO^)ERe<+pn zka;GX?kyU~JY`LBXBK_>{dqOM4SkkGTK+`PbzQwOv3F zAq}ADAQJbg5m>gSnYaluSG-gIy~giXqxxQfz3>n?@&jK#jvg)GinNPl%Y{}hur+<_ zl*gDSNYaUB?FG*7RpuF;(A$OeX(#e2q}f1Xo=r7XD-dfRhMjxNTHrB;B52>*}Wg(DiCI%J_ z>NBMwh=7M4al&XsWD!R;8{NH?iO9{)d@qA(mt;wlK~>+v3L3SOgbU^TMSZwR3(Vuc zua^@VehiVm^yx4yuupuopvs#lXm;k}d4_Sd(kLZ1P?^Q^k&N6WvH=|V3v8v4&j&nW zxiyb7N7aO6EZ`6-c`;K~Ee7|dK4{c%?+pu3`P0D2`Zz zkklEW=Ip@oN?%@;I=gWt1&3la3Aee6cxb8VledWz>? zJ=fn?J%7s?tM7HAvl){)D20j^+c*TDwRcEq(q zXV$#iEo~Dp06G@U4?x#k4}p#uPn?=e>@<*EXP|rj9fmU^d<^(A)ATuc&ydjK zKY!&X%`Gn`t#Y2`8nh*sYq>=3G9VvZr1q ziV{V6c>YuHTiOHex;(xgAR+_ZHY^+I9MhVM7fp+Y$%FLj6`Qzuu8>cwI*P&?dA{Vk zOjHSrGlEo{^@ek16QB||q!$%r&h0)Wiyc1h5hEozWJO7#Z{EU~@e;9(bWAjP@F=Sp zYF$1ItwfH&%Vti^;dx&-SCT7Gl0dSbLUza_>9&qMW?z^Orw6v(+GdT zP&}x{!_tp<6ZXxC8P#_RFz%#lKj8d(E?Wo2(Z!DLvo7tV5n9YrQLdmqe43dC#5@pR zT=g!+W*glp6yt>0xLz^=jj=}dzEZzzZ2cu4O2j{gP=hiM-lNcBRhmUGU_~V?^WBGV>f# z0a=$V!q*q^Naddp`ucK|e*&3O`ODT+!67AzX5Wmm#dE)D;BWreT8Xmh*Z+I0xjHyX z6O4vQYj1aDrWn<-QG_8IG5_DFFOPiqx5x!!^*>pK*}y~t7D};bHcBzg>6-x`f;g-l zeb(<$h$ZS1+e(W_f2G-B`lhcgxbOzwIxm4^JKZ^I>Bo*h-PrRD)@6(IEoo`0CZpMN ztjd|icJyPF$><2h1f#zQ>tSn z?dS3~Q$0ywZp9@WHTtF+>6uC5Bh03G;U`>a%BTKp z<#W!N%4RI(bH5Kx^;jeX-y#|O{CnjnpZ*$8x5&4&E>!yL3w7R9kt&iriM9szA1gBw zk|bLjnl8TEvyso1fW;%808f9IGR!C;?#T)KV9FV!>m?Nap!9fig*K|g4lPxNUUbOW zKRiwc-%L)=JX%#^b&+c$wE!)7?--`5{&?eSrvMS82U8OKm7bH=cP@9`8j}Ru9NSV? zO-USg9?!a=4B*gZD6z89Vlydv{yY8=3Zlb(oF@Qc%HA=u64efXidU8d3T0q`3@Sq@lya7OC-IIvLMzZPBMd z`LmF?eM^}}+cIS>kfMufgZOCneDd(5Ii~|@3K8*zh@^N&;QLzH*w8e+q55V7;M&3F zs8*?$)@@6myL5hvnpXequ$*+K33tp_uUbe5xKFUXcj+39P{XmPN-FRihE7lKz%e%m zV9*{Rv=p(3_IZ@7@=Cl(;j|LP1VmA~ZEX+B%nnoRN|*Mhf-C8QNY_+{nC~#qLaQfV znB8FpMj6gA8HW!(oI_Z8P$u`iQ|-16lPNT|?%1uY)T`ExVy&yV%wa8FrE2!au!I_7 z6NywjfaK?HR7TO8+zMy;IXT7~`P^e4-CIc>O`S86MZ_1sidXdi5OaD?0zw;g zp&s+s?sU1(cP3W90W16UQxF1Gz=wK@&Z*?N=x$xllGPE{A4Ea0CyDm2G#{}|D7IcW zfp1xa@10YWcoTil!fYG;b4eb9v%8ne0t39uv-vvmZ!KPhlQgIv&4rMRDkg->Y8Osq zU#@(97Hm5v8&q*=4cQ>r_IH>6v4eegeNg26-K%#S6Kq_KO|2>|Hm{Eq;9iJ^gTr4< z%@64e8dd0vy|8*zrndn5ly4Jp&)ijSYd@o`Y`|K9dbHe~cEGc1GIU>YY~5%_i?&vb z1m2EMJD@OKbZ@`R6Jtiho&I=4!3OspPaI+lRX99he=TodsyPz{ty1OBP7!oyJ3{&J zqD+yjVyAriGfXNFpWHt^XQEQ%?3WnMSrSndXAq$JL48d(_IZ8U6<8)5#UsCl7`3z7 zW<*R{E5*_l+ALAgcxB2(!jntH1+WVP;EBbunLINJmb&!5v{*hamXCRYvL{2j5!dK|^U+C<4ulG@rky0}0r>Z;N?&&bkR zLGi!Zt0t<=ymLPFnL>1|%Zb}CcEuOxKOg@NL&G+W zdJG(-3G7W2c@olotZ6aUo{4vL;1ekYlcJI5 zhPb2da)1JkfjOWAWS)l}Re&?HPW>OtEd`0+d<8tc2{n-$rW>t`0p~Zv_TFQK2c$7e zX^Q#DEAaGWmjazuoF-JwWgiS_4{7=F)=Xgud@kQSqa%#4`^Fz}RTnNFwO$i9;Fix4 ztYX?BY(5JDZWS+#NzM+9kiTtcofQD82pU-U&Q)HaS)ZLE!Q(leR4M zZ@?-y68$H)%erbmAdWdd_hWaVsX^6C@0{=Z55n5apet(Ro-yAa;5;82>z9@M{NMT} zKR0UEa&kT|uf50HJGr0dsiAGtO-`%^;^q@i>m5DrKi^l)Pp%i@1KbljyV1POC_Hu= zaK7mm&?j8K>UH5UeF6C$qEYAB3r*MbAaJ0^HtVk5fh5W0yeU9iz+l_4Om49ttwl!A zt{wIrVa^`H1)A0zlMP8Eu2d-^pHT#pC~8A2?x`uWKW^nUk^|~o$1^@V9`jc=TiHF& z*9)Cyo%IYmyFEf7a@u|$ltqbC( zjPZLC#j!-`M=iAKo-e5Y-teSCg1TlT$OD9e$^kAnVy>F?leKFps>DGjd>3>FNPsAS zyLRB~VR>Wf1Hamp;Q}$yNFcO-{<5GVcgYKb7U4^K2X}NLl#p6>Y*MX=o0XGOQ?8yI z=Gl8YW1{9KIV=DEo)Q)Q|BVDVN1|;yrU$D{)l6=bt*!Qhxjtr1j7Z%;_KSye9O9L)k$08n@7_f*9vEZ2X4`>T!mHv zn~>Z)GG=S9ZCChTjZlm#&%U<#)7}0tlq-JkGW}==9t=9CHemC1tfAh2foQCgXAB-a zOt>QogP%#NwnO@#e{HyeYzzzL|1oJ&A5K-&M5tAK16Mw4*neb1{v1XsU@hTatY*<8 zE=c{8G9Y}Vm6gPjvCCICQ65X6%pklJZ&`uu=^AMTp@jhCY#4(`8%BD-Y60 z;w+4abkVx+ai`6&VIc}DLtZ}Dv7kMBT z&EYs1g}D3%lnKzLDSbCVA_^QrxEH`vHXzT`v3;SnB2vn;h-M^sZ!!-&ny-yHYK%i3 zgO>8VSfc^xgp~+r##3NGGR0BJw<1yAOwtnJWwv=irI`x#oYgc#k#nk9pW)=$%VG8H~C1zG=Fxl$5~J=^7OD&IVgtz4Z>&9iU`sg zKwZ#wxB+O16@LJFFDcO=w)?y5)*gRWVR?HsjyPhF`MAkQDH=uxL{vFCF#Fgq%DPZo6rZ$wU?;8w{jYEO4L$R#wS&% zGcJvU(K$ggkcUN!wzrXQ+Z*y})w&D(Z@wXm5I#5|gVTIRVTf)L^Ci0<0|YmsQxK(q z(n`Wnh??A{S(Y)+7m93#q2cF!U9i<^+akW1X7E{|uRRtW8&s_#gixrvlC8Fc1Ma|1 z!VLVYiEzJFm`PDUye90IyNOGm9^_q)mjO#L$8-SSa0NsIw}{+Kx3!^Nx!-?_Y@#<^ zSw3B+{|NQ_aX!QXHL8e-Ox8d`klnufc`p_;RrpUEuv%Mos=22KjIx{f3EA+Bku!O#>NGO8x$tofj85ir;|h1`xb42TsJj z^KDZfJ>>?FAsR#dPtj228lkt+aoRLUKV?waMk=B)WglA|s#N%Z@`Wz6&imzURjbP~SS zHCHkq+gkfU;`pUa6b3F+;fj&&Q2-&oaAxVX{@f>YINEh}WRo;V-3)L`Jst*97A8Eq z4$k?TQ_6u}k5CQNbfCB$A2gato>2qCHmBxHSaG(nh8d@=(HvnOj1d#W0pj8Y*J(AH zg?d5bWFm zermI=9$}#g2*g203_a_@GGExvK7_4C#y|1_jYU(B!;BpK6dtf52O%4_1M3o@X|*qY z$FGBy4(NRTwY!{oA}*!QLG&}nr<;H9NiC;T!Azj*Hi`!-zvq4IS9$?u#GBoxh_(S> zRCY{mM+;A02VG%y3@pOXnL9@w=yH6xn=7jD&$C4hKOLQ9!D7;O)kma_3;CpxeS2SM zb`0_jg8!)j+rrIsx#G!MJW3a-jH2Z<+3r&W#~B5pZG2kw2Jy&8U&))ALcn1!qY&*s@?+UEz7+j*uZ3$%4rM+Gbb`XvB??G%-ZI@8 z7*c(`^oe%i55{e4JOT$^&2VKcg6 zcwufttcMdOFhV5e%!-_na;|?bN(STw(r5L^6;hXu6r(DViiw9RJn)PfgT)#u6UZI$ zWPC|$wXF2OAh;HACqGm!q8PikV>Obc5QRsFq8(&>*->e%d1xZ)!cf*Q; z@xC(CSudN(y5}ZKCg5--=R{fUq_E}-Jao513`5Xb+vQSt*NVGov`xW zIh3zCzk=`z)I(&XLsQn$bJJvHuY!Tvqmms!OB$iUL)o#3c&w@>#B_yljaZkhrW8tv z!%H#4zbC~}K|l2~FSs6NyvExl+vKA4PI)Gs?%6b~IRmVS>|q%PxBD3Cc`%+#HS!&i zcZ;6EY>ri-wdK*g8_Am+d#jp#K5g2?wH5Agv@~LCZWZuGXzSmQdH42wtq>~0IT+X9 z;Qeoe-SW}wcy_&y$15a|CWq?E-DQD+l<;^fuF%AL|tY}^tx61+tU(W9H;Vp;m$Qg3yi3iNfS(MyK5yy4c3ksFgk8Z$$kHQ6bF1Lcm6=v}of#26yihvBt_ zx*GQb7C5c}E)MG?y)YM@=6IrD8&cf9c}FiPN80MNIFtMSHVmz%d#w7eCo&Jr%8UnZh_OQA$O&G9A`0mEmq^j zK3!^pE7Y%?w2BFa2N3iM6n&9ClfvD5(1+y=qhJscNfK#&$a3*YU)=d($a3~#xcLc; z*VOeqWZ%5R-0a(ryEx;t=96e<&&oiqxseY_ixc5dK}1W)SZDZK#cp*S+qJZP;8EL6 zY5e8!73Vt4R@o!Tb*C(A!r8fqI(gZjzXfPP#r>0IvJ0)p$-;=rw#lG%a*;oHCFRn` z*7A=6hX{tVJLLASU|E6S1>?9S7T`b6zbiGkKe-6%Q}dVno_3?x$7?G|%S&^q8fIMx zCYLF91k{N3jLC(A-W~?t9)?~6@vEnKjC`I$ADxM}*8D8`FQ2OLnx220T;T2cYMA_HbYmelWs83!*g$qg@R$LUT5w(=)F0^dpN%9zp%cxdP4ic zfV~lL3xAR^&)G0^(_%E_{FTskjWCOd0x z9NLPPY@ro{z~umf?P>LEjFRVBik9KNmz&rCEI5u0-la>sm2KXE$pNrcJ&AR1ki@Hf z0}M<7Gzdg!WHJP_7Ds_JU)?AuP;6unw46HjTg%b7T4DTvdVQTeb@3pVEjf8LD~?q< ze=Ry?%e0JqgqpG4Y6S0YD;|W3Wke}21r0+sok)AQfz9-*l3s(=_l9##Y4NIb@Dv9F zr>V_+zn7Qw^8$y=i2xFAfr(^pKqQZTh=cfQEO}pIaK1Xi|BtJ8jE*E)!?t7FwllHq zWa5c!+qP|MV%xTD+vu1Rzd7f8THl}Ur+4joy4I>%`^R3_eU;~z_1=wUTBowM`BULj zt0QrXPY6aA*5@Z-oN42FVW?say7RpdGKImvA9A#$=#}(O>O45nANsakMN(_F14FIk?&2<+Jt+S!w~-qD&%W&DZfYM%%NLS-8)| z7h7dD?HBAEzz=QKDtcx``oCOx4b1bx4>;WS0yda2@7HQn;bm0h*d-KrmXMdo#=k$2 zZP$Gp2@7()dTRbZw?a*sDLG~yKr%N=yi zG`R5ah>0$Jr7IIuVU$~4uk^MEVXIoVK|#~1Nsih7a6SC=z8@J-*I+t-q4rL7v?8CB z+CVNSyomDxi<~MPBO6qnsZc#L>6oAdb^K{1X&iT3;y#;3zsK*N$y!s?zrvyhr?Z!B zjH&*tLe+kHyi`eH<{5E-+2pZr(>td|FtnpKebT7M4S|BDS%Y87B*f<~)NpZ}gu{vP zb%40Qv6i5W!@o?~d8q>pW!(3J#EvBQEW}h}yXsknF*KW9(!gQe0)&8flq1V>!P;Lw zo{sJNV-ysmPX8*bi|B46@}nay_mj=&hR?&VXQwX!%jl_qsBOEyA%kJnMZi+xy6-m3 z`V@xRzAaKgm=_Azl3R+9enQSY3vRg?_vfjBCHc1Pa-myHI4R>Lbt^0Mm^PZ)$hd?~ zLG@W_f|UYw0=L}n`K;LP9!8fe=S}Z)8&aOJsl5p>$k?cL52R&}t!nq{6(~jr7BP$9 ziBLU+Hj2Uqa8R7p^&F8UgCoRS$X-m#756Z;)v+LuGN8N@zxz<#b}^zO{njmuArJ(h z1`w1xE1wjI9c_;qjsl0IPBVy$PgWJ|Sy@oaxV9?`S8}sL!;?}PiWPtaBWT?)tdKq# zlr)R>hm$y#aD7hol)K9%^{a^-n;@CvaSXlOX}F_`rtc1-ZW~0}Bfm}F#nO)8*4thU zZeazqk2=D^Oz%DwgT22Imh~x*adEfaUIY=^^%%*D$6SZG)qRnr{APHfn|X|Z3F-R5 zUq2_(v`_}2JG7j*c+q?yh4>?`|DA-HcX<=4 z2+D`-4B?7|5WcoHg1G3twd~a!@b&)9{LaS|>HFuS=}N}j^XbOW3^AGWmz0)e}%n?L(vTuS7FEcYtPSRhSn6L&SPqX7DJ@%C~g2D#1xSttVI7)Im*v(k`3CZI7 zkvLH*Gu}K|%)uD|XLUh;^lgtRBO}W0{G=QuY~*h95RSv&o3HksCUNuT+;sWVH2Zw> z5h9E&Betpu1>b$XT>y)LxeP{U3b-6-5wrh)*|J#*7Qkq5*7TOc=T7-x1f6vu^H$&U}>D3|opGk6dS^w>v`zv%NxTGPbgk&sI zIF%^cobXQyhV?|Jc`)G2j= z8LOIVQHA<|we9OlXF(J8{-S3|h<}V7Iexdd?Wj`)jau7G3`x z(&P6h|Kgs`+{&;g*U%%6a2Z40Rr>dvm zr@#Ku$``!B_G|$?!l;4viMNSQmA%R&UP1_UJU+x$pBcMICo@FA%BZj+4I^Sg=~Y8q zO+?Z@D*fvOOIIzaqs~5oV6)bJDPO(d;9lZ>eJQhsd=@Ug)d(vOf0a95I&SKGA>)Rr zJWQ($WaZayc5*w+*ez;X+~5VosJvdPQ-L*Tx2@}$R@+&9tv|7lp-9EAH7Q4+`IG2Z zERyKi&kd94OL!DD)R}*F_lsG?ar4k(nLV{AbwH!o=NUqUo?s#I$T_8@d_==gfycrE zHTQ-5DuvBh3Sd59Z1pPN1F*SBMP{aaL|Z|n`drt9q zzh!!PRF$h42B3}MIa>6v)bDPuM10 zsvHkNXX=z!ukb9)rqe7}UXODTAh*u}RQtk68uqC;zZo8FLg>{tccU@;|9x(}c!tm) z5-mz@2uj)UX_^>N+d9=~ZWrLObdV`>Azmv2Q1y-a8}?_smnf+x+c8l5LxBAaOcJTd zg`iW9iV~vJjeayrtfm{ArKa()2+wqi-HSJxVhAv54~lJHv6S=Oixl%dDBG0t+poW7 z(ujCPkM?sp2qD`rg_I^i6dQ(2N|0Oyw8neXj2pWy{;6jYKTh7c#7CmNlmvcFoRyED(-6XJNA$LBZ3lw{NOs0v)nNzrY)G_iT9iUP^(L%bk^qVVu8BM1_0CU{qQCDckV{B8a zt-^gIgZK9HfsvWv0o%5S6_HGRb9zG#4g#%|TFIUiJYrx6Ko@owZ{;0=!W0R%pOC4> zSVT|$L-5I2(OD2owwo!gSY0}oe|ukn7oVGGn`4!jelov?(y2~)+*c$KJ@u)oU&qnl zvaRDH)>NEmkaDxKzJ?&EZ`~bTb~*H!(uJi&2QqOJc(H~4E{c#kkq4OrK+i@gA}1vl zzM!j!>U$Z$=+?l^(}g!VgT&`117X9jC0Ja*yDnah{n|@Na(U#e(t}I|0Sck1ZA>Z> z0bbH61AGHU)dXGB_*3OCa#~6%n>WqZFkG$d{@5kEi=v31;uu0)_c#FI@W>%2@EE%D zu+<%S*J5LkhPPypw^HuN5eqI7abz?{Cl1ns*msM%++ujFHm3z(~c$YeaM@+T?yR^HwoEc(1CQA0lrf z!Yt@gvdMJC%^D6hyjW?{LNx!U|C))sO`>)|p*~fz?fTm!iq3h_cDwDPyJFkWIpx@ywWKF^ug zVTWurBK|w(&@urUbJ4&xB0$C0lXg*bm+t^-9Sy_GUB@D)8L%uYA9JzDHQTqL3RTx? z_}jJV9D`Ke$nUD4=R(xTGloHB$(B?pXuf9D)jP7zf+v;JvNb(W;tGStZ^?(dfh5(c z&@pTtVQ4eUnn=jEnypn{+#QV15ru$q-vNa{V#)x80M`bEps+JLcvR9Iu36Ik(ni2( z-(l(B$dc+MyAcn*#l&YJlZTsitN4zK1Mr@4yS>8DXWvniE&lM$9Iw<4z9ycvoxK#)8kM-F^K|$& z*PO+cz=ZJ#;V+!yvSZWycK9Y5cS~DbT%rT-1?q#TwuQi*nm!#gzSEN~lt4ao6NM1_ zgrvTrdgd`6io_9Jch7~PY64HVz8MQi>vAnr(uX02>_9nS$qHb#rqnmE4+$mph?p;! zc5<1N_&0f5i-L+`|2;ySImdvr9#{_5(+lQ2hrYO*OX3W~iz}%Y>=S)WlOPELo?eer zT1ZRHBCz`6{4|XcwZVT9t)n>SSYm?Qr#{(sY8WSfrOaHEtP(jQkw&`;dLRE{@*Y;o zI_<-O;Y`Dx>W}_Tg_Sg<_ry)P?P$a#A?p}##}arP=VzUxc>klEbt%%%z8*&LK4(mr zc`1_Q1NF(W5k_%(K*sC3NyaPwa~I%RB;EgeOaA*I`W-!R7{rBnc-s6BeSqQDVzZ6t zxfuAk9>UyT1N-+nomKO8DT&4MgBv>6gtz~1V(^~pf{w-wtv;yvK~7$;gSZ?KsGQSp zd$J7AM{s$_r6f((Fa*Q|Ae;X0B2zIBzjcq#t1Vz_mm#h{uxR3w2Cz`D4`9 z#-Fj=Ek9q-GRWfhTMJ)nUxs2w3WWacEvonOPTId#5g8UXb2jI2kRtuwp#Z1C+`QrS=fT8%*jxH!K;0s43dhJ z-D7TZVrik2qLE?J!mD8x77K+WXp4=t+C8+=cn~NZIbM3K@49GW@*V5b8!NMq25%8juF#3RB#P* zPOQaMX_Jhp9M_rUtC0Qb_7UE4wFt=s>@{jN-FGA6 zDWVtE5FUH&qSi>YG0htJ%th3h`FlQps>qyDi5ka-UaT`+W}e3K@_Nr+^j03L5uhEd6@voX;D$bX0EYd4|nj+POD$0`is74}oe$JC%fPq59 zV`%pC{HT#TtLPru~9a#JaFx9DWjyXC-fmM)^hSEzWRCl>X_eglCeyn;f!fia^cg zs+>&D>-I`WajA9V<3(c%!OH?j4S!_g18qyN;a-cQ(;AC|l71vLr-tJTz0Uo>;#u>A zk3LUN>ubyljn4_P{w3ceHt^3kOqJ5rxrR|FsYugmF4-qKqd=bKU8SlFQVTQLNQ;4> zT!G z+pI7LvDSp+_f2Op@QvAz$P0p(u#V!EwJB!>4~nN*7X>D@&XYa_aicqqbD(R~dfbl4 z_t5P9l1}}h{2;d{xxm#*m}c_AY%agovjl9{E%?R={M5w*E>aX;KQfzCXm(O29dUVd z#Tu(s80k*QHJ8zhN;@=Lu6~&UQp|R6Ijz-s1zsAR)$XQKR~pB5mzbBzKArfxEk z37x9GU>qx_&0?JK`vn@8CUYgEdkRf9YBaUlJUhj3j6y++u7%$o$!U0Yp{Dd##gQ55*Iw^?bL#`-QHf;IAT3jbH?C;cLbn#_K&%ho%yI>|` zmo0cpGOb?{GgYmU-^1Q?uG#3gz`5wvXDHJ`x>XZ5MB4KeV^3zG_9Z<#}winRcJ%ppK7CmHk2 zJr3!g9sK^0z#CYXU>e;W!=uk08#<$~QSY+hZaxiUoJ>qlY17%ZVu3`F$mj}FtbB;C zy}3i}ySFl!PZ2=7@oqp29h=)nvw)lXp zMDJCK6kQRid&6dnxkU+<)A4A~GEki3Kgt!_l^iy#ymyv-N}jG$f4S(LcagFbjTlS3 z-v2dpJ!zXNGjDfJzGM`S-jEL7Al7j+uDEvQ;XS(ovS?ofpBGrnT?VfgQM}T18}cDr zlv@=Y8bq|0y^R0mWf#%lHT-u+dh7gpygp1Wn$KJD@(cQ>3eDklk74(?r9j*{>d)eJ zul}i9HvU@%{FFEhG6cMv6o`Lqk|6EA!(Q(8Vk9B(v!HMw=^W=hv?1TKD>^-OHIilm zhm+l(T-&LZl@FeB3x)u5J?R%+&n@LM0Q;}&sBjy_MHcYiLhl)Lteec5CCYwxE+?+>dmOq7R*3YQ> zJgTmmmjlW-r%Pn z%~a;>D*kb&+z0)1bFt~bFNv(($@r?G5C56xEX%r~e1|Uk-+xSkWT=oO=qmgFJS;y$ zhHy!cwY5Lv<3Sw%eTtOtTq^$ITzmdBRq_7c<+g4JC=9FJ%({!Ed-mJ*juxcFH6wg_ z92y{jjzN+$l3b?3%m|Wn3YY@$Zw9u zu5xo8<7X87QxSI(f}9zC)_NE$tCDF2XV$!{ur6q#8~C<>>Ny@bq3; zTdUiJ%g!W*2en6$0LuHdqktgAfl^YttH=NK^|7s|o7?MoH*_5e(wOWn7Oc4OVbBfM znw-YGsk~M1M~dxwdCuZM3mz&r8 z=$c%)T_jeH*OBhzoBB(`sD9UA4qFVKe98g`9wHWe$XQ_>GE+3Pj90PbJ$ij5s~RL(l* zs3rHB5C=n0c7<=yP86NjN>o|DI)_F>Zk0TS&EDEFKqlXy{Nb$&U^5k(p;x}xrzaBF zDR(kTGnBE~Lh1P6ljEl2hh|`{X8fgz;&9>7gyh2KT2)(w+yW(}CT@1Mdpu%i7ME1J z7|1nJGw8Z`CED_KQHiO|D9=J01kv3Vr82+hPZn!Ajf)vx|8MxwO2I|$)nWqGBhx-L zUU*!|xAI2A(am#o7~Z5ZqXaMom4Av8g)D9Zyu+T9=M_p<~i*d}d2tEEFQ)P|H-U@t())zQGWUGrO7T8d2tIR=~ zS#GmBYwHPv`)<5!-1{+mPZsP6OD3a+C{^8R=lai4+wj4ehNC_jJxQSQybRvm_4>RY z$bUO{f1DC#^$w)i@HSRU2#3jGkY%v^Meza8PWRIsfBi|sj3<8z{dlBbGo@Xg*jbU^ z?fVxiTPdskLP)?4YR@vkV|jU=t6^-3evsP1Z{OJ2g`fKL2=4g$pjXpA}fS*^0Ej&6RXSchnLc;zbGkn;;+b7+r z!KZ_j(glayATJ8RXc!le9~N03l8HD=v|=yheXWZ{KJtF3M_^WRX1L^yl6r+~^!^MGe_ zju39=u|~$IP!MNCpE=-C)ynohk6A*>t~?r=V!--=qOMXlD+Wl-su%g3@*LT>3|{cC zm`2K^evf8xBP?(<1-;ThYoqG@T;cW@gjNjfKa}#F-{+g3*?-XFJ4Ca_+OH45=r>!~ z_v>=fF5j!(OPrp7$NkTt-JZ9>_g024ncR;X#HuN~sot-bJH(^mTv8s7`y;nryi?i& znd!E4Y()VHDX>a)u7YSj&>KA1+ICHsd2h7E9^8@9ZYnZKFoiHi=k&i@IXbsZ=OZ6y zEpae?&=49?SknCuTp*LKLlIz`FLYoK8-Hzoi{=E4XCBxjv6(cK$gCuL!Vp_cG#l`Z zB%@$kaAqhDY=@aLgI;gF8|B%lnqvQ$n*R*kah>#YeQs6hus3lRw5 zdwFP>7I6oh+6_2MBeYf?-~v;r%&wxR_Vj7)f`7!8GE)O7!qBD^*-NI?7x;>@4r>>f zP?c76yPXvMSu^@GP$V+Y{{P%3m8NG;t4oi2t|#io)<{7He1M2GmrWPFs=2m+1Q^`8 zZ`Q37;%n?YEFDZ#td1Y~gT*HAVqhg=7Lt($e$tl2W?X?|IFd?q~4yYU>lSWq`@p#%Mn+K)X3Q%)j;xR_^ztPew3ZY0y(xp~LN5>b-x zOTDb@>JOtKY=4gb!`9>NXQxpl2?7j@adrxx_y7kaVe*^5KL>(!k|E>{SV!S%$Ex0T zs!rBQMM~ME21p$@vU4|1yvb6e7mLND86B4-m7#6p?SwKjH zu^a>}q(zp;*2)cVpw~5yUGGQ--9U;_=WD}ASoR09TbX<{(PPh@k*>6y}%Aq+0 z>~4L3j{3u)ry5L~85;TP^(}@sBvYuA^k$Tw|5kz=Id7cIH1|t#H!9LEvz|X2$)!g? z=ec0f$snza<_Oev(#j6a&TGv>Uh=zptXeKz-9oFo3z!q#!qm0$$g0>~!2%0~l7$0l zU4LY6!Z!E|O~wC`s3u*YyRm`i02>8Fv7Y2P$R(0GKK0crXE2SKjEz^ZA3N>7_3TgF z{$xn~fjZKHIX!3(Wi!xw=TGPi4DT)Kww|gx@hpV12InRlfayo)z-}i7oh9G_nm7Hf z1zq9BDvkQ9Dh~S}bmA5c9>}s2%4GyO00s zLo-2Rcir@?YZ(5GhUc}^Ks}iUmw9~=WR-cS`HVi0=y8Xt*C!>FgwM05V>LBW_InlM zBvQQNefl1XlG?Fis?ZB+p&XNZZ#y(aX*~QT$3)`$=6tg8fO_dEj__ob_$EZ=O?K-a zn^3;4H|qguLIp!PsuMLktEavdeaJ3CqfPX1g6!8lk*WBbvqA;&l4Ta~dA5o!UNX5h z_Aj$(q ziwicIcpSrJ5`_7raeg{|4qr5=fJzeAJ1F=eGlHWB?? zBqOIsxkK}O*Pbw!Z1P80i@@IJQFQ>#7c39K5G;)S@_NM*5ulkCi z5N!YBzTZfaN?It<4PNTSAZZP|6uS|^uII)Jb*P`!s3M@{?!a%4H~U?Bs-C{zG0^q{ zum!7wOSzXJ_YZ_m!gE?xV?2ttH#^;MaXn9MClAtZ{S_muqqJTJPwS4QmVLC5s@Qsa zGSZcJ=RJ6w4F(<8qWC-TRkakdYIVgQ{aZ4icMtfZS~p&{QJOO5K4>V4K0~9&`hR^M zV4)p+?_?9Y=2}Nyg2Jt@>Y7&$o9id=_07C~|A~zn*plZbu&7d9xG?RbImOLZgQ>$O z(2m;75v9M%Q(kUB4#FX`9j`Lxh~BNwfOfgK@~YEIYMm!9oLvC};FwW#h0a(JNl#2| z1brIyOCRr25l5+o7I#n>GjbFiw${t9A|)sW%&Z}WB(h1`ei#623WL}hFXlYK@ui-b zC_zjw_!g%V(ac5YqR*&Du;-M1uUP8rWNtbpC#}1?0 zM>u@L{pIyw$30fNtrm^bu=2f17Ll4)hsf7S{(yi5ga;`Xv4GjrkAB9{5ONqCJ?Cst z2Tek`;VCiOgkjWg zQH5F&QwgcjQXSKbO_`hL44&s7#XAEpvKqokN^CWse%`b@HCKG26qP>2FH^IWU%91K za@_mkbYx}SvM5lVbv+Esy(Xw6$_PkfbK*i`*66eDM$dK5@-QfaKn}s{hRup-Bynh59NB2C8^+i{ChON7;^0Taq|J7a%9qtlBqVQo&PojIXe^CT z^7iRib%-b3TKNcR2|vGVCD^;d(cF@gWuiW_UlY`^+O*D}ITBQ5?pQTasa$CPZAC6JH zRkq3C_%O8DRL4Kaf59oO(P8DuD^SAxdtfKW>@h5!l!1M4azb1%o8Z@0r%OVVq%#Vq zbhDC*F?p%sgOC2FC3z#yUJeA59$Z@W9==`^CI)ml&9~b;`%w@58aumWM%RIdsa#t- zAU3MDO%cV5Ox~w?G^G2T%2!P{F}L4lHyc@-ZPh+sE2Vu@Nd{gLMMu2ZOF442 zBwQ`F_?x8T1|O7-Zx;7ERw|C9c5PL8~5L2-KA$ z>amznXiU2d%-}}E{c2s9b4A3b`09NvM8_RQ_CFwx^ep}|6Rh9;SgMQ_w>>gKQjb*7sDL7C>GTw`8eJ}c_TV4yBa(ni2h*=$XK)F4d`l<{?vI4~ zd+Yv&EZDodY<#DR66cv2V}-h@cu!)f65CIWC%V`!C?DvBUd=!kC*qs%>=YT!!UVgI z4CJ9PPq8EA$-tE8F5}@uDpkgc&kK>{qcV=l-1c=xlXledgz4$Y6%C{$yXL`s1U%F5 zdWkX$w<@YBzjFI9$t$`=)cX%UogeORYIi38YKD6XCS%_4()axXQSW4tk~M3-wwK`4 zZ>(XRL(k{y5nyK;rsWmBq{=af!66KIMASx{1|{nP6E5{h5w^nm%lv!-pojG0SF=WV z-%&AaK5Ew6Jyy5d>6V22^RRKn(mJyMGGbtCev6hVzQ#SJ83;blhWSvG;1_rE3~7T~ z4%s{EZj9hTY6057fY^ZiI6)oNSJdX~M%W&2@+i;s}ku?u=MpkHkZ@Jyg4og<7OZSN1!*hvWH}A5oj-rM^JGzC2$^@?e}~lh8D-Si{L;R!&B^K>LWU+qu0wCkdP*psw?O`yU;3}B9*t)pTF7^MJ> z)^?w~brfpS7FVB4PLwM2D~)`y{ztya}g7O)VszdAzYSul*?!{&voJx`Q%BU5UIGbU<^WaS!N_kYV z=k#lJhEyGcVBV&IPXnGINg}S|v=Q;VA%2iwQpJW&{THqkwmcGmFJi?_eo#TUM0+^; z*FSd|I@d5j$@VZjIw?pYUB{RrB_mZn&WuZdj%1P{!&?=TLZn@3S%DraNDH9k~1(ELVo2CB}CY~ z#pxd0&$q57_$`{*|EwdpZ8;N|W1Y$5AGYihluthl%5fRj9yevl8Q^ta^T%;z^#9q5 z1nAt?hb6#$bUXzJC|@{BUyAz6J(A6r;IF>;>2O830{|B;fWcdr6q5D?$gW!MLvMdT z1qRzK_e7-249-X#vGa=_0Q`QE^Neuza0ZoW$tBlDmB7I@p-HW^TUD}R;*Y?%7$ECV z(%A4JsR`uSc&xkU#r-0@M6^Hjk`ZXN6P-~oFNYLY&!WGaD}+%vioodY zcMhAhnYh}qW-&TDk^UeGITjU0mAXYAGlggMufZv({aW>3#4%EBWhdsMIly1Pg?$3Q zW$Nkjcj-tJ27I>D8Xt(OyWvr5E;=M%T$#sQUQJz_ku`82ciL73+M@CSx`Gd`CO$jP zI`I3(v8*Fi>0?TuFyeN1$DgYq8LD6y8q^s~)kfYKww~JSL3_^M_h*GRf&P_7h!w3* zuyF;k`#CRy>GoTAUwl9uGJV~t2Pp(Frd22{ZpU^-_#Euuy;wQl4AXjg4qBi#Dplxo7qR;i)8P8IDguN^1uPa6M^%y0jjU_@qpALz zlz#}1BC=r1EVX6>wV52=o)5wpYPkJwQ|eg*QyM|ii;IzDtGKVG3RcFA z+6^@{{0DY*kE)3-#Ko{1yJyPh|m z1{~?nL#ZH;^sVO4K%PKm&v?&{oOC;4GRBV`>D=47Lit8Y0g5y}*^OGNcvk#`N-1>i z}F#JIaZ9NfA z^{_rO+G@VdGgoFJR&8|;%kaDPKpu5zUezlz(sbPms6^HVMkhC)qC$`x24mMB)HFGe zT-S~2F7{7tV_IBb;k=qxu$YjJuOAoO+A0vwiXrl+f4oR}Mt+&nn@&N%s0lI19MMJ~ zT}}lCWkx|=*ekoldv(9(sm|`v2P{sJXFu(kv7Y5>qPP&S%7%iOlGyd%`r^>iwL@*cUD$7 zr&EdlTKFw2k9HSbMVj)sTLzv?V@L8bMm3$uV4s#VZrE*2u@pN#s|izPBTs>G{RYEA zDaRyHQ12L@gdyUC=RMtdt%<*$2y%ttTwAK-ZG-1KySV&0Ve-}@~F zA$GNl-lPNgOGu|r7l#EvxnAozo^^ zmcJ`BtFxYej8_ozSrQ4?_eNJ73V~LMl<^Ef@?N;KXj{c4M}w0KY&3W+k@|gl7Nt;j zxJfyS&wlPM?afSI_9nRcJf_cgly`&;+e&4s@k$Ywd=4W~tDIQcrR=@Dh)flZyl$>= z`Ymei`Bvms_b$bEj{XzUV|ug-B1UJ-d*O?2FazM$8p~gGSbuX?&1i&EHePz@>G1-- zvbXZUVKP|bIX=)~>I!#o4=3f^cQJ}MFUxyBU){d>n07zU<-^i@Z{Pi7ta<;~fvIhq zcOw?(vfm1oX|PXQlVifWLl(#1Pvp*Vt<>Q91|S^4Ou}{l;q0980%r{ zA!8r^2*cxWi4>vIOMlScchzXLtaRJs9zhdEI~+ZRnG@b$el$(Lo4!hKx}ibm-6Ar_ zPBj{@1t20{ezKlkGdY~!DqG&6XWrfSLI`4_Of%eYuYI>}zn<1OGO41WHxx9n&#{@= z{)^O{%}sIp5~OzU2e_siIpgX9h#QZNn)MZNx{Cga#eyLthu`C&DsBRrqSZiC%G}mh z{c?|1NuB$1<7$y788v-1B3m>cAc2O zLD^gN=fV@X+8Me9m-`)`;RdzZHli(Jz^Ska)GeaXelzr_=+*!%?FKF{0q^zhOYeYm&y0MD23OT90{{4W6Pui8X0w}5 zw{4A9OjrsXH&qiRVwwKDzPA2E+)a2Xy zgW^Mii{Tdrgcj;|xr){%Z8*}M?nhsY;w9-^+S2*_Mmcxwc}ItDWfA0&%4nFT2eL8J zljc}5kbB$@+hGo~L7*~RhW2DAS2JlrM_Fg_kon8zu` zp5it5!DWJ*W-sD3w^kAGmyT3xJyO4!q@7^~Rr2F6%jr{Jm>FW9{Aw&B#1=zY{P3$@ z(Sxd-8I^3AV0KHtqq4vu#uqL4YyABD3jsv|0urpv3c~adRTKcDhRXv%H zx=mHF3N2a)vpq2OJbLde>I#$>-^PWrv4uAp2Aca7?@Y^X z6d55pIbQ6wxvd!5Hp%JmzQs~WHt!i+(A52hkqZK^we9nj4lt4BtNPnQdbWMy3!Z3+ zy{G)eiv^~PpTD_1v4tLIGVTwzM6|!7ueN_pHj;Fi!`$N%rCfM;ajlyL$}F>rVG z+0zm-R9Q(&xjvis+)M1({++=vVYI*<3?lOHpa2V*CHjx@i3sv*3H8G-s29kU)-YwS zt3E<#O#cJ(WUcfDe;9H#XM`7F`kP=aJoJ(eXB}Y=F7f`OuA+;P*DOwUcT@_WJ+e|4-)t3)7(vQF-b`@>YRN4IYBHp;BZFvKC+<8lk0fXs%X?k?+uz+Q8tB0x;+k5X z>(Uu8*N(s#2|F=iX{24HgT$m!*dUR)<^?Oe)d0m& zwHsuS{%R$^)S)sWAKtJID5F|K=CB5>UP~`|AL8mZko;#vH)59lN`EsH?)FA|bi2ZJ2)na%hX`ogzvyW}n$V0tHe0`j?OhdjcN9 zZ6Jh`q}IgZ>*0eBh%3{@fj+~RPWm4?G_@tI_y+f~R^xn$gN8nR;S3Rk7k)nm*IDN5 z@Dv63hQ)rSHk6Y*3FSf?^j$0`30{DCTjgn+hsbDI>jS33+ZW?F}}WjD=n zys^oO3YfyqIyNx46(vo9xj~bL#nlv4`=WL#f}b&KdhG2d;pcI(8TQ*q#+{Pkd;*X3 zn^}$aGRrRs{g}xDIag_nlu8{ST?xd_jlDr!;#Cu&@vF6|uK2N>s7jw6sgM?T7-kHm zZd)qGjn}l@Q5L~&?c|n9HwZNMB;Vbg7$L60lD1l;I8iq6_!)4D)WaJ+VR&amY#~Y6 zy`(uQ-65qhp_&@&LG)43#cHQf1cAvofk~kzyWa%d^yjNQU}@f%n%bbg zxX!v0i5O3i{Xf!OxTTbEdp6Cn%IP8dC(}-&IBSy=OuS(*`V(Jg&_F22vaaq^Y0cpE z7aJW593TMNQW!NkMp94FfvMU-A>?^>+Ba$GzGlMq@1~1milB>1B-H7!Zm!qhh9D?*P^XKa+r zE>^YXjJ?d;#tp`r8qN8%q5%sK149SkY>)X2uO;0U-J85_w(DM;j3I$uR;{+I;jM^J zdg(>_1~sKE*^YzEMB82p6;g>&?Qdjj+(3({`HGK0^kxVcuU2w)?^Xfx&EI_g_(qJP zmP_HsdU(f1Ivmq_RTiicdjVrNm7E4Dl=kU4!P>6UaG@r6)~L1bF_n7Iq2|KFq5j7Z zFT?!cFw2%gVh4}i^$af_dztNV=qb9?3~l5|6h`i3R!y8g8;F{ehO}9*!XZ|yoL8KM zJaHbIkzVtGUO74$e;#VG%G+?U6^OUsVU!OawV?D`H}H$ZR85UT{UR%B=8v1ab_}N& z5BmiO^6DMNRSyu=X?f0{fay?dHPtArXlXhlepb(_>4gv*hU#ZlXTdJXdqHpV~;jnoRmz#~) z8aB@_Px<{vI-+qd`c(`UlMatfvn81hk-b0+Dda3%2Z!;Nn#s|fXOjP_&)q?%g%KJe zw2vJ*s??!WV?^*`>of^iX@Ss{l(I>Sr`P3W@^UeCsY`|IGucay@Xp693L|U!DOCoP zsF=@gI=7i%|53kn2*lS7t{-blUOo*1uE}NRj2H$DJ?pY#^?qY=eRs93ys@%kRHtcQ z@G-J>oArzT)o0`LOc=0Cl1hVzMQN(y8{A*B;grsKG&ALPLE3LvR<}vg+0gKm%`$A4 zlL0A{Y5!(l!Y3hWoC6P$?g5U6$hP8YQY{8*jI_&Tddh65WG`=tR&%^EtbdfjaMaZU z>7hG_h8R4lb+CYe%RfG^1$qz`miQNGVT;!Mh_s)ybCHRDp)l2>{%=h}O_w9_(7;LK zGRiRJacaNW?cNCGp0bu)B@9SQK5$IYt8)gE1AJl5zS($;BLdN2c)#K;IRhw-@dNg! z!=nQResG2D@I(*^b$n2nu6}}$|lc6Uyjt++aJU)F8>;?hNboKos%dSZ7*^C#3i@&fF7-ohm z{Z=_bgJcgV{eDvVeuQR$xS?R|%1YWBB~llY`JfQ8J-Z8j!&*`ZguOIkMSI73{33L_ zE6oIJPY|w#t)gi*ifJ7{w?&G0iil?zH6ZJvSm8YCD9<%H8#myj>m`X=Ns`_k4~1>6 z$h*a+aR3jnqP1;4G~IRyhT|DSe%vY~Z4Fxg<5n``8ArOYjtn}7>gQpp8;I!Yx0^~{+yT>g??K5+@UeWTp(NQ9A9@(c z*2Aq2{Gl}R;q{P^NSkUvy#MRUNyJ-USFc+ihOes>$&EbVebpJ~16)_NsDal}R;;n) zjB^|Ohh8ARjD!C1JnlRZTU__qX62DopJjW{sn;q=clEhv3p5q7J)#QP8dW9HqqOsQ zw(|0{dr6;#E!=Q~tYcwl_0!fL-k~d=qIDe2fwIUoSquJuYep{4lSp&eVR+thF(>cd zU7YI)A>T5nA3^R0F+uF`q!^7#^5*rcze0^CXy>RxlBa^uf@1}EoGs`hb=EAM8C{iY z#Rg$h@ZnG&6ATm!R;)Bx(i=u_$!<{iB!TxHAf@r3@RukffoHIifsw~Zc&OS z+}C|&Lp-Flw_(Cn-8_oDoea{|Pf6oIRc_^jyBNCe1vGD0*5^&v)j;P=gdyaH8M9&{ zPt7>2YNbg3}XFMjvex1Y8|^P`z#9$S9gQvhyAY z6ONn1zX#xk3Aoo%(pDnQ4T%-EaawlfZ}b>Pu$wJXdJ%7@nYQb~f1!-^y8mZ?!iQe5 zY~rb-?aI>hzt}HZ)>Z>gtl|4(^X)p>yks_OzKK<(SjPBmz|;&&hPvK^qxQ-Hfr<0{ zj7iq5OW5WZw0~PqJ&8RQP>1~M-v{II_@JRY6JPkn@$HiXP-@8;#9=re*?AR*ap00| zOdnJTS<(jBR=sn^b0#J?>nWSAd66>(jk~UIPbN>knw%V1-PIO9&8X0mnc0DpjFx4= zCR`qvrDWQMS}V^;_s>@E#NKh_RgOLUR&ZVZrTzOWZi|1einXFevwQeib1`2RR5ku^ zK(O>uBUIZg2}_Xee%t~(gaWW$o1hz>x*&jJ_Svi4wi=(rg z+AU%}IxgmGI`6gn3jPvr6W_djLW|XcK5@${Td*aq36U!%PTyYq@WoZ<4`H1;Y`N)x zE!TNc5dUMNS1q$yZpTt3o>$Pj)C-FxX8@@TTgu~4xiZ^JX%}yjNpZ`R5&JSZ7yO@9 zcU6f`ds4vs3R<8V)(<(O!gJX!>BiRTB5Tp;A_(^Ty;KamfX~RHELZy3@$sCOZnv6~ zYAtxVIfjkLr|VKGeVnsfRvc?SA5)brc*!!OcpcLf9|L&;v2m99r`3tky?=rym(S$Y zo<5iFLRtPfurX+?i{;LXqpeb0NqXU9#egYWCr$)6AM4n<+}4(B^sG|Gd0Qtqa7$ap(DJzuI;{*Wh3-mW>pvrY{6OZ$tv!|M*f%a*n!%%?l>xKcR?{5?$!`(4^UZfB@3Pn$6}7&!g~;pgT$?*$cm?GN#}ozn}!#REckq3lz`}qj>~tvT-XGE%kTv)MBO zjy4K|{H3hM=$|#q6e};;Z1@tna<7t%3Uf)!t0SYXON8yYz`memC{rvq@*FK%2Xph< z#G>>FZf08@2$grWd?D=nC!>>RWnq7HP2@7WVQTD}|LMp=Ci+{fA?Wm0oQjs-q*1(wtb4dlh6>JeTFEs3`$dyG4kV-P9%<3#Q zpD^{IZO7fW!qZ6D)O@aw8=W3=t=CK+fAP&9o<0b^=(fcX^jfc&KeVNjI|;j` zpmS2PqR6$Vsw>H|g@G}ojH#7nIC+(sH_Jc!;u2uzzVi{m*_p3@=}u}%^6|uR|U^_ z`A5hRI3hpceP@oAf=?Ayn`2t6xL`l|TT~Q|xpF}T`N_T+SyMZerg$v=&?e`x_(PW? zkHsGzi$CKXm6vup7S}=!w%$EjhEecbNm-n zGzI@qNyB1VbPyLwrsL78`sIcJ6LGq%!tPQB(Ty3j%$gH^8o+Gx-O5KO8_#%AGR1O; zkpP>N`TquJez--nscwIPR({RIDFSJ%?cg`RR3o=RO*ouw2a^VwzE5DohmR5X_mOy>wNc?dIoZ3fE^)t-=TjScc6NDAUb13I&K6Xa2M74;_XsW; z49d~?O=iA9*L$-*wUgVht-AHe!NGO)b1t*>(#23f*##y_MGFW|u=mN|a+#4kHr2dj u|M;D=abQS}q9R+MM)mv2$L8ka^Y}bIkI%2?`Tqa_0RR6(aDWQ{6a@fTNk-iO literal 0 HcmV?d00001 diff --git a/assets/fleet/fleet-104.1.2+up0.10.6.tgz b/assets/fleet/fleet-104.1.2+up0.10.6.tgz new file mode 100644 index 0000000000000000000000000000000000000000..83967d73e2e40eaee59ac18af69b3787f3373fed GIT binary patch literal 6436 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 literal 0 HcmV?d00001 diff --git a/assets/harvester-csi-driver/harvester-csi-driver-104.0.3+up0.1.21.tgz b/assets/harvester-csi-driver/harvester-csi-driver-104.0.3+up0.1.21.tgz new file mode 100644 index 0000000000000000000000000000000000000000..25ce332410f04c8b5eb55a69ea047cdf6894f57a GIT binary patch literal 3846 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 IvH)ZN0MhHBvH$=8 literal 0 HcmV?d00001 diff --git a/charts/fleet-agent/104.1.2+up0.10.6/Chart.yaml b/charts/fleet-agent/104.1.2+up0.10.6/Chart.yaml new file mode 100644 index 0000000000..e4a9f3ff68 --- /dev/null +++ b/charts/fleet-agent/104.1.2+up0.10.6/Chart.yaml @@ -0,0 +1,15 @@ +annotations: + catalog.cattle.io/certified: rancher + catalog.cattle.io/hidden: "true" + catalog.cattle.io/kube-version: '>= 1.18.0-0 < 1.31.0-0' + catalog.cattle.io/namespace: cattle-fleet-system + catalog.cattle.io/os: linux + catalog.cattle.io/permits-os: linux,windows + catalog.cattle.io/rancher-version: '>= 2.9.0-0 < 2.10.0-0' + catalog.cattle.io/release-name: fleet-agent +apiVersion: v2 +appVersion: 0.10.6 +description: Fleet Manager Agent - GitOps at Scale +icon: https://charts.rancher.io/assets/logos/fleet.svg +name: fleet-agent +version: 104.1.2+up0.10.6 diff --git a/charts/fleet-agent/104.1.2+up0.10.6/README.md b/charts/fleet-agent/104.1.2+up0.10.6/README.md new file mode 100644 index 0000000000..2c5724dcef --- /dev/null +++ b/charts/fleet-agent/104.1.2+up0.10.6/README.md @@ -0,0 +1,8 @@ +## Fleet Agent Helm Chart + +Every Fleet-managed downstream cluster will run an agent that communicates back to the Fleet controller. This agent is just another set of Kubernetes controllers running in the downstream cluster. + +Standalone Fleet users use this chart for agent-initiated registration. For more details see [agent-initiated registration](https://fleet.rancher.io/cluster-registration#agent-initiated). +Fleet in Rancher does not use this chart, but creates the agent deployments programmatically. + +The Fleet documentation is centralized in the [doc website](https://fleet.rancher.io/). \ No newline at end of file diff --git a/charts/fleet-agent/104.1.2+up0.10.6/templates/_helpers.tpl b/charts/fleet-agent/104.1.2+up0.10.6/templates/_helpers.tpl new file mode 100644 index 0000000000..6cd96c3ace --- /dev/null +++ b/charts/fleet-agent/104.1.2+up0.10.6/templates/_helpers.tpl @@ -0,0 +1,22 @@ +{{- define "system_default_registry" -}} +{{- if .Values.global.cattle.systemDefaultRegistry -}} +{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} +{{- else -}} +{{- "" -}} +{{- end -}} +{{- end -}} + +{{/* +Windows cluster will add default taint for linux nodes, +add below linux tolerations to workloads could be scheduled to those linux nodes +*/}} +{{- define "linux-node-tolerations" -}} +- key: "cattle.io/os" + value: "linux" + effect: "NoSchedule" + operator: "Equal" +{{- end -}} + +{{- define "linux-node-selector" -}} +kubernetes.io/os: linux +{{- end -}} \ No newline at end of file diff --git a/charts/fleet-agent/104.1.2+up0.10.6/templates/configmap.yaml b/charts/fleet-agent/104.1.2+up0.10.6/templates/configmap.yaml new file mode 100644 index 0000000000..5b052e8745 --- /dev/null +++ b/charts/fleet-agent/104.1.2+up0.10.6/templates/configmap.yaml @@ -0,0 +1,16 @@ +kind: ConfigMap +apiVersion: v1 +metadata: + name: fleet-agent +data: + config: |- + { + {{ if .Values.labels }} + "labels":{{toJson .Values.labels}}, + {{ end }} + "clientID":"{{.Values.clientID}}", + "agentTLSMode": "{{.Values.agentTLSMode}}" + {{ if .Values.garbageCollectionInterval }} + "garbageCollectionInterval": "{{.Values.garbageCollectionInterval}}" + {{ end }} + } diff --git a/charts/fleet-agent/104.1.2+up0.10.6/templates/deployment.yaml b/charts/fleet-agent/104.1.2+up0.10.6/templates/deployment.yaml new file mode 100644 index 0000000000..a13d85abee --- /dev/null +++ b/charts/fleet-agent/104.1.2+up0.10.6/templates/deployment.yaml @@ -0,0 +1,108 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: fleet-agent +spec: + serviceName: fleet-agent + selector: + matchLabels: + app: fleet-agent + template: + metadata: + labels: + app: fleet-agent + spec: + initContainers: + - env: + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + image: '{{ template "system_default_registry" . }}{{.Values.image.repository}}:{{.Values.image.tag}}' + name: fleet-agent-register + command: + - fleetagent + - register + {{- if .Values.debug }} + - --debug + - --debug-level + - {{ quote .Values.debugLevel }} + {{- else }} + securityContext: + allowPrivilegeEscalation: false + readOnlyRootFilesystem: true + privileged: false + capabilities: + drop: + - ALL + {{- end }} + containers: + - env: + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + image: '{{ template "system_default_registry" . }}{{.Values.image.repository}}:{{.Values.image.tag}}' + name: fleet-agent + command: + - fleetagent + {{- if .Values.debug }} + - --debug + - --debug-level + - {{ quote .Values.debugLevel }} + {{- else }} + securityContext: + allowPrivilegeEscalation: false + readOnlyRootFilesystem: true + privileged: false + capabilities: + drop: + - ALL + {{- end }} + volumeMounts: + - mountPath: /.kube + name: kube + - env: + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + image: '{{ template "system_default_registry" . }}{{.Values.image.repository}}:{{.Values.image.tag}}' + name: fleet-agent-clusterstatus + command: + - fleetagent + - clusterstatus + {{- if .Values.debug }} + - --debug + - --debug-level + - {{ quote .Values.debugLevel }} + {{- else }} + securityContext: + allowPrivilegeEscalation: false + readOnlyRootFilesystem: true + privileged: false + capabilities: + drop: + - ALL + {{- end }} + volumes: + - name: kube + emptyDir: {} + serviceAccountName: fleet-agent + {{- if .Values.fleetAgent.hostNetwork }} + hostNetwork: true + {{- end }} + nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} +{{- if .Values.fleetAgent.nodeSelector }} +{{ toYaml .Values.fleetAgent.nodeSelector | indent 8 }} +{{- end }} + tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} +{{- if .Values.fleetAgent.tolerations }} +{{ toYaml .Values.fleetAgent.tolerations | indent 8 }} +{{- end }} +{{- if not .Values.debug }} + securityContext: + runAsNonRoot: true + runAsUser: 1000 + runAsGroup: 1000 +{{- end }} diff --git a/charts/fleet-agent/104.1.2+up0.10.6/templates/network_policy_allow_all.yaml b/charts/fleet-agent/104.1.2+up0.10.6/templates/network_policy_allow_all.yaml new file mode 100644 index 0000000000..a72109a062 --- /dev/null +++ b/charts/fleet-agent/104.1.2+up0.10.6/templates/network_policy_allow_all.yaml @@ -0,0 +1,15 @@ +--- +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: default-allow-all + namespace: {{ .Values.internal.systemNamespace }} +spec: + podSelector: {} + ingress: + - {} + egress: + - {} + policyTypes: + - Ingress + - Egress diff --git a/charts/fleet-agent/104.1.2+up0.10.6/templates/patch_default_serviceaccount.yaml b/charts/fleet-agent/104.1.2+up0.10.6/templates/patch_default_serviceaccount.yaml new file mode 100644 index 0000000000..aad4eea415 --- /dev/null +++ b/charts/fleet-agent/104.1.2+up0.10.6/templates/patch_default_serviceaccount.yaml @@ -0,0 +1,28 @@ +--- +apiVersion: batch/v1 +kind: Job +metadata: + name: patch-fleet-sa + annotations: + "helm.sh/hook": post-install, post-upgrade + "helm.sh/hook-delete-policy": hook-succeeded, before-hook-creation +spec: + template: + spec: + serviceAccountName: fleet-agent + restartPolicy: Never + containers: + - name: sa + image: "{{ template "system_default_registry" . }}{{ .Values.global.kubectl.repository }}:{{ .Values.global.kubectl.tag }}" + imagePullPolicy: {{ .Values.global.imagePullPolicy }} + command: ["kubectl", "patch", "serviceaccount", "default", "-p", "{\"automountServiceAccountToken\": false}"] + args: ["-n", {{ .Values.internal.systemNamespace }}] + nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} +{{- if .Values.kubectl.nodeSelector }} +{{ toYaml .Values.kubectl.nodeSelector | indent 8 }} +{{- end }} + tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} +{{- if .Values.kubectl.tolerations }} +{{ toYaml .Values.kubectl.tolerations | indent 8 }} +{{- end }} + backoffLimit: 1 diff --git a/charts/fleet-agent/104.1.2+up0.10.6/templates/rbac.yaml b/charts/fleet-agent/104.1.2+up0.10.6/templates/rbac.yaml new file mode 100644 index 0000000000..1a7e8d8841 --- /dev/null +++ b/charts/fleet-agent/104.1.2+up0.10.6/templates/rbac.yaml @@ -0,0 +1,28 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: fleet-agent-system-fleet-agent-role +rules: +- apiGroups: + - '*' + resources: + - '*' + verbs: + - '*' +- nonResourceURLs: + - "*" + verbs: + - "*" +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: fleet-agent-system-fleet-agent-role-binding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: fleet-agent-system-fleet-agent-role +subjects: +- kind: ServiceAccount + name: fleet-agent + namespace: {{.Release.Namespace}} diff --git a/charts/fleet-agent/104.1.2+up0.10.6/templates/secret.yaml b/charts/fleet-agent/104.1.2+up0.10.6/templates/secret.yaml new file mode 100644 index 0000000000..4715882047 --- /dev/null +++ b/charts/fleet-agent/104.1.2+up0.10.6/templates/secret.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +data: + systemRegistrationNamespace: "{{b64enc .Values.systemRegistrationNamespace}}" + clusterNamespace: "{{b64enc .Values.clusterNamespace}}" + token: "{{b64enc .Values.token}}" + apiServerURL: "{{b64enc .Values.apiServerURL}}" + apiServerCA: "{{b64enc .Values.apiServerCA}}" +kind: Secret +metadata: + name: fleet-agent-bootstrap diff --git a/charts/fleet-agent/104.1.2+up0.10.6/templates/service.yaml b/charts/fleet-agent/104.1.2+up0.10.6/templates/service.yaml new file mode 100644 index 0000000000..36d35588f3 --- /dev/null +++ b/charts/fleet-agent/104.1.2+up0.10.6/templates/service.yaml @@ -0,0 +1,9 @@ +apiVersion: v1 +kind: Service +metadata: + name: fleet-agent +spec: + type: ClusterIP + clusterIP: None + selector: + app: fleet-agent diff --git a/charts/fleet-agent/104.1.2+up0.10.6/templates/serviceaccount.yaml b/charts/fleet-agent/104.1.2+up0.10.6/templates/serviceaccount.yaml new file mode 100644 index 0000000000..73e27f0be9 --- /dev/null +++ b/charts/fleet-agent/104.1.2+up0.10.6/templates/serviceaccount.yaml @@ -0,0 +1,4 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: fleet-agent diff --git a/charts/fleet-agent/104.1.2+up0.10.6/templates/validate.yaml b/charts/fleet-agent/104.1.2+up0.10.6/templates/validate.yaml new file mode 100644 index 0000000000..d53ff1c508 --- /dev/null +++ b/charts/fleet-agent/104.1.2+up0.10.6/templates/validate.yaml @@ -0,0 +1,11 @@ +{{if ne .Release.Namespace .Values.internal.systemNamespace }} +{{ fail (printf "This chart must be installed in the namespace %s as the release name fleet-agent" .Values.internal.systemNamespace) }} +{{end}} + +{{if ne .Release.Name .Values.internal.managedReleaseName }} +{{ fail (printf "This chart must be installed in the namespace %s as the release name fleet-agent" .Values.internal.managedReleaseName) }} +{{end}} + +{{if not .Values.apiServerURL }} +{{ fail "apiServerURL is required to be set, and most likely also apiServerCA" }} +{{end}} diff --git a/charts/fleet-agent/104.1.2+up0.10.6/values.yaml b/charts/fleet-agent/104.1.2+up0.10.6/values.yaml new file mode 100644 index 0000000000..9d4e22f84e --- /dev/null +++ b/charts/fleet-agent/104.1.2+up0.10.6/values.yaml @@ -0,0 +1,70 @@ +image: + os: "windows,linux" + repository: rancher/fleet-agent + tag: v0.10.6 + +# The public URL of the Kubernetes API server running the Fleet Manager must be set here +# Example: https://example.com:6443 +apiServerURL: "" + +# The the pem encoded value of the CA of the Kubernetes API server running the Fleet Manager. +# If left empty it is assumed this Kubernetes API TLS is signed by a well known CA. +apiServerCA: "" + +# Determines whether the agent should trust CA bundles from the operating system's trust store when connecting to a +# management cluster. True in `system-store` mode, false in `strict` mode. +agentTLSMode: "system-store" + +# The cluster registration value +token: "" + +# Labels to add to the cluster upon registration only. They are not added after the fact. +# labels: +# foo: bar + +# The client ID of the cluster to associate with +clientID: "" + +# The namespace of the cluster we are register with +clusterNamespace: "" + +# The namespace containing the clusters registration secrets +systemRegistrationNamespace: cattle-fleet-clusters-system + +# Please do not change the below setting unless you really know what you are doing +internal: + systemNamespace: cattle-fleet-system + managedReleaseName: fleet-agent + +# The nodeSelector and tolerations for the agent deployment +fleetAgent: + ## Node labels for pod assignment + ## Ref: https://kubernetes.io/docs/user-guide/node-selection/ + ## + nodeSelector: {} + ## List of node taints to tolerate (requires Kubernetes >= 1.6) + tolerations: [] + ## HostNetwork setting for the agent deployment. + ## When set allows for provisioning of network related bundles (CNI configuration) in a cluster without CNI. + hostNetwork: false +kubectl: + ## Node labels for pod assignment + ## Ref: https://kubernetes.io/docs/user-guide/node-selection/ + ## + nodeSelector: {} + ## List of node taints to tolerate (requires Kubernetes >= 1.6) + tolerations: + - key: node.cloudprovider.kubernetes.io/uninitialized + operator: "Equal" + value: "true" + effect: NoSchedule + +global: + cattle: + systemDefaultRegistry: "" + kubectl: + repository: rancher/kubectl + tag: v1.29.0 + +debug: false +debugLevel: 0 diff --git a/charts/fleet-crd/104.1.2+up0.10.6/Chart.yaml b/charts/fleet-crd/104.1.2+up0.10.6/Chart.yaml new file mode 100644 index 0000000000..5e24af0a7b --- /dev/null +++ b/charts/fleet-crd/104.1.2+up0.10.6/Chart.yaml @@ -0,0 +1,13 @@ +annotations: + catalog.cattle.io/certified: rancher + catalog.cattle.io/hidden: "true" + catalog.cattle.io/namespace: cattle-fleet-system + catalog.cattle.io/os: linux + catalog.cattle.io/permits-os: linux,windows + catalog.cattle.io/release-name: fleet-crd +apiVersion: v2 +appVersion: 0.10.6 +description: Fleet Manager CustomResourceDefinitions +icon: https://charts.rancher.io/assets/logos/fleet.svg +name: fleet-crd +version: 104.1.2+up0.10.6 diff --git a/charts/fleet-crd/104.1.2+up0.10.6/README.md b/charts/fleet-crd/104.1.2+up0.10.6/README.md new file mode 100644 index 0000000000..2452ab2f1f --- /dev/null +++ b/charts/fleet-crd/104.1.2+up0.10.6/README.md @@ -0,0 +1,5 @@ +# Fleet CRD Helm Chart + +Fleet Manager CustomResourceDefinitions Helm chart is a requirement for the Fleet Helm Chart. + +The Fleet documentation is centralized in the [doc website](https://fleet.rancher.io/). \ No newline at end of file diff --git a/charts/fleet-crd/104.1.2+up0.10.6/templates/crds.yaml b/charts/fleet-crd/104.1.2+up0.10.6/templates/crds.yaml new file mode 100644 index 0000000000..4ee4cd986b --- /dev/null +++ b/charts/fleet-crd/104.1.2+up0.10.6/templates/crds.yaml @@ -0,0 +1,7076 @@ +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + name: bundledeployments.fleet.cattle.io +spec: + group: fleet.cattle.io + names: + kind: BundleDeployment + listKind: BundleDeploymentList + plural: bundledeployments + singular: bundledeployment + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .status.display.deployed + name: Deployed + type: string + - jsonPath: .status.display.monitored + name: Monitored + type: string + - jsonPath: .status.conditions[?(@.type=="Ready")].message + name: Status + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: 'BundleDeployment is used internally by Fleet and should not + be used directly. + + When a Bundle is deployed to a cluster an instance of a Bundle is called + a + + BundleDeployment. A BundleDeployment represents the state of that Bundle + on + + a specific cluster with its cluster-specific customizations. The Fleet + agent + + is only aware of BundleDeployment resources that are created for the cluster + + the agent is managing.' + 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 + metadata: + type: object + spec: + properties: + correctDrift: + description: CorrectDrift specifies how drift correction should + work. + properties: + enabled: + description: Enabled correct drift if true. + type: boolean + force: + description: Force helm rollback with --force option will be + used if true. This will try to recreate all resources in the + release. + type: boolean + keepFailHistory: + description: KeepFailHistory keeps track of failed rollbacks + in the helm history. + type: boolean + type: object + dependsOn: + description: DependsOn refers to the bundles which must be ready + before this bundle can be deployed. + items: + properties: + name: + description: Name of the bundle. + nullable: true + type: string + selector: + description: Selector matching bundle's labels. + nullable: true + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: 'A label selector requirement is a selector + that contains values, a key, and an operator that + + relates the key and values.' + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: 'operator represents a key''s relationship + to a set of values. + + Valid operators are In, NotIn, Exists and DoesNotExist.' + type: string + values: + description: 'values is an array of string values. + If the operator is In or NotIn, + + the values array must be non-empty. If the operator + is Exists or DoesNotExist, + + the values array must be empty. This array is + replaced during a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} pairs. + A single {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, + whose key field is "key", the + + operator is "In", and the values array contains only + "value". The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + type: object + nullable: true + type: array + deploymentID: + description: DeploymentID is the ID of the currently applied deployment. + nullable: true + type: string + ociContents: + description: OCIContents is true when this deployment's contents + is stored in an oci registry + type: boolean + options: + description: Options are the deployment options, that are currently + applied. + properties: + correctDrift: + description: CorrectDrift specifies how drift correction should + work. + properties: + enabled: + description: Enabled correct drift if true. + type: boolean + force: + description: Force helm rollback with --force option will + be used if true. This will try to recreate all resources + in the release. + type: boolean + keepFailHistory: + description: KeepFailHistory keeps track of failed rollbacks + in the helm history. + type: boolean + type: object + defaultNamespace: + description: 'DefaultNamespace is the namespace to use for resources + that do not + + specify a namespace. This field is not used to enforce or + lock down + + the deployment to a specific namespace.' + nullable: true + type: string + deleteCRDResources: + description: DeleteCRDResources deletes CRDs. Warning! this + will also delete all your Custom Resources. + type: boolean + deleteNamespace: + description: DeleteNamespace can be used to delete the deployed + namespace when removing the bundle + type: boolean + diff: + description: Diff can be used to ignore the modified state of + objects which are amended at runtime. + nullable: true + properties: + comparePatches: + description: ComparePatches match a resource and remove + fields from the check for modifications. + items: + description: ComparePatch matches a resource and removes + fields from the check for modifications. + properties: + apiVersion: + description: APIVersion is the apiVersion of the resource + to match. + nullable: true + type: string + jsonPointers: + description: JSONPointers ignore diffs at a certain + JSON path. + items: + type: string + nullable: true + type: array + kind: + description: Kind is the kind of the resource to match. + nullable: true + type: string + name: + description: Name is the name of the resource to match. + nullable: true + type: string + namespace: + description: Namespace is the namespace of the resource + to match. + nullable: true + type: string + operations: + description: Operations remove a JSON path from the + resource. + items: + description: Operation of a ComparePatch, usually + "remove". + properties: + op: + description: Op is usually "remove" + nullable: true + type: string + path: + description: Path is the JSON path to remove. + nullable: true + type: string + value: + description: Value is usually empty. + nullable: true + type: string + type: object + nullable: true + type: array + type: object + nullable: true + type: array + type: object + forceSyncGeneration: + description: ForceSyncGeneration is used to force a redeployment + format: int64 + type: integer + helm: + description: Helm options for the deployment, like the chart + name, repo and values. + nullable: true + properties: + atomic: + description: Atomic sets the --atomic flag when Helm is + performing an upgrade + type: boolean + chart: + description: 'Chart can refer to any go-getter URL or OCI + registry based helm + + chart URL. The chart will be downloaded.' + nullable: true + type: string + disableDNS: + description: DisableDNS can be used to customize Helm's + EnableDNS option, which Fleet sets to `true` by default. + type: boolean + disableDependencyUpdate: + description: DisableDependencyUpdate allows skipping chart + dependencies update + type: boolean + disablePreProcess: + description: DisablePreProcess disables template processing + in values + type: boolean + force: + description: Force allows to override immutable resources. + This could be dangerous. + type: boolean + maxHistory: + description: MaxHistory limits the maximum number of revisions + saved per release by Helm. + type: integer + releaseName: + description: 'ReleaseName sets a custom release name to + deploy the chart as. If + + not specified a release name will be generated by combining + the + + invoking GitRepo.name + GitRepo.path.' + maxLength: 53 + nullable: true + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + type: string + repo: + description: Repo is the name of the HTTPS helm repo to + download the chart from. + nullable: true + type: string + skipSchemaValidation: + description: SkipSchemaValidation allows skipping schema + validation against the chart values + type: boolean + takeOwnership: + description: TakeOwnership makes helm skip the check for + its own annotations + type: boolean + timeoutSeconds: + description: TimeoutSeconds is the time to wait for Helm + operations. + type: integer + values: + description: 'Values passed to Helm. It is possible to specify + the keys and values + + as go template strings.' + nullable: true + type: object + x-kubernetes-preserve-unknown-fields: true + valuesFiles: + description: ValuesFiles is a list of files to load values + from. + items: + type: string + nullable: true + type: array + valuesFrom: + description: ValuesFrom loads the values from configmaps + and secrets. + items: + description: 'Define helm values that can come from configmap, + secret or external. Credit: https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439' + properties: + configMapKeyRef: + description: The reference to a config map with release + values. + nullable: true + properties: + key: + nullable: true + type: string + name: + description: Name of a resource in the same namespace + as the referent. + nullable: true + type: string + namespace: + nullable: true + type: string + type: object + secretKeyRef: + description: The reference to a secret with release + values. + nullable: true + properties: + key: + nullable: true + type: string + name: + description: Name of a resource in the same namespace + as the referent. + nullable: true + type: string + namespace: + nullable: true + type: string + type: object + type: object + nullable: true + type: array + version: + description: Version of the chart to download + nullable: true + type: string + waitForJobs: + description: 'WaitForJobs if set and timeoutSeconds provided, + will wait until all + + Jobs have been completed before marking the GitRepo as + ready. It + + will wait for as long as timeoutSeconds' + type: boolean + type: object + ignore: + description: IgnoreOptions can be used to ignore fields when + monitoring the bundle. + properties: + conditions: + description: Conditions is a list of conditions to be ignored + when monitoring the Bundle. + items: + additionalProperties: + type: string + type: object + nullable: true + type: array + type: object + keepResources: + description: KeepResources can be used to keep the deployed + resources when removing the bundle + type: boolean + kustomize: + description: 'Kustomize options for the deployment, like the + dir containing the + + kustomization.yaml file.' + nullable: true + properties: + dir: + description: 'Dir points to a custom folder for kustomize + resources. This folder must contain + + a kustomization.yaml file.' + nullable: true + type: string + type: object + namespace: + description: 'TargetNamespace if present will assign all resource + to this + + namespace and if any cluster scoped resource exists the deployment + + will fail.' + nullable: true + type: string + namespaceAnnotations: + additionalProperties: + type: string + description: NamespaceAnnotations are annotations that will + be appended to the namespace created by Fleet. + nullable: true + type: object + namespaceLabels: + additionalProperties: + type: string + description: NamespaceLabels are labels that will be appended + to the namespace created by Fleet. + nullable: true + type: object + serviceAccount: + description: ServiceAccount which will be used to perform this + deployment. + nullable: true + type: string + yaml: + description: 'YAML options, if using raw YAML these are names + that map to + + overlays/{name} files that will be used to replace or patch + a resource.' + nullable: true + properties: + overlays: + description: 'Overlays is a list of names that maps to folders + in "overlays/". + + If you wish to customize the file ./subdir/resource.yaml + then a file + + ./overlays/myoverlay/subdir/resource.yaml will replace + the base + + file. + + A file named ./overlays/myoverlay/subdir/resource_patch.yaml + will patch the base file.' + items: + type: string + nullable: true + type: array + type: object + type: object + paused: + description: 'Paused if set to true, will stop any BundleDeployments + from being + + updated. If true, BundleDeployments will be marked as out of sync + + when changes are detected.' + type: boolean + stagedDeploymentID: + description: StagedDeploymentID is the ID of the staged deployment. + nullable: true + type: string + stagedOptions: + description: 'StagedOptions are the deployment options, that are + staged for + + the next deployment.' + properties: + correctDrift: + description: CorrectDrift specifies how drift correction should + work. + properties: + enabled: + description: Enabled correct drift if true. + type: boolean + force: + description: Force helm rollback with --force option will + be used if true. This will try to recreate all resources + in the release. + type: boolean + keepFailHistory: + description: KeepFailHistory keeps track of failed rollbacks + in the helm history. + type: boolean + type: object + defaultNamespace: + description: 'DefaultNamespace is the namespace to use for resources + that do not + + specify a namespace. This field is not used to enforce or + lock down + + the deployment to a specific namespace.' + nullable: true + type: string + deleteCRDResources: + description: DeleteCRDResources deletes CRDs. Warning! this + will also delete all your Custom Resources. + type: boolean + deleteNamespace: + description: DeleteNamespace can be used to delete the deployed + namespace when removing the bundle + type: boolean + diff: + description: Diff can be used to ignore the modified state of + objects which are amended at runtime. + nullable: true + properties: + comparePatches: + description: ComparePatches match a resource and remove + fields from the check for modifications. + items: + description: ComparePatch matches a resource and removes + fields from the check for modifications. + properties: + apiVersion: + description: APIVersion is the apiVersion of the resource + to match. + nullable: true + type: string + jsonPointers: + description: JSONPointers ignore diffs at a certain + JSON path. + items: + type: string + nullable: true + type: array + kind: + description: Kind is the kind of the resource to match. + nullable: true + type: string + name: + description: Name is the name of the resource to match. + nullable: true + type: string + namespace: + description: Namespace is the namespace of the resource + to match. + nullable: true + type: string + operations: + description: Operations remove a JSON path from the + resource. + items: + description: Operation of a ComparePatch, usually + "remove". + properties: + op: + description: Op is usually "remove" + nullable: true + type: string + path: + description: Path is the JSON path to remove. + nullable: true + type: string + value: + description: Value is usually empty. + nullable: true + type: string + type: object + nullable: true + type: array + type: object + nullable: true + type: array + type: object + forceSyncGeneration: + description: ForceSyncGeneration is used to force a redeployment + format: int64 + type: integer + helm: + description: Helm options for the deployment, like the chart + name, repo and values. + nullable: true + properties: + atomic: + description: Atomic sets the --atomic flag when Helm is + performing an upgrade + type: boolean + chart: + description: 'Chart can refer to any go-getter URL or OCI + registry based helm + + chart URL. The chart will be downloaded.' + nullable: true + type: string + disableDNS: + description: DisableDNS can be used to customize Helm's + EnableDNS option, which Fleet sets to `true` by default. + type: boolean + disableDependencyUpdate: + description: DisableDependencyUpdate allows skipping chart + dependencies update + type: boolean + disablePreProcess: + description: DisablePreProcess disables template processing + in values + type: boolean + force: + description: Force allows to override immutable resources. + This could be dangerous. + type: boolean + maxHistory: + description: MaxHistory limits the maximum number of revisions + saved per release by Helm. + type: integer + releaseName: + description: 'ReleaseName sets a custom release name to + deploy the chart as. If + + not specified a release name will be generated by combining + the + + invoking GitRepo.name + GitRepo.path.' + maxLength: 53 + nullable: true + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + type: string + repo: + description: Repo is the name of the HTTPS helm repo to + download the chart from. + nullable: true + type: string + skipSchemaValidation: + description: SkipSchemaValidation allows skipping schema + validation against the chart values + type: boolean + takeOwnership: + description: TakeOwnership makes helm skip the check for + its own annotations + type: boolean + timeoutSeconds: + description: TimeoutSeconds is the time to wait for Helm + operations. + type: integer + values: + description: 'Values passed to Helm. It is possible to specify + the keys and values + + as go template strings.' + nullable: true + type: object + x-kubernetes-preserve-unknown-fields: true + valuesFiles: + description: ValuesFiles is a list of files to load values + from. + items: + type: string + nullable: true + type: array + valuesFrom: + description: ValuesFrom loads the values from configmaps + and secrets. + items: + description: 'Define helm values that can come from configmap, + secret or external. Credit: https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439' + properties: + configMapKeyRef: + description: The reference to a config map with release + values. + nullable: true + properties: + key: + nullable: true + type: string + name: + description: Name of a resource in the same namespace + as the referent. + nullable: true + type: string + namespace: + nullable: true + type: string + type: object + secretKeyRef: + description: The reference to a secret with release + values. + nullable: true + properties: + key: + nullable: true + type: string + name: + description: Name of a resource in the same namespace + as the referent. + nullable: true + type: string + namespace: + nullable: true + type: string + type: object + type: object + nullable: true + type: array + version: + description: Version of the chart to download + nullable: true + type: string + waitForJobs: + description: 'WaitForJobs if set and timeoutSeconds provided, + will wait until all + + Jobs have been completed before marking the GitRepo as + ready. It + + will wait for as long as timeoutSeconds' + type: boolean + type: object + ignore: + description: IgnoreOptions can be used to ignore fields when + monitoring the bundle. + properties: + conditions: + description: Conditions is a list of conditions to be ignored + when monitoring the Bundle. + items: + additionalProperties: + type: string + type: object + nullable: true + type: array + type: object + keepResources: + description: KeepResources can be used to keep the deployed + resources when removing the bundle + type: boolean + kustomize: + description: 'Kustomize options for the deployment, like the + dir containing the + + kustomization.yaml file.' + nullable: true + properties: + dir: + description: 'Dir points to a custom folder for kustomize + resources. This folder must contain + + a kustomization.yaml file.' + nullable: true + type: string + type: object + namespace: + description: 'TargetNamespace if present will assign all resource + to this + + namespace and if any cluster scoped resource exists the deployment + + will fail.' + nullable: true + type: string + namespaceAnnotations: + additionalProperties: + type: string + description: NamespaceAnnotations are annotations that will + be appended to the namespace created by Fleet. + nullable: true + type: object + namespaceLabels: + additionalProperties: + type: string + description: NamespaceLabels are labels that will be appended + to the namespace created by Fleet. + nullable: true + type: object + serviceAccount: + description: ServiceAccount which will be used to perform this + deployment. + nullable: true + type: string + yaml: + description: 'YAML options, if using raw YAML these are names + that map to + + overlays/{name} files that will be used to replace or patch + a resource.' + nullable: true + properties: + overlays: + description: 'Overlays is a list of names that maps to folders + in "overlays/". + + If you wish to customize the file ./subdir/resource.yaml + then a file + + ./overlays/myoverlay/subdir/resource.yaml will replace + the base + + file. + + A file named ./overlays/myoverlay/subdir/resource_patch.yaml + will patch the base file.' + items: + type: string + nullable: true + type: array + type: object + type: object + type: object + status: + properties: + appliedDeploymentID: + nullable: true + type: string + conditions: + items: + properties: + lastTransitionTime: + description: Last time the condition transitioned from one + status to another. + type: string + lastUpdateTime: + description: The last time this condition was updated. + type: string + message: + description: Human-readable message indicating details about + last transition + type: string + reason: + description: The reason for the condition's last transition. + type: string + status: + description: Status of the condition, one of True, False, + Unknown. + type: string + type: + description: Type of cluster condition. + type: string + required: + - status + - type + type: object + nullable: true + type: array + display: + nullable: true + properties: + deployed: + nullable: true + type: string + monitored: + nullable: true + type: string + state: + nullable: true + type: string + type: object + modifiedStatus: + items: + description: 'ModifiedStatus is used to report the status of a + resource that is modified. + + It indicates if the modification was a create, a delete or a + patch.' + properties: + apiVersion: + nullable: true + type: string + delete: + type: boolean + kind: + nullable: true + type: string + missing: + type: boolean + name: + nullable: true + type: string + namespace: + nullable: true + type: string + patch: + nullable: true + type: string + type: object + nullable: true + type: array + nonModified: + type: boolean + nonReadyStatus: + items: + description: NonReadyStatus is used to report the status of a + resource that is not ready. It includes a summary. + properties: + apiVersion: + nullable: true + type: string + kind: + nullable: true + type: string + name: + nullable: true + type: string + namespace: + nullable: true + type: string + summary: + properties: + error: + type: boolean + message: + items: + type: string + type: array + state: + type: string + transitioning: + type: boolean + type: object + uid: + description: 'UID is a type that holds unique ID values, including + UUIDs. Because we + + don''t ONLY use UUIDs, this is an alias to string. Being + a type captures + + intent and helps make sure that UIDs and names do not get + conflated.' + nullable: true + type: string + type: object + nullable: true + type: array + ready: + type: boolean + release: + nullable: true + type: string + resources: + description: 'Resources lists the metadata of resources that were + deployed + + according to the helm release history.' + items: + description: BundleDeploymentResource contains the metadata of + a deployed resource. + properties: + apiVersion: + nullable: true + type: string + createdAt: + format: date-time + nullable: true + type: string + kind: + nullable: true + type: string + name: + nullable: true + type: string + namespace: + nullable: true + type: string + type: object + nullable: true + type: array + syncGeneration: + format: int64 + nullable: true + type: integer + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + name: bundlenamespacemappings.fleet.cattle.io +spec: + group: fleet.cattle.io + names: + kind: BundleNamespaceMapping + listKind: BundleNamespaceMappingList + plural: bundlenamespacemappings + singular: bundlenamespacemapping + scope: Namespaced + versions: + - name: v1alpha1 + schema: + openAPIV3Schema: + description: BundleNamespaceMapping maps bundles to clusters in other namespaces. + 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 + bundleSelector: + description: 'A label selector is a label query over a set of resources. + The result of matchLabels and + + matchExpressions are ANDed. An empty label selector matches all objects. + A null + + label selector matches no objects.' + nullable: true + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. + The requirements are ANDed. + items: + description: 'A label selector requirement is a selector that + contains values, a key, and an operator that + + relates the key and values.' + properties: + key: + description: key is the label key that the selector applies + to. + type: string + operator: + description: 'operator represents a key''s relationship to + a set of values. + + Valid operators are In, NotIn, Exists and DoesNotExist.' + type: string + values: + description: 'values is an array of string values. If the + operator is In or NotIn, + + the values array must be non-empty. If the operator is Exists + or DoesNotExist, + + the values array must be empty. This array is replaced during + a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} pairs. A single + {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, whose key + field is "key", the + + operator is "In", and the values array contains only "value". + The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + 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 + metadata: + type: object + namespaceSelector: + description: 'A label selector is a label query over a set of resources. + The result of matchLabels and + + matchExpressions are ANDed. An empty label selector matches all objects. + A null + + label selector matches no objects.' + nullable: true + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. + The requirements are ANDed. + items: + description: 'A label selector requirement is a selector that + contains values, a key, and an operator that + + relates the key and values.' + properties: + key: + description: key is the label key that the selector applies + to. + type: string + operator: + description: 'operator represents a key''s relationship to + a set of values. + + Valid operators are In, NotIn, Exists and DoesNotExist.' + type: string + values: + description: 'values is an array of string values. If the + operator is In or NotIn, + + the values array must be non-empty. If the operator is Exists + or DoesNotExist, + + the values array must be empty. This array is replaced during + a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} pairs. A single + {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, whose key + field is "key", the + + operator is "In", and the values array contains only "value". + The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + name: bundles.fleet.cattle.io +spec: + group: fleet.cattle.io + names: + kind: Bundle + listKind: BundleList + plural: bundles + singular: bundle + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .status.display.readyClusters + name: BundleDeployments-Ready + type: string + - jsonPath: .status.conditions[?(@.type=="Ready")].message + name: Status + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: 'Bundle contains the resources of an application and its deployment + options. + + It will be deployed as a Helm chart to target clusters. + + + + When a GitRepo is scanned it will produce one or more bundles. Bundles + are + + a collection of resources that get deployed to one or more cluster(s). + Bundle is the + + fundamental deployment unit used in Fleet. The contents of a Bundle may + be + + Kubernetes manifests, Kustomize configuration, or Helm charts. Regardless + + of the source the contents are dynamically rendered into a Helm chart + by + + the agent and installed into the downstream cluster as a Helm release.' + 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 + metadata: + type: object + spec: + properties: + contentsId: + description: ContentsID stores the contents id when deploying contents + using an OCI registry. + nullable: true + type: string + correctDrift: + description: CorrectDrift specifies how drift correction should + work. + properties: + enabled: + description: Enabled correct drift if true. + type: boolean + force: + description: Force helm rollback with --force option will be + used if true. This will try to recreate all resources in the + release. + type: boolean + keepFailHistory: + description: KeepFailHistory keeps track of failed rollbacks + in the helm history. + type: boolean + type: object + defaultNamespace: + description: 'DefaultNamespace is the namespace to use for resources + that do not + + specify a namespace. This field is not used to enforce or lock + down + + the deployment to a specific namespace.' + nullable: true + type: string + deleteCRDResources: + description: DeleteCRDResources deletes CRDs. Warning! this will + also delete all your Custom Resources. + type: boolean + deleteNamespace: + description: DeleteNamespace can be used to delete the deployed + namespace when removing the bundle + type: boolean + dependsOn: + description: DependsOn refers to the bundles which must be ready + before this bundle can be deployed. + items: + properties: + name: + description: Name of the bundle. + nullable: true + type: string + selector: + description: Selector matching bundle's labels. + nullable: true + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: 'A label selector requirement is a selector + that contains values, a key, and an operator that + + relates the key and values.' + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: 'operator represents a key''s relationship + to a set of values. + + Valid operators are In, NotIn, Exists and DoesNotExist.' + type: string + values: + description: 'values is an array of string values. + If the operator is In or NotIn, + + the values array must be non-empty. If the operator + is Exists or DoesNotExist, + + the values array must be empty. This array is + replaced during a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} pairs. + A single {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, + whose key field is "key", the + + operator is "In", and the values array contains only + "value". The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + type: object + nullable: true + type: array + diff: + description: Diff can be used to ignore the modified state of objects + which are amended at runtime. + nullable: true + properties: + comparePatches: + description: ComparePatches match a resource and remove fields + from the check for modifications. + items: + description: ComparePatch matches a resource and removes fields + from the check for modifications. + properties: + apiVersion: + description: APIVersion is the apiVersion of the resource + to match. + nullable: true + type: string + jsonPointers: + description: JSONPointers ignore diffs at a certain JSON + path. + items: + type: string + nullable: true + type: array + kind: + description: Kind is the kind of the resource to match. + nullable: true + type: string + name: + description: Name is the name of the resource to match. + nullable: true + type: string + namespace: + description: Namespace is the namespace of the resource + to match. + nullable: true + type: string + operations: + description: Operations remove a JSON path from the resource. + items: + description: Operation of a ComparePatch, usually "remove". + properties: + op: + description: Op is usually "remove" + nullable: true + type: string + path: + description: Path is the JSON path to remove. + nullable: true + type: string + value: + description: Value is usually empty. + nullable: true + type: string + type: object + nullable: true + type: array + type: object + nullable: true + type: array + type: object + forceSyncGeneration: + description: ForceSyncGeneration is used to force a redeployment + format: int64 + type: integer + helm: + description: Helm options for the deployment, like the chart name, + repo and values. + nullable: true + properties: + atomic: + description: Atomic sets the --atomic flag when Helm is performing + an upgrade + type: boolean + chart: + description: 'Chart can refer to any go-getter URL or OCI registry + based helm + + chart URL. The chart will be downloaded.' + nullable: true + type: string + disableDNS: + description: DisableDNS can be used to customize Helm's EnableDNS + option, which Fleet sets to `true` by default. + type: boolean + disableDependencyUpdate: + description: DisableDependencyUpdate allows skipping chart dependencies + update + type: boolean + disablePreProcess: + description: DisablePreProcess disables template processing + in values + type: boolean + force: + description: Force allows to override immutable resources. This + could be dangerous. + type: boolean + maxHistory: + description: MaxHistory limits the maximum number of revisions + saved per release by Helm. + type: integer + releaseName: + description: 'ReleaseName sets a custom release name to deploy + the chart as. If + + not specified a release name will be generated by combining + the + + invoking GitRepo.name + GitRepo.path.' + maxLength: 53 + nullable: true + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + type: string + repo: + description: Repo is the name of the HTTPS helm repo to download + the chart from. + nullable: true + type: string + skipSchemaValidation: + description: SkipSchemaValidation allows skipping schema validation + against the chart values + type: boolean + takeOwnership: + description: TakeOwnership makes helm skip the check for its + own annotations + type: boolean + timeoutSeconds: + description: TimeoutSeconds is the time to wait for Helm operations. + type: integer + values: + description: 'Values passed to Helm. It is possible to specify + the keys and values + + as go template strings.' + nullable: true + type: object + x-kubernetes-preserve-unknown-fields: true + valuesFiles: + description: ValuesFiles is a list of files to load values from. + items: + type: string + nullable: true + type: array + valuesFrom: + description: ValuesFrom loads the values from configmaps and + secrets. + items: + description: 'Define helm values that can come from configmap, + secret or external. Credit: https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439' + properties: + configMapKeyRef: + description: The reference to a config map with release + values. + nullable: true + properties: + key: + nullable: true + type: string + name: + description: Name of a resource in the same namespace + as the referent. + nullable: true + type: string + namespace: + nullable: true + type: string + type: object + secretKeyRef: + description: The reference to a secret with release values. + nullable: true + properties: + key: + nullable: true + type: string + name: + description: Name of a resource in the same namespace + as the referent. + nullable: true + type: string + namespace: + nullable: true + type: string + type: object + type: object + nullable: true + type: array + version: + description: Version of the chart to download + nullable: true + type: string + waitForJobs: + description: 'WaitForJobs if set and timeoutSeconds provided, + will wait until all + + Jobs have been completed before marking the GitRepo as ready. + It + + will wait for as long as timeoutSeconds' + type: boolean + type: object + ignore: + description: IgnoreOptions can be used to ignore fields when monitoring + the bundle. + properties: + conditions: + description: Conditions is a list of conditions to be ignored + when monitoring the Bundle. + items: + additionalProperties: + type: string + type: object + nullable: true + type: array + type: object + keepResources: + description: KeepResources can be used to keep the deployed resources + when removing the bundle + type: boolean + kustomize: + description: 'Kustomize options for the deployment, like the dir + containing the + + kustomization.yaml file.' + nullable: true + properties: + dir: + description: 'Dir points to a custom folder for kustomize resources. + This folder must contain + + a kustomization.yaml file.' + nullable: true + type: string + type: object + namespace: + description: 'TargetNamespace if present will assign all resource + to this + + namespace and if any cluster scoped resource exists the deployment + + will fail.' + nullable: true + type: string + namespaceAnnotations: + additionalProperties: + type: string + description: NamespaceAnnotations are annotations that will be appended + to the namespace created by Fleet. + nullable: true + type: object + namespaceLabels: + additionalProperties: + type: string + description: NamespaceLabels are labels that will be appended to + the namespace created by Fleet. + nullable: true + type: object + paused: + description: Paused if set to true, will stop any BundleDeployments + from being updated. It will be marked as out of sync. + type: boolean + resources: + description: 'Resources contains the resources that were read from + the bundle''s + + path. This includes the content of downloaded helm charts.' + items: + description: BundleResource represents the content of a single + resource from the bundle, like a YAML manifest. + properties: + content: + description: The content of the resource, can be compressed. + nullable: true + type: string + encoding: + description: Encoding is either empty or "base64+gz". + nullable: true + type: string + name: + description: Name of the resource, can include the bundle's + internal path. + nullable: true + type: string + type: object + nullable: true + type: array + rolloutStrategy: + description: 'RolloutStrategy controls the rollout of bundles, by + defining + + partitions, canaries and percentages for cluster availability.' + nullable: true + properties: + autoPartitionSize: + anyOf: + - type: integer + - type: string + description: 'A number or percentage of how to automatically + partition clusters if no + + specific partitioning strategy is configured. + + default: 25%' + nullable: true + x-kubernetes-int-or-string: true + maxUnavailable: + anyOf: + - type: integer + - type: string + description: 'A number or percentage of clusters that can be + unavailable during an update + + of a bundle. This follows the same basic approach as a deployment + rollout + + strategy. Once the number of clusters meets unavailable state + update will be + + paused. Default value is 100% which doesn''t take effect on + update. + + default: 100%' + nullable: true + x-kubernetes-int-or-string: true + maxUnavailablePartitions: + anyOf: + - type: integer + - type: string + description: 'A number or percentage of cluster partitions that + can be unavailable during + + an update of a bundle. + + default: 0' + nullable: true + x-kubernetes-int-or-string: true + partitions: + description: 'A list of definitions of partitions. If any target + clusters do not match + + the configuration they are added to partitions at the end + following the + + autoPartitionSize.' + items: + description: Partition defines a separate rollout strategy + for a set of clusters. + properties: + clusterGroup: + description: A cluster group name to include in this partition + type: string + clusterGroupSelector: + description: Selector matching cluster group labels to + include in this partition + nullable: true + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: 'A label selector requirement is a + selector that contains values, a key, and an operator + that + + relates the key and values.' + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: 'operator represents a key''s relationship + to a set of values. + + Valid operators are In, NotIn, Exists and + DoesNotExist.' + type: string + values: + description: 'values is an array of string values. + If the operator is In or NotIn, + + the values array must be non-empty. If the + operator is Exists or DoesNotExist, + + the values array must be empty. This array + is replaced during a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, + whose key field is "key", the + + operator is "In", and the values array contains + only "value". The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + clusterName: + description: ClusterName is the name of a cluster to include + in this partition + type: string + clusterSelector: + description: Selector matching cluster labels to include + in this partition + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: 'A label selector requirement is a + selector that contains values, a key, and an operator + that + + relates the key and values.' + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: 'operator represents a key''s relationship + to a set of values. + + Valid operators are In, NotIn, Exists and + DoesNotExist.' + type: string + values: + description: 'values is an array of string values. + If the operator is In or NotIn, + + the values array must be non-empty. If the + operator is Exists or DoesNotExist, + + the values array must be empty. This array + is replaced during a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, + whose key field is "key", the + + operator is "In", and the values array contains + only "value". The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + maxUnavailable: + anyOf: + - type: integer + - type: string + description: 'A number or percentage of clusters that + can be unavailable in this + + partition before this partition is treated as done. + + default: 10%' + x-kubernetes-int-or-string: true + name: + description: A user-friendly name given to the partition + used for Display (optional). + nullable: true + type: string + type: object + nullable: true + type: array + type: object + serviceAccount: + description: ServiceAccount which will be used to perform this deployment. + nullable: true + type: string + targetRestrictions: + description: TargetRestrictions is an allow list, which controls + if a bundledeployment is created for a target. + items: + description: 'BundleTargetRestriction is used internally by Fleet + and should not be modified. + + It acts as an allow list, to prevent the creation of BundleDeployments + from + + Targets created by TargetCustomizations in fleet.yaml.' + properties: + clusterGroup: + nullable: true + type: string + clusterGroupSelector: + description: 'A label selector is a label query over a set + of resources. The result of matchLabels and + + matchExpressions are ANDed. An empty label selector matches + all objects. A null + + label selector matches no objects.' + nullable: true + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: 'A label selector requirement is a selector + that contains values, a key, and an operator that + + relates the key and values.' + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: 'operator represents a key''s relationship + to a set of values. + + Valid operators are In, NotIn, Exists and DoesNotExist.' + type: string + values: + description: 'values is an array of string values. + If the operator is In or NotIn, + + the values array must be non-empty. If the operator + is Exists or DoesNotExist, + + the values array must be empty. This array is + replaced during a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} pairs. + A single {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, + whose key field is "key", the + + operator is "In", and the values array contains only + "value". The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + clusterName: + nullable: true + type: string + clusterSelector: + description: 'A label selector is a label query over a set + of resources. The result of matchLabels and + + matchExpressions are ANDed. An empty label selector matches + all objects. A null + + label selector matches no objects.' + nullable: true + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: 'A label selector requirement is a selector + that contains values, a key, and an operator that + + relates the key and values.' + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: 'operator represents a key''s relationship + to a set of values. + + Valid operators are In, NotIn, Exists and DoesNotExist.' + type: string + values: + description: 'values is an array of string values. + If the operator is In or NotIn, + + the values array must be non-empty. If the operator + is Exists or DoesNotExist, + + the values array must be empty. This array is + replaced during a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} pairs. + A single {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, + whose key field is "key", the + + operator is "In", and the values array contains only + "value". The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + name: + nullable: true + type: string + type: object + type: array + targets: + description: 'Targets refer to the clusters which will be deployed + to. + + Targets are evaluated in order and the first one to match is used.' + items: + description: 'BundleTarget declares clusters to deploy to. Fleet + will merge the + + BundleDeploymentOptions from customizations into this struct.' + properties: + clusterGroup: + description: ClusterGroup to match a specific cluster group + by name. + nullable: true + type: string + clusterGroupSelector: + description: ClusterGroupSelector is a selector to match cluster + groups. + nullable: true + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: 'A label selector requirement is a selector + that contains values, a key, and an operator that + + relates the key and values.' + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: 'operator represents a key''s relationship + to a set of values. + + Valid operators are In, NotIn, Exists and DoesNotExist.' + type: string + values: + description: 'values is an array of string values. + If the operator is In or NotIn, + + the values array must be non-empty. If the operator + is Exists or DoesNotExist, + + the values array must be empty. This array is + replaced during a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} pairs. + A single {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, + whose key field is "key", the + + operator is "In", and the values array contains only + "value". The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + clusterName: + description: 'ClusterName to match a specific cluster by name + that will be + + selected' + nullable: true + type: string + clusterSelector: + description: 'ClusterSelector is a selector to match clusters. + The structure is + + the standard metav1.LabelSelector format. If clusterGroupSelector + or + + clusterGroup is specified, clusterSelector will be used + only to + + further refine the selection after clusterGroupSelector + and + + clusterGroup is evaluated.' + nullable: true + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: 'A label selector requirement is a selector + that contains values, a key, and an operator that + + relates the key and values.' + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: 'operator represents a key''s relationship + to a set of values. + + Valid operators are In, NotIn, Exists and DoesNotExist.' + type: string + values: + description: 'values is an array of string values. + If the operator is In or NotIn, + + the values array must be non-empty. If the operator + is Exists or DoesNotExist, + + the values array must be empty. This array is + replaced during a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} pairs. + A single {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, + whose key field is "key", the + + operator is "In", and the values array contains only + "value". The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + correctDrift: + description: CorrectDrift specifies how drift correction should + work. + properties: + enabled: + description: Enabled correct drift if true. + type: boolean + force: + description: Force helm rollback with --force option will + be used if true. This will try to recreate all resources + in the release. + type: boolean + keepFailHistory: + description: KeepFailHistory keeps track of failed rollbacks + in the helm history. + type: boolean + type: object + defaultNamespace: + description: 'DefaultNamespace is the namespace to use for + resources that do not + + specify a namespace. This field is not used to enforce or + lock down + + the deployment to a specific namespace.' + nullable: true + type: string + deleteCRDResources: + description: DeleteCRDResources deletes CRDs. Warning! this + will also delete all your Custom Resources. + type: boolean + deleteNamespace: + description: DeleteNamespace can be used to delete the deployed + namespace when removing the bundle + type: boolean + diff: + description: Diff can be used to ignore the modified state + of objects which are amended at runtime. + nullable: true + properties: + comparePatches: + description: ComparePatches match a resource and remove + fields from the check for modifications. + items: + description: ComparePatch matches a resource and removes + fields from the check for modifications. + properties: + apiVersion: + description: APIVersion is the apiVersion of the + resource to match. + nullable: true + type: string + jsonPointers: + description: JSONPointers ignore diffs at a certain + JSON path. + items: + type: string + nullable: true + type: array + kind: + description: Kind is the kind of the resource to + match. + nullable: true + type: string + name: + description: Name is the name of the resource to + match. + nullable: true + type: string + namespace: + description: Namespace is the namespace of the resource + to match. + nullable: true + type: string + operations: + description: Operations remove a JSON path from + the resource. + items: + description: Operation of a ComparePatch, usually + "remove". + properties: + op: + description: Op is usually "remove" + nullable: true + type: string + path: + description: Path is the JSON path to remove. + nullable: true + type: string + value: + description: Value is usually empty. + nullable: true + type: string + type: object + nullable: true + type: array + type: object + nullable: true + type: array + type: object + doNotDeploy: + description: DoNotDeploy if set to true, will not deploy to + this target. + type: boolean + forceSyncGeneration: + description: ForceSyncGeneration is used to force a redeployment + format: int64 + type: integer + helm: + description: Helm options for the deployment, like the chart + name, repo and values. + nullable: true + properties: + atomic: + description: Atomic sets the --atomic flag when Helm is + performing an upgrade + type: boolean + chart: + description: 'Chart can refer to any go-getter URL or + OCI registry based helm + + chart URL. The chart will be downloaded.' + nullable: true + type: string + disableDNS: + description: DisableDNS can be used to customize Helm's + EnableDNS option, which Fleet sets to `true` by default. + type: boolean + disableDependencyUpdate: + description: DisableDependencyUpdate allows skipping chart + dependencies update + type: boolean + disablePreProcess: + description: DisablePreProcess disables template processing + in values + type: boolean + force: + description: Force allows to override immutable resources. + This could be dangerous. + type: boolean + maxHistory: + description: MaxHistory limits the maximum number of revisions + saved per release by Helm. + type: integer + releaseName: + description: 'ReleaseName sets a custom release name to + deploy the chart as. If + + not specified a release name will be generated by combining + the + + invoking GitRepo.name + GitRepo.path.' + maxLength: 53 + nullable: true + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + type: string + repo: + description: Repo is the name of the HTTPS helm repo to + download the chart from. + nullable: true + type: string + skipSchemaValidation: + description: SkipSchemaValidation allows skipping schema + validation against the chart values + type: boolean + takeOwnership: + description: TakeOwnership makes helm skip the check for + its own annotations + type: boolean + timeoutSeconds: + description: TimeoutSeconds is the time to wait for Helm + operations. + type: integer + values: + description: 'Values passed to Helm. It is possible to + specify the keys and values + + as go template strings.' + nullable: true + type: object + x-kubernetes-preserve-unknown-fields: true + valuesFiles: + description: ValuesFiles is a list of files to load values + from. + items: + type: string + nullable: true + type: array + valuesFrom: + description: ValuesFrom loads the values from configmaps + and secrets. + items: + description: 'Define helm values that can come from + configmap, secret or external. Credit: https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439' + properties: + configMapKeyRef: + description: The reference to a config map with + release values. + nullable: true + properties: + key: + nullable: true + type: string + name: + description: Name of a resource in the same + namespace as the referent. + nullable: true + type: string + namespace: + nullable: true + type: string + type: object + secretKeyRef: + description: The reference to a secret with release + values. + nullable: true + properties: + key: + nullable: true + type: string + name: + description: Name of a resource in the same + namespace as the referent. + nullable: true + type: string + namespace: + nullable: true + type: string + type: object + type: object + nullable: true + type: array + version: + description: Version of the chart to download + nullable: true + type: string + waitForJobs: + description: 'WaitForJobs if set and timeoutSeconds provided, + will wait until all + + Jobs have been completed before marking the GitRepo + as ready. It + + will wait for as long as timeoutSeconds' + type: boolean + type: object + ignore: + description: IgnoreOptions can be used to ignore fields when + monitoring the bundle. + properties: + conditions: + description: Conditions is a list of conditions to be + ignored when monitoring the Bundle. + items: + additionalProperties: + type: string + type: object + nullable: true + type: array + type: object + keepResources: + description: KeepResources can be used to keep the deployed + resources when removing the bundle + type: boolean + kustomize: + description: 'Kustomize options for the deployment, like the + dir containing the + + kustomization.yaml file.' + nullable: true + properties: + dir: + description: 'Dir points to a custom folder for kustomize + resources. This folder must contain + + a kustomization.yaml file.' + nullable: true + type: string + type: object + name: + description: 'Name of target. This value is largely for display + and logging. If + + not specified a default name of the format "target000" will + be used' + type: string + namespace: + description: 'TargetNamespace if present will assign all resource + to this + + namespace and if any cluster scoped resource exists the + deployment + + will fail.' + nullable: true + type: string + namespaceAnnotations: + additionalProperties: + type: string + description: NamespaceAnnotations are annotations that will + be appended to the namespace created by Fleet. + nullable: true + type: object + namespaceLabels: + additionalProperties: + type: string + description: NamespaceLabels are labels that will be appended + to the namespace created by Fleet. + nullable: true + type: object + serviceAccount: + description: ServiceAccount which will be used to perform + this deployment. + nullable: true + type: string + yaml: + description: 'YAML options, if using raw YAML these are names + that map to + + overlays/{name} files that will be used to replace or patch + a resource.' + nullable: true + properties: + overlays: + description: 'Overlays is a list of names that maps to + folders in "overlays/". + + If you wish to customize the file ./subdir/resource.yaml + then a file + + ./overlays/myoverlay/subdir/resource.yaml will replace + the base + + file. + + A file named ./overlays/myoverlay/subdir/resource_patch.yaml + will patch the base file.' + items: + type: string + nullable: true + type: array + type: object + type: object + type: array + yaml: + description: 'YAML options, if using raw YAML these are names that + map to + + overlays/{name} files that will be used to replace or patch a + resource.' + nullable: true + properties: + overlays: + description: 'Overlays is a list of names that maps to folders + in "overlays/". + + If you wish to customize the file ./subdir/resource.yaml then + a file + + ./overlays/myoverlay/subdir/resource.yaml will replace the + base + + file. + + A file named ./overlays/myoverlay/subdir/resource_patch.yaml + will patch the base file.' + items: + type: string + nullable: true + type: array + type: object + type: object + status: + properties: + conditions: + description: 'Conditions is a list of Wrangler conditions that describe + the state + + of the bundle.' + items: + properties: + lastTransitionTime: + description: Last time the condition transitioned from one + status to another. + type: string + lastUpdateTime: + description: The last time this condition was updated. + type: string + message: + description: Human-readable message indicating details about + last transition + type: string + reason: + description: The reason for the condition's last transition. + type: string + status: + description: Status of the condition, one of True, False, + Unknown. + type: string + type: + description: Type of cluster condition. + type: string + required: + - status + - type + type: object + type: array + display: + description: 'Display contains the number of ready, desiredready + clusters and a + + summary state for the bundle''s resources.' + properties: + readyClusters: + description: 'ReadyClusters is a string in the form "%d/%d", + that describes the + + number of clusters that are ready vs. the number of clusters + desired + + to be ready.' + nullable: true + type: string + state: + description: State is a summary state for the bundle, calculated + over the non-ready resources. + nullable: true + type: string + type: object + maxNew: + description: 'MaxNew is always 50. A bundle change can only stage + 50 + + bundledeployments at a time.' + type: integer + maxUnavailable: + description: 'MaxUnavailable is the maximum number of unavailable + deployments. See + + rollout configuration.' + type: integer + maxUnavailablePartitions: + description: 'MaxUnavailablePartitions is the maximum number of + unavailable + + partitions. The rollout configuration defines a maximum number + or + + percentage of unavailable partitions.' + type: integer + newlyCreated: + description: 'NewlyCreated is the number of bundle deployments that + have been created, + + not updated.' + type: integer + observedGeneration: + description: ObservedGeneration is the current generation of the + bundle. + format: int64 + type: integer + ociReference: + description: 'OCIReference is the OCI reference used to store contents, + this is + + only for informational purposes.' + type: string + partitions: + description: PartitionStatus lists the status of each partition. + items: + description: PartitionStatus is the status of a single rollout + partition. + properties: + count: + description: Count is the number of clusters in the partition. + type: integer + maxUnavailable: + description: MaxUnavailable is the maximum number of unavailable + clusters in the partition. + type: integer + name: + description: Name is the name of the partition. + nullable: true + type: string + summary: + description: Summary is a summary state for the partition, + calculated over its non-ready resources. + properties: + desiredReady: + description: 'DesiredReady is the number of bundle deployments + that should be + + ready.' + type: integer + errApplied: + description: 'ErrApplied is the number of bundle deployments + that have been synced + + from the Fleet controller and the downstream cluster, + but with some + + errors when deploying the bundle.' + type: integer + modified: + description: 'Modified is the number of bundle deployments + that have been deployed + + and for which all resources are ready, but where some + changes from the + + Git repository have not yet been synced.' + type: integer + nonReadyResources: + description: 'NonReadyClusters is a list of states, which + is filled for a bundle + + that is not ready.' + items: + description: 'NonReadyResource contains information + about a bundle that is not ready for a + + given state like "ErrApplied". It contains a list + of non-ready or modified + + resources and their states.' + properties: + bundleState: + description: State is the state of the resource, + like e.g. "NotReady" or "ErrApplied". + nullable: true + type: string + message: + description: Message contains information why the + bundle is not ready. + nullable: true + type: string + modifiedStatus: + description: ModifiedStatus lists the state for + each modified resource. + items: + description: 'ModifiedStatus is used to report + the status of a resource that is modified. + + It indicates if the modification was a create, + a delete or a patch.' + properties: + apiVersion: + nullable: true + type: string + delete: + type: boolean + kind: + nullable: true + type: string + missing: + type: boolean + name: + nullable: true + type: string + namespace: + nullable: true + type: string + patch: + nullable: true + type: string + type: object + nullable: true + type: array + name: + description: Name is the name of the resource. + nullable: true + type: string + nonReadyStatus: + description: NonReadyStatus lists the state for + each non-ready resource. + items: + description: NonReadyStatus is used to report + the status of a resource that is not ready. + It includes a summary. + properties: + apiVersion: + nullable: true + type: string + kind: + nullable: true + type: string + name: + nullable: true + type: string + namespace: + nullable: true + type: string + summary: + properties: + error: + type: boolean + message: + items: + type: string + type: array + state: + type: string + transitioning: + type: boolean + type: object + uid: + description: 'UID is a type that holds unique + ID values, including UUIDs. Because we + + don''t ONLY use UUIDs, this is an alias + to string. Being a type captures + + intent and helps make sure that UIDs and + names do not get conflated.' + nullable: true + type: string + type: object + nullable: true + type: array + type: object + nullable: true + type: array + notReady: + description: 'NotReady is the number of bundle deployments + that have been deployed + + where some resources are not ready.' + type: integer + outOfSync: + description: 'OutOfSync is the number of bundle deployments + that have been synced + + from Fleet controller, but not yet by the downstream + agent.' + type: integer + pending: + description: 'Pending is the number of bundle deployments + that are being processed + + by Fleet controller.' + type: integer + ready: + description: 'Ready is the number of bundle deployments + that have been deployed + + where all resources are ready.' + type: integer + waitApplied: + description: 'WaitApplied is the number of bundle deployments + that have been + + synced from Fleet controller and downstream cluster, + but are waiting + + to be deployed.' + type: integer + type: object + unavailable: + description: Unavailable is the number of unavailable clusters + in the partition. + type: integer + type: object + type: array + resourceKey: + description: 'ResourceKey lists resources, which will likely be + deployed. The + + actual list of resources on a cluster might differ, depending + on the + + helm chart, value templating, etc..' + items: + description: ResourceKey lists resources, which will likely be + deployed. + properties: + apiVersion: + description: APIVersion is the k8s api version of the resource. + nullable: true + type: string + kind: + description: Kind is the k8s api kind of the resource. + nullable: true + type: string + name: + description: Name is the name of the resource. + nullable: true + type: string + namespace: + description: Namespace is the namespace of the resource. + nullable: true + type: string + type: object + nullable: true + type: array + resourcesSha256Sum: + description: ResourcesSHA256Sum corresponds to the JSON serialization + of the .Spec.Resources field + type: string + summary: + description: 'Summary contains the number of bundle deployments + in each state and + + a list of non-ready resources.' + properties: + desiredReady: + description: 'DesiredReady is the number of bundle deployments + that should be + + ready.' + type: integer + errApplied: + description: 'ErrApplied is the number of bundle deployments + that have been synced + + from the Fleet controller and the downstream cluster, but + with some + + errors when deploying the bundle.' + type: integer + modified: + description: 'Modified is the number of bundle deployments that + have been deployed + + and for which all resources are ready, but where some changes + from the + + Git repository have not yet been synced.' + type: integer + nonReadyResources: + description: 'NonReadyClusters is a list of states, which is + filled for a bundle + + that is not ready.' + items: + description: 'NonReadyResource contains information about + a bundle that is not ready for a + + given state like "ErrApplied". It contains a list of non-ready + or modified + + resources and their states.' + properties: + bundleState: + description: State is the state of the resource, like + e.g. "NotReady" or "ErrApplied". + nullable: true + type: string + message: + description: Message contains information why the bundle + is not ready. + nullable: true + type: string + modifiedStatus: + description: ModifiedStatus lists the state for each modified + resource. + items: + description: 'ModifiedStatus is used to report the status + of a resource that is modified. + + It indicates if the modification was a create, a delete + or a patch.' + properties: + apiVersion: + nullable: true + type: string + delete: + type: boolean + kind: + nullable: true + type: string + missing: + type: boolean + name: + nullable: true + type: string + namespace: + nullable: true + type: string + patch: + nullable: true + type: string + type: object + nullable: true + type: array + name: + description: Name is the name of the resource. + nullable: true + type: string + nonReadyStatus: + description: NonReadyStatus lists the state for each non-ready + resource. + items: + description: NonReadyStatus is used to report the status + of a resource that is not ready. It includes a summary. + properties: + apiVersion: + nullable: true + type: string + kind: + nullable: true + type: string + name: + nullable: true + type: string + namespace: + nullable: true + type: string + summary: + properties: + error: + type: boolean + message: + items: + type: string + type: array + state: + type: string + transitioning: + type: boolean + type: object + uid: + description: 'UID is a type that holds unique ID + values, including UUIDs. Because we + + don''t ONLY use UUIDs, this is an alias to string. Being + a type captures + + intent and helps make sure that UIDs and names + do not get conflated.' + nullable: true + type: string + type: object + nullable: true + type: array + type: object + nullable: true + type: array + notReady: + description: 'NotReady is the number of bundle deployments that + have been deployed + + where some resources are not ready.' + type: integer + outOfSync: + description: 'OutOfSync is the number of bundle deployments + that have been synced + + from Fleet controller, but not yet by the downstream agent.' + type: integer + pending: + description: 'Pending is the number of bundle deployments that + are being processed + + by Fleet controller.' + type: integer + ready: + description: 'Ready is the number of bundle deployments that + have been deployed + + where all resources are ready.' + type: integer + waitApplied: + description: 'WaitApplied is the number of bundle deployments + that have been + + synced from Fleet controller and downstream cluster, but are + waiting + + to be deployed.' + type: integer + type: object + unavailable: + description: 'Unavailable is the number of bundle deployments that + are not ready or + + where the AppliedDeploymentID in the status does not match the + + DeploymentID from the spec.' + type: integer + unavailablePartitions: + description: UnavailablePartitions is the number of unavailable + partitions. + type: integer + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + name: clustergroups.fleet.cattle.io +spec: + group: fleet.cattle.io + names: + categories: + - fleet + kind: ClusterGroup + listKind: ClusterGroupList + plural: clustergroups + singular: clustergroup + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .status.display.readyClusters + name: Clusters-Ready + type: string + - jsonPath: .status.display.readyBundles + name: Bundles-Ready + type: string + - jsonPath: .status.conditions[?(@.type=="Ready")].message + name: Status + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: ClusterGroup is a re-usable selector to target a group of clusters. + 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 + metadata: + type: object + spec: + properties: + selector: + description: Selector is a label selector, used to select clusters + for this group. + nullable: true + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. + The requirements are ANDed. + items: + description: 'A label selector requirement is a selector that + contains values, a key, and an operator that + + relates the key and values.' + properties: + key: + description: key is the label key that the selector applies + to. + type: string + operator: + description: 'operator represents a key''s relationship + to a set of values. + + Valid operators are In, NotIn, Exists and DoesNotExist.' + type: string + values: + description: 'values is an array of string values. If + the operator is In or NotIn, + + the values array must be non-empty. If the operator + is Exists or DoesNotExist, + + the values array must be empty. This array is replaced + during a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} pairs. A single + {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, whose + key field is "key", the + + operator is "In", and the values array contains only "value". + The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + type: object + status: + properties: + clusterCount: + description: ClusterCount is the number of clusters in the cluster + group. + type: integer + conditions: + description: Conditions is a list of conditions and their statuses + for the cluster group. + items: + properties: + lastTransitionTime: + description: Last time the condition transitioned from one + status to another. + type: string + lastUpdateTime: + description: The last time this condition was updated. + type: string + message: + description: Human-readable message indicating details about + last transition + type: string + reason: + description: The reason for the condition's last transition. + type: string + status: + description: Status of the condition, one of True, False, + Unknown. + type: string + type: + description: Type of cluster condition. + type: string + required: + - status + - type + type: object + type: array + display: + description: 'Display contains the number of ready, desiredready + clusters and a + + summary state for the bundle''s resources.' + properties: + readyBundles: + description: 'ReadyBundles is a string in the form "%d/%d", + that describes the + + number of bundles that are ready vs. the number of bundles + desired + + to be ready.' + nullable: true + type: string + readyClusters: + description: 'ReadyClusters is a string in the form "%d/%d", + that describes the + + number of clusters that are ready vs. the number of clusters + desired + + to be ready.' + nullable: true + type: string + state: + description: 'State is a summary state for the cluster group, + showing "NotReady" if + + there are non-ready resources.' + nullable: true + type: string + type: object + nonReadyClusterCount: + description: NonReadyClusterCount is the number of clusters that + are not ready. + type: integer + nonReadyClusters: + description: NonReadyClusters is a list of cluster names that are + not ready. + items: + type: string + nullable: true + type: array + resourceCounts: + description: 'ResourceCounts contains the number of resources in + each state over + + all bundles in the cluster group.' + properties: + desiredReady: + description: DesiredReady is the number of resources that should + be ready. + type: integer + missing: + description: Missing is the number of missing resources. + type: integer + modified: + description: Modified is the number of resources that have been + modified. + type: integer + notReady: + description: 'NotReady is the number of not ready resources. + Resources are not + + ready if they do not match any other state.' + type: integer + orphaned: + description: Orphaned is the number of orphaned resources. + type: integer + ready: + description: Ready is the number of ready resources. + type: integer + unknown: + description: Unknown is the number of resources in an unknown + state. + type: integer + waitApplied: + description: WaitApplied is the number of resources that are + waiting to be applied. + type: integer + type: object + summary: + description: 'Summary is a summary of the bundle deployments and + their resources + + in the cluster group.' + properties: + desiredReady: + description: 'DesiredReady is the number of bundle deployments + that should be + + ready.' + type: integer + errApplied: + description: 'ErrApplied is the number of bundle deployments + that have been synced + + from the Fleet controller and the downstream cluster, but + with some + + errors when deploying the bundle.' + type: integer + modified: + description: 'Modified is the number of bundle deployments that + have been deployed + + and for which all resources are ready, but where some changes + from the + + Git repository have not yet been synced.' + type: integer + nonReadyResources: + description: 'NonReadyClusters is a list of states, which is + filled for a bundle + + that is not ready.' + items: + description: 'NonReadyResource contains information about + a bundle that is not ready for a + + given state like "ErrApplied". It contains a list of non-ready + or modified + + resources and their states.' + properties: + bundleState: + description: State is the state of the resource, like + e.g. "NotReady" or "ErrApplied". + nullable: true + type: string + message: + description: Message contains information why the bundle + is not ready. + nullable: true + type: string + modifiedStatus: + description: ModifiedStatus lists the state for each modified + resource. + items: + description: 'ModifiedStatus is used to report the status + of a resource that is modified. + + It indicates if the modification was a create, a delete + or a patch.' + properties: + apiVersion: + nullable: true + type: string + delete: + type: boolean + kind: + nullable: true + type: string + missing: + type: boolean + name: + nullable: true + type: string + namespace: + nullable: true + type: string + patch: + nullable: true + type: string + type: object + nullable: true + type: array + name: + description: Name is the name of the resource. + nullable: true + type: string + nonReadyStatus: + description: NonReadyStatus lists the state for each non-ready + resource. + items: + description: NonReadyStatus is used to report the status + of a resource that is not ready. It includes a summary. + properties: + apiVersion: + nullable: true + type: string + kind: + nullable: true + type: string + name: + nullable: true + type: string + namespace: + nullable: true + type: string + summary: + properties: + error: + type: boolean + message: + items: + type: string + type: array + state: + type: string + transitioning: + type: boolean + type: object + uid: + description: 'UID is a type that holds unique ID + values, including UUIDs. Because we + + don''t ONLY use UUIDs, this is an alias to string. Being + a type captures + + intent and helps make sure that UIDs and names + do not get conflated.' + nullable: true + type: string + type: object + nullable: true + type: array + type: object + nullable: true + type: array + notReady: + description: 'NotReady is the number of bundle deployments that + have been deployed + + where some resources are not ready.' + type: integer + outOfSync: + description: 'OutOfSync is the number of bundle deployments + that have been synced + + from Fleet controller, but not yet by the downstream agent.' + type: integer + pending: + description: 'Pending is the number of bundle deployments that + are being processed + + by Fleet controller.' + type: integer + ready: + description: 'Ready is the number of bundle deployments that + have been deployed + + where all resources are ready.' + type: integer + waitApplied: + description: 'WaitApplied is the number of bundle deployments + that have been + + synced from Fleet controller and downstream cluster, but are + waiting + + to be deployed.' + type: integer + type: object + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + name: clusterregistrations.fleet.cattle.io +spec: + group: fleet.cattle.io + names: + kind: ClusterRegistration + listKind: ClusterRegistrationList + plural: clusterregistrations + singular: clusterregistration + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .status.clusterName + name: Cluster-Name + type: string + - jsonPath: .spec.clusterLabels + name: Labels + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: ClusterRegistration is used internally by Fleet and should + not be used directly. + 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 + metadata: + type: object + spec: + properties: + clientID: + description: 'ClientID is a unique string that will identify the + cluster. The + + agent either uses the configured ID or the kubeSystem.UID.' + nullable: true + type: string + clientRandom: + description: 'ClientRandom is a random string that the agent generates. + When + + fleet-controller grants a registration, it creates a registration + + secret with this string in the name.' + nullable: true + type: string + clusterLabels: + additionalProperties: + type: string + description: ClusterLabels are copied to the cluster resource during + the registration. + nullable: true + type: object + type: object + status: + properties: + clusterName: + description: 'ClusterName is only set after the registration is + being processed by + + fleet-controller.' + nullable: true + type: string + granted: + description: 'Granted is set to true, if the request service account + is present + + and its token secret exists. This happens directly before creating + + the registration secret, roles and rolebindings.' + type: boolean + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + name: clusterregistrationtokens.fleet.cattle.io +spec: + group: fleet.cattle.io + names: + kind: ClusterRegistrationToken + listKind: ClusterRegistrationTokenList + plural: clusterregistrationtokens + singular: clusterregistrationtoken + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .status.secretName + name: Secret-Name + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: ClusterRegistrationToken is used by agents to register a new + cluster. + 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 + metadata: + type: object + spec: + properties: + ttl: + description: 'TTL is the time to live for the token. It is used + to calculate the + + expiration time. If the token expires, it will be deleted.' + nullable: true + type: string + type: object + status: + properties: + expires: + description: Expires is the time when the token expires. + format: date-time + type: string + secretName: + description: SecretName is the name of the secret containing the + token. + nullable: true + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + name: clusters.fleet.cattle.io +spec: + group: fleet.cattle.io + names: + kind: Cluster + listKind: ClusterList + plural: clusters + singular: cluster + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .status.display.readyBundles + name: Bundles-Ready + type: string + - jsonPath: .status.agent.lastSeen + name: Last-Seen + type: string + - jsonPath: .status.conditions[?(@.type=="Ready")].message + name: Status + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: 'Cluster corresponds to a Kubernetes cluster. Fleet deploys + bundles to targeted clusters. + + Clusters to which Fleet deploys manifests are referred to as downstream + + clusters. In the single cluster use case, the Fleet manager Kubernetes + + cluster is both the manager and downstream cluster at the same time.' + 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 + metadata: + type: object + spec: + properties: + agentAffinity: + description: 'AgentAffinity overrides the default affinity for the + cluster''s agent + + deployment. If this value is nil the default affinity is used.' + nullable: true + properties: + nodeAffinity: + description: Describes node affinity scheduling rules for the + pod. + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: 'The scheduler will prefer to schedule pods + to nodes that satisfy + + the affinity expressions specified by this field, but + it may choose + + a node that violates one or more of the expressions. The + node that is + + most preferred is the one with the greatest sum of weights, + i.e. + + for each node that meets all of the scheduling requirements + (resource + + request, requiredDuringScheduling affinity expressions, + etc.), + + compute a sum by iterating through the elements of this + field and adding + + "weight" to the sum if the node matches the corresponding + matchExpressions; the + + node(s) with the highest sum are the most preferred.' + items: + description: 'An empty preferred scheduling term matches + all objects with implicit weight 0 + + (i.e. it''s a no-op). A null preferred scheduling term + matches no objects (i.e. is also a no-op).' + properties: + preference: + description: A node selector term, associated with + the corresponding weight. + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + items: + description: 'A node selector requirement is + a selector that contains values, a key, and + an operator + + that relates the key and values.' + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: 'Represents a key''s relationship + to a set of values. + + Valid operators are In, NotIn, Exists, + DoesNotExist. Gt, and Lt.' + type: string + values: + description: 'An array of string values. + If the operator is In or NotIn, + + the values array must be non-empty. If + the operator is Exists or DoesNotExist, + + the values array must be empty. If the + operator is Gt or Lt, the values + + array must have a single element, which + will be interpreted as an integer. + + This array is replaced during a strategic + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchFields: + description: A list of node selector requirements + by node's fields. + items: + description: 'A node selector requirement is + a selector that contains values, a key, and + an operator + + that relates the key and values.' + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: 'Represents a key''s relationship + to a set of values. + + Valid operators are In, NotIn, Exists, + DoesNotExist. Gt, and Lt.' + type: string + values: + description: 'An array of string values. + If the operator is In or NotIn, + + the values array must be non-empty. If + the operator is Exists or DoesNotExist, + + the values array must be empty. If the + operator is Gt or Lt, the values + + array must have a single element, which + will be interpreted as an integer. + + This array is replaced during a strategic + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + type: object + x-kubernetes-map-type: atomic + weight: + description: Weight associated with matching the corresponding + nodeSelectorTerm, in the range 1-100. + format: int32 + type: integer + required: + - preference + - weight + type: object + type: array + x-kubernetes-list-type: atomic + requiredDuringSchedulingIgnoredDuringExecution: + description: 'If the affinity requirements specified by + this field are not met at + + scheduling time, the pod will not be scheduled onto the + node. + + If the affinity requirements specified by this field cease + to be met + + at some point during pod execution (e.g. due to an update), + the system + + may or may not try to eventually evict the pod from its + node.' + properties: + nodeSelectorTerms: + description: Required. A list of node selector terms. + The terms are ORed. + items: + description: 'A null or empty node selector term matches + no objects. The requirements of + + them are ANDed. + + The TopologySelectorTerm type implements a subset + of the NodeSelectorTerm.' + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + items: + description: 'A node selector requirement is + a selector that contains values, a key, and + an operator + + that relates the key and values.' + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: 'Represents a key''s relationship + to a set of values. + + Valid operators are In, NotIn, Exists, + DoesNotExist. Gt, and Lt.' + type: string + values: + description: 'An array of string values. + If the operator is In or NotIn, + + the values array must be non-empty. If + the operator is Exists or DoesNotExist, + + the values array must be empty. If the + operator is Gt or Lt, the values + + array must have a single element, which + will be interpreted as an integer. + + This array is replaced during a strategic + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchFields: + description: A list of node selector requirements + by node's fields. + items: + description: 'A node selector requirement is + a selector that contains values, a key, and + an operator + + that relates the key and values.' + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: 'Represents a key''s relationship + to a set of values. + + Valid operators are In, NotIn, Exists, + DoesNotExist. Gt, and Lt.' + type: string + values: + description: 'An array of string values. + If the operator is In or NotIn, + + the values array must be non-empty. If + the operator is Exists or DoesNotExist, + + the values array must be empty. If the + operator is Gt or Lt, the values + + array must have a single element, which + will be interpreted as an integer. + + This array is replaced during a strategic + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + type: object + x-kubernetes-map-type: atomic + type: array + x-kubernetes-list-type: atomic + required: + - nodeSelectorTerms + type: object + x-kubernetes-map-type: atomic + type: object + podAffinity: + description: Describes pod affinity scheduling rules (e.g. co-locate + this pod in the same node, zone, etc. as some other pod(s)). + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: 'The scheduler will prefer to schedule pods + to nodes that satisfy + + the affinity expressions specified by this field, but + it may choose + + a node that violates one or more of the expressions. The + node that is + + most preferred is the one with the greatest sum of weights, + i.e. + + for each node that meets all of the scheduling requirements + (resource + + request, requiredDuringScheduling affinity expressions, + etc.), + + compute a sum by iterating through the elements of this + field and adding + + "weight" to the sum if the node has pods which matches + the corresponding podAffinityTerm; the + + node(s) with the highest sum are the most preferred.' + items: + description: The weights of all of the matched WeightedPodAffinityTerm + fields are added per-node to find the most preferred + node(s) + properties: + podAffinityTerm: + description: Required. A pod affinity term, associated + with the corresponding weight. + properties: + labelSelector: + description: 'A label query over a set of resources, + in this case pods. + + If it''s null, this PodAffinityTerm matches + with no Pods.' + properties: + matchExpressions: + description: matchExpressions is a list of + label selector requirements. The requirements + are ANDed. + items: + description: 'A label selector requirement + is a selector that contains values, a + key, and an operator that + + relates the key and values.' + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: 'operator represents a + key''s relationship to a set of values. + + Valid operators are In, NotIn, Exists + and DoesNotExist.' + type: string + values: + description: 'values is an array of + string values. If the operator is + In or NotIn, + + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + + the values array must be empty. This + array is replaced during a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, + whose key field is "key", the + + operator is "In", and the values array contains + only "value". The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + matchLabelKeys: + description: 'MatchLabelKeys is a set of pod label + keys to select which pods will + + be taken into consideration. The keys are used + to lookup values from the + + incoming pod labels, those key-value labels + are merged with `labelSelector` as `key in (value)` + + to select the group of existing pods which pods + will be taken into consideration + + for the incoming pod''s pod (anti) affinity. + Keys that don''t exist in the incoming + + pod labels will be ignored. The default value + is empty. + + The same key is forbidden to exist in both matchLabelKeys + and labelSelector. + + Also, matchLabelKeys cannot be set when labelSelector + isn''t set. + + This is an alpha field and requires enabling + MatchLabelKeysInPodAffinity feature gate.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + description: 'MismatchLabelKeys is a set of pod + label keys to select which pods will + + be taken into consideration. The keys are used + to lookup values from the + + incoming pod labels, those key-value labels + are merged with `labelSelector` as `key notin + (value)` + + to select the group of existing pods which pods + will be taken into consideration + + for the incoming pod''s pod (anti) affinity. + Keys that don''t exist in the incoming + + pod labels will be ignored. The default value + is empty. + + The same key is forbidden to exist in both mismatchLabelKeys + and labelSelector. + + Also, mismatchLabelKeys cannot be set when labelSelector + isn''t set. + + This is an alpha field and requires enabling + MatchLabelKeysInPodAffinity feature gate.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + namespaceSelector: + description: 'A label query over the set of namespaces + that the term applies to. + + The term is applied to the union of the namespaces + selected by this field + + and the ones listed in the namespaces field. + + null selector and null or empty namespaces list + means "this pod''s namespace". + + An empty selector ({}) matches all namespaces.' + properties: + matchExpressions: + description: matchExpressions is a list of + label selector requirements. The requirements + are ANDed. + items: + description: 'A label selector requirement + is a selector that contains values, a + key, and an operator that + + relates the key and values.' + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: 'operator represents a + key''s relationship to a set of values. + + Valid operators are In, NotIn, Exists + and DoesNotExist.' + type: string + values: + description: 'values is an array of + string values. If the operator is + In or NotIn, + + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + + the values array must be empty. This + array is replaced during a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, + whose key field is "key", the + + operator is "In", and the values array contains + only "value". The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + description: 'namespaces specifies a static list + of namespace names that the term applies to. + + The term is applied to the union of the namespaces + listed in this field + + and the ones selected by namespaceSelector. + + null or empty namespaces list and null namespaceSelector + means "this pod''s namespace".' + items: + type: string + type: array + x-kubernetes-list-type: atomic + topologyKey: + description: 'This pod should be co-located (affinity) + or not co-located (anti-affinity) with the pods + matching + + the labelSelector in the specified namespaces, + where co-located is defined as running on a + node + + whose value of the label with key topologyKey + matches that of any node on which any of the + + selected pods is running. + + Empty topologyKey is not allowed.' + type: string + required: + - topologyKey + type: object + weight: + description: 'weight associated with matching the + corresponding podAffinityTerm, + + in the range 1-100.' + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + x-kubernetes-list-type: atomic + requiredDuringSchedulingIgnoredDuringExecution: + description: 'If the affinity requirements specified by + this field are not met at + + scheduling time, the pod will not be scheduled onto the + node. + + If the affinity requirements specified by this field cease + to be met + + at some point during pod execution (e.g. due to a pod + label update), the + + system may or may not try to eventually evict the pod + from its node. + + When there are multiple elements, the lists of nodes corresponding + to each + + podAffinityTerm are intersected, i.e. all terms must be + satisfied.' + items: + description: 'Defines a set of pods (namely those matching + the labelSelector + + relative to the given namespace(s)) that this pod should + be + + co-located (affinity) or not co-located (anti-affinity) + with, + + where co-located is defined as running on a node whose + value of + + the label with key matches that of any + node on which + + a pod of the set of pods is running' + properties: + labelSelector: + description: 'A label query over a set of resources, + in this case pods. + + If it''s null, this PodAffinityTerm matches with + no Pods.' + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + items: + description: 'A label selector requirement is + a selector that contains values, a key, and + an operator that + + relates the key and values.' + properties: + key: + description: key is the label key that the + selector applies to. + type: string + operator: + description: 'operator represents a key''s + relationship to a set of values. + + Valid operators are In, NotIn, Exists + and DoesNotExist.' + type: string + values: + description: 'values is an array of string + values. If the operator is In or NotIn, + + the values array must be non-empty. If + the operator is Exists or DoesNotExist, + + the values array must be empty. This array + is replaced during a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, + whose key field is "key", the + + operator is "In", and the values array contains + only "value". The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + matchLabelKeys: + description: 'MatchLabelKeys is a set of pod label + keys to select which pods will + + be taken into consideration. The keys are used to + lookup values from the + + incoming pod labels, those key-value labels are + merged with `labelSelector` as `key in (value)` + + to select the group of existing pods which pods + will be taken into consideration + + for the incoming pod''s pod (anti) affinity. Keys + that don''t exist in the incoming + + pod labels will be ignored. The default value is + empty. + + The same key is forbidden to exist in both matchLabelKeys + and labelSelector. + + Also, matchLabelKeys cannot be set when labelSelector + isn''t set. + + This is an alpha field and requires enabling MatchLabelKeysInPodAffinity + feature gate.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + description: 'MismatchLabelKeys is a set of pod label + keys to select which pods will + + be taken into consideration. The keys are used to + lookup values from the + + incoming pod labels, those key-value labels are + merged with `labelSelector` as `key notin (value)` + + to select the group of existing pods which pods + will be taken into consideration + + for the incoming pod''s pod (anti) affinity. Keys + that don''t exist in the incoming + + pod labels will be ignored. The default value is + empty. + + The same key is forbidden to exist in both mismatchLabelKeys + and labelSelector. + + Also, mismatchLabelKeys cannot be set when labelSelector + isn''t set. + + This is an alpha field and requires enabling MatchLabelKeysInPodAffinity + feature gate.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + namespaceSelector: + description: 'A label query over the set of namespaces + that the term applies to. + + The term is applied to the union of the namespaces + selected by this field + + and the ones listed in the namespaces field. + + null selector and null or empty namespaces list + means "this pod''s namespace". + + An empty selector ({}) matches all namespaces.' + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + items: + description: 'A label selector requirement is + a selector that contains values, a key, and + an operator that + + relates the key and values.' + properties: + key: + description: key is the label key that the + selector applies to. + type: string + operator: + description: 'operator represents a key''s + relationship to a set of values. + + Valid operators are In, NotIn, Exists + and DoesNotExist.' + type: string + values: + description: 'values is an array of string + values. If the operator is In or NotIn, + + the values array must be non-empty. If + the operator is Exists or DoesNotExist, + + the values array must be empty. This array + is replaced during a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, + whose key field is "key", the + + operator is "In", and the values array contains + only "value". The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + description: 'namespaces specifies a static list of + namespace names that the term applies to. + + The term is applied to the union of the namespaces + listed in this field + + and the ones selected by namespaceSelector. + + null or empty namespaces list and null namespaceSelector + means "this pod''s namespace".' + items: + type: string + type: array + x-kubernetes-list-type: atomic + topologyKey: + description: 'This pod should be co-located (affinity) + or not co-located (anti-affinity) with the pods + matching + + the labelSelector in the specified namespaces, where + co-located is defined as running on a node + + whose value of the label with key topologyKey matches + that of any node on which any of the + + selected pods is running. + + Empty topologyKey is not allowed.' + type: string + required: + - topologyKey + type: object + type: array + x-kubernetes-list-type: atomic + type: object + podAntiAffinity: + description: Describes pod anti-affinity scheduling rules (e.g. + avoid putting this pod in the same node, zone, etc. as some + other pod(s)). + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: 'The scheduler will prefer to schedule pods + to nodes that satisfy + + the anti-affinity expressions specified by this field, + but it may choose + + a node that violates one or more of the expressions. The + node that is + + most preferred is the one with the greatest sum of weights, + i.e. + + for each node that meets all of the scheduling requirements + (resource + + request, requiredDuringScheduling anti-affinity expressions, + etc.), + + compute a sum by iterating through the elements of this + field and adding + + "weight" to the sum if the node has pods which matches + the corresponding podAffinityTerm; the + + node(s) with the highest sum are the most preferred.' + items: + description: The weights of all of the matched WeightedPodAffinityTerm + fields are added per-node to find the most preferred + node(s) + properties: + podAffinityTerm: + description: Required. A pod affinity term, associated + with the corresponding weight. + properties: + labelSelector: + description: 'A label query over a set of resources, + in this case pods. + + If it''s null, this PodAffinityTerm matches + with no Pods.' + properties: + matchExpressions: + description: matchExpressions is a list of + label selector requirements. The requirements + are ANDed. + items: + description: 'A label selector requirement + is a selector that contains values, a + key, and an operator that + + relates the key and values.' + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: 'operator represents a + key''s relationship to a set of values. + + Valid operators are In, NotIn, Exists + and DoesNotExist.' + type: string + values: + description: 'values is an array of + string values. If the operator is + In or NotIn, + + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + + the values array must be empty. This + array is replaced during a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, + whose key field is "key", the + + operator is "In", and the values array contains + only "value". The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + matchLabelKeys: + description: 'MatchLabelKeys is a set of pod label + keys to select which pods will + + be taken into consideration. The keys are used + to lookup values from the + + incoming pod labels, those key-value labels + are merged with `labelSelector` as `key in (value)` + + to select the group of existing pods which pods + will be taken into consideration + + for the incoming pod''s pod (anti) affinity. + Keys that don''t exist in the incoming + + pod labels will be ignored. The default value + is empty. + + The same key is forbidden to exist in both matchLabelKeys + and labelSelector. + + Also, matchLabelKeys cannot be set when labelSelector + isn''t set. + + This is an alpha field and requires enabling + MatchLabelKeysInPodAffinity feature gate.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + description: 'MismatchLabelKeys is a set of pod + label keys to select which pods will + + be taken into consideration. The keys are used + to lookup values from the + + incoming pod labels, those key-value labels + are merged with `labelSelector` as `key notin + (value)` + + to select the group of existing pods which pods + will be taken into consideration + + for the incoming pod''s pod (anti) affinity. + Keys that don''t exist in the incoming + + pod labels will be ignored. The default value + is empty. + + The same key is forbidden to exist in both mismatchLabelKeys + and labelSelector. + + Also, mismatchLabelKeys cannot be set when labelSelector + isn''t set. + + This is an alpha field and requires enabling + MatchLabelKeysInPodAffinity feature gate.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + namespaceSelector: + description: 'A label query over the set of namespaces + that the term applies to. + + The term is applied to the union of the namespaces + selected by this field + + and the ones listed in the namespaces field. + + null selector and null or empty namespaces list + means "this pod''s namespace". + + An empty selector ({}) matches all namespaces.' + properties: + matchExpressions: + description: matchExpressions is a list of + label selector requirements. The requirements + are ANDed. + items: + description: 'A label selector requirement + is a selector that contains values, a + key, and an operator that + + relates the key and values.' + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: 'operator represents a + key''s relationship to a set of values. + + Valid operators are In, NotIn, Exists + and DoesNotExist.' + type: string + values: + description: 'values is an array of + string values. If the operator is + In or NotIn, + + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + + the values array must be empty. This + array is replaced during a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, + whose key field is "key", the + + operator is "In", and the values array contains + only "value". The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + description: 'namespaces specifies a static list + of namespace names that the term applies to. + + The term is applied to the union of the namespaces + listed in this field + + and the ones selected by namespaceSelector. + + null or empty namespaces list and null namespaceSelector + means "this pod''s namespace".' + items: + type: string + type: array + x-kubernetes-list-type: atomic + topologyKey: + description: 'This pod should be co-located (affinity) + or not co-located (anti-affinity) with the pods + matching + + the labelSelector in the specified namespaces, + where co-located is defined as running on a + node + + whose value of the label with key topologyKey + matches that of any node on which any of the + + selected pods is running. + + Empty topologyKey is not allowed.' + type: string + required: + - topologyKey + type: object + weight: + description: 'weight associated with matching the + corresponding podAffinityTerm, + + in the range 1-100.' + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + x-kubernetes-list-type: atomic + requiredDuringSchedulingIgnoredDuringExecution: + description: 'If the anti-affinity requirements specified + by this field are not met at + + scheduling time, the pod will not be scheduled onto the + node. + + If the anti-affinity requirements specified by this field + cease to be met + + at some point during pod execution (e.g. due to a pod + label update), the + + system may or may not try to eventually evict the pod + from its node. + + When there are multiple elements, the lists of nodes corresponding + to each + + podAffinityTerm are intersected, i.e. all terms must be + satisfied.' + items: + description: 'Defines a set of pods (namely those matching + the labelSelector + + relative to the given namespace(s)) that this pod should + be + + co-located (affinity) or not co-located (anti-affinity) + with, + + where co-located is defined as running on a node whose + value of + + the label with key matches that of any + node on which + + a pod of the set of pods is running' + properties: + labelSelector: + description: 'A label query over a set of resources, + in this case pods. + + If it''s null, this PodAffinityTerm matches with + no Pods.' + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + items: + description: 'A label selector requirement is + a selector that contains values, a key, and + an operator that + + relates the key and values.' + properties: + key: + description: key is the label key that the + selector applies to. + type: string + operator: + description: 'operator represents a key''s + relationship to a set of values. + + Valid operators are In, NotIn, Exists + and DoesNotExist.' + type: string + values: + description: 'values is an array of string + values. If the operator is In or NotIn, + + the values array must be non-empty. If + the operator is Exists or DoesNotExist, + + the values array must be empty. This array + is replaced during a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, + whose key field is "key", the + + operator is "In", and the values array contains + only "value". The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + matchLabelKeys: + description: 'MatchLabelKeys is a set of pod label + keys to select which pods will + + be taken into consideration. The keys are used to + lookup values from the + + incoming pod labels, those key-value labels are + merged with `labelSelector` as `key in (value)` + + to select the group of existing pods which pods + will be taken into consideration + + for the incoming pod''s pod (anti) affinity. Keys + that don''t exist in the incoming + + pod labels will be ignored. The default value is + empty. + + The same key is forbidden to exist in both matchLabelKeys + and labelSelector. + + Also, matchLabelKeys cannot be set when labelSelector + isn''t set. + + This is an alpha field and requires enabling MatchLabelKeysInPodAffinity + feature gate.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + description: 'MismatchLabelKeys is a set of pod label + keys to select which pods will + + be taken into consideration. The keys are used to + lookup values from the + + incoming pod labels, those key-value labels are + merged with `labelSelector` as `key notin (value)` + + to select the group of existing pods which pods + will be taken into consideration + + for the incoming pod''s pod (anti) affinity. Keys + that don''t exist in the incoming + + pod labels will be ignored. The default value is + empty. + + The same key is forbidden to exist in both mismatchLabelKeys + and labelSelector. + + Also, mismatchLabelKeys cannot be set when labelSelector + isn''t set. + + This is an alpha field and requires enabling MatchLabelKeysInPodAffinity + feature gate.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + namespaceSelector: + description: 'A label query over the set of namespaces + that the term applies to. + + The term is applied to the union of the namespaces + selected by this field + + and the ones listed in the namespaces field. + + null selector and null or empty namespaces list + means "this pod''s namespace". + + An empty selector ({}) matches all namespaces.' + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + items: + description: 'A label selector requirement is + a selector that contains values, a key, and + an operator that + + relates the key and values.' + properties: + key: + description: key is the label key that the + selector applies to. + type: string + operator: + description: 'operator represents a key''s + relationship to a set of values. + + Valid operators are In, NotIn, Exists + and DoesNotExist.' + type: string + values: + description: 'values is an array of string + values. If the operator is In or NotIn, + + the values array must be non-empty. If + the operator is Exists or DoesNotExist, + + the values array must be empty. This array + is replaced during a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, + whose key field is "key", the + + operator is "In", and the values array contains + only "value". The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + description: 'namespaces specifies a static list of + namespace names that the term applies to. + + The term is applied to the union of the namespaces + listed in this field + + and the ones selected by namespaceSelector. + + null or empty namespaces list and null namespaceSelector + means "this pod''s namespace".' + items: + type: string + type: array + x-kubernetes-list-type: atomic + topologyKey: + description: 'This pod should be co-located (affinity) + or not co-located (anti-affinity) with the pods + matching + + the labelSelector in the specified namespaces, where + co-located is defined as running on a node + + whose value of the label with key topologyKey matches + that of any node on which any of the + + selected pods is running. + + Empty topologyKey is not allowed.' + type: string + required: + - topologyKey + type: object + type: array + x-kubernetes-list-type: atomic + type: object + type: object + agentEnvVars: + description: AgentEnvVars are extra environment variables to be + added to the agent deployment. + items: + description: EnvVar represents an environment variable present + in a Container. + properties: + name: + description: Name of the environment variable. Must be a C_IDENTIFIER. + type: string + value: + description: 'Variable references $(VAR_NAME) are expanded + + using the previously defined environment variables in the + container and + + any service environment variables. If a variable cannot + be resolved, + + the reference in the input string will be unchanged. Double + $$ are reduced + + to a single $, which allows for escaping the $(VAR_NAME) + syntax: i.e. + + "$$(VAR_NAME)" will produce the string literal "$(VAR_NAME)". + + Escaped references will never be expanded, regardless of + whether the variable + + exists or not. + + Defaults to "".' + type: string + valueFrom: + description: Source for the environment variable's value. + Cannot be used if value is not empty. + properties: + configMapKeyRef: + description: Selects a key of a ConfigMap. + properties: + key: + description: The key to select. + type: string + name: + default: '' + description: 'Name of the referent. + + This field is effectively required, but due to backwards + compatibility is + + allowed to be empty. Instances of this type with + an empty value here are + + almost certainly wrong. + + TODO: Add other useful fields. apiVersion, kind, + uid? + + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + + TODO: Drop `kubebuilder:default` when controller-gen + doesn''t need it https://github.com/kubernetes-sigs/kubebuilder/issues/3896.' + type: string + optional: + description: Specify whether the ConfigMap or its + key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + description: 'Selects a field of the pod: supports metadata.name, + metadata.namespace, `metadata.labels['''']`, `metadata.annotations['''']`, + + spec.nodeName, spec.serviceAccountName, status.hostIP, + status.podIP, status.podIPs.' + properties: + apiVersion: + description: Version of the schema the FieldPath is + written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the specified + API version. + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + description: 'Selects a resource of the container: only + resources limits and requests + + (limits.cpu, limits.memory, limits.ephemeral-storage, + requests.cpu, requests.memory and requests.ephemeral-storage) + are currently supported.' + properties: + containerName: + description: 'Container name: required for volumes, + optional for env vars' + type: string + divisor: + anyOf: + - type: integer + - type: string + description: Specifies the output format of the exposed + resources, defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + description: Selects a key of a secret in the pod's namespace + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + default: '' + description: 'Name of the referent. + + This field is effectively required, but due to backwards + compatibility is + + allowed to be empty. Instances of this type with + an empty value here are + + almost certainly wrong. + + TODO: Add other useful fields. apiVersion, kind, + uid? + + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + + TODO: Drop `kubebuilder:default` when controller-gen + doesn''t need it https://github.com/kubernetes-sigs/kubebuilder/issues/3896.' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + nullable: true + type: array + agentNamespace: + description: AgentNamespace defaults to the system namespace, e.g. + cattle-fleet-system. + nullable: true + type: string + agentResources: + description: AgentResources sets the resources for the cluster's + agent deployment. + nullable: true + properties: + claims: + description: 'Claims lists the names of resources, defined in + spec.resourceClaims, + + that are used by this container. + + + + This is an alpha field and requires enabling the + + DynamicResourceAllocation feature gate. + + + + This field is immutable. It can only be set for containers.' + items: + description: ResourceClaim references one entry in PodSpec.ResourceClaims. + properties: + name: + description: 'Name must match the name of one entry in + pod.spec.resourceClaims of + + the Pod where this field is used. It makes that resource + available + + inside a container.' + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: 'Limits describes the maximum amount of compute + resources allowed. + + More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: 'Requests describes the minimum amount of compute + resources required. + + If Requests is omitted for a container, it defaults to Limits + if that is explicitly specified, + + otherwise to an implementation-defined value. Requests cannot + exceed Limits. + + More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' + type: object + type: object + agentTolerations: + description: AgentTolerations defines an extra set of Tolerations + to be added to the Agent deployment. + items: + description: 'The pod this Toleration is attached to tolerates + any taint that matches + + the triple using the matching operator .' + properties: + effect: + description: 'Effect indicates the taint effect to match. + Empty means match all taint effects. + + When specified, allowed values are NoSchedule, PreferNoSchedule + and NoExecute.' + type: string + key: + description: 'Key is the taint key that the toleration applies + to. Empty means match all taint keys. + + If the key is empty, operator must be Exists; this combination + means to match all values and all keys.' + type: string + operator: + description: 'Operator represents a key''s relationship to + the value. + + Valid operators are Exists and Equal. Defaults to Equal. + + Exists is equivalent to wildcard for value, so that a pod + can + + tolerate all taints of a particular category.' + type: string + tolerationSeconds: + description: 'TolerationSeconds represents the period of time + the toleration (which must be + + of effect NoExecute, otherwise this field is ignored) tolerates + the taint. By default, + + it is not set, which means tolerate the taint forever (do + not evict). Zero and + + negative values will be treated as 0 (evict immediately) + by the system.' + format: int64 + type: integer + value: + description: 'Value is the taint value the toleration matches + to. + + If the operator is Exists, the value should be empty, otherwise + just a regular string.' + type: string + type: object + nullable: true + type: array + clientID: + description: 'ClientID is a unique string that will identify the + cluster. It can + + either be predefined, or generated when importing the cluster.' + nullable: true + type: string + hostNetwork: + description: 'HostNetwork sets the agent StatefulSet to use hostNetwork: + true setting. + + Allows for provisioning of network related bundles (CNI configuration).' + nullable: true + type: boolean + kubeConfigSecret: + description: 'KubeConfigSecret is the name of the secret containing + the kubeconfig for the downstream cluster. + + It can optionally contain a APIServerURL and CA to override the + + values in the fleet-controller''s configmap.' + nullable: true + type: string + kubeConfigSecretNamespace: + description: 'KubeConfigSecretNamespace is the namespace of the + secret containing the kubeconfig for the downstream cluster. + + If unset, it will be assumed the secret can be found in the namespace + that the Cluster object resides within.' + nullable: true + type: string + paused: + description: Paused if set to true, will stop any BundleDeployments + from being updated. + type: boolean + privateRepoURL: + description: PrivateRepoURL prefixes the image name and overrides + a global repo URL from the agents config. + nullable: true + type: string + redeployAgentGeneration: + description: RedeployAgentGeneration can be used to force redeploying + the agent. + format: int64 + type: integer + templateValues: + description: TemplateValues defines a cluster specific mapping of + values to be sent to fleet.yaml values templating. + nullable: true + type: object + x-kubernetes-preserve-unknown-fields: true + type: object + status: + properties: + agent: + description: AgentStatus contains information about the agent. + properties: + lastSeen: + description: 'LastSeen is the last time the agent checked in + to update the status + + of the cluster resource.' + format: date-time + nullable: true + type: string + namespace: + description: Namespace is the namespace of the agent deployment, + e.g. "cattle-fleet-system". + nullable: true + type: string + type: object + agentAffinityHash: + description: 'AgentAffinityHash is a hash of the agent''s affinity + configuration, + + used to detect changes.' + type: string + agentConfigChanged: + description: 'AgentConfigChanged is set to true if any of the agent + configuration + + changed, like the API server URL or CA. Setting it to true will + + trigger a re-import of the cluster.' + type: boolean + agentDeployedGeneration: + description: AgentDeployedGeneration is the generation of the agent + that is currently deployed. + format: int64 + nullable: true + type: integer + agentEnvVarsHash: + description: AgentEnvVarsHash is a hash of the agent's env vars, + used to detect changes. + nullable: true + type: string + agentHostNetwork: + description: AgentHostNetwork defines observed state of spec.hostNetwork + setting that is currently used. + nullable: true + type: boolean + agentMigrated: + description: 'AgentMigrated is always set to true after importing + a cluster. If + + false, it will trigger a migration. Old agents don''t have + + this in their status.' + type: boolean + agentNamespaceMigrated: + description: 'AgentNamespaceMigrated is always set to true after + importing a + + cluster. If false, it will trigger a migration. Old Fleet agents + + don''t have this in their status.' + type: boolean + agentPrivateRepoURL: + description: AgentPrivateRepoURL is the private repo URL for the + agent that is currently used. + nullable: true + type: string + agentResourcesHash: + description: 'AgentResourcesHash is a hash of the agent''s resources + configuration, + + used to detect changes.' + nullable: true + type: string + agentTLSMode: + description: 'AgentTLSMode supports two values: `system-store` and + `strict`. If set to + + `system-store`, instructs the agent to trust CA bundles from the + operating + + system''s store. If set to `strict`, then the agent shall only + connect to a + + server which uses the exact CA configured when creating/updating + the agent.' + nullable: true + type: string + agentTolerationsHash: + description: 'AgentTolerationsHash is a hash of the agent''s tolerations + + configuration, used to detect changes.' + nullable: true + type: string + apiServerCAHash: + description: APIServerCAHash is a hash of the upstream API server + CA, used to detect changes. + nullable: true + type: string + apiServerURL: + description: 'APIServerURL is the currently used URL of the API + server that the + + cluster uses to connect to upstream.' + nullable: true + type: string + cattleNamespaceMigrated: + description: 'CattleNamespaceMigrated is always set to true after + importing a + + cluster. If false, it will trigger a migration. Old Fleet agents, + + don''t have this in their status.' + type: boolean + conditions: + items: + properties: + lastTransitionTime: + description: Last time the condition transitioned from one + status to another. + type: string + lastUpdateTime: + description: The last time this condition was updated. + type: string + message: + description: Human-readable message indicating details about + last transition + type: string + reason: + description: The reason for the condition's last transition. + type: string + status: + description: Status of the condition, one of True, False, + Unknown. + type: string + type: + description: Type of cluster condition. + type: string + required: + - status + - type + type: object + type: array + desiredReadyGitRepos: + description: 'DesiredReadyGitRepos is the number of gitrepos for + this cluster that + + are desired to be ready.' + type: integer + display: + description: Display contains the number of ready bundles, nodes + and a summary state. + properties: + readyBundles: + description: 'ReadyBundles is a string in the form "%d/%d", + that describes the + + number of bundles that are ready vs. the number of bundles + desired + + to be ready.' + type: string + state: + description: State of the cluster, either one of the bundle + states, or "WaitCheckIn". + nullable: true + type: string + type: object + garbageCollectionInterval: + description: GarbageCollectionInterval determines how often agents + clean up obsolete Helm releases. + type: string + namespace: + description: 'Namespace is the cluster namespace, it contains the + clusters service + + account as well as any bundledeployments. Example: + + "cluster-fleet-local-cluster-294db1acfa77-d9ccf852678f"' + type: string + readyGitRepos: + description: ReadyGitRepos is the number of gitrepos for this cluster + that are ready. + type: integer + resourceCounts: + description: ResourceCounts is an aggregate over the GitRepoResourceCounts. + properties: + desiredReady: + description: DesiredReady is the number of resources that should + be ready. + type: integer + missing: + description: Missing is the number of missing resources. + type: integer + modified: + description: Modified is the number of resources that have been + modified. + type: integer + notReady: + description: 'NotReady is the number of not ready resources. + Resources are not + + ready if they do not match any other state.' + type: integer + orphaned: + description: Orphaned is the number of orphaned resources. + type: integer + ready: + description: Ready is the number of ready resources. + type: integer + unknown: + description: Unknown is the number of resources in an unknown + state. + type: integer + waitApplied: + description: WaitApplied is the number of resources that are + waiting to be applied. + type: integer + type: object + summary: + description: 'Summary is a summary of the bundledeployments. The + resource counts + + are copied from the gitrepo resource.' + properties: + desiredReady: + description: 'DesiredReady is the number of bundle deployments + that should be + + ready.' + type: integer + errApplied: + description: 'ErrApplied is the number of bundle deployments + that have been synced + + from the Fleet controller and the downstream cluster, but + with some + + errors when deploying the bundle.' + type: integer + modified: + description: 'Modified is the number of bundle deployments that + have been deployed + + and for which all resources are ready, but where some changes + from the + + Git repository have not yet been synced.' + type: integer + nonReadyResources: + description: 'NonReadyClusters is a list of states, which is + filled for a bundle + + that is not ready.' + items: + description: 'NonReadyResource contains information about + a bundle that is not ready for a + + given state like "ErrApplied". It contains a list of non-ready + or modified + + resources and their states.' + properties: + bundleState: + description: State is the state of the resource, like + e.g. "NotReady" or "ErrApplied". + nullable: true + type: string + message: + description: Message contains information why the bundle + is not ready. + nullable: true + type: string + modifiedStatus: + description: ModifiedStatus lists the state for each modified + resource. + items: + description: 'ModifiedStatus is used to report the status + of a resource that is modified. + + It indicates if the modification was a create, a delete + or a patch.' + properties: + apiVersion: + nullable: true + type: string + delete: + type: boolean + kind: + nullable: true + type: string + missing: + type: boolean + name: + nullable: true + type: string + namespace: + nullable: true + type: string + patch: + nullable: true + type: string + type: object + nullable: true + type: array + name: + description: Name is the name of the resource. + nullable: true + type: string + nonReadyStatus: + description: NonReadyStatus lists the state for each non-ready + resource. + items: + description: NonReadyStatus is used to report the status + of a resource that is not ready. It includes a summary. + properties: + apiVersion: + nullable: true + type: string + kind: + nullable: true + type: string + name: + nullable: true + type: string + namespace: + nullable: true + type: string + summary: + properties: + error: + type: boolean + message: + items: + type: string + type: array + state: + type: string + transitioning: + type: boolean + type: object + uid: + description: 'UID is a type that holds unique ID + values, including UUIDs. Because we + + don''t ONLY use UUIDs, this is an alias to string. Being + a type captures + + intent and helps make sure that UIDs and names + do not get conflated.' + nullable: true + type: string + type: object + nullable: true + type: array + type: object + nullable: true + type: array + notReady: + description: 'NotReady is the number of bundle deployments that + have been deployed + + where some resources are not ready.' + type: integer + outOfSync: + description: 'OutOfSync is the number of bundle deployments + that have been synced + + from Fleet controller, but not yet by the downstream agent.' + type: integer + pending: + description: 'Pending is the number of bundle deployments that + are being processed + + by Fleet controller.' + type: integer + ready: + description: 'Ready is the number of bundle deployments that + have been deployed + + where all resources are ready.' + type: integer + waitApplied: + description: 'WaitApplied is the number of bundle deployments + that have been + + synced from Fleet controller and downstream cluster, but are + waiting + + to be deployed.' + type: integer + type: object + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + name: contents.fleet.cattle.io +spec: + group: fleet.cattle.io + names: + kind: Content + listKind: ContentList + plural: contents + singular: content + scope: Cluster + versions: + - name: v1alpha1 + schema: + openAPIV3Schema: + description: 'Content is used internally by Fleet and should not be used + directly. It + + contains the resources from a bundle for a specific target cluster.' + 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 + content: + description: 'Content is a byte array, which contains the manifests + of a bundle. + + The bundle resources are copied into the bundledeployment''s content + + resource, so the downstream agent can deploy them.' + format: byte + nullable: true + 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 + metadata: + type: object + sha256sum: + description: SHA256Sum of the Content field + type: string + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + name: gitreporestrictions.fleet.cattle.io +spec: + group: fleet.cattle.io + names: + kind: GitRepoRestriction + listKind: GitRepoRestrictionList + plural: gitreporestrictions + singular: gitreporestriction + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .defaultServiceAccount + name: Default-ServiceAccount + type: string + - jsonPath: .allowedServiceAccounts + name: Allowed-ServiceAccounts + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: 'GitRepoRestriction is a resource that can optionally be used + to restrict + + the options of GitRepos in the same namespace.' + properties: + allowedClientSecretNames: + description: AllowedClientSecretNames is a list of client secret names + that GitRepos are allowed to use. + items: + type: string + nullable: true + type: array + allowedRepoPatterns: + description: 'AllowedRepoPatterns is a list of regex patterns that restrict + the + + valid values of the Repo field of a GitRepo.' + items: + type: string + nullable: true + type: array + allowedServiceAccounts: + description: AllowedServiceAccounts is a list of service accounts that + GitRepos are allowed to use. + items: + type: string + nullable: true + type: array + allowedTargetNamespaces: + description: 'AllowedTargetNamespaces restricts TargetNamespace to the + given + + namespaces. If AllowedTargetNamespaces is set, TargetNamespace must + + be set.' + items: + type: string + nullable: true + type: array + 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 + defaultClientSecretName: + description: DefaultClientSecretName overrides the GitRepo's default + client secret. + nullable: true + type: string + defaultServiceAccount: + description: DefaultServiceAccount overrides the GitRepo's default service + account. + nullable: true + 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 + metadata: + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + name: gitrepos.fleet.cattle.io +spec: + group: fleet.cattle.io + names: + categories: + - fleet + kind: GitRepo + listKind: GitRepoList + plural: gitrepos + singular: gitrepo + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .spec.repo + name: Repo + type: string + - jsonPath: .status.commit + name: Commit + type: string + - jsonPath: .status.display.readyBundleDeployments + name: BundleDeployments-Ready + type: string + - jsonPath: .status.conditions[?(@.type=="Ready")].message + name: Status + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: 'GitRepo describes a git repository that is watched by Fleet. + + The resource contains the necessary information to deploy the repo, or + parts + + of it, to target clusters.' + 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 + metadata: + type: object + spec: + properties: + branch: + description: Branch The git branch to follow. + nullable: true + type: string + caBundle: + description: CABundle is a PEM encoded CA bundle which will be used + to validate the repo's certificate. + format: byte + nullable: true + type: string + clientSecretName: + description: 'ClientSecretName is the name of the client secret + to be used to connect to the repo + + It is expected the secret be of type "kubernetes.io/basic-auth" + or "kubernetes.io/ssh-auth".' + nullable: true + type: string + correctDrift: + description: CorrectDrift specifies how drift correction should + work. + properties: + enabled: + description: Enabled correct drift if true. + type: boolean + force: + description: Force helm rollback with --force option will be + used if true. This will try to recreate all resources in the + release. + type: boolean + keepFailHistory: + description: KeepFailHistory keeps track of failed rollbacks + in the helm history. + type: boolean + type: object + deleteNamespace: + description: DeleteNamespace specifies if the namespace created + must be deleted after deleting the GitRepo. + type: boolean + disablePolling: + description: Disables git polling. When enabled only webhooks will + be used. + type: boolean + forceSyncGeneration: + description: Increment this number to force a redeployment of contents + from Git. + format: int64 + type: integer + helmRepoURLRegex: + description: 'HelmRepoURLRegex Helm credentials will be used if + the helm repo matches this regex + + Credentials will always be used if this is empty or not provided.' + nullable: true + type: string + helmSecretName: + description: HelmSecretName contains the auth secret for a private + Helm repository. + nullable: true + type: string + helmSecretNameForPaths: + description: HelmSecretNameForPaths contains the auth secret for + private Helm repository for each path. + nullable: true + type: string + imageScanCommit: + description: Commit specifies how to commit to the git repo when + a new image is scanned and written back to git repo. + properties: + authorEmail: + description: AuthorEmail gives the email to provide when making + a commit + nullable: true + type: string + authorName: + description: AuthorName gives the name to provide when making + a commit + nullable: true + type: string + messageTemplate: + description: 'MessageTemplate provides a template for the commit + message, + + into which will be interpolated the details of the change + made.' + nullable: true + type: string + type: object + imageScanInterval: + description: ImageScanInterval is the interval of syncing scanned + images and writing back to git repo. + type: string + insecureSkipTLSVerify: + description: InsecureSkipTLSverify will use insecure HTTPS to clone + the repo. + type: boolean + keepResources: + description: KeepResources specifies if the resources created must + be kept after deleting the GitRepo. + type: boolean + ociRegistry: + description: OCIRegistry specifies the OCI registry related parameters + properties: + authSecretName: + description: AuthSecretName contains the auth secret where the + OCI regristry credentials are stored. + nullable: true + type: string + basicHTTP: + description: BasicHTTP uses HTTP connections to the OCI registry + when enabled. + nullable: true + type: boolean + insecureSkipTLS: + description: InsecureSkipTLS allows connections to OCI registry + without certs when enabled. + nullable: true + type: boolean + reference: + description: Reference of the OCI Registry + type: string + type: object + paths: + description: 'Paths is the directories relative to the git repo + root that contain resources to be applied. + + Path globbing is supported, for example ["charts/*"] will match + all folders as a subdirectory of charts/ + + If empty, "/" is the default.' + items: + type: string + nullable: true + type: array + paused: + description: 'Paused, when true, causes changes in Git not to be + propagated down to the clusters but instead to mark + + resources as OutOfSync.' + type: boolean + pollingInterval: + description: PollingInterval is how often to check git for new updates. + nullable: true + type: string + repo: + description: Repo is a URL to a git repo to clone and index. + nullable: true + type: string + revision: + description: Revision A specific commit or tag to operate on. + nullable: true + type: string + serviceAccount: + description: ServiceAccount used in the downstream cluster for deployment. + nullable: true + type: string + targetNamespace: + description: 'Ensure that all resources are created in this namespace + + Any cluster scoped resource will be rejected if this is set + + Additionally this namespace will be created on demand.' + nullable: true + type: string + targets: + description: Targets is a list of targets this repo will deploy + to. + items: + description: GitTarget is a cluster or cluster group to deploy + to. + properties: + clusterGroup: + description: ClusterGroup is the name of a cluster group in + the same namespace as the clusters. + nullable: true + type: string + clusterGroupSelector: + description: ClusterGroupSelector is a label selector to select + cluster groups. + nullable: true + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: 'A label selector requirement is a selector + that contains values, a key, and an operator that + + relates the key and values.' + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: 'operator represents a key''s relationship + to a set of values. + + Valid operators are In, NotIn, Exists and DoesNotExist.' + type: string + values: + description: 'values is an array of string values. + If the operator is In or NotIn, + + the values array must be non-empty. If the operator + is Exists or DoesNotExist, + + the values array must be empty. This array is + replaced during a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} pairs. + A single {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, + whose key field is "key", the + + operator is "In", and the values array contains only + "value". The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + clusterName: + description: ClusterName is the name of a cluster. + nullable: true + type: string + clusterSelector: + description: ClusterSelector is a label selector to select + clusters. + nullable: true + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: 'A label selector requirement is a selector + that contains values, a key, and an operator that + + relates the key and values.' + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: 'operator represents a key''s relationship + to a set of values. + + Valid operators are In, NotIn, Exists and DoesNotExist.' + type: string + values: + description: 'values is an array of string values. + If the operator is In or NotIn, + + the values array must be non-empty. If the operator + is Exists or DoesNotExist, + + the values array must be empty. This array is + replaced during a strategic + + merge patch.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: 'matchLabels is a map of {key,value} pairs. + A single {key,value} in the matchLabels + + map is equivalent to an element of matchExpressions, + whose key field is "key", the + + operator is "In", and the values array contains only + "value". The requirements are ANDed.' + type: object + type: object + x-kubernetes-map-type: atomic + name: + description: Name is the name of this target. + nullable: true + type: string + type: object + type: array + type: object + status: + properties: + commit: + description: Commit is the Git commit hash from the last git job + run. + type: string + conditions: + description: 'Conditions is a list of Wrangler conditions that describe + the state + + of the GitRepo.' + items: + properties: + lastTransitionTime: + description: Last time the condition transitioned from one + status to another. + type: string + lastUpdateTime: + description: The last time this condition was updated. + type: string + message: + description: Human-readable message indicating details about + last transition + type: string + reason: + description: The reason for the condition's last transition. + type: string + status: + description: Status of the condition, one of True, False, + Unknown. + type: string + type: + description: Type of cluster condition. + type: string + required: + - status + - type + type: object + type: array + desiredReadyClusters: + description: "DesiredReadyClusters\tis the number of clusters that\ + \ should be ready for bundles of this GitRepo." + type: integer + display: + description: Display contains a human readable summary of the status. + properties: + error: + description: Error is true if a message is present. + type: boolean + message: + description: Message contains the relevant message from the + deployment conditions. + type: string + readyBundleDeployments: + description: 'ReadyBundleDeployments is a string in the form + "%d/%d", that describes the + + number of ready bundledeployments over the total number of + bundledeployments.' + type: string + state: + description: 'State is the state of the GitRepo, e.g. "GitUpdating" + or the maximal + + BundleState according to StateRank.' + type: string + type: object + gitJobStatus: + description: GitJobStatus is the status of the last Git job run, + e.g. "Current" if there was no error. + type: string + lastPollingTriggered: + description: LastPollingTime is the last time the polling check + was triggered + format: date-time + type: string + lastSyncedImageScanTime: + description: LastSyncedImageScanTime is the time of the last image + scan. + format: date-time + type: string + observedGeneration: + description: 'ObservedGeneration is the current generation of the + resource in the cluster. It is copied from k8s + + metadata.Generation. The value is incremented for all changes, + except for changes to .metadata or .status.' + format: int64 + type: integer + readyClusters: + description: 'ReadyClusters is the lowest number of clusters that + are ready over + + all the bundles of this GitRepo.' + type: integer + resourceCounts: + description: ResourceCounts contains the number of resources in + each state over all bundles. + properties: + desiredReady: + description: DesiredReady is the number of resources that should + be ready. + type: integer + missing: + description: Missing is the number of missing resources. + type: integer + modified: + description: Modified is the number of resources that have been + modified. + type: integer + notReady: + description: 'NotReady is the number of not ready resources. + Resources are not + + ready if they do not match any other state.' + type: integer + orphaned: + description: Orphaned is the number of orphaned resources. + type: integer + ready: + description: Ready is the number of ready resources. + type: integer + unknown: + description: Unknown is the number of resources in an unknown + state. + type: integer + waitApplied: + description: WaitApplied is the number of resources that are + waiting to be applied. + type: integer + type: object + resourceErrors: + description: ResourceErrors is a sorted list of errors from the + resources. + items: + type: string + type: array + resources: + description: Resources contains metadata about the resources of + each bundle. + items: + description: GitRepoResource contains metadata about the resources + of a bundle. + properties: + apiVersion: + description: APIVersion is the API version of the resource. + nullable: true + type: string + error: + description: Error is true if any Error in the PerClusterState + is true. + type: boolean + id: + description: ID is the name of the resource, e.g. "namespace1/my-config" + or "backingimagemanagers.storage.io". + nullable: true + type: string + incompleteState: + description: 'IncompleteState is true if a bundle summary + has 10 or more non-ready + + resources or a non-ready resource has more 10 or more non-ready + or + + modified states.' + type: boolean + kind: + description: Kind is the k8s kind of the resource. + nullable: true + type: string + message: + description: Message is the first message from the PerClusterStates. + nullable: true + type: string + name: + description: Name of the resource. + nullable: true + type: string + namespace: + description: Namespace of the resource. + nullable: true + type: string + perClusterState: + description: PerClusterState is a list of states for each + cluster. Derived from the summaries non-ready resources. + items: + description: ResourcePerClusterState is generated for each + non-ready resource of the bundles. + properties: + clusterId: + description: ClusterID is the id of the cluster. + nullable: true + type: string + error: + description: Error is true if the resource is in an + error state, copied from the bundle's summary for + non-ready resources. + type: boolean + message: + description: Message combines the messages from the + bundle's summary. Messages are joined with the delimiter + ';'. + nullable: true + type: string + patch: + description: Patch for modified resources. + nullable: true + type: object + x-kubernetes-preserve-unknown-fields: true + state: + description: State is the state of the resource. + nullable: true + type: string + transitioning: + description: 'Transitioning is true if the resource + is in a transitioning state, + + copied from the bundle''s summary for non-ready resources.' + type: boolean + type: object + nullable: true + type: array + state: + description: State is the state of the resource, e.g. "Unknown", + "WaitApplied", "ErrApplied" or "Ready". + type: string + transitioning: + description: Transitioning is true if any Transitioning in + the PerClusterState is true. + type: boolean + type: + description: Type is the type of the resource, e.g. "apiextensions.k8s.io.customresourcedefinition" + or "configmap". + type: string + type: object + type: array + summary: + description: Summary contains the number of bundle deployments in + each state and a list of non-ready resources. + properties: + desiredReady: + description: 'DesiredReady is the number of bundle deployments + that should be + + ready.' + type: integer + errApplied: + description: 'ErrApplied is the number of bundle deployments + that have been synced + + from the Fleet controller and the downstream cluster, but + with some + + errors when deploying the bundle.' + type: integer + modified: + description: 'Modified is the number of bundle deployments that + have been deployed + + and for which all resources are ready, but where some changes + from the + + Git repository have not yet been synced.' + type: integer + nonReadyResources: + description: 'NonReadyClusters is a list of states, which is + filled for a bundle + + that is not ready.' + items: + description: 'NonReadyResource contains information about + a bundle that is not ready for a + + given state like "ErrApplied". It contains a list of non-ready + or modified + + resources and their states.' + properties: + bundleState: + description: State is the state of the resource, like + e.g. "NotReady" or "ErrApplied". + nullable: true + type: string + message: + description: Message contains information why the bundle + is not ready. + nullable: true + type: string + modifiedStatus: + description: ModifiedStatus lists the state for each modified + resource. + items: + description: 'ModifiedStatus is used to report the status + of a resource that is modified. + + It indicates if the modification was a create, a delete + or a patch.' + properties: + apiVersion: + nullable: true + type: string + delete: + type: boolean + kind: + nullable: true + type: string + missing: + type: boolean + name: + nullable: true + type: string + namespace: + nullable: true + type: string + patch: + nullable: true + type: string + type: object + nullable: true + type: array + name: + description: Name is the name of the resource. + nullable: true + type: string + nonReadyStatus: + description: NonReadyStatus lists the state for each non-ready + resource. + items: + description: NonReadyStatus is used to report the status + of a resource that is not ready. It includes a summary. + properties: + apiVersion: + nullable: true + type: string + kind: + nullable: true + type: string + name: + nullable: true + type: string + namespace: + nullable: true + type: string + summary: + properties: + error: + type: boolean + message: + items: + type: string + type: array + state: + type: string + transitioning: + type: boolean + type: object + uid: + description: 'UID is a type that holds unique ID + values, including UUIDs. Because we + + don''t ONLY use UUIDs, this is an alias to string. Being + a type captures + + intent and helps make sure that UIDs and names + do not get conflated.' + nullable: true + type: string + type: object + nullable: true + type: array + type: object + nullable: true + type: array + notReady: + description: 'NotReady is the number of bundle deployments that + have been deployed + + where some resources are not ready.' + type: integer + outOfSync: + description: 'OutOfSync is the number of bundle deployments + that have been synced + + from Fleet controller, but not yet by the downstream agent.' + type: integer + pending: + description: 'Pending is the number of bundle deployments that + are being processed + + by Fleet controller.' + type: integer + ready: + description: 'Ready is the number of bundle deployments that + have been deployed + + where all resources are ready.' + type: integer + waitApplied: + description: 'WaitApplied is the number of bundle deployments + that have been + + synced from Fleet controller and downstream cluster, but are + waiting + + to be deployed.' + type: integer + type: object + updateGeneration: + description: Update generation is the force update generation if + spec.forceSyncGeneration is set + format: int64 + type: integer + webhookCommit: + description: WebhookCommit is the latest Git commit hash received + from a webhook + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + name: imagescans.fleet.cattle.io +spec: + group: fleet.cattle.io + names: + kind: ImageScan + listKind: ImageScanList + plural: imagescans + singular: imagescan + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .spec.image + name: Repository + type: string + - jsonPath: .status.latestTag + name: Latest + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + 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 + metadata: + type: object + spec: + description: API is taken from https://github.com/fluxcd/image-reflector-controller + properties: + gitrepoName: + description: GitRepo reference name + nullable: true + type: string + image: + description: Image is the name of the image repository + nullable: true + type: string + interval: + description: 'Interval is the length of time to wait between + + scans of the image repository.' + nullable: true + type: string + policy: + description: 'Policy gives the particulars of the policy to be followed + in + + selecting the most recent image' + properties: + alphabetical: + description: Alphabetical set of rules to use for alphabetical + ordering of the tags. + nullable: true + properties: + order: + description: 'Order specifies the sorting order of the tags. + Given the letters of the + + alphabet as tags, ascending order would select Z, and + descending order + + would select A.' + nullable: true + type: string + type: object + semver: + description: 'SemVer gives a semantic version range to check + against the tags + + available.' + nullable: true + properties: + range: + description: 'Range gives a semver range for the image tag; + the highest + + version within the range that''s a tag yields the latest + image.' + nullable: true + type: string + type: object + type: object + secretRef: + description: 'SecretRef can be given the name of a secret containing + + credentials to use for the image registry. The secret should be + + created with `kubectl create secret docker-registry`, or the + + equivalent.' + nullable: true + properties: + name: + default: '' + description: 'Name of the referent. + + This field is effectively required, but due to backwards compatibility + is + + allowed to be empty. Instances of this type with an empty + value here are + + almost certainly wrong. + + TODO: Add other useful fields. apiVersion, kind, uid? + + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + + TODO: Drop `kubebuilder:default` when controller-gen doesn''t + need it https://github.com/kubernetes-sigs/kubebuilder/issues/3896.' + type: string + type: object + x-kubernetes-map-type: atomic + suspend: + description: 'This flag tells the controller to suspend subsequent + image scans. + + It does not apply to already started scans. Defaults to false.' + type: boolean + tagName: + description: TagName is the tag ref that needs to be put in manifest + to replace fields + nullable: true + type: string + type: object + status: + properties: + canonicalImageName: + description: 'CanonicalName is the name of the image repository + with all the + + implied bits made explicit; e.g., `docker.io/library/alpine` + + rather than `alpine`.' + type: string + conditions: + items: + properties: + lastTransitionTime: + description: Last time the condition transitioned from one + status to another. + type: string + lastUpdateTime: + description: The last time this condition was updated. + type: string + message: + description: Human-readable message indicating details about + last transition + type: string + reason: + description: The reason for the condition's last transition. + type: string + status: + description: Status of the condition, one of True, False, + Unknown. + type: string + type: + description: Type of cluster condition. + type: string + required: + - status + - type + type: object + type: array + lastScanTime: + description: LastScanTime is the last time image was scanned + format: date-time + type: string + latestDigest: + description: LatestDigest is the digest of latest tag + type: string + latestImage: + description: 'LatestImage gives the first in the list of images + scanned by + + the image repository, when filtered and ordered according to + + the policy.' + type: string + latestTag: + description: Latest tag is the latest tag filtered by the policy + type: string + observedGeneration: + format: int64 + type: integer + type: object + type: object + served: true + storage: true + subresources: + status: {} diff --git a/charts/fleet-crd/104.1.2+up0.10.6/values.yaml b/charts/fleet-crd/104.1.2+up0.10.6/values.yaml new file mode 100644 index 0000000000..d41d3a2444 --- /dev/null +++ b/charts/fleet-crd/104.1.2+up0.10.6/values.yaml @@ -0,0 +1 @@ +# This file is intentionally empty diff --git a/charts/fleet/104.1.2+up0.10.6/Chart.yaml b/charts/fleet/104.1.2+up0.10.6/Chart.yaml new file mode 100644 index 0000000000..6f16991a87 --- /dev/null +++ b/charts/fleet/104.1.2+up0.10.6/Chart.yaml @@ -0,0 +1,18 @@ +annotations: + catalog.cattle.io/auto-install: fleet-crd=match + catalog.cattle.io/certified: rancher + catalog.cattle.io/experimental: "true" + catalog.cattle.io/hidden: "true" + catalog.cattle.io/kube-version: '>= 1.18.0-0 < 1.31.0-0' + catalog.cattle.io/namespace: cattle-fleet-system + catalog.cattle.io/os: linux + catalog.cattle.io/permits-os: linux,windows + catalog.cattle.io/provides-gvr: clusters.fleet.cattle.io/v1alpha1 + catalog.cattle.io/rancher-version: '>= 2.9.0-0 < 2.10.0-0' + catalog.cattle.io/release-name: fleet +apiVersion: v2 +appVersion: 0.10.6 +description: Fleet Manager - GitOps at Scale +icon: https://charts.rancher.io/assets/logos/fleet.svg +name: fleet +version: 104.1.2+up0.10.6 diff --git a/charts/fleet/104.1.2+up0.10.6/README.md b/charts/fleet/104.1.2+up0.10.6/README.md new file mode 100644 index 0000000000..2f2a4c302a --- /dev/null +++ b/charts/fleet/104.1.2+up0.10.6/README.md @@ -0,0 +1,30 @@ +# Fleet Helm Chart + +Fleet is GitOps at scale. Fleet is designed to manage multiple clusters. + +## What is Fleet? + +* Cluster engine: Fleet is a container management and deployment engine designed to offer users more control on the local cluster and constant monitoring through GitOps. Fleet focuses not only on the ability to scale, but it also gives users a high degree of control and visibility to monitor exactly what is installed on the cluster. + +* Deployment management: Fleet can manage deployments from git of raw Kubernetes YAML, Helm charts, Kustomize, or any combination of the three. Regardless of the source, all resources are dynamically turned into Helm charts, and Helm is used as the engine to deploy all resources in the cluster. As a result, users can enjoy a high degree of control, consistency, and auditability of their clusters. + +## Introduction + +This chart deploys Fleet on a Kubernetes cluster. It also deploys some of its dependencies as subcharts. + +The documentation is centralized in the [doc website](https://fleet.rancher.io/). + +## Prerequisites + +Get helm if you don't have it. Helm 3 is just a CLI. + + +## Install Fleet + +Install the Fleet Helm charts (there are two because we separate out CRDs for ultimate flexibility.): + +``` +$ helm repo add fleet https://rancher.github.io/fleet-helm-charts/ +$ helm -n cattle-fleet-system install --create-namespace --wait fleet-crd fleet/fleet-crd +$ helm -n cattle-fleet-system install --create-namespace --wait fleet fleet/fleet +``` \ No newline at end of file diff --git a/charts/fleet/104.1.2+up0.10.6/templates/_helpers.tpl b/charts/fleet/104.1.2+up0.10.6/templates/_helpers.tpl new file mode 100644 index 0000000000..6cd96c3ace --- /dev/null +++ b/charts/fleet/104.1.2+up0.10.6/templates/_helpers.tpl @@ -0,0 +1,22 @@ +{{- define "system_default_registry" -}} +{{- if .Values.global.cattle.systemDefaultRegistry -}} +{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} +{{- else -}} +{{- "" -}} +{{- end -}} +{{- end -}} + +{{/* +Windows cluster will add default taint for linux nodes, +add below linux tolerations to workloads could be scheduled to those linux nodes +*/}} +{{- define "linux-node-tolerations" -}} +- key: "cattle.io/os" + value: "linux" + effect: "NoSchedule" + operator: "Equal" +{{- end -}} + +{{- define "linux-node-selector" -}} +kubernetes.io/os: linux +{{- end -}} \ No newline at end of file diff --git a/charts/fleet/104.1.2+up0.10.6/templates/configmap.yaml b/charts/fleet/104.1.2+up0.10.6/templates/configmap.yaml new file mode 100644 index 0000000000..719898d6d8 --- /dev/null +++ b/charts/fleet/104.1.2+up0.10.6/templates/configmap.yaml @@ -0,0 +1,29 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: fleet-controller +data: + config: | + { + "systemDefaultRegistry": "{{ template "system_default_registry" . }}", + "agentImage": "{{ template "system_default_registry" . }}{{.Values.agentImage.repository}}:{{.Values.agentImage.tag}}", + "agentImagePullPolicy": "{{ .Values.agentImage.imagePullPolicy }}", + "apiServerURL": "{{.Values.apiServerURL}}", + "apiServerCA": "{{b64enc .Values.apiServerCA}}", + "agentCheckinInterval": "{{.Values.agentCheckinInterval}}", + "agentTLSMode": "{{.Values.agentTLSMode}}", + {{ if .Values.garbageCollectionInterval }} + "garbageCollectionInterval": "{{.Values.garbageCollectionInterval}}", + {{ end }} + "ignoreClusterRegistrationLabels": {{.Values.ignoreClusterRegistrationLabels}}, + "bootstrap": { + "paths": "{{.Values.bootstrap.paths}}", + "repo": "{{.Values.bootstrap.repo}}", + "secret": "{{.Values.bootstrap.secret}}", + "branch": "{{.Values.bootstrap.branch}}", + "namespace": "{{.Values.bootstrap.namespace}}", + "agentNamespace": "{{.Values.bootstrap.agentNamespace}}" + }, + "webhookReceiverURL": "{{.Values.webhookReceiverURL}}", + "githubURLPrefix": "{{.Values.githubURLPrefix}}" + } diff --git a/charts/fleet/104.1.2+up0.10.6/templates/deployment.yaml b/charts/fleet/104.1.2+up0.10.6/templates/deployment.yaml new file mode 100644 index 0000000000..025eb0710a --- /dev/null +++ b/charts/fleet/104.1.2+up0.10.6/templates/deployment.yaml @@ -0,0 +1,251 @@ +{{- $shards := list (dict "id" "" "nodeSelector" dict) -}} +{{- $uniqueShards := list -}} +{{- if .Values.shards -}} + {{- range .Values.shards -}} + {{- if not (has .id $uniqueShards) -}} + {{- $shards = append $shards . -}} + {{- $uniqueShards = append $uniqueShards .id -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{ range $shard := $shards }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: "fleet-controller{{if $shard.id }}-shard-{{ $shard.id }}{{end}}" +spec: + selector: + matchLabels: + app: fleet-controller + template: + metadata: + labels: + app: fleet-controller + fleet.cattle.io/shard-id: "{{ $shard.id }}" + {{- if empty $shard.id }} + fleet.cattle.io/shard-default: "true" + {{- end }} + spec: + containers: + - env: + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + {{- if $.Values.clusterEnqueueDelay }} + - name: FLEET_CLUSTER_ENQUEUE_DELAY + value: {{ $.Values.clusterEnqueueDelay }} + {{- end }} + {{- if $.Values.proxy }} + - name: HTTP_PROXY + value: {{ $.Values.proxy }} + - name: HTTPS_PROXY + value: {{ $.Values.proxy }} + - name: NO_PROXY + value: {{ $.Values.noProxy }} + {{- end }} + {{- if $.Values.cpuPprof }} + - name: FLEET_CPU_PPROF_DIR + value: /tmp/pprof/ + {{- end }} + {{- if $.Values.cpuPprof }} + - name: FLEET_CPU_PPROF_PERIOD + value: {{ quote $.Values.cpuPprof.period }} + {{- end }} + {{- if $.Values.leaderElection.leaseDuration }} + - name: CATTLE_ELECTION_LEASE_DURATION + value: {{$.Values.leaderElection.leaseDuration}} + {{- end }} + {{- if $.Values.leaderElection.retryPeriod }} + - name: CATTLE_ELECTION_RETRY_PERIOD + value: {{$.Values.leaderElection.retryPeriod}} + {{- end }} + {{- if $.Values.leaderElection.renewDeadline }} + - name: CATTLE_ELECTION_RENEW_DEADLINE + value: {{$.Values.leaderElection.renewDeadline}} + {{- end }} + {{- if $.Values.debug }} + - name: CATTLE_DEV_MODE + value: "true" + {{- end }} + {{- if $.Values.controller.reconciler.workers.bundle }} + - name: BUNDLE_RECONCILER_WORKERS + value: {{ quote $.Values.controller.reconciler.workers.bundle }} + {{- end }} + {{- if $.Values.controller.reconciler.workers.bundledeployment }} + - name: BUNDLEDEPLOYMENT_RECONCILER_WORKERS + value: {{ quote $.Values.controller.reconciler.workers.bundledeployment }} + {{- end }} +{{- if $.Values.extraEnv }} +{{ toYaml $.Values.extraEnv | indent 8}} +{{- end }} + image: '{{ template "system_default_registry" $ }}{{ $.Values.image.repository }}:{{ $.Values.image.tag }}' + name: fleet-controller + imagePullPolicy: "{{ $.Values.image.imagePullPolicy }}" + {{- if $.Values.metrics.enabled }} + ports: + - containerPort: 8080 + name: metrics + {{- end }} + command: + - fleetcontroller + {{- if $shard.id }} + - --shard-id + - {{ quote $shard.id }} + {{- end }} + {{- if not $.Values.metrics.enabled }} + - --disable-metrics + {{- end }} + {{- if $.Values.debug }} + - --debug + - --debug-level + - {{ quote $.Values.debugLevel }} + {{- else }} + securityContext: + allowPrivilegeEscalation: false + readOnlyRootFilesystem: true + privileged: false + capabilities: + drop: + - ALL + {{- end }} + volumeMounts: + - mountPath: /tmp + name: tmp + {{- if $.Values.cpuPprof }} + - mountPath: /tmp/pprof + name: pprof + {{- end }} + {{- if not $shard.id }} # Only deploy cleanup and agent management through sharding-less deployment + - env: + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + {{- if $.Values.debug }} + - name: CATTLE_DEV_MODE + value: "true" + {{- end }} + {{- if $.Values.leaderElection.leaseDuration }} + - name: CATTLE_ELECTION_LEASE_DURATION + value: {{$.Values.leaderElection.leaseDuration}} + {{- end }} + {{- if $.Values.leaderElection.retryPeriod }} + - name: CATTLE_ELECTION_RETRY_PERIOD + value: {{$.Values.leaderElection.retryPeriod}} + {{- end }} + {{- if $.Values.leaderElection.renewDeadline }} + - name: CATTLE_ELECTION_RENEW_DEADLINE + value: {{$.Values.leaderElection.renewDeadline}} + {{- end }} + {{- if $.Values.controller.reconciler.workers.gitrepo }} + - name: GITREPO_RECONCILER_WORKERS + value: {{ quote $.Values.controller.reconciler.workers.gitrepo }} + {{- end }} + {{- if $.Values.controller.reconciler.workers.bundle }} + - name: BUNDLE_RECONCILER_WORKERS + value: {{ quote $.Values.controller.reconciler.workers.bundle }} + {{- end }} + {{- if $.Values.controller.reconciler.workers.bundledeployment }} + - name: BUNDLEDEPLOYMENT_RECONCILER_WORKERS + value: {{ quote $.Values.controller.reconciler.workers.bundledeployment }} + {{- end }} + image: '{{ template "system_default_registry" $ }}{{ $.Values.image.repository }}:{{ $.Values.image.tag }}' + name: fleet-cleanup + imagePullPolicy: "{{ $.Values.image.imagePullPolicy }}" + command: + - fleetcontroller + - cleanup + {{- if $.Values.debug }} + - --debug + - --debug-level + - {{ quote $.Values.debugLevel }} + {{- else }} + securityContext: + allowPrivilegeEscalation: false + readOnlyRootFilesystem: true + privileged: false + capabilities: + drop: + - ALL + {{- end }} + - env: + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: FLEET_PROPAGATE_DEBUG_SETTINGS_TO_AGENTS + value: {{ quote $.Values.propagateDebugSettingsToAgents }} + {{- if $.Values.debug }} + - name: CATTLE_DEV_MODE + value: "true" + {{- end }} + {{- if $.Values.leaderElection.leaseDuration }} + - name: CATTLE_ELECTION_LEASE_DURATION + value: {{$.Values.leaderElection.leaseDuration}} + {{- end }} + {{- if $.Values.leaderElection.retryPeriod }} + - name: CATTLE_ELECTION_RETRY_PERIOD + value: {{$.Values.leaderElection.retryPeriod}} + {{- end }} + {{- if $.Values.leaderElection.renewDeadline }} + - name: CATTLE_ELECTION_RENEW_DEADLINE + value: {{$.Values.leaderElection.renewDeadline}} + {{- end }} + image: '{{ template "system_default_registry" $ }}{{ $.Values.image.repository }}:{{ $.Values.image.tag }}' + name: fleet-agentmanagement + imagePullPolicy: "{{ $.Values.image.imagePullPolicy }}" + command: + - fleetcontroller + - agentmanagement + {{- if not $.Values.bootstrap.enabled }} + - --disable-bootstrap + {{- end }} + {{- if $.Values.debug }} + - --debug + - --debug-level + - {{ quote $.Values.debugLevel }} + {{- else }} + securityContext: + allowPrivilegeEscalation: false + readOnlyRootFilesystem: true + privileged: false + capabilities: + drop: + - ALL + {{- end }} + {{- end }} + volumes: + - name: tmp + emptyDir: {} + {{- if $.Values.cpuPprof }} + - name: pprof {{ toYaml $.Values.cpuPprof.volumeConfiguration | nindent 10 }} + {{- end }} + + serviceAccountName: fleet-controller + nodeSelector: {{ include "linux-node-selector" $shard.id | nindent 8 }} +{{- if $.Values.nodeSelector }} +{{ toYaml $.Values.nodeSelector | indent 8 }} +{{- end }} +{{- if $shard.nodeSelector -}} +{{- range $key, $value := $shard.nodeSelector }} +{{ $key | indent 8}}: {{ $value }} +{{- end }} +{{- end }} + tolerations: {{ include "linux-node-tolerations" $shard.id | nindent 8 }} +{{- if $.Values.tolerations }} +{{ toYaml $.Values.tolerations | indent 8 }} +{{- end }} + {{- if $.Values.priorityClassName }} + priorityClassName: "{{$.Values.priorityClassName}}" + {{- end }} + +{{- if not $.Values.debug }} + securityContext: + runAsNonRoot: true + runAsUser: 1000 + runAsGroup: 1000 +{{- end }} +--- +{{- end }} diff --git a/charts/fleet/104.1.2+up0.10.6/templates/deployment_gitjob.yaml b/charts/fleet/104.1.2+up0.10.6/templates/deployment_gitjob.yaml new file mode 100644 index 0000000000..5c3df9608a --- /dev/null +++ b/charts/fleet/104.1.2+up0.10.6/templates/deployment_gitjob.yaml @@ -0,0 +1,136 @@ +{{- $shards := list (dict "id" "" "nodeSelector" dict) -}} +{{- $uniqueShards := list -}} +{{- if .Values.shards -}} + {{- range .Values.shards -}} + {{- if not (has .id $uniqueShards) -}} + {{- $shards = append $shards . -}} + {{- $uniqueShards = append $uniqueShards .id -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{ range $shard := $shards }} +{{- if $.Values.gitops.enabled }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: "gitjob{{if $shard.id }}-shard-{{ $shard.id }}{{end}}" +spec: + selector: + matchLabels: + app: "gitjob" + template: + metadata: + labels: + app: "gitjob" + fleet.cattle.io/shard-id: "{{ $shard.id }}" + {{- if empty $shard.id }} + fleet.cattle.io/shard-default: "true" + {{- end }} + spec: + serviceAccountName: gitjob + containers: + - image: "{{ template "system_default_registry" $ }}{{ $.Values.image.repository }}:{{ $.Values.image.tag }}" + name: gitjob + {{- if $.Values.metrics.enabled }} + ports: + - containerPort: 8081 + name: metrics + {{- end }} + args: + - fleetcontroller + - gitjob + - --gitjob-image + - "{{ template "system_default_registry" $ }}{{ $.Values.image.repository }}:{{ $.Values.image.tag }}" + {{- if $.Values.debug }} + - --debug + - --debug-level + - {{ quote $.Values.debugLevel }} + {{- end }} + {{- if $shard.id }} + - --shard-id + - {{ quote $shard.id }} + {{- end }} + {{- if $shard.nodeSelector }} + - --shard-node-selector + - {{ toJson $shard.nodeSelector | squote }} + {{- end }} + {{- if not $.Values.metrics.enabled }} + - --disable-metrics + {{- end }} + env: + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + {{- if $.Values.leaderElection.leaseDuration }} + - name: CATTLE_ELECTION_LEASE_DURATION + value: {{$.Values.leaderElection.leaseDuration}} + {{- end }} + {{- if $.Values.leaderElection.retryPeriod }} + - name: CATTLE_ELECTION_RETRY_PERIOD + value: {{$.Values.leaderElection.retryPeriod}} + {{- end }} + {{- if $.Values.leaderElection.renewDeadline }} + - name: CATTLE_ELECTION_RENEW_DEADLINE + value: {{$.Values.leaderElection.renewDeadline}} + {{- end }} + {{- if $.Values.proxy }} + - name: HTTP_PROXY + value: {{ $.Values.proxy }} + - name: HTTPS_PROXY + value: {{ $.Values.proxy }} + - name: NO_PROXY + value: {{ $.Values.noProxy }} + {{- end }} + {{- if $.Values.controller.reconciler.workers.gitrepo }} + - name: GITREPO_RECONCILER_WORKERS + value: {{ quote $.Values.controller.reconciler.workers.gitrepo }} + {{- end }} +{{- if $.Values.extraEnv }} +{{ toYaml $.Values.extraEnv | indent 12}} +{{- end }} + {{- if $.Values.debug }} + - name: CATTLE_DEV_MODE + value: "true" + {{- else }} + securityContext: + allowPrivilegeEscalation: false + readOnlyRootFilesystem: true + privileged: false + capabilities: + drop: + - ALL + {{- end }} + volumeMounts: + - mountPath: /tmp + name: tmp + nodeSelector: {{ include "linux-node-selector" $shard.id | nindent 8 }} +{{- if $.Values.nodeSelector }} +{{ toYaml $.Values.nodeSelector | indent 8 }} +{{- end }} +{{- if $shard.nodeSelector -}} +{{- range $key, $value := $shard.nodeSelector }} +{{ $key | indent 8}}: {{ $value }} +{{- end }} +{{- end }} + tolerations: {{ include "linux-node-tolerations" $shard.id | nindent 8 }} +{{- if $.Values.tolerations }} +{{ toYaml $.Values.tolerations | indent 8 }} +{{- end }} + {{- if $.Values.priorityClassName }} + priorityClassName: "{{$.Values.priorityClassName}}" + {{- end }} + +{{- if not $.Values.debug }} + securityContext: + runAsNonRoot: true + runAsUser: 1000 + runAsGroup: 1000 +{{- end }} + volumes: + - name: tmp + emptyDir: {} +{{- end }} +--- +{{- end }} diff --git a/charts/fleet/104.1.2+up0.10.6/templates/job_cleanup_clusterregistrations.yaml b/charts/fleet/104.1.2+up0.10.6/templates/job_cleanup_clusterregistrations.yaml new file mode 100644 index 0000000000..d039fd40b3 --- /dev/null +++ b/charts/fleet/104.1.2+up0.10.6/templates/job_cleanup_clusterregistrations.yaml @@ -0,0 +1,41 @@ +{{- if .Values.migrations.clusterRegistrationCleanup }} +--- +apiVersion: batch/v1 +kind: Job +metadata: + name: fleet-cleanup-clusterregistrations + annotations: + "helm.sh/hook": post-install, post-upgrade + "helm.sh/hook-delete-policy": hook-succeeded, before-hook-creation +spec: + template: + metadata: + labels: + app: fleet-job + spec: + serviceAccountName: fleet-controller + restartPolicy: Never + securityContext: + runAsNonRoot: true + runAsGroup: 1000 + runAsUser: 1000 + containers: + - name: cleanup + image: "{{ template "system_default_registry" . }}{{.Values.image.repository}}:{{.Values.image.tag}}" + imagePullPolicy: {{ .Values.global.imagePullPolicy }} + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: false + privileged: false + command: + - fleet + args: + - cleanup + - clusterregistration + nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} + tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} + backoffLimit: 1 +{{- end }} diff --git a/charts/fleet/104.1.2+up0.10.6/templates/job_cleanup_gitrepojobs.yaml b/charts/fleet/104.1.2+up0.10.6/templates/job_cleanup_gitrepojobs.yaml new file mode 100644 index 0000000000..0c58024476 --- /dev/null +++ b/charts/fleet/104.1.2+up0.10.6/templates/job_cleanup_gitrepojobs.yaml @@ -0,0 +1,44 @@ +{{- if .Values.migrations.gitrepoJobsCleanup }} +--- +apiVersion: batch/v1 +kind: CronJob +metadata: + name: fleet-cleanup-gitrepo-jobs +spec: + schedule: "@daily" + concurrencyPolicy: Forbid + successfulJobsHistoryLimit: 0 + failedJobsHistoryLimit: 1 + jobTemplate: + spec: + template: + metadata: + labels: + app: fleet-job + spec: + serviceAccountName: gitjob + restartPolicy: Never + securityContext: + runAsNonRoot: true + runAsGroup: 1000 + runAsUser: 1000 + containers: + - name: cleanup + image: "{{ template "system_default_registry" . }}{{.Values.image.repository}}:{{.Values.image.tag}}" + imagePullPolicy: {{ .Values.global.imagePullPolicy }} + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: false + privileged: false + command: + - fleet + args: + - cleanup + - gitjob + nodeSelector: {{ include "linux-node-selector" . | nindent 12 }} + tolerations: {{ include "linux-node-tolerations" . | nindent 12 }} + backoffLimit: 1 +{{- end }} diff --git a/charts/fleet/104.1.2+up0.10.6/templates/rbac.yaml b/charts/fleet/104.1.2+up0.10.6/templates/rbac.yaml new file mode 100644 index 0000000000..026c1c26d2 --- /dev/null +++ b/charts/fleet/104.1.2+up0.10.6/templates/rbac.yaml @@ -0,0 +1,113 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: fleet-controller +rules: +- apiGroups: + - fleet.cattle.io + resources: + - '*' + verbs: + - '*' +- apiGroups: + - "" + resources: + - namespaces + - serviceaccounts + verbs: + - '*' +- apiGroups: + - "" + resources: + - secrets + - configmaps + verbs: + - '*' +- apiGroups: + - rbac.authorization.k8s.io + resources: + - clusterroles + - clusterrolebindings + - roles + - rolebindings + verbs: + - '*' +- apiGroups: + - "" + resources: + - 'events' + verbs: + - '*' +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: fleet-controller +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: fleet-controller +subjects: +- kind: ServiceAccount + name: fleet-controller + namespace: {{.Release.Namespace}} + +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: fleet-controller +rules: +- apiGroups: + - "" + resources: + - configmaps + verbs: + - '*' +- apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - '*' + +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: fleet-controller +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: fleet-controller +subjects: +- kind: ServiceAccount + name: fleet-controller + +{{- if .Values.bootstrap.enabled }} +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: fleet-controller-bootstrap +rules: +- apiGroups: + - '*' + resources: + - '*' + verbs: + - '*' +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: fleet-controller-bootstrap +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: fleet-controller-bootstrap +subjects: +- kind: ServiceAccount + name: fleet-controller-bootstrap + namespace: {{.Release.Namespace}} +{{- end }} diff --git a/charts/fleet/104.1.2+up0.10.6/templates/rbac_gitjob.yaml b/charts/fleet/104.1.2+up0.10.6/templates/rbac_gitjob.yaml new file mode 100644 index 0000000000..e2c93169de --- /dev/null +++ b/charts/fleet/104.1.2+up0.10.6/templates/rbac_gitjob.yaml @@ -0,0 +1,133 @@ +{{- if .Values.gitops.enabled }} +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: gitjob +rules: + - apiGroups: + - "batch" + resources: + - 'jobs' + verbs: + - '*' + - apiGroups: + - "" + resources: + - 'pods' + verbs: + - 'list' + - 'get' + - 'watch' + - apiGroups: + - "" + resources: + - 'secrets' + verbs: + - '*' + - apiGroups: + - "" + resources: + - 'configmaps' + verbs: + - '*' + - apiGroups: + - "fleet.cattle.io" + resources: + - "gitrepos" + - "gitrepos/status" + verbs: + - "*" + - apiGroups: + - "fleet.cattle.io" + resources: + - "gitreporestrictions" + verbs: + - list + - get + - watch + - apiGroups: + - "fleet.cattle.io" + resources: + - "bundles" + - "bundledeployments" + - "imagescans" + - "contents" + verbs: + - list + - delete + - get + - watch + - update + - apiGroups: + - "" + resources: + - 'events' + verbs: + - '*' + - apiGroups: + - "" + resources: + - serviceaccounts + verbs: + - "create" + - apiGroups: + - "" + resources: + - namespaces + verbs: + - "create" + - "delete" + - apiGroups: + - rbac.authorization.k8s.io + resources: + - roles + verbs: + - escalate + - create + - bind + - apiGroups: + - rbac.authorization.k8s.io + resources: + - rolebindings + verbs: + - create + +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: gitjob-binding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: gitjob +subjects: + - kind: ServiceAccount + name: gitjob + namespace: {{ .Release.Namespace }} + +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: gitjob +rules: + - apiGroups: + - "coordination.k8s.io" + resources: + - "leases" + verbs: + - "*" +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: gitjob +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: gitjob +subjects: + - kind: ServiceAccount + name: gitjob +{{- end }} diff --git a/charts/fleet/104.1.2+up0.10.6/templates/service.yaml b/charts/fleet/104.1.2+up0.10.6/templates/service.yaml new file mode 100644 index 0000000000..49aefb490a --- /dev/null +++ b/charts/fleet/104.1.2+up0.10.6/templates/service.yaml @@ -0,0 +1,36 @@ +{{- if .Values.metrics.enabled }} +{{- $shards := list (dict "id" "" "nodeSelector" dict) -}} +{{- $uniqueShards := list -}} +{{- if .Values.shards -}} + {{- range .Values.shards -}} + {{- if not (has .id $uniqueShards) -}} + {{- $shards = append $shards . -}} + {{- $uniqueShards = append $uniqueShards .id -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{ range $shard := $shards }} +apiVersion: v1 +kind: Service +metadata: + name: "monitoring-fleet-controller{{if $shard.id }}-shard-{{ $shard.id }}{{end}}" + labels: + app: fleet-controller +spec: + type: ClusterIP + ports: + - port: 8080 + targetPort: 8080 + protocol: TCP + name: metrics + selector: + app: fleet-controller + {{- if empty $shard.id }} + fleet.cattle.io/shard-default: "true" + {{- else }} + fleet.cattle.io/shard-id: "{{ $shard.id }}" + {{- end }} +--- +{{- end }} +{{- end }} diff --git a/charts/fleet/104.1.2+up0.10.6/templates/service_gitjob.yaml b/charts/fleet/104.1.2+up0.10.6/templates/service_gitjob.yaml new file mode 100644 index 0000000000..f33c9a5457 --- /dev/null +++ b/charts/fleet/104.1.2+up0.10.6/templates/service_gitjob.yaml @@ -0,0 +1,51 @@ +{{- if .Values.gitops.enabled }} +apiVersion: v1 +kind: Service +metadata: + name: gitjob +spec: + ports: + - name: http-80 + port: 80 + protocol: TCP + targetPort: 8080 + selector: + app: "gitjob" +--- +{{- if .Values.metrics.enabled }} +{{- $shards := list (dict "id" "" "nodeSelector" dict) -}} +{{- $uniqueShards := list -}} +{{- if .Values.shards -}} + {{- range .Values.shards -}} + {{- if not (has .id $uniqueShards) -}} + {{- $shards = append $shards . -}} + {{- $uniqueShards = append $uniqueShards .id -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{ range $shard := $shards }} +apiVersion: v1 +kind: Service +metadata: + name: "monitoring-gitjob{{if $shard.id }}-shard-{{ $shard.id }}{{end}}" + labels: + app: gitjob +spec: + type: ClusterIP + ports: + - port: 8081 + targetPort: 8081 + protocol: TCP + name: metrics + selector: + app: gitjob + {{- if empty $shard.id }} + fleet.cattle.io/shard-default: "true" + {{- else }} + fleet.cattle.io/shard-id: "{{ $shard.id }}" + {{- end }} +--- +{{- end }} +{{- end }} +{{- end }} diff --git a/charts/fleet/104.1.2+up0.10.6/templates/serviceaccount.yaml b/charts/fleet/104.1.2+up0.10.6/templates/serviceaccount.yaml new file mode 100644 index 0000000000..ba27c748d7 --- /dev/null +++ b/charts/fleet/104.1.2+up0.10.6/templates/serviceaccount.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: fleet-controller + +{{- if .Values.bootstrap.enabled }} +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: fleet-controller-bootstrap +{{- end }} diff --git a/charts/fleet/104.1.2+up0.10.6/templates/serviceaccount_gitjob.yaml b/charts/fleet/104.1.2+up0.10.6/templates/serviceaccount_gitjob.yaml new file mode 100644 index 0000000000..c769b47cfd --- /dev/null +++ b/charts/fleet/104.1.2+up0.10.6/templates/serviceaccount_gitjob.yaml @@ -0,0 +1,6 @@ +{{- if .Values.gitops.enabled }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: gitjob +{{- end }} diff --git a/charts/fleet/104.1.2+up0.10.6/values.yaml b/charts/fleet/104.1.2+up0.10.6/values.yaml new file mode 100644 index 0000000000..8de92140f2 --- /dev/null +++ b/charts/fleet/104.1.2+up0.10.6/values.yaml @@ -0,0 +1,121 @@ +image: + repository: rancher/fleet + tag: v0.10.6 + imagePullPolicy: IfNotPresent + +agentImage: + repository: rancher/fleet-agent + tag: v0.10.6 + imagePullPolicy: IfNotPresent + +# For cluster registration the public URL of the Kubernetes API server must be set here +# Example: https://example.com:6443 +apiServerURL: "" + +# For cluster registration the pem encoded value of the CA of the Kubernetes API server must be set here +# If left empty it is assumed this Kubernetes API TLS is signed by a well known CA. +apiServerCA: "" + +# Determines whether the agent should trust CA bundles from the operating system's trust store when connecting to a +# management cluster. True in `system-store` mode, false in `strict` mode. +agentTLSMode: "system-store" + +# A duration string for how often agents should report a heartbeat +agentCheckinInterval: "15m" + +# Whether you want to allow cluster upon registration to specify their labels. +ignoreClusterRegistrationLabels: false + +# Counts from gitrepo are out of sync with bundleDeployment state. +# Just retry in a number of seconds as there is no great way to trigger an event that doesn't cause a loop. +# If not set default is 15 seconds. +# clusterEnqueueDelay: 120s + +# http[s] proxy server +# proxy: http://@:: + +# comma separated list of domains or ip addresses that will not use the proxy +noProxy: 127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,.svc,.cluster.local + +bootstrap: + enabled: true + # The namespace that will be autocreated and the local cluster will be registered in + namespace: fleet-local + # The namespace where the fleet agent for the local cluster will be ran, if empty + # this will default to cattle-fleet-system + agentNamespace: "" + # A repo to add at install time that will deploy to the local cluster. This allows + # one to fully bootstrap fleet, its configuration and all its downstream clusters + # in one shot. + repo: "" + secret: "" + branch: master + paths: "" + +global: + cattle: + systemDefaultRegistry: "" + +## Node labels for pod assignment +## Ref: https://kubernetes.io/docs/user-guide/node-selection/ +## +nodeSelector: {} +## List of node taints to tolerate (requires Kubernetes >= 1.6) +tolerations: [] + +## PriorityClassName assigned to deployment. +priorityClassName: "" + +gitops: + enabled: true + +metrics: + enabled: true + +debug: false +debugLevel: 0 +propagateDebugSettingsToAgents: true + +## Optional CPU pprof configuration. Profiles are collected continuously and saved every period +## Any valid volume configuration can be provided, the example below uses hostPath +# cpuPprof: +# period: "60s" +# volumeConfiguration: +# hostPath: +# path: /tmp/pprof +# type: DirectoryOrCreate + +migrations: + clusterRegistrationCleanup: true + gitrepoJobsCleanup: true + +## Leader election configuration +leaderElection: + leaseDuration: 30s + retryPeriod: 10s + renewDeadline: 25s + +## Fleet controller configuration +controller: + reconciler: + # The number of workers that are allowed to each type of reconciler + workers: + gitrepo: "50" + bundle: "50" + bundledeployment: "50" + +# Extra environment variables passed to the fleet pods. +# extraEnv: +# - name: EXPERIMENTAL_OCI_STORAGE +# value: "true" + +# shards: +# - id: shard0 +# nodeSelector: +# kubernetes.io/hostname: k3d-upstream-server-0 +# - id: shard1 +# nodeSelector: +# kubernetes.io/hostname: k3d-upstream-server-1 +# - id: shard2 +# nodeSelector: +# kubernetes.io/hostname: k3d-upstream-server-2 diff --git a/charts/harvester-csi-driver/104.0.3+up0.1.21/.helmignore b/charts/harvester-csi-driver/104.0.3+up0.1.21/.helmignore new file mode 100644 index 0000000000..0e8a0eb36f --- /dev/null +++ b/charts/harvester-csi-driver/104.0.3+up0.1.21/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/charts/harvester-csi-driver/104.0.3+up0.1.21/Chart.yaml b/charts/harvester-csi-driver/104.0.3+up0.1.21/Chart.yaml new file mode 100644 index 0000000000..b5db5b9410 --- /dev/null +++ b/charts/harvester-csi-driver/104.0.3+up0.1.21/Chart.yaml @@ -0,0 +1,22 @@ +annotations: + catalog.cattle.io/certified: rancher + catalog.cattle.io/display-name: Harvester CSI Driver + catalog.cattle.io/kube-version: '>= 1.23.0-0 < 1.31.0-0' + catalog.cattle.io/namespace: kube-system + catalog.cattle.io/os: linux + catalog.cattle.io/permits-os: linux + catalog.cattle.io/rancher-version: '>= 2.9.0-0 < 2.10.0-0' + catalog.cattle.io/release-name: harvester-csi-driver + catalog.cattle.io/ui-component: harvester-csi-driver + catalog.cattle.io/upstream-version: 0.1.21 +apiVersion: v2 +appVersion: v0.2.2 +description: A Helm chart for Harvester CSI driver +keywords: +- infrastructure +- harvester +maintainers: +- name: harvester +name: harvester-csi-driver +type: application +version: 104.0.3+up0.1.21 diff --git a/charts/harvester-csi-driver/104.0.3+up0.1.21/questions.yml b/charts/harvester-csi-driver/104.0.3+up0.1.21/questions.yml new file mode 100644 index 0000000000..0c703a0f29 --- /dev/null +++ b/charts/harvester-csi-driver/104.0.3+up0.1.21/questions.yml @@ -0,0 +1,11 @@ +categories: +- infrastructure +- harvester +namespace: kube-system +questions: +- variable: cloudConfig.hostPath + label: Cloud config file path + description: "Specify the path of the cloud config." + group: "Default" + type: string + default: "/etc/kubernetes/cloud-config" diff --git a/charts/harvester-csi-driver/104.0.3+up0.1.21/templates/NOTES.txt b/charts/harvester-csi-driver/104.0.3+up0.1.21/templates/NOTES.txt new file mode 100644 index 0000000000..ba09c6d518 --- /dev/null +++ b/charts/harvester-csi-driver/104.0.3+up0.1.21/templates/NOTES.txt @@ -0,0 +1 @@ +Successfully deployed Harvester CSI driver to the {{ .Release.Namespace }} namespace. diff --git a/charts/harvester-csi-driver/104.0.3+up0.1.21/templates/_helpers.tpl b/charts/harvester-csi-driver/104.0.3+up0.1.21/templates/_helpers.tpl new file mode 100644 index 0000000000..def471b21d --- /dev/null +++ b/charts/harvester-csi-driver/104.0.3+up0.1.21/templates/_helpers.tpl @@ -0,0 +1,62 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "harvester-csi-driver.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "harvester-csi-driver.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "harvester-csi-driver.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "harvester-csi-driver.labels" -}} +helm.sh/chart: {{ include "harvester-csi-driver.chart" . }} +{{ include "harvester-csi-driver.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "harvester-csi-driver.selectorLabels" -}} +app.kubernetes.io/name: {{ include "harvester-csi-driver.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Global system default registry +*/}} +{{- define "system_default_registry" -}} +{{- if .Values.global.cattle.systemDefaultRegistry -}} +{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} +{{- else -}} +{{- "" -}} +{{- end -}} +{{- end -}} diff --git a/charts/harvester-csi-driver/104.0.3+up0.1.21/templates/csidriver.yaml b/charts/harvester-csi-driver/104.0.3+up0.1.21/templates/csidriver.yaml new file mode 100644 index 0000000000..5fc6ec84a2 --- /dev/null +++ b/charts/harvester-csi-driver/104.0.3+up0.1.21/templates/csidriver.yaml @@ -0,0 +1,10 @@ +apiVersion: storage.k8s.io/v1 +kind: CSIDriver +metadata: + name: driver.harvesterhci.io +spec: + attachRequired: true + fsGroupPolicy: ReadWriteOnceWithFSType + podInfoOnMount: true + volumeLifecycleModes: + - Persistent diff --git a/charts/harvester-csi-driver/104.0.3+up0.1.21/templates/daemonset.yaml b/charts/harvester-csi-driver/104.0.3+up0.1.21/templates/daemonset.yaml new file mode 100644 index 0000000000..6ccb3203a0 --- /dev/null +++ b/charts/harvester-csi-driver/104.0.3+up0.1.21/templates/daemonset.yaml @@ -0,0 +1,152 @@ +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: {{ include "harvester-csi-driver.name" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "harvester-csi-driver.labels" . | nindent 4 }} +spec: + selector: + matchLabels: + component: csi-driver + {{- include "harvester-csi-driver.selectorLabels" . | nindent 6 }} + template: + metadata: + labels: + component: csi-driver + {{- include "harvester-csi-driver.selectorLabels" . | nindent 8 }} + spec: + containers: + - args: + - --v=5 + - --csi-address=$(ADDRESS) + - --kubelet-registration-path={{ .Values.kubeletRootDir }}/harvester-plugins/driver.harvesterhci.io/csi.sock + env: + - name: ADDRESS + value: /csi/csi.sock + image: {{ template "system_default_registry" . }}{{ .Values.image.csi.nodeDriverRegistrar.repository }}:{{ .Values.image.csi.nodeDriverRegistrar.tag }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + lifecycle: + preStop: + exec: + command: + - /bin/sh + - -c + - rm -rf /registration/driver.harvesterhci.io-reg.sock + /csi//* + name: node-driver-registrar + securityContext: + privileged: true + volumeMounts: + - mountPath: /csi/ + name: socket-dir + - mountPath: /registration + name: registration-dir + - args: + - --nodeid=$(NODE_ID) + - --endpoint=$(CSI_ENDPOINT) + - --kubeconfig=/var/lib/harvester/cloud-provider-config + {{- if .Values.hostStorageClass }} + - --host-storage-class={{ .Values.hostStorageClass }} + {{- end }} + env: + - name: NODE_ID + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: spec.nodeName + - name: CSI_ENDPOINT + value: unix:///csi/csi.sock + image: {{ template "system_default_registry" . }}{{ .Values.image.harvester.csiDriver.repository }}:{{ .Values.image.harvester.csiDriver.tag | default .Chart.AppVersion }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + lifecycle: + preStop: + exec: + command: + - /bin/sh + - -c + - rm -f /csi//* + name: harvester-csi-driver + securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - SYS_ADMIN + privileged: true + volumeMounts: + - name: cloud-config + readOnly: true + mountPath: /var/lib/harvester + - name: kubernetes + readOnly: true + mountPath: /etc/kubernetes + - mountPath: {{ .Values.kubeletRootDir }}/plugins/kubernetes.io/csi + mountPropagation: Bidirectional + name: kubernetes-csi-dir + - mountPath: /csi/ + name: socket-dir + - mountPath: {{ .Values.kubeletRootDir }}/pods + mountPropagation: Bidirectional + name: pods-mount-dir + - mountPath: /dev + name: host-dev + - mountPath: /sys + name: host-sys + - mountPath: /rootfs + mountPropagation: Bidirectional + name: host + - mountPath: /lib/modules + name: lib-modules + readOnly: true + hostPID: true + serviceAccountName: {{ include "harvester-csi-driver.name" . }} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} + volumes: + - name: cloud-config + {{- if .Values.cloudConfig.secretName }} + secret: + secretName: {{ .Values.cloudConfig.secretName }} + {{- else }} + hostPath: + path: {{ .Values.cloudConfig.hostPath }} + type: DirectoryOrCreate + {{- end }} + - hostPath: + path: /etc/kubernetes + type: DirectoryOrCreate + name: kubernetes + - hostPath: + path: {{ .Values.kubeletRootDir }}/plugins/kubernetes.io/csi + type: DirectoryOrCreate + name: kubernetes-csi-dir + - hostPath: + path: {{ .Values.kubeletRootDir }}/plugins_registry + type: Directory + name: registration-dir + - hostPath: + path: {{ .Values.kubeletRootDir }}/harvester-plugins/driver.harvesterhci.io + type: DirectoryOrCreate + name: socket-dir + - hostPath: + path: {{ .Values.kubeletRootDir }}/pods + type: DirectoryOrCreate + name: pods-mount-dir + - hostPath: + path: /dev + name: host-dev + - hostPath: + path: /sys + name: host-sys + - hostPath: + path: / + name: host + - hostPath: + path: /lib/modules + name: lib-modules diff --git a/charts/harvester-csi-driver/104.0.3+up0.1.21/templates/deployment.yaml b/charts/harvester-csi-driver/104.0.3+up0.1.21/templates/deployment.yaml new file mode 100644 index 0000000000..bb511dfa7b --- /dev/null +++ b/charts/harvester-csi-driver/104.0.3+up0.1.21/templates/deployment.yaml @@ -0,0 +1,95 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "harvester-csi-driver.name" . }}-controllers + namespace: {{ .Release.Namespace }} + labels: + {{- include "harvester-csi-driver.labels" . | nindent 4 }} +spec: + replicas: {{ .Values.replicasCount }} + selector: + matchLabels: + component: csi-controllers + {{- include "harvester-csi-driver.selectorLabels" . | nindent 6 }} + template: + metadata: + labels: + component: csi-controllers + {{- include "harvester-csi-driver.selectorLabels" . | nindent 8 }} + spec: + containers: + - args: + - --v=5 + - --csi-address=$(ADDRESS) + - --timeout=1m50s + - --leader-election + - --leader-election-namespace=$(POD_NAMESPACE) + env: + - name: ADDRESS + value: /csi/csi.sock + - name: POD_NAMESPACE + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + image: {{ template "system_default_registry" . }}{{ .Values.image.csi.resizer.repository }}:{{ .Values.image.csi.resizer.tag }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + name: csi-resizer + volumeMounts: + - mountPath: /csi/ + name: socket-dir + - args: + - --v=5 + - --csi-address=$(ADDRESS) + - --timeout=1m50s + - --leader-election + - --leader-election-namespace=$(POD_NAMESPACE) + - --default-fstype=ext4 + env: + - name: ADDRESS + value: /csi/csi.sock + - name: POD_NAMESPACE + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + image: {{ template "system_default_registry" . }}{{ .Values.image.csi.provisioner.repository }}:{{ .Values.image.csi.provisioner.tag }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + name: csi-provisioner + volumeMounts: + - mountPath: /csi/ + name: socket-dir + - args: + - --v=5 + - --csi-address=$(ADDRESS) + - --timeout=1m50s + - --leader-election + - --leader-election-namespace=$(POD_NAMESPACE) + env: + - name: ADDRESS + value: /csi/csi.sock + - name: POD_NAMESPACE + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + image: {{ template "system_default_registry" . }}{{ .Values.image.csi.attacher.repository }}:{{ .Values.image.csi.attacher.tag }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + name: csi-attacher + volumeMounts: + - mountPath: /csi/ + name: socket-dir + serviceAccountName: {{ include "harvester-csi-driver.name" . }} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} + volumes: + - hostPath: + path: {{ .Values.kubeletRootDir }}/harvester-plugins/driver.harvesterhci.io + type: DirectoryOrCreate + name: socket-dir diff --git a/charts/harvester-csi-driver/104.0.3+up0.1.21/templates/rbac.yaml b/charts/harvester-csi-driver/104.0.3+up0.1.21/templates/rbac.yaml new file mode 100644 index 0000000000..2ba042a26b --- /dev/null +++ b/charts/harvester-csi-driver/104.0.3+up0.1.21/templates/rbac.yaml @@ -0,0 +1,75 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "harvester-csi-driver.name" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "harvester-csi-driver.labels" . | nindent 4 }} +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: {{ include "harvester-csi-driver.name" . }} + labels: + {{- include "harvester-csi-driver.labels" . | nindent 4 }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: {{ include "harvester-csi-driver.name" . }} +subjects: + - kind: ServiceAccount + name: {{ include "harvester-csi-driver.name" . }} + namespace: {{ .Release.Namespace }} +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: {{ include "harvester-csi-driver.name" . }} + labels: + {{- include "harvester-csi-driver.labels" . | nindent 4 }} +rules: + - apiGroups: [ "coordination.k8s.io" ] + resources: [ "leases" ] + verbs: [ "get", "watch", "list", "delete", "update", "create" ] + - apiGroups: [ "storage.k8s.io" ] + resources: [ "csistoragecapacities" ] + verbs: [ "get", "list", "watch", "create", "update", "patch", "delete" ] + - apiGroups: [""] + resources: ["persistentvolumes"] + verbs: [ "get", "list", "watch", "create","update", "patch", "delete" ] + - apiGroups: [""] + resources: ["persistentvolumeclaims"] + verbs: ["get", "list", "watch", "create","update", "patch", "delete" ] + - apiGroups: [""] + resources: ["persistentvolumeclaims/status"] + verbs: ["patch"] + - apiGroups: ["storage.k8s.io"] + resources: ["storageclasses"] + verbs: ["get", "list", "watch"] + - apiGroups: ["snapshot.storage.k8s.io"] + resources: ["volumesnapshots"] + verbs: ["get", "list"] + - apiGroups: ["snapshot.storage.k8s.io"] + resources: ["volumesnapshotcontents"] + verbs: ["get", "list"] + - apiGroups: [ "storage.k8s.io" ] + resources: [ "csinodes" ] + verbs: [ "get", "list", "watch" ] + - apiGroups: [ "" ] + resources: [ "events" ] + verbs: [ "list", "watch", "create", "update", "patch" ] + - apiGroups: [ "" ] + resources: [ "pods" ] + verbs: [ "get", "list", "watch" ] + - apiGroups: [ "apps" ] + resources: [ "replicasets" ] + verbs: [ "get" ] + - apiGroups: [""] + resources: ["nodes"] + verbs: ["get", "list", "watch"] + - apiGroups: ["storage.k8s.io"] + resources: ["volumeattachments"] + verbs: ["get", "list", "watch", "patch"] + - apiGroups: [ "storage.k8s.io" ] + resources: [ "volumeattachments/status" ] + verbs: [ "patch" ] diff --git a/charts/harvester-csi-driver/104.0.3+up0.1.21/templates/storageclass.yaml b/charts/harvester-csi-driver/104.0.3+up0.1.21/templates/storageclass.yaml new file mode 100644 index 0000000000..a29c9c7da0 --- /dev/null +++ b/charts/harvester-csi-driver/104.0.3+up0.1.21/templates/storageclass.yaml @@ -0,0 +1,10 @@ +apiVersion: storage.k8s.io/v1 +kind: StorageClass +metadata: + name: harvester + annotations: + storageclass.kubernetes.io/is-default-class: "true" +allowVolumeExpansion: true +provisioner: driver.harvesterhci.io +reclaimPolicy: Delete +volumeBindingMode: Immediate diff --git a/charts/harvester-csi-driver/104.0.3+up0.1.21/values.yaml b/charts/harvester-csi-driver/104.0.3+up0.1.21/values.yaml new file mode 100644 index 0000000000..fe6b120cbd --- /dev/null +++ b/charts/harvester-csi-driver/104.0.3+up0.1.21/values.yaml @@ -0,0 +1,56 @@ +# Default values for harvester-csi-driver. + +replicasCount: 3 + +image: + harvester: + csiDriver: + repository: rancher/harvester-csi-driver + # Overrides the image tag whose default is the chart appVersion. + tag: "v0.2.2" + csi: + nodeDriverRegistrar: + repository: rancher/mirrored-longhornio-csi-node-driver-registrar + tag: v2.3.0 + resizer: + repository: rancher/mirrored-longhornio-csi-resizer + tag: v1.2.0 + provisioner: + repository: rancher/mirrored-longhornio-csi-provisioner + tag: v2.1.2 + attacher: + repository: rancher/mirrored-longhornio-csi-attacher + tag: v3.2.1 + pullPolicy: IfNotPresent + +nameOverride: "" +fullnameOverride: "" + +# This field can be used to specify the corresponding StorageClass on the host cluster. +hostStorageClass: "" +kubeletRootDir: /var/lib/kubelet +cloudConfig: + secretName: "" + hostPath: "/var/lib/rancher/rke2/etc/config-files/" + +nodeSelector: + kubernetes.io/os: linux + +tolerations: + - effect: NoSchedule + key: kubevirt.io/drain + operator: Exists + - effect: NoSchedule + key: node-role.kubernetes.io/control-plane + operator: Equal + - effect: NoExecute + key: node-role.kubernetes.io/etcd + operator: Equal + - key: cattle.io/os + operator: Equal + value: "linux" + effect: NoSchedule + +global: + cattle: + systemDefaultRegistry: "" diff --git a/index.yaml b/index.yaml index 549a27b7f0..925db52555 100755 --- a/index.yaml +++ b/index.yaml @@ -1006,6 +1006,28 @@ entries: urls: - assets/fleet/fleet-105.0.0+up0.11.0.tgz version: 105.0.0+up0.11.0 + - annotations: + catalog.cattle.io/auto-install: fleet-crd=match + catalog.cattle.io/certified: rancher + catalog.cattle.io/experimental: "true" + catalog.cattle.io/hidden: "true" + catalog.cattle.io/kube-version: '>= 1.18.0-0 < 1.31.0-0' + catalog.cattle.io/namespace: cattle-fleet-system + catalog.cattle.io/os: linux + catalog.cattle.io/permits-os: linux,windows + catalog.cattle.io/provides-gvr: clusters.fleet.cattle.io/v1alpha1 + catalog.cattle.io/rancher-version: '>= 2.9.0-0 < 2.10.0-0' + catalog.cattle.io/release-name: fleet + apiVersion: v2 + appVersion: 0.10.6 + created: "2024-11-18T15:00:46.713483692-03:00" + description: Fleet Manager - GitOps at Scale + digest: da9fd9530ec9043aeb99f6506643d4fd53b1faf29f16e405459abb411f647dac + icon: https://charts.rancher.io/assets/logos/fleet.svg + name: fleet + urls: + - assets/fleet/fleet-104.1.2+up0.10.6.tgz + version: 104.1.2+up0.10.6 - annotations: catalog.cattle.io/auto-install: fleet-crd=match catalog.cattle.io/certified: rancher @@ -1751,6 +1773,25 @@ entries: urls: - assets/fleet-agent/fleet-agent-105.0.0+up0.11.0.tgz version: 105.0.0+up0.11.0 + - annotations: + catalog.cattle.io/certified: rancher + catalog.cattle.io/hidden: "true" + catalog.cattle.io/kube-version: '>= 1.18.0-0 < 1.31.0-0' + catalog.cattle.io/namespace: cattle-fleet-system + catalog.cattle.io/os: linux + catalog.cattle.io/permits-os: linux,windows + catalog.cattle.io/rancher-version: '>= 2.9.0-0 < 2.10.0-0' + catalog.cattle.io/release-name: fleet-agent + apiVersion: v2 + appVersion: 0.10.6 + created: "2024-11-18T15:00:56.006043934-03:00" + description: Fleet Manager Agent - GitOps at Scale + digest: 2fcb090eee3beb62b13ba96ae308db881f0444a1b8bb7c18efa44c2bad9b9911 + icon: https://charts.rancher.io/assets/logos/fleet.svg + name: fleet-agent + urls: + - assets/fleet-agent/fleet-agent-104.1.2+up0.10.6.tgz + version: 104.1.2+up0.10.6 - annotations: catalog.cattle.io/certified: rancher catalog.cattle.io/hidden: "true" @@ -2318,6 +2359,23 @@ entries: urls: - assets/fleet-crd/fleet-crd-105.0.0+up0.11.0.tgz version: 105.0.0+up0.11.0 + - annotations: + catalog.cattle.io/certified: rancher + catalog.cattle.io/hidden: "true" + catalog.cattle.io/namespace: cattle-fleet-system + catalog.cattle.io/os: linux + catalog.cattle.io/permits-os: linux,windows + catalog.cattle.io/release-name: fleet-crd + apiVersion: v2 + appVersion: 0.10.6 + created: "2024-11-18T15:00:51.291955494-03:00" + description: Fleet Manager CustomResourceDefinitions + digest: 20251cd2a9c6808abd43ffccd6543e524d021cf772cce873be1d9fe2e4e4d8d9 + icon: https://charts.rancher.io/assets/logos/fleet.svg + name: fleet-crd + urls: + - assets/fleet-crd/fleet-crd-104.1.2+up0.10.6.tgz + version: 104.1.2+up0.10.6 - annotations: catalog.cattle.io/certified: rancher catalog.cattle.io/hidden: "true" @@ -3188,6 +3246,32 @@ entries: urls: - assets/harvester-csi-driver/harvester-csi-driver-105.0.0+up0.1.21.tgz version: 105.0.0+up0.1.21 + - annotations: + catalog.cattle.io/certified: rancher + catalog.cattle.io/display-name: Harvester CSI Driver + catalog.cattle.io/kube-version: '>= 1.23.0-0 < 1.31.0-0' + catalog.cattle.io/namespace: kube-system + catalog.cattle.io/os: linux + catalog.cattle.io/permits-os: linux + catalog.cattle.io/rancher-version: '>= 2.9.0-0 < 2.10.0-0' + catalog.cattle.io/release-name: harvester-csi-driver + catalog.cattle.io/ui-component: harvester-csi-driver + catalog.cattle.io/upstream-version: 0.1.21 + apiVersion: v2 + appVersion: v0.2.2 + created: "2024-11-18T15:00:59.98250617-03:00" + description: A Helm chart for Harvester CSI driver + digest: 8ecf414a4135aab5bb88c34da3d870a7cb47a6864f7b6a28f6e33cf910a02dcc + keywords: + - infrastructure + - harvester + maintainers: + - name: harvester + name: harvester-csi-driver + type: application + urls: + - assets/harvester-csi-driver/harvester-csi-driver-104.0.3+up0.1.21.tgz + version: 104.0.3+up0.1.21 - annotations: catalog.cattle.io/certified: rancher catalog.cattle.io/display-name: Harvester CSI Driver diff --git a/release.yaml b/release.yaml index d153739f84..009f48813e 100644 --- a/release.yaml +++ b/release.yaml @@ -1,13 +1,17 @@ fleet: - 105.0.1+up0.11.1 + - 104.1.2+up0.10.6 fleet-agent: - 105.0.1+up0.11.1 + - 104.1.2+up0.10.6 fleet-crd: - 105.0.1+up0.11.1 + - 104.1.2+up0.10.6 harvester-cloud-provider: - 105.0.0+up0.2.6 harvester-csi-driver: - 105.0.0+up0.1.21 + - 104.0.3+up0.1.21 rancher-cis-benchmark: - 105.0.0+up7.0.0 rancher-cis-benchmark-crd: