From 75cd658aec41f33afdf8c502d12ce185d1d458c8 Mon Sep 17 00:00:00 2001 From: Anand Raja Kesavamoorthy Date: Fri, 15 Nov 2024 18:19:56 +0000 Subject: [PATCH 1/3] Updated setup for csm 1.13 --- content/v1/_index.md | 37 +- content/v1/applicationmobility/_index.md | 2 +- .../v1/applicationmobility/release/_index.md | 9 +- .../Migration guide from v1 to v2/_index.md | 184 +++ content/v1/authorization/_index.md | 6 +- .../Backup and Restore/_index.md | 0 .../v1.x}/Backup and Restore/helm/_index.md | 5 +- .../v1.x}/Backup and Restore/rpm/_index.md | 2 +- content/v1/authorization/v1.x/_index.md | 66 + .../authorization/v1.x}/cli.md | 4 +- .../{v1.x GA => v1.x}/configuration/_index.md | 0 .../v1.x}/configuration/powerflex/_index.md | 21 +- .../v1.x}/configuration/powermax/_index.md | 43 +- .../v1.x}/configuration/powerscale/_index.md | 21 +- .../configuration/proxy-server/_index.md | 0 .../authorization/{v1.x GA => v1.x}/design.md | 0 .../{v1.x GA => v1.x}/design1.png | Bin .../{v1.x GA => v1.x}/design2.png | Bin .../karavi-authorization-example.png | Bin .../v1/authorization/v1.x/release/_index.md | 21 + .../authorization/v1.x}/troubleshooting.md | 4 +- content/v1/authorization/v2.x/_index.md | 74 + .../authorization-ha-example.png | Bin .../v2.x/configuration/_index.md | 197 +++ .../v2.x/configuration/powerflex/_index.md | 178 +++ .../v2.x/configuration/powermax/_index.md | 210 +++ .../v2.x/configuration/powerscale/_index.md | 181 +++ .../{v2.0 Tech Preview => v2.x}/image.png | Bin .../v1/authorization/v2.x/release/_index.md | 13 + .../v1/authorization/v2.x/troubleshooting.md | 8 + content/v1/cosidriver/_index.md | 2 + content/v1/csidriver/_index.md | 4 +- content/v1/csidriver/features/powerflex.md | 44 + content/v1/csidriver/features/powermax.md | 3 + content/v1/csidriver/features/powerscale.md | 1368 ++++++++--------- content/v1/csidriver/features/powerstore.md | 101 +- content/v1/csidriver/release/powerflex.md | 24 +- content/v1/csidriver/release/powermax.md | 31 +- content/v1/csidriver/release/powerscale.md | 23 +- content/v1/csidriver/release/powerstore.md | 25 +- content/v1/csidriver/release/unity.md | 19 +- .../v1/csidriver/troubleshooting/powermax.md | 1 + content/v1/csm_hexagon.png | Bin 194107 -> 423322 bytes content/v1/deployment/_index.md | 17 +- .../csminstallationwizard/_index.md | 37 +- .../csminstallationwizard/release/_index.md | 7 +- .../csm-versions/default-values.properties | 2 +- .../csminstallationwizard/src/index.html | 39 +- .../csminstallationwizard/src/package.json | 6 +- .../src/static/css/style.css | 2 +- .../src/static/js/commands.js | 1 + .../src/static/js/constants.js | 4 +- .../src/static/js/generate-yaml.js | 2 + .../src/static/js/tests/generate-yaml.test.js | 836 ++++++++-- .../src/static/js/tests/ui-functions.test.js | 22 +- .../src/static/js/tests/utility.test.js | 4 +- .../src/static/js/ui-functions.js | 46 +- .../helm/csm-1.11.1-values.template} | 306 ++-- .../templates/helm/csm-1.12.0-values.template | 596 +++++++ .../operator/csm-isilon-1.10.2.template | 34 +- .../operator/csm-isilon-1.11.1.template | 495 ++++++ .../operator/csm-isilon-1.12.0.template | 496 ++++++ .../operator/csm-powermax-1.10.2.template | 22 +- .../operator/csm-powermax-1.11.1.template | 465 ++++++ .../operator/csm-powermax-1.12.0.template | 472 ++++++ .../operator/csm-powerstore-1.10.2.template | 16 +- .../operator/csm-powerstore-1.11.1.template | 207 +++ .../operator/csm-powerstore-1.12.0.template | 207 +++ content/v1/deployment/csmoperator/_index.md | 176 +-- .../deployment/csmoperator/drivers/_index.md | 45 +- .../csmoperator/drivers/powerflex.md | 31 +- .../csmoperator/drivers/powermax.md | 331 ++-- .../csmoperator/drivers/powerscale.md | 22 +- .../csmoperator/drivers/powerstore.md | 148 +- .../deployment/csmoperator/drivers/unity.md | 27 +- .../csmoperator/{install.jpg => install.JPG} | Bin ...tall_olm_pods.jpg => install_olm_pods.JPG} | Bin .../deployment/csmoperator/modules/_index.md | 4 +- ...authorization.md => authorization v1.x.md} | 45 +- .../csmoperator/modules/authorization v2.0.md | 394 +++++ .../csmoperator/modules/observability.md | 10 +- .../csmoperator/modules/replication.md | 23 +- .../csmoperator/modules/resiliency.md | 22 +- .../deployment/csmoperator/release/_index.md | 26 +- .../csmoperator/troubleshooting/_index.md | 12 + .../helm/drivers/installation/_index.md | 4 +- .../helm/drivers/installation/isilon.md | 44 +- .../helm/drivers/installation/powerflex.md | 107 +- .../helm/drivers/installation/powermax.md | 323 ++-- .../helm/drivers/installation/powerstore.md | 129 +- .../helm/drivers/installation/unity.md | 98 +- .../deployment/helm/drivers/upgrade/isilon.md | 10 +- .../helm/drivers/upgrade/powerflex.md | 8 +- .../helm/drivers/upgrade/powermax.md | 8 +- .../helm/drivers/upgrade/powerstore.md | 10 +- .../deployment/helm/drivers/upgrade/unity.md | 8 +- .../installation/authorization v2.0/_index.md | 200 +++ .../authorization-v1.x}/_index.md | 112 +- .../installation/observability/_index.md | 6 +- .../installation/observability/deployment.md | 97 +- .../installation/observability/installer.md | 4 +- .../replication/install-repctl.md | 7 +- .../replication/install-script.md | 7 +- .../installation/replication/installation.md | 15 + .../installation/replication/powerflex.md | 4 + .../installation/replication/powermax.md | 4 + .../installation/replication/powerscale.md | 4 + .../installation/replication/powerstore.md | 33 +- .../modules/installation/resiliency/_index.md | 28 +- .../modules/uninstall/authorization v2.0.md | 37 + .../modules/uninstall/authorization-v1.x.md | 27 + .../helm/modules/upgrade/authorization.md | 4 + .../helm/modules/upgrade/observability.md | 32 +- .../helm/modules/upgrade/replication.md | 6 +- .../helm/modules/upgrade/resiliency.md | 4 +- .../v1/deployment/offline/drivers/_index.md | 6 +- .../v1/deployment/offline/modules/_index.md | 30 +- .../v1/deployment/offline/upgrade/_index.md | 4 +- .../authorization-v1.x/authorization v1.x.md} | 39 +- .../rpm/modules/uninstall/authorization.md | 2 +- .../rpm/modules/upgrade/authorization.md | 12 +- content/v1/interactive-tutorials/_index.md | 23 - content/v1/observability/metrics/_index.md | 2 +- content/v1/observability/metrics/powermax.md | 5 +- .../v1/observability/metrics/powerstore.md | 10 +- content/v1/observability/release/_index.md | 12 +- content/v1/prerequisites/_index.md | 87 +- content/v1/replication/_index.md | 10 +- .../replication/high-availability/_index.md | 8 + .../powermax-metro.md} | 17 +- .../high-availability/powerstore-metro.md | 60 + .../{metro.png => powermax-metro.png} | Bin content/v1/replication/powerstore-metro.png | Bin 0 -> 46841 bytes content/v1/replication/release/_index.md | 24 +- content/v1/replication/troubleshooting.md | 3 + content/v1/resiliency/_index.md | 9 +- content/v1/resiliency/release/_index.md | 12 +- content/v1/secure/_index.md | 8 - content/v1/secure/encryption/_index.md | 137 -- .../v1/secure/encryption/release/_index.md | 19 - .../v1/secure/encryption/troubleshooting.md | 102 -- .../volume-group-snapshots/_index.md | 6 +- content/v1/support/cert-csi/_index.md | 84 +- content/v1/support/cert-csi/qualified.md | 4 + content/v1/support/cli/_index.md | 151 +- content/v1/support/license/_index.md | 20 - content/v1/support/release/_index.md | 6 +- content/v1/support/troubleshooting/_index.md | 6 +- content/v2/_index.md | 10 +- content/v2/applicationmobility/_index.md | 6 +- .../v2/applicationmobility/release/_index.md | 14 +- .../v2/applicationmobility/troubleshooting.md | 48 - content/v2/authorization/_index.md | 55 +- content/v2/authorization/release/_index.md | 29 - .../Backup and Restore/_index.md | 0 .../v1.x GA/Backup and Restore/helm/_index.md | 0 .../v1.x GA/Backup and Restore/rpm/_index.md | 0 .../authorization/v1.x GA/_index.md | 0 .../{v1 => v2}/authorization/v1.x GA/cli.md | 0 .../v1.x GA}/configuration/_index.md | 0 .../v1.x GA/configuration/powerflex/_index.md | 0 .../v1.x GA/configuration/powermax/_index.md | 0 .../configuration/powerscale/_index.md | 0 .../configuration/proxy-server/_index.md | 0 .../v2/authorization/{ => v1.x GA}/design.md | 0 .../authorization/{ => v1.x GA}/design1.png | Bin .../authorization/{ => v1.x GA}/design2.png | Bin .../karavi-authorization-example.png | Bin .../authorization/v1.x GA/release/_index.md | 0 .../authorization/v1.x GA/troubleshooting.md | 0 .../authorization/v2.0 Tech Preview/_index.md | 0 .../authorization-ha-example.png | Bin 0 -> 121616 bytes .../configuration/_index.md | 0 .../configuration/powerflex/_index.md | 0 .../configuration/proxy-server/_index.md | 0 .../authorization/v2.0 Tech Preview/image.png | Bin 0 -> 178897 bytes content/v2/cosidriver/release/_index.md | 2 +- content/v2/csidriver/_index.md | 7 +- content/v2/csidriver/features/powerflex.md | 3 + content/v2/csidriver/features/powermax.md | 14 +- content/v2/csidriver/features/powerscale.md | 2 +- content/v2/csidriver/features/unity.md | 13 + content/v2/csidriver/release/powerflex.md | 31 +- content/v2/csidriver/release/powermax.md | 24 +- content/v2/csidriver/release/powerscale.md | 23 +- content/v2/csidriver/release/powerstore.md | 25 +- content/v2/csidriver/release/unity.md | 27 +- .../v2/csidriver/troubleshooting/powerflex.md | 2 + .../csidriver/troubleshooting/powerscale.md | 1 - content/v2/deployment/_index.md | 7 +- .../csminstallationwizard/_index.md | 22 +- .../csminstallationwizard/release/_index.md | 6 +- .../csm-versions/default-values.properties | 2 +- .../csminstallationwizard/src/index.html | 10 +- .../src/static/css/style.css | 3 +- .../src/static/js/constants.js | 2 +- .../src/static/js/tests/generate-yaml.test.js | 2 +- .../src/static/js/tests/ui-functions.test.js | 10 +- .../src/static/js/tests/utility.test.js | 2 +- .../src/static/js/ui-functions.js | 16 +- .../templates/helm/csm-1.11.0-values.template | 0 .../operator/csm-isilon-1.11.0.template | 0 .../operator/csm-powermax-1.11.0.template | 0 .../operator/csm-powerstore-1.11.0.template | 0 content/v2/deployment/csmoperator/_index.md | 167 +- .../csmoperator/drivers/powerflex.md | 48 +- .../csmoperator/drivers/powermax.md | 27 +- .../csmoperator/drivers/powerscale.md | 1 + .../deployment/csmoperator/drivers/unity.md | 27 +- .../authorization v2.0 Tech Preview.md | 0 .../csmoperator/modules/authorization.md | 131 +- .../csmoperator/modules/observability.md | 50 +- .../csmoperator/modules/replication.md | 4 +- .../csmoperator/modules/resiliency.md | 10 +- .../deployment/csmoperator/release/_index.md | 18 +- .../helm/drivers/installation/isilon.md | 17 +- .../helm/drivers/installation/powerflex.md | 15 +- .../helm/drivers/installation/powermax.md | 189 ++- .../helm/drivers/installation/powerstore.md | 4 +- .../helm/drivers/installation/unity.md | 14 +- .../deployment/helm/drivers/upgrade/isilon.md | 11 +- .../helm/drivers/upgrade/powerflex.md | 10 +- .../helm/drivers/upgrade/powermax.md | 7 +- .../helm/drivers/upgrade/powerstore.md | 11 +- .../deployment/helm/drivers/upgrade/unity.md | 9 +- .../installation/authorization/_index.md | 10 +- .../modules/installation/encryption/vault.md | 2 +- .../replication/install-repctl.md | 4 +- .../replication/install-script.md | 4 +- .../modules/installation/resiliency/_index.md | 34 + .../helm/modules/upgrade/observability.md | 2 +- .../helm/modules/upgrade/replication.md | 2 +- .../v2/deployment/offline/drivers/_index.md | 106 +- .../authorization/authorization.md | 8 +- content/v2/interactive-tutorials/_index.md | 8 +- content/v2/observability/release/_index.md | 10 +- content/v2/prerequisites/_index.md | 78 +- content/v2/replication/release/_index.md | 9 +- content/v2/resiliency/_index.md | 29 +- content/v2/resiliency/release/_index.md | 9 +- .../v2/secure/encryption/release/_index.md | 10 +- content/v2/snapshots/_index.md | 8 +- content/v2/support/cert-csi/_index.md | 99 +- content/v2/support/cli/_index.md | 71 +- content/v2/support/license/_index.md | 8 +- content/v2/support/release/_index.md | 2 +- content/v2/support/troubleshooting/_index.md | 6 +- content/v3/_index.md | 6 +- content/v3/applicationmobility/_index.md | 14 +- content/v3/applicationmobility/deployment.md | 66 - .../v3/applicationmobility/release/_index.md | 10 +- .../v3/applicationmobility/troubleshooting.md | 2 +- content/v3/applicationmobility/use_cases.md | 2 +- .../Backup and Restore/helm/_index.md | 4 +- content/v3/authorization/_index.md | 30 +- .../configuration/powerflex/_index.md | 20 +- .../configuration/powermax/_index.md | 28 +- .../configuration/powerscale/_index.md | 18 +- .../configuration/proxy-server/_index.md | 42 +- content/v3/authorization/deployment/_index.md | 15 - .../deployment/operator/_index.md | 13 - content/v3/authorization/release/_index.md | 9 +- content/v3/cosidriver/features/objectscale.md | 4 +- content/v3/cosidriver/release/_index.md | 2 +- content/v3/csidriver/_index.md | 35 +- content/v3/csidriver/features/powerflex.md | 2 +- content/v3/csidriver/features/powermax.md | 11 +- content/v3/csidriver/features/powerscale.md | 12 +- content/v3/csidriver/features/powerstore.md | 17 +- content/v3/csidriver/features/unity.md | 106 +- .../csidriver/installation/operator/_index.md | 11 - content/v3/csidriver/release/powerflex.md | 46 +- content/v3/csidriver/release/powermax.md | 31 +- content/v3/csidriver/release/powerscale.md | 33 +- content/v3/csidriver/release/powerstore.md | 54 +- content/v3/csidriver/release/unity.md | 32 +- .../{installation => }/test/_index.md | 0 .../{installation => }/test/powerflex.md | 0 .../{installation => }/test/powermax.md | 0 .../{installation => }/test/powerscale.md | 0 .../{installation => }/test/powerstore.md | 0 .../{installation => }/test/unity.md | 0 .../v3/csidriver/troubleshooting/powerflex.md | 6 +- .../v3/csidriver/troubleshooting/powermax.md | 2 +- .../csidriver/troubleshooting/powerscale.md | 1 + .../csidriver/troubleshooting/powerstore.md | 3 +- content/v3/csidriver/troubleshooting/unity.md | 1 + content/v3/deployment/_index.md | 38 +- .../csminstallationwizard/_index.md | 31 +- .../csminstallationwizard/release/_index.md | 6 +- .../csm-versions/default-values.properties | 2 +- .../csminstallationwizard/src/index.html | 7 +- .../src/static/css/style.css | 1 + .../src/static/js/constants.js | 1 + .../src/static/js/tests/generate-yaml.test.js | 1 + .../src/static/js/tests/ui-functions.test.js | 1 + .../src/static/js/tests/utility.test.js | 1 + .../src/static/js/ui-functions.js | 5 +- .../helm/csm-1.10.2-values.template} | 157 +- .../templates/helm/csm-1.8.0-values.template | 1 + .../templates/helm/csm-1.9.3-values.template | 86 ++ .../operator/csm-isilon-1.10.2.template} | 35 +- ...9.4.template => csm-isilon-1.9.3.template} | 0 .../operator/csm-powermax-1.10.2.template} | 123 +- .../operator/csm-powermax-1.8.0.template | 4 +- ...4.template => csm-powermax-1.9.3.template} | 0 .../operator/csm-powerstore-1.10.2.template} | 25 +- ...template => csm-powerstore-1.9.3.template} | 6 +- content/v3/deployment/csmoperator/_index.md | 102 +- .../deployment/csmoperator/drivers/_index.md | 2 +- .../csmoperator/drivers/powerflex.md | 8 +- .../csmoperator/drivers/powermax.md | 4 +- .../csmoperator/drivers/powerscale.md | 4 +- .../csmoperator/drivers/powerstore.md | 2 +- .../deployment/csmoperator/drivers/unity.md | 2 + .../csmoperator/modules/authorization.md | 117 +- .../csmoperator/modules/observability.md | 8 +- .../csmoperator/modules/replication.md | 4 +- .../csmoperator/modules/resiliency.md | 2 +- .../csmoperator}/operator_migration.md | 14 +- .../deployment/csmoperator/release/_index.md | 77 +- .../helm}/_index.md | 8 +- content/v3/deployment/helm/drivers/_index.md | 6 + .../helm/drivers/installation}/_index.md | 6 +- .../helm/drivers/installation}/isilon.md | 40 +- .../helm/drivers/installation}/powerflex.md | 40 +- .../helm/drivers/installation}/powermax.md | 27 +- .../helm/drivers/installation}/powerstore.md | 12 +- .../helm/drivers/installation}/unity.md | 17 +- .../helm/drivers}/uninstall/_index.md | 4 +- .../helm/drivers/upgrade}/_index.md | 3 +- .../helm/drivers/upgrade}/isilon.md | 17 +- .../helm/drivers/upgrade}/powerflex.md | 15 +- .../helm/drivers/upgrade}/powermax.md | 11 +- .../helm/drivers/upgrade}/powerstore.md | 14 +- .../helm/drivers/upgrade}/unity.md | 15 +- content/v3/deployment/helm/modules/_index.md | 6 + .../helm/modules/installation/_index.md | 6 + .../applicationmobility/_index.md | 0 .../installation/authorization/_index.md | 10 +- .../modules/installation/encryption/_index.md | 0 .../modules/installation/encryption/rekey.md | 0 .../modules/installation/encryption/vault.md | 2 +- .../installation/observability}/_index.md | 15 +- .../installation/observability/deployment.md} | 53 +- .../installation/observability/installer.md} | 4 +- .../installation/replication}/_index.md | 4 +- .../replication}/configmap-secrets.md | 0 .../replication}/install-repctl.md | 4 +- .../replication}/install-script.md | 4 +- .../installation/replication}/installation.md | 0 .../installation/replication}/powerflex.md | 2 +- .../installation/replication}/powermax.md | 6 - .../installation/replication}/powerscale.md | 0 .../installation/replication}/powerstore.md | 0 .../replication}/storageclasses.md | 0 .../installation/resiliency/_index.md} | 4 +- .../helm/modules/uninstall/_index.md | 6 + .../modules/uninstall/applicationmobility.md} | 4 +- .../helm/modules/uninstall/authorization.md | 0 .../helm/modules/uninstall/encryption.md | 0 .../helm/modules/uninstall/observability.md} | 4 +- .../helm/modules/uninstall/replication.md} | 6 +- .../helm/modules/uninstall/resiliency.md | 28 + .../deployment/helm/modules/upgrade/_index.md | 8 + .../helm/modules/upgrade/authorization.md | 41 + .../helm/modules/upgrade/observability.md} | 26 +- .../helm/modules/upgrade/replication.md} | 10 +- .../helm/modules/upgrade/resiliency.md} | 12 +- content/v3/deployment/offline/_index.md | 8 + .../offline/drivers}/_index.md | 30 +- .../offline/modules/_index.md} | 15 +- .../offline/upgrade/_index.md} | 4 +- content/v3/deployment/rpm/_index.md | 8 + content/v3/deployment/rpm/modules/_index.md | 6 + .../rpm/modules/installation/_index.md | 6 + .../authorization/authorization.md | 8 +- .../rpm/modules/uninstall/_index.md | 7 + .../rpm/modules/uninstall/authorization.md} | 6 +- .../deployment/rpm/modules/upgrade/_index.md | 7 + .../rpm/modules/upgrade/authorization.md} | 20 +- content/v3/interactive-tutorials/_index.md | 12 +- .../csm-operator/_index.md | 0 .../csm-quickstart/_index.md | 0 content/v3/observability/_index.md | 34 +- .../v3/observability/deployment/operator.md | 11 - content/v3/observability/release/_index.md | 14 +- .../observability/troubleshooting/_index.md | 6 +- content/v3/prerequisites/_index.md | 93 ++ content/v3/references/FAQ/_index.md | 112 -- content/v3/references/_index.md | 7 - content/v3/references/policies/_index.md | 7 - content/v3/release/_index.md | 27 - content/v3/replication/_index.md | 19 - content/v3/replication/cluster-topologies.md | 8 +- .../deployment/install-operator.md | 11 - content/v3/replication/high-availability.md | 4 +- .../migration/migrating-volumes-diff-array.md | 2 +- content/v3/replication/release/_index.md | 14 +- content/v3/resiliency/_index.md | 4 +- content/v3/resiliency/deployment/_index.md | 7 - content/v3/resiliency/deployment/operator.md | 11 - content/v3/resiliency/release/_index.md | 11 +- content/v3/resiliency/uninstallation.md | 13 - content/v3/secure/encryption/_index.md | 10 +- content/v3/secure/encryption/deployment.md | 186 --- content/v3/secure/encryption/rekey.md | 144 -- .../v3/secure/encryption/troubleshooting.md | 18 +- .../v3/secure/encryption/uninstallation.md | 43 - content/v3/secure/encryption/vault.md | 244 --- content/v3/securitypolicy/_index.md | 15 - content/v3/support/_index.md | 16 +- .../certcsi.md => support/cert-csi/_index.md} | 227 +-- .../cert-csi}/img/HTMLReport.png | Bin .../cert-csi}/img/interruptTest.png | Bin .../cert-csi}/img/listRuns.png | Bin .../cert-csi}/img/longevity.png | Bin .../cert-csi}/img/multiDBTabularReport.png | Bin .../cert-csi}/img/resourceUsage.png | Bin .../test => support/cert-csi}/img/scaling.PNG | Bin .../cert-csi}/img/tabularReport.png | Bin .../cert-csi}/img/textReport.png | Bin .../cert-csi}/img/unifiedTest.png | Bin content/v3/support/cert-csi/qualified.md | 14 + .../v3/{references => support}/cli/_index.md | 2 +- .../contributionguidelines/_index.md | 2 +- .../deprecationpolicy/_index.md | 2 +- .../{references => support}/learn/_index.md | 4 +- content/v3/{ => support}/license/_index.md | 8 +- content/v3/support/release/_index.md | 27 + content/v3/support/troubleshooting/_index.md | 25 + content/v3/troubleshooting/_index.md | 25 - 432 files changed, 10791 insertions(+), 5431 deletions(-) create mode 100644 content/v1/authorization/Migration guide from v1 to v2/_index.md rename content/v1/authorization/{v1.x GA => v1.x}/Backup and Restore/_index.md (100%) rename content/{v2/authorization => v1/authorization/v1.x}/Backup and Restore/helm/_index.md (96%) rename content/{v2/authorization => v1/authorization/v1.x}/Backup and Restore/rpm/_index.md (94%) create mode 100644 content/v1/authorization/v1.x/_index.md rename content/{v2/authorization => v1/authorization/v1.x}/cli.md (99%) rename content/v1/authorization/{v1.x GA => v1.x}/configuration/_index.md (100%) rename content/{v2/authorization => v1/authorization/v1.x}/configuration/powerflex/_index.md (80%) rename content/{v2/authorization => v1/authorization/v1.x}/configuration/powermax/_index.md (71%) rename content/{v2/authorization => v1/authorization/v1.x}/configuration/powerscale/_index.md (80%) rename content/v1/authorization/{v1.x GA => v1.x}/configuration/proxy-server/_index.md (100%) rename content/v1/authorization/{v1.x GA => v1.x}/design.md (100%) rename content/v1/authorization/{v1.x GA => v1.x}/design1.png (100%) rename content/v1/authorization/{v1.x GA => v1.x}/design2.png (100%) rename content/v1/authorization/{v1.x GA => v1.x}/karavi-authorization-example.png (100%) create mode 100644 content/v1/authorization/v1.x/release/_index.md rename content/{v2/authorization => v1/authorization/v1.x}/troubleshooting.md (98%) create mode 100644 content/v1/authorization/v2.x/_index.md rename content/v1/authorization/{v2.0 Tech Preview => v2.x}/authorization-ha-example.png (100%) create mode 100644 content/v1/authorization/v2.x/configuration/_index.md create mode 100644 content/v1/authorization/v2.x/configuration/powerflex/_index.md create mode 100644 content/v1/authorization/v2.x/configuration/powermax/_index.md create mode 100644 content/v1/authorization/v2.x/configuration/powerscale/_index.md rename content/v1/authorization/{v2.0 Tech Preview => v2.x}/image.png (100%) create mode 100644 content/v1/authorization/v2.x/release/_index.md create mode 100644 content/v1/authorization/v2.x/troubleshooting.md rename content/{v2/deployment/csminstallationwizard/src/templates/helm/csm-1.7.1-values.template => v1/deployment/csminstallationwizard/src/templates/helm/csm-1.11.1-values.template} (56%) create mode 100644 content/v1/deployment/csminstallationwizard/src/templates/helm/csm-1.12.0-values.template create mode 100644 content/v1/deployment/csminstallationwizard/src/templates/operator/csm-isilon-1.11.1.template create mode 100644 content/v1/deployment/csminstallationwizard/src/templates/operator/csm-isilon-1.12.0.template create mode 100644 content/v1/deployment/csminstallationwizard/src/templates/operator/csm-powermax-1.11.1.template create mode 100644 content/v1/deployment/csminstallationwizard/src/templates/operator/csm-powermax-1.12.0.template create mode 100644 content/v1/deployment/csminstallationwizard/src/templates/operator/csm-powerstore-1.11.1.template create mode 100644 content/v1/deployment/csminstallationwizard/src/templates/operator/csm-powerstore-1.12.0.template rename content/v1/deployment/csmoperator/{install.jpg => install.JPG} (100%) rename content/v1/deployment/csmoperator/{install_olm_pods.jpg => install_olm_pods.JPG} (100%) rename content/v1/deployment/csmoperator/modules/{authorization.md => authorization v1.x.md} (90%) create mode 100644 content/v1/deployment/csmoperator/modules/authorization v2.0.md create mode 100644 content/v1/deployment/helm/modules/installation/authorization v2.0/_index.md rename content/{v3/authorization/deployment/helm => v1/deployment/helm/modules/installation/authorization-v1.x}/_index.md (52%) create mode 100644 content/v1/deployment/helm/modules/uninstall/authorization v2.0.md create mode 100644 content/v1/deployment/helm/modules/uninstall/authorization-v1.x.md rename content/{v3/authorization/deployment/rpm/_index.md => v1/deployment/rpm/modules/installation/authorization-v1.x/authorization v1.x.md} (84%) delete mode 100644 content/v1/interactive-tutorials/_index.md create mode 100644 content/v1/replication/high-availability/_index.md rename content/v1/replication/{high-availability.md => high-availability/powermax-metro.md} (58%) create mode 100644 content/v1/replication/high-availability/powerstore-metro.md rename content/v1/replication/{metro.png => powermax-metro.png} (100%) create mode 100644 content/v1/replication/powerstore-metro.png delete mode 100644 content/v1/secure/_index.md delete mode 100644 content/v1/secure/encryption/_index.md delete mode 100644 content/v1/secure/encryption/release/_index.md delete mode 100644 content/v1/secure/encryption/troubleshooting.md delete mode 100644 content/v1/support/license/_index.md delete mode 100644 content/v2/applicationmobility/troubleshooting.md delete mode 100644 content/v2/authorization/release/_index.md rename content/v2/authorization/{ => v1.x GA}/Backup and Restore/_index.md (100%) rename content/{v1 => v2}/authorization/v1.x GA/Backup and Restore/helm/_index.md (100%) rename content/{v1 => v2}/authorization/v1.x GA/Backup and Restore/rpm/_index.md (100%) rename content/{v1 => v2}/authorization/v1.x GA/_index.md (100%) rename content/{v1 => v2}/authorization/v1.x GA/cli.md (100%) rename content/{v1/authorization/v2.0 Tech Preview => v2/authorization/v1.x GA}/configuration/_index.md (100%) rename content/{v1 => v2}/authorization/v1.x GA/configuration/powerflex/_index.md (100%) rename content/{v1 => v2}/authorization/v1.x GA/configuration/powermax/_index.md (100%) rename content/{v1 => v2}/authorization/v1.x GA/configuration/powerscale/_index.md (100%) rename content/v2/authorization/{ => v1.x GA}/configuration/proxy-server/_index.md (100%) rename content/v2/authorization/{ => v1.x GA}/design.md (100%) rename content/v2/authorization/{ => v1.x GA}/design1.png (100%) rename content/v2/authorization/{ => v1.x GA}/design2.png (100%) rename content/v2/authorization/{ => v1.x GA}/karavi-authorization-example.png (100%) rename content/{v1 => v2}/authorization/v1.x GA/release/_index.md (100%) rename content/{v1 => v2}/authorization/v1.x GA/troubleshooting.md (100%) rename content/{v1 => v2}/authorization/v2.0 Tech Preview/_index.md (100%) create mode 100644 content/v2/authorization/v2.0 Tech Preview/authorization-ha-example.png rename content/v2/authorization/{ => v2.0 Tech Preview}/configuration/_index.md (100%) rename content/{v1 => v2}/authorization/v2.0 Tech Preview/configuration/powerflex/_index.md (100%) rename content/{v1 => v2}/authorization/v2.0 Tech Preview/configuration/proxy-server/_index.md (100%) create mode 100644 content/v2/authorization/v2.0 Tech Preview/image.png rename content/{v1 => v2}/deployment/csminstallationwizard/src/templates/helm/csm-1.11.0-values.template (100%) rename content/{v1 => v2}/deployment/csminstallationwizard/src/templates/operator/csm-isilon-1.11.0.template (100%) rename content/{v1 => v2}/deployment/csminstallationwizard/src/templates/operator/csm-powermax-1.11.0.template (100%) rename content/{v1 => v2}/deployment/csminstallationwizard/src/templates/operator/csm-powerstore-1.11.0.template (100%) rename content/{v1 => v2}/deployment/csmoperator/modules/authorization v2.0 Tech Preview.md (100%) delete mode 100644 content/v3/applicationmobility/deployment.md delete mode 100644 content/v3/authorization/deployment/_index.md delete mode 100644 content/v3/authorization/deployment/operator/_index.md delete mode 100644 content/v3/csidriver/installation/operator/_index.md rename content/v3/csidriver/{installation => }/test/_index.md (100%) rename content/v3/csidriver/{installation => }/test/powerflex.md (100%) rename content/v3/csidriver/{installation => }/test/powermax.md (100%) rename content/v3/csidriver/{installation => }/test/powerscale.md (100%) rename content/v3/csidriver/{installation => }/test/powerstore.md (100%) rename content/v3/csidriver/{installation => }/test/unity.md (100%) rename content/{v2/deployment/csminstallationwizard/src/templates/helm/csm-1.7.0-values.template => v3/deployment/csminstallationwizard/src/templates/helm/csm-1.10.2-values.template} (73%) rename content/{v2/deployment/csminstallationwizard/src/templates/operator/csm-isilon-1.7.0.template => v3/deployment/csminstallationwizard/src/templates/operator/csm-isilon-1.10.2.template} (96%) rename content/v3/deployment/csminstallationwizard/src/templates/operator/{csm-isilon-1.9.4.template => csm-isilon-1.9.3.template} (100%) rename content/{v2/deployment/csminstallationwizard/src/templates/operator/csm-powermax-1.7.0.template => v3/deployment/csminstallationwizard/src/templates/operator/csm-powermax-1.10.2.template} (74%) rename content/v3/deployment/csminstallationwizard/src/templates/operator/{csm-powermax-1.9.4.template => csm-powermax-1.9.3.template} (100%) rename content/{v2/deployment/csminstallationwizard/src/templates/operator/csm-powerstore-1.7.0.template => v3/deployment/csminstallationwizard/src/templates/operator/csm-powerstore-1.10.2.template} (92%) rename content/v3/deployment/csminstallationwizard/src/templates/operator/{csm-powerstore-1.9.4.template => csm-powerstore-1.9.3.template} (98%) rename content/v3/{csidriver/installation/operator => deployment/csmoperator}/operator_migration.md (75%) rename content/v3/{csidriver/installation => deployment/helm}/_index.md (57%) create mode 100644 content/v3/deployment/helm/drivers/_index.md rename content/v3/{csidriver/installation/helm => deployment/helm/drivers/installation}/_index.md (93%) rename content/v3/{csidriver/installation/helm => deployment/helm/drivers/installation}/isilon.md (90%) rename content/v3/{csidriver/installation/helm => deployment/helm/drivers/installation}/powerflex.md (90%) rename content/v3/{csidriver/installation/helm => deployment/helm/drivers/installation}/powermax.md (94%) rename content/v3/{csidriver/installation/helm => deployment/helm/drivers/installation}/powerstore.md (97%) rename content/v3/{csidriver/installation/helm => deployment/helm/drivers/installation}/unity.md (95%) rename content/v3/{csidriver => deployment/helm/drivers}/uninstall/_index.md (89%) rename content/v3/{csidriver/upgradation => deployment/helm/drivers/upgrade}/_index.md (50%) rename content/v3/{csidriver/upgradation/drivers => deployment/helm/drivers/upgrade}/isilon.md (51%) rename content/v3/{csidriver/upgradation/drivers => deployment/helm/drivers/upgrade}/powerflex.md (61%) rename content/v3/{csidriver/upgradation/drivers => deployment/helm/drivers/upgrade}/powermax.md (67%) rename content/v3/{csidriver/upgradation/drivers => deployment/helm/drivers/upgrade}/powerstore.md (71%) rename content/v3/{csidriver/upgradation/drivers => deployment/helm/drivers/upgrade}/unity.md (57%) create mode 100644 content/v3/deployment/helm/modules/_index.md create mode 100644 content/v3/deployment/helm/modules/installation/_index.md rename content/{v2 => v3}/deployment/helm/modules/installation/applicationmobility/_index.md (100%) rename content/{v1 => v3}/deployment/helm/modules/installation/authorization/_index.md (97%) rename content/{v1 => v3}/deployment/helm/modules/installation/encryption/_index.md (100%) rename content/{v1 => v3}/deployment/helm/modules/installation/encryption/rekey.md (100%) rename content/{v1 => v3}/deployment/helm/modules/installation/encryption/vault.md (98%) rename content/v3/{observability/deployment => deployment/helm/modules/installation/observability}/_index.md (98%) rename content/v3/{observability/deployment/helm.md => deployment/helm/modules/installation/observability/deployment.md} (86%) rename content/v3/{observability/deployment/online.md => deployment/helm/modules/installation/observability/installer.md} (98%) rename content/v3/{replication/deployment => deployment/helm/modules/installation/replication}/_index.md (69%) rename content/v3/{replication/deployment => deployment/helm/modules/installation/replication}/configmap-secrets.md (100%) rename content/v3/{replication/deployment => deployment/helm/modules/installation/replication}/install-repctl.md (96%) rename content/v3/{replication/deployment => deployment/helm/modules/installation/replication}/install-script.md (93%) rename content/v3/{replication/deployment => deployment/helm/modules/installation/replication}/installation.md (100%) rename content/v3/{replication/deployment => deployment/helm/modules/installation/replication}/powerflex.md (99%) rename content/v3/{replication/deployment => deployment/helm/modules/installation/replication}/powermax.md (97%) rename content/v3/{replication/deployment => deployment/helm/modules/installation/replication}/powerscale.md (100%) rename content/v3/{replication/deployment => deployment/helm/modules/installation/replication}/powerstore.md (100%) rename content/v3/{replication/deployment => deployment/helm/modules/installation/replication}/storageclasses.md (100%) rename content/v3/{resiliency/deployment/helm.md => deployment/helm/modules/installation/resiliency/_index.md} (99%) create mode 100644 content/v3/deployment/helm/modules/uninstall/_index.md rename content/v3/{applicationmobility/uninstallation.md => deployment/helm/modules/uninstall/applicationmobility.md} (85%) rename content/{v1 => v3}/deployment/helm/modules/uninstall/authorization.md (100%) rename content/{v1 => v3}/deployment/helm/modules/uninstall/encryption.md (100%) rename content/v3/{observability/uninstall/_index.md => deployment/helm/modules/uninstall/observability.md} (92%) rename content/v3/{replication/uninstall.md => deployment/helm/modules/uninstall/replication.md} (90%) create mode 100644 content/v3/deployment/helm/modules/uninstall/resiliency.md create mode 100644 content/v3/deployment/helm/modules/upgrade/_index.md create mode 100644 content/v3/deployment/helm/modules/upgrade/authorization.md rename content/v3/{observability/upgrade/_index.md => deployment/helm/modules/upgrade/observability.md} (77%) rename content/v3/{replication/upgrade.md => deployment/helm/modules/upgrade/replication.md} (95%) rename content/v3/{resiliency/upgrade.md => deployment/helm/modules/upgrade/resiliency.md} (78%) create mode 100644 content/v3/deployment/offline/_index.md rename content/v3/{csidriver/installation/offline => deployment/offline/drivers}/_index.md (93%) rename content/v3/{observability/deployment/offline.md => deployment/offline/modules/_index.md} (92%) rename content/v3/{csidriver/upgradation/drivers/offline.md => deployment/offline/upgrade/_index.md} (60%) create mode 100644 content/v3/deployment/rpm/_index.md create mode 100644 content/v3/deployment/rpm/modules/_index.md create mode 100644 content/v3/deployment/rpm/modules/installation/_index.md rename content/{v1 => v3}/deployment/rpm/modules/installation/authorization/authorization.md (93%) create mode 100644 content/v3/deployment/rpm/modules/uninstall/_index.md rename content/v3/{authorization/uninstallation.md => deployment/rpm/modules/uninstall/authorization.md} (81%) create mode 100644 content/v3/deployment/rpm/modules/upgrade/_index.md rename content/v3/{authorization/upgrade.md => deployment/rpm/modules/upgrade/authorization.md} (75%) rename content/{v1 => v3}/interactive-tutorials/csm-operator/_index.md (100%) rename content/{v1 => v3}/interactive-tutorials/csm-quickstart/_index.md (100%) delete mode 100644 content/v3/observability/deployment/operator.md create mode 100644 content/v3/prerequisites/_index.md delete mode 100644 content/v3/references/FAQ/_index.md delete mode 100644 content/v3/references/_index.md delete mode 100644 content/v3/references/policies/_index.md delete mode 100644 content/v3/release/_index.md delete mode 100644 content/v3/replication/deployment/install-operator.md delete mode 100644 content/v3/resiliency/deployment/_index.md delete mode 100644 content/v3/resiliency/deployment/operator.md delete mode 100644 content/v3/resiliency/uninstallation.md delete mode 100644 content/v3/secure/encryption/deployment.md delete mode 100644 content/v3/secure/encryption/rekey.md delete mode 100644 content/v3/secure/encryption/uninstallation.md delete mode 100644 content/v3/secure/encryption/vault.md delete mode 100644 content/v3/securitypolicy/_index.md rename content/v3/{csidriver/installation/test/certcsi.md => support/cert-csi/_index.md} (86%) rename content/v3/{csidriver/installation/test => support/cert-csi}/img/HTMLReport.png (100%) rename content/v3/{csidriver/installation/test => support/cert-csi}/img/interruptTest.png (100%) rename content/v3/{csidriver/installation/test => support/cert-csi}/img/listRuns.png (100%) rename content/v3/{csidriver/installation/test => support/cert-csi}/img/longevity.png (100%) rename content/v3/{csidriver/installation/test => support/cert-csi}/img/multiDBTabularReport.png (100%) rename content/v3/{csidriver/installation/test => support/cert-csi}/img/resourceUsage.png (100%) rename content/v3/{csidriver/installation/test => support/cert-csi}/img/scaling.PNG (100%) rename content/v3/{csidriver/installation/test => support/cert-csi}/img/tabularReport.png (100%) rename content/v3/{csidriver/installation/test => support/cert-csi}/img/textReport.png (100%) rename content/v3/{csidriver/installation/test => support/cert-csi}/img/unifiedTest.png (100%) create mode 100644 content/v3/support/cert-csi/qualified.md rename content/v3/{references => support}/cli/_index.md (99%) rename content/v3/{references => support}/contributionguidelines/_index.md (99%) rename content/v3/{references/policies => support}/deprecationpolicy/_index.md (99%) rename content/v3/{references => support}/learn/_index.md (95%) rename content/v3/{ => support}/license/_index.md (78%) create mode 100644 content/v3/support/release/_index.md create mode 100644 content/v3/support/troubleshooting/_index.md delete mode 100644 content/v3/troubleshooting/_index.md diff --git a/content/v1/_index.md b/content/v1/_index.md index aacc25bd27..0570d6316b 100644 --- a/content/v1/_index.md +++ b/content/v1/_index.md @@ -1,14 +1,25 @@ + --- -title: "Documentation" -linkTitle: "Documentation" +title: "Container Storage Modules" +linkTitle: "Container Storage Modules" +weight: 20 +menu: + main: + weight: 20 +no_list: true --- {{% pageinfo color="primary" %}} -This document version is no longer actively maintained. The site that you are currently viewing is an archived snapshot. For up-to-date documentation, see the [latest version](/csm-docs/) -The CSM Authorization RPM will be deprecated in a future release. It is highly recommended that you use CSM Authorization Helm deployment or CSM Operator going forward. +1. Dell CSM Volume Group Snapshotter will be deprecated in CSM 1.14 (May 2025) and will no longer be supported. + +2. {{< message text="1" >}} + +3. {{< message text="5" >}} {{% /pageinfo %}} -The Dell Technologies (Dell) Container Storage Modules (CSM) enables simple and consistent integration and automation experiences, extending enterprise storage capabilities to Kubernetes for cloud-native stateful applications. It reduces management complexity so developers can independently consume enterprise storage with ease and automate daily operations such as provisioning, snapshotting, replication, observability, authorization, application mobility, encryption, and resiliency. + + +The Dell Technologies (Dell) Container Storage Modules (CSM) enables simple and consistent integration and automation experiences, extending enterprise storage capabilities to Kubernetes for cloud-native stateful applications. It reduces management complexity so developers can independently consume enterprise storage with ease and automate daily operations such as provisioning, snapshotting, replication, observability, authorization, application mobility and resiliency. CSM Hex Diagram @@ -41,22 +52,8 @@ CSM is made up of multiple components including modules (enterprise capabilities {{< /card >}} {{% /cardpane %}} {{% cardpane %}} -{{< card header="[**Application Mobility**](applicationmobility/)" - footer="Supports [PowerFlex](csidriver/features/powerflex/) via Apex Navigator for Kubernetes">}} +{{< card header="[**Application Mobility**](applicationmobility/)">}} Container Storage Modules for Application Mobility provide Kubernetes administrators the ability to clone their stateful application workloads and application data to other clusters in the cloud. [...Learn more](applicationmobility/) {{< /card >}} - {{< card header="[**Encryption**](secure/encryption)" - footer="Supports PowerScale">}} - Encryption provides the capability to encrypt user data residing on volumes created by Dell CSI Drivers. - [...Learn more](secure/encryption/) - {{< /card >}} {{% /cardpane %}} -{{% cardpane %}} - {{< card header="[License](support/license/)" - footer="Required for [Encryption](secure/encryption/)">}} - The tech-preview releases of Encryption require a license. - Request a license using the [Container Storage Modules License Request](https://app.smartsheet.com/b/form/5e46fad643874d56b1f9cf4c9f3071fb) by providing the requested details. - [...Learn more](support/license/) - {{< /card >}} -{{% /cardpane %}} \ No newline at end of file diff --git a/content/v1/applicationmobility/_index.md b/content/v1/applicationmobility/_index.md index bc5913b636..66c5f768ea 100644 --- a/content/v1/applicationmobility/_index.md +++ b/content/v1/applicationmobility/_index.md @@ -7,7 +7,7 @@ Description: > --- {{% pageinfo color="primary" %}} -Application Mobility is available with [APEX Navigator for Kubernetes](https://www.dell.com/en-ca/dt/apex/storage/public-cloud/navigator.htm#kubernetes) +We are pleased to announce that Application Mobility will be available with Container Storage Modules starting early next year (2025). {{% /pageinfo %}} Container Storage Modules for Application Mobility provide Kubernetes administrators the ability to clone their stateful application workloads and application data to other clusters, either on-premise or in the cloud. diff --git a/content/v1/applicationmobility/release/_index.md b/content/v1/applicationmobility/release/_index.md index 75bbfe9842..c887b070cc 100644 --- a/content/v1/applicationmobility/release/_index.md +++ b/content/v1/applicationmobility/release/_index.md @@ -6,21 +6,18 @@ Description: > Release Notes --- {{% pageinfo color="primary" %}} -Application Mobility is available with [APEX Navigator for Kubernetes](https://www.dell.com/en-ca/dt/apex/storage/public-cloud/navigator.htm#kubernetes) +We are pleased to announce that Application Mobility will be available with Container Storage Modules starting early next year (2025). {{% /pageinfo %}} -## Release Notes - CSM Application Mobility v1.1.0 +## Release Notes - CSM Application Mobility v1.2.0 ### New Features/Changes -- [#1359 - [FEATURE]: Add Support for OpenShift Container Platform (OCP) 4.16 ](https://github.com/dell/csm/issues/1359) -- [#1400 - [FEATURE]: Support for Kubernetes 1.30](https://github.com/dell/csm/issues/1400) +- [#1472 - [FEATURE]: Support for Kubernetes 1.31](https://github.com/dell/csm/issues/1472) ### Fixed Issues -- [#1299 - [BUG]: Images of application mobility velero plugin and controller is not setting the correct image to the latest ](https://github.com/dell/csm/issues/1299) - ### Known Issues There are no known issues in this release. diff --git a/content/v1/authorization/Migration guide from v1 to v2/_index.md b/content/v1/authorization/Migration guide from v1 to v2/_index.md new file mode 100644 index 0000000000..823f559ad7 --- /dev/null +++ b/content/v1/authorization/Migration guide from v1 to v2/_index.md @@ -0,0 +1,184 @@ +--- +title: Authorization - v2 Migration guide +linktitle: Migration Guide From v1 to v2 +weight: 1 +description: > + CSM for Authorization v1 to v2 Migration Guide +--- +CSM for Authorization v2 has significant architectural changes that prevent a user from upgradng CSM for Authorization v1 to CSM for Authorization v2. This page provides a reference guide for migrating v1 to v2 using Powerflex as an example. + +**Before migration please note following points** + - CSM for Authorization v2 calculates the actual usage of capacity provisioned by syncing with the array. + - Volumes belonging to a tenant are identified using the **Volume Prefix** configured in csmtenant custom resource. + - Volumes without the **Volume Prefix** will not be accounted for in usage capacity calculation as ownership of the volume is unknown without the volume prefix. + - User should rename all volumes that are needed to be accounted for with the **Volume Prefix** before migration to v2. See the [Prerequisites](#prerequisites). + +## Prerequisites +### On the storage array, rename the volumes owned by each tenant with a tenant prefix. +Use [dellctl](../../support/cli/) to list the volumes owned by the tenant. +``` +# dellctl volume get --proxy --namespace +NAME VOLUME ID SIZE POOL SYSTEM ID PV NAME PV STATUS STORAGE CLASS PVC NAME NAMESPACE SNAPSHOT COUNT +k8s-4cfa97ba5d c6cfdfe000000229 8.000000 pool1 3000000000011111 k8s-4cfa97ba5d Bound vxflexos vol-create-test-vndq8 test 0 +k8s-519bb230c5 c6cfdfe20000022b 8.000000 pool1 3000000000011111 k8s-519bb230c5 Bound vxflexos vol-create-test-wc45j test 0 +k8s-ecc8381e08 c6cfdfe300000231 8.000000 pool1 3000000000011111 k8s-ecc8381e08 Bound vxflexos vol-create-test-r8ptv test 0 +k8s-cc47d7a61e c6cfdfe10000022a 8.000000 pool1 3000000000011111 k8s-cc47d7a61e Bound vxflexos vol-create-test-k8szc test 0 +k8s-76914ae62b c6cfdfdf00000223 8.000000 pool1 3000000000011111 k8s-76914ae62b Bound vxflexos vol-create-test-8sbtl test 0 +``` + +On the storage array, rename each volume with your chosen tenant prefix. For example, if you've chosen the prefix `tn1`, volume `k8s-4cfa97ba5d` should be renamed to `tn1-k8s-4cfa97ba5d`. + +## Storage Systems + +In CSM for Authorization v1 setup, list the storage to get all the storage systems configured in the environment. +Example: + +``` +karavictl storage list --admin-token admintoken.yaml --addr csm-authorization.host.com + +{ + "storage": { + "powerflex": { + "3000000000011111": { + "Endpoint": "https://1.1.1.1", + "Insecure": true, + "Password": "(omitted)", + "User": "admin" + } + } + } +} +``` +In CSM for Authorization v2, storage is created using custom resources. For each Storage in a v1 environment, create using the CR, example: + +``` +kubectl create -f controller/config/samples/csm-authorization_v1_storage.yaml +``` +```yaml +apiVersion: csm-authorization.storage.dell.com/v1 +kind: Storage +metadata: + name: powerflex +spec: + # Type of the storage system. Example: powerflex, powermax, powerscale + type: powerflex + endpoint: https://1.1.1.1 + # System ID of the backend storage array + systemID: 3000000000011111 + # Vault is the credential manager for storage arrays + vault: + identifier: vault0 + kvEngine: secret + path: csm-authorization/powerflex/3000000000011111 + # SkipCertificateValidation is the flag to skip certificate validation + skipCertificateValidation: true + # PollInterval is the polling frequency to test the storage connectivity + pollInterval: 30s +``` + +## Role and Role Binding + +In CSM for Authorization v2, role creation is simpler. User will not be required to bind the role, only thing user needs to do is create roles that are needed. + +List all the roles that are created in CSM for Authorization v1 setup. +Example: +``` +karavictl role list --admin-token admintoken.yaml --addr csm-authorization.host.com +``` +``` +{ + "CSIGold": [ + { + "storage_system_id": "3000000000011111", + "pool_quotas": [ + { + "pool": "mypool", + "quota": 32000000 + } + ] + } + ], + "CSISilver": [ + { + "storage_system_id": "3000000000011111", + "pool_quotas": [ + { + "pool": "mypool", + "quota": 16000000 + } + ] + } + ] +} +``` +In CSM for Authorization v2, roles are created using custom resources. For each role in a v1 environment, create using the CR, example: +``` +kubectl create -f controller/config/samples/csm-authorization_v1_csmrole.yaml +``` +```yaml +apiVersion: csm-authorization.storage.dell.com/v1 +kind: CSMRole +metadata: + name: CSIGold +spec: + quota: 3200GiB + systemID: 3000000000011111 + systemType: powerflex + pool: pool1 +``` +```yaml +apiVersion: csm-authorization.storage.dell.com/v1 +kind: CSMRole +metadata: + name: CSISilver +spec: + quota: 1600GiB + systemID: 3000000000011111 + systemType: powerflex + pool: pool2 +``` + +## Tenant + +List all the tenants in v1 setup and all those tenants should be created in v2 setup. +List tenants in v1 setup, example: +``` +karavictl tenant list --admin-token admintoken.yaml --addr csm-authorization.host.com +``` +``` +{ + "tenants": [ + { + "name": "Alice" + } + ] +} +``` +Get detail of each tenant, example: +``` +karavictl tenant get --name Alice --admin-token admintoken.yaml --addr csm-authorization.host.com +``` +``` +{ + "name": "Alice" + "roles": "CSIGold,CSISilver" + "approvesdc": true +} +``` +In CSM for Authorization v2, tenants are created using custom resources. The `spec.volumePrefix` field must be the prefix used in the prerequisite step of renaming the storage array volumes. For each tenant in a v1 environment, create using the CR, example: +``` +kubectl create -f controller/config/samples/csm-authorization_v1_csmtenant.yaml +``` +csm-authorization_v1_csmtenant.yaml file will look like following example: +```yaml +apiVersion: csm-authorization.storage.dell.com/v1 +kind: CSMTenant +metadata: + name: Alice +spec: + # Roles defines a comma separated list of Roles for this tenant + roles: CSIGold,CSISilver + approveSdc: true + revoke: false + volumePrefix: tn1 +``` \ No newline at end of file diff --git a/content/v1/authorization/_index.md b/content/v1/authorization/_index.md index a1b5c26051..52b88d8c1c 100644 --- a/content/v1/authorization/_index.md +++ b/content/v1/authorization/_index.md @@ -6,7 +6,7 @@ Description: > Dell Technologies (Dell) Container Storage Modules (CSM) for Authorization --- -[Container Storage Modules](https://github.com/dell/csm) (CSM) for Authorization is part of the open-source suite of Kubernetes storage enablers for Dell products. +[Container Storage Modules](https://github.com/dell/csm) (CSM) for Authorization is part of the open-source suite of Kubernetes storage enablers for Dell products. CSM for Authorization provides storage and Kubernetes administrators the ability to apply RBAC for Dell CSI Drivers. It does this by deploying a proxy between the CSI driver and the storage system to enforce role-based access and usage rules. @@ -14,4 +14,6 @@ Storage administrators of compatible storage platforms will be able to apply quo Kubernetes administrators will have an interface to create, delete, and manage roles/groups that storage rules may be applied. Administrators and/or users may then generate authentication tokens that may be used by tenants to use storage with proper access policies being automatically enforced. -Currently, we have two versions of Authorization, **v1.x GA** and **v2.0 Tech Preview**. \ No newline at end of file +Currently, we have two versions of Authorization, **v1.x** and **v2.x**. **v2.x is not backward compatible with v1.x versions**. + +**Deprecation Notice Pre-Wire: Starting with CSM 1.13, Authorization v1.x will be deprecated and will be officially discontinued by CSM 1.15 in September 2025. Please migrate to Authorization v2.0 before then to avoid any issues using the v2 Migration guide linked below.** diff --git a/content/v1/authorization/v1.x GA/Backup and Restore/_index.md b/content/v1/authorization/v1.x/Backup and Restore/_index.md similarity index 100% rename from content/v1/authorization/v1.x GA/Backup and Restore/_index.md rename to content/v1/authorization/v1.x/Backup and Restore/_index.md diff --git a/content/v2/authorization/Backup and Restore/helm/_index.md b/content/v1/authorization/v1.x/Backup and Restore/helm/_index.md similarity index 96% rename from content/v2/authorization/Backup and Restore/helm/_index.md rename to content/v1/authorization/v1.x/Backup and Restore/helm/_index.md index e4ecfec456..dacb0b7919 100644 --- a/content/v2/authorization/Backup and Restore/helm/_index.md +++ b/content/v1/authorization/v1.x/Backup and Restore/helm/_index.md @@ -4,6 +4,9 @@ linktitle: Helm description: > Dell Technologies (Dell) Container Storage Modules (CSM) for Authorization Helm backup and restore --- +{{% pageinfo color="primary" %}} +{{< message text="5" >}} +{{% /pageinfo %}} ## Roles @@ -117,4 +120,4 @@ volumes: claimName: redis-backup ``` -Once saved, Redis will now use the backup volume. \ No newline at end of file +Once saved, Redis will now use the backup volume. diff --git a/content/v2/authorization/Backup and Restore/rpm/_index.md b/content/v1/authorization/v1.x/Backup and Restore/rpm/_index.md similarity index 94% rename from content/v2/authorization/Backup and Restore/rpm/_index.md rename to content/v1/authorization/v1.x/Backup and Restore/rpm/_index.md index 8a2ff7ebfd..ca2b044b08 100644 --- a/content/v2/authorization/Backup and Restore/rpm/_index.md +++ b/content/v1/authorization/v1.x/Backup and Restore/rpm/_index.md @@ -6,7 +6,7 @@ description: > --- {{% pageinfo color="primary" %}} -The CSM Authorization RPM is no longer actively maintained or supported. It will be deprecated in a future release. It is highly recommended that you use CSM Authorization Helm deployment or CSM Operator going forward. +{{< message text="5" >}} {{% /pageinfo %}} ## Roles diff --git a/content/v1/authorization/v1.x/_index.md b/content/v1/authorization/v1.x/_index.md new file mode 100644 index 0000000000..bbbd4fa0f5 --- /dev/null +++ b/content/v1/authorization/v1.x/_index.md @@ -0,0 +1,66 @@ +--- +title: Authorization - v1.x +linktitle: v1.x +weight: 4 +Description: > + Dell Technologies (Dell) Container Storage Modules (CSM) for Authorization v1.x. +tags: + - csm-authorization +--- + +{{% pageinfo color="primary" %}} +{{< message text="5" >}} +{{% /pageinfo %}} + +The following diagram shows a high-level overview of CSM for Authorization with a `tenant-app` that is using a CSI driver to perform storage operations through the CSM for Authorization `proxy-server` to access the a Dell storage system. All requests from the CSI driver will contain the token for the given tenant that was granted by the Storage Administrator. + +![CSM for Authorization](./karavi-authorization-example.png "CSM for Authorization") + +## CSM for Authorization Capabilities +{{}} +| Feature | PowerFlex | PowerMax | PowerScale | Unity XT | PowerStore | +| - | - | - | - | - | - | +| Ability to set storage quota limits to ensure k8s tenants are not overconsuming storage | Yes | Yes | No (natively supported) | No | No | +| Ability to create access control policies to ensure k8s tenant clusters are not accessing storage that does not belong to them | Yes | Yes | No (natively supported) | No | No | +| Ability to shield storage credentials from Kubernetes administrators ensuring credentials are only handled by storage admins | Yes | Yes | Yes | No | No | +{{
}} + +**NOTE:** PowerScale OneFS implements its own form of Role-Based Access Control (RBAC). CSM for Authorization does not enforce any role-based restrictions for PowerScale. To configure RBAC for PowerScale, refer to the PowerScale OneFS [documentation](https://www.dell.com/support/home/en-us/product-support/product/isilon-onefs/docs). + +## Authorization Components Support Matrix +CSM for Authorization consists of 2 components - The authorization sidecar, bundled with the driver, communicates with the Authorization proxy server to validate access to Storage platforms. The authorization sidecar is backward compatible with older Authorization proxy server versions. However, it is highly recommended to have the Authorization proxy server and sidecar installed from the same release of CSM. + +**NOTE:** If the deployed CSI driver has a number of controller pods equal to the number of schedulable nodes in your cluster, CSM for Authorization may not be able to inject properly into the driver's controller pod. +To resolve this, please refer to our [troubleshooting guide](./troubleshooting) on the topic. + +## Roles and Responsibilities + +The CSM for Authorization CLI can be executed in the context of the following roles: +- Storage Administrators +- Kubernetes Tenant Administrators + +### Storage Administrators + +Storage Administrators can perform the following operations within CSM for Authorization + +- Tenant Management (create, get, list, delete, bind roles, unbind roles) +- Token Management (generate, revoke) +- Storage System Management (create, get, list, update, delete) +- Storage Access Roles Management (assign to a storage system with an optional quota) + +### Tenant Administrators + +Tenants of CSM for Authorization can use the token provided by the Storage Administrators in their storage requests. + +### Workflow + +1) Tenant Admin requests storage from a Storage Admin. +2) Storage Admin uses CSM Authorization CLI to:
+ a) Create a tenant resource.
+ b) Create a role permitting desired storage access.
+ c) Assign the role to the tenant and generate a token.
+3) Storage Admin returns a token to the Tenant Admin. +4) Tenant Admin inputs the Token into their Kubernetes cluster as a Secret. +5) Tenant Admin updates CSI driver with CSM Authorization sidecar module. + +![CSM for Authorization Workflow](./design2.png "CSM for Authorization Workflow") diff --git a/content/v2/authorization/cli.md b/content/v1/authorization/v1.x/cli.md similarity index 99% rename from content/v2/authorization/cli.md rename to content/v1/authorization/v1.x/cli.md index 8f13774355..62823c8ca6 100644 --- a/content/v2/authorization/cli.md +++ b/content/v1/authorization/v1.x/cli.md @@ -7,7 +7,7 @@ description: > --- {{% pageinfo color="primary" %}} -The CSM Authorization karavictl CLI is no longer actively maintained or supported. It will be deprecated in CSM 2.0. +{{< message text="5" >}} {{% /pageinfo %}} karavictl is a command-line interface (CLI) used to interact with and manage your Container Storage Modules (CSM) Authorization deployment. @@ -1089,4 +1089,4 @@ karavictl tenant update [flags] karavictl tenant update --name Alice --approvesdc=false --admin-token admintoken.yaml --addr csm-authorization.host.com ``` -On success, there will be no output. You may run `karavictl tenant get --name ` to confirm the update was persisted. \ No newline at end of file +On success, there will be no output. You may run `karavictl tenant get --name ` to confirm the update was persisted. diff --git a/content/v1/authorization/v1.x GA/configuration/_index.md b/content/v1/authorization/v1.x/configuration/_index.md similarity index 100% rename from content/v1/authorization/v1.x GA/configuration/_index.md rename to content/v1/authorization/v1.x/configuration/_index.md diff --git a/content/v2/authorization/configuration/powerflex/_index.md b/content/v1/authorization/v1.x/configuration/powerflex/_index.md similarity index 80% rename from content/v2/authorization/configuration/powerflex/_index.md rename to content/v1/authorization/v1.x/configuration/powerflex/_index.md index 06c0e803cc..f666291acd 100644 --- a/content/v2/authorization/configuration/powerflex/_index.md +++ b/content/v1/authorization/v1.x/configuration/powerflex/_index.md @@ -55,7 +55,7 @@ Given a setup where Kubernetes, a storage system, and the CSM for Authorization **Helm** - Refer to the [Install the Driver](../../../deployment/helm/drivers/installation/powerflex/#install-the-driver) section to edit the parameters in `samples/config.yaml` to configure the driver to communicate with the CSM Authorization sidecar. + Refer to the [Install the Driver](../../../../deployment/helm/drivers/installation/powerflex/#install-the-driver) section to edit the parameters in `samples/config.yaml` to configure the driver to communicate with the CSM Authorization sidecar. - Update `endpoint` to match the localhost endpoint in `samples/secret/karavi-authorization-config.json`. @@ -78,7 +78,7 @@ Given a setup where Kubernetes, a storage system, and the CSM for Authorization **Operator** - Refer to the [Create Secret](../../../deployment/csmoperator/drivers/powerflex/#create-secret) section to prepare `secret.yaml` to configure the driver to communicate with the CSM Authorization sidecar. + Refer to the [Create Secret](../../../../deployment/csmoperator/drivers/powerflex/#create-secret) section to prepare `secret.yaml` to configure the driver to communicate with the CSM Authorization sidecar. - Update `endpoint` to match the localhost endpoint in `samples/secret/karavi-authorization-config.json`. @@ -102,7 +102,7 @@ Given a setup where Kubernetes, a storage system, and the CSM for Authorization **Helm** - Refer to the [Install the Driver](../../../deployment/helm/drivers/installation/powerflex/#install-the-driver) section to edit the parameters in `myvalues.yaml` to enable CSM Authorization. + Refer to the [Install the Driver](../../../../deployment/helm/drivers/installation/powerflex/#install-the-driver) section to edit the parameters in `myvalues.yaml` to enable CSM Authorization. - Update `authorization.enabled` to `true`. @@ -119,8 +119,8 @@ Given a setup where Kubernetes, a storage system, and the CSM for Authorization enabled: true # sidecarProxyImage: the container image used for the csm-authorization-sidecar. - # Default value: dellemc/csm-authorization-sidecar:v1.10.0 - sidecarProxyImage: dellemc/csm-authorization-sidecar:v1.10.0 + # Default value: quay.io/dell/container-storage-modules/csm-authorization-sidecar:v1.12.0 + sidecarProxyImage: quay.io/dell/container-storage-modules/csm-authorization-sidecar:v1.12.0 # proxyHost: hostname of the csm-authorization server # Default value: None @@ -136,7 +136,7 @@ Given a setup where Kubernetes, a storage system, and the CSM for Authorization **Operator** - Refer to the [Install Driver](../../../deployment/csmoperator/drivers/powerflex/#install-driver) section to edit the parameters in the Custom Resource to enable CSM Authorization. + Refer to the [Install Driver](../../../../deployment/csmoperator/drivers/powerflex/#install-driver) section to edit the parameters in the Custom Resource to enable CSM Authorization. Under `modules`, enable the module named `authorization`: @@ -156,10 +156,10 @@ Given a setup where Kubernetes, a storage system, and the CSM for Authorization - name: authorization # enable: Enable/Disable csm-authorization enabled: true - configVersion: v1.10.0 + configVersion: v1.12.0 components: - name: karavi-authorization-proxy - image: dellemc/csm-authorization-sidecar:v1.10.0 + image: quay.io/dell/container-storage-modules/csm-authorization-sidecar:v1.12.0 envs: # proxyHost: hostname of the csm-authorization server - name: "PROXY_HOST" @@ -170,6 +170,9 @@ Given a setup where Kubernetes, a storage system, and the CSM for Authorization value: "true" ``` + Alternatively, you can use the minimal sample files provided + [here](https://github.com/dell/csm-operator/tree/main/samples/minimal-samples) and install the module using default values + 6. Install the Dell CSI PowerFlex driver following the appropriate documenation for your installation method. -7. (Optional) Install [dellctl](../../../support/cli/#installation-instructions) to perform Kubernetes administrator commands for additional capabilities (e.g., list volumes). Please refer to the [dellctl documentation page](../../../support/cli) for the installation steps and command list. \ No newline at end of file +7. (Optional) Install [dellctl](../../../../support/cli/#installation-instructions) to perform Kubernetes administrator commands for additional capabilities (e.g., list volumes). Please refer to the [dellctl documentation page](../../../../support/cli) for the installation steps and command list. diff --git a/content/v2/authorization/configuration/powermax/_index.md b/content/v1/authorization/v1.x/configuration/powermax/_index.md similarity index 71% rename from content/v2/authorization/configuration/powermax/_index.md rename to content/v1/authorization/v1.x/configuration/powermax/_index.md index 4003f65efd..1295bb508c 100644 --- a/content/v2/authorization/configuration/powermax/_index.md +++ b/content/v1/authorization/v1.x/configuration/powermax/_index.md @@ -55,17 +55,17 @@ Create the karavi-authorization-config secret using this command: **Helm** - Refer to the [Install the Driver](../../../deployment/helm/drivers/installation/powermax/#install-the-driver) section where you edit `samples/secret/secret.yaml` with the credentials of the PowerMax. Leave `username` and `password` with the default values as they will be ignored. + Refer to the [Install the Driver](../../../../deployment/helm/drivers/installation/powermax/#install-the-driver) section where you edit `samples/secret/secret.yaml` with the credentials of the PowerMax. Leave `username` and `password` with the default values as they will be ignored. **Operator** - Refer to the [Install the Driver](../../../deployment/csmoperator/drivers/powermax/#install-driver) section to prepare `powermax-creds.yaml`. Leave `username` and `password` with the default values as they will be ignored. + Refer to the [Install the Driver](../../../../deployment/csmoperator/drivers/powermax/#install-driver) section to prepare `powermax-creds.yaml`. Leave `username` and `password` with the default values as they will be ignored. 5. Enable CSM Authorization in the driver installation applicable to your installation method. **Helm** - Refer to the [Install the Driver](../../../deployment/helm/drivers/installation/powermax/#install-the-driver) section to edit the parameters in `my-powermax-settings.yaml` file to configure the driver to communicate with the CSM Authorization sidecar. + Refer to the [Install the Driver](../../../../deployment/helm/drivers/installation/powermax/#install-the-driver) section to edit the parameters in `my-powermax-settings.yaml` file to configure the driver to communicate with the CSM Authorization sidecar. - Update `global.storageArrays.endpoint` to match the localhost endpoint in `samples/secret/karavi-authorization-config.json`. @@ -79,6 +79,8 @@ Create the karavi-authorization-config secret using this command: - Update `authorization.skipCertificateValidation` to `true` or `false` depending on if you want to disable or enable certificate validation of the CSM Authorization Proxy Server. + - Update `csireverseproxy.deployAsSidecar` to `true`. + Example: ```yaml @@ -89,12 +91,20 @@ Create the karavi-authorization-config secret using this command: managementServers: - endpoint: https://localhost:9400 + csireverseproxy: + # Set enabled to true if you want to deploy csireverseproxy as sidecar + # Allowed values: + # "true" - CSI reverse proxy will be deployed as a sidecar + # "false" - CSI reverse proxy will be deployed along with driver + # Default value: "true" + deployAsSidecar: true + authorization: enabled: true # sidecarProxyImage: the container image used for the csm-authorization-sidecar. - # Default value: dellemc/csm-authorization-sidecar:v1.10.0 - sidecarProxyImage: dellemc/csm-authorization-sidecar:v1.10.0 + # Default value: quay.io/dell/container-storage-modules/csm-authorization-sidecar:v1.12.0 + sidecarProxyImage: quay.io/dell/container-storage-modules/csm-authorization-sidecar:v1.12.0 # proxyHost: hostname of the csm-authorization server # Default value: None @@ -110,7 +120,7 @@ Create the karavi-authorization-config secret using this command: **Operator** - Refer to the [Install Driver](../../../deployment/csmoperator/drivers/powermax/#install-driver) section to edit the parameters in the Custom Resource to enable CSM Authorization. + Refer to the [Install Driver](../../../../deployment/csmoperator/drivers/powermax/#install-driver) section to edit the parameters in the Custom Resource to enable CSM Authorization. Under `modules`, enable the module named `authorization`: @@ -122,18 +132,30 @@ Create the karavi-authorization-config secret using this command: - Update the `SKIP_CERTIFICATE_VALIDATION` environment value to `true` or `false` depending on if you want to disable or enable certificate validation of the CSM Authorization Proxy Server. + - Update the `DeployAsSidecar` environment variable for the `csipowermax-reverseproxy` component to `true`. + Example: ```yaml modules: + - name: csireverseproxy + # enabled: Always set to true + enabled: true + forceRemoveModule: true + configVersion: v2.11.0 + components: + - name: csipowermax-reverseproxy + envs: + - name: "DeployAsSidecar" + value: "true" # Authorization: enable csm-authorization for RBAC - name: authorization # enable: Enable/Disable csm-authorization enabled: true - configVersion: v1.10.0 + configVersion: v1.12.0 components: - name: karavi-authorization-proxy - image: dellemc/csm-authorization-sidecar:v1.10.0 + image: quay.io/dell/container-storage-modules/csm-authorization-sidecar:v1.12.0 envs: # proxyHost: hostname of the csm-authorization server - name: "PROXY_HOST" @@ -144,6 +166,9 @@ Create the karavi-authorization-config secret using this command: value: "true" ``` + Alternatively, you can use the minimal sample files provided + [here](https://github.com/dell/csm-operator/tree/main/samples/minimal-samples) and install the module using default values + 5. Install the Dell CSI PowerMax driver following the appropriate documenation for your installation method. -6. (Optional) Install [dellctl](../../../support/cli/#installation-instructions) to perform Kubernetes administrator commands for additional capabilities (e.g., list volumes). Please refer to the [dellctl documentation page](../../../support/cli) for the installation steps and command list. \ No newline at end of file +6. (Optional) Install [dellctl](../../../../support/cli/#installation-instructions) to perform Kubernetes administrator commands for additional capabilities (e.g., list volumes). Please refer to the [dellctl documentation page](../../../../support/cli) for the installation steps and command list. diff --git a/content/v2/authorization/configuration/powerscale/_index.md b/content/v1/authorization/v1.x/configuration/powerscale/_index.md similarity index 80% rename from content/v2/authorization/configuration/powerscale/_index.md rename to content/v1/authorization/v1.x/configuration/powerscale/_index.md index 58c0f19c91..142491b30c 100644 --- a/content/v2/authorization/configuration/powerscale/_index.md +++ b/content/v1/authorization/v1.x/configuration/powerscale/_index.md @@ -56,7 +56,7 @@ kubectl -n isilon create secret generic karavi-authorization-config --from-file= **Helm** - Refer to the [Install the Driver](../../../deployment/helm/drivers/installation/isilon/#install-the-driver) section to edit the parameters to prepare the `samples/secret/secret.yaml` file to configure the driver to communicate with the CSM Authorization sidecar. + Refer to the [Install the Driver](../../../../deployment/helm/drivers/installation/isilon/#install-the-driver) section to edit the parameters to prepare the `samples/secret/secret.yaml` file to configure the driver to communicate with the CSM Authorization sidecar. - Update `endpoint` to match the localhost endpoint in `samples/secret/karavi-authorization-config.json`. @@ -82,7 +82,7 @@ kubectl -n isilon create secret generic karavi-authorization-config --from-file= **Operator** - Refer to the [Prerequisite](../../../deployment/csmoperator/drivers/powerscale/#prerequisite) section to prepare the `secret.yaml` file to configure the driver to communicate with the CSM Authorization sidecar. + Refer to the [Prerequisite](../../../../deployment/csmoperator/drivers/powerscale/#prerequisite) section to prepare the `secret.yaml` file to configure the driver to communicate with the CSM Authorization sidecar. - Update `endpoint` to match the localhost endpoint in `samples/secret/karavi-authorization-config.json`. @@ -110,7 +110,7 @@ kubectl -n isilon create secret generic karavi-authorization-config --from-file= **Helm** - Refer to the [Install the Driver](../../../deployment/helm/drivers/installation/isilon/#install-the-driver) section to edit the parameters in `my-isilon-settings.yaml` file to enable CSM Authorization. + Refer to the [Install the Driver](../../../../deployment/helm/drivers/installation/isilon/#install-the-driver) section to edit the parameters in `my-isilon-settings.yaml` file to enable CSM Authorization. - Update `authorization.enabled` to `true`. @@ -127,8 +127,8 @@ kubectl -n isilon create secret generic karavi-authorization-config --from-file= enabled: true # sidecarProxyImage: the container image used for the csm-authorization-sidecar. - # Default value: dellemc/csm-authorization-sidecar:v1.10.0 - sidecarProxyImage: dellemc/csm-authorization-sidecar:v1.10.0 + # Default value: quay.io/dell/container-storage-modules/csm-authorization-sidecar:v1.12.0 + sidecarProxyImage: quay.io/dell/container-storage-modules/csm-authorization-sidecar:v1.12.0 # proxyHost: hostname of the csm-authorization server # Default value: None @@ -144,7 +144,7 @@ kubectl -n isilon create secret generic karavi-authorization-config --from-file= **Operator** - Refer to the [Install Driver](../../../deployment/csmoperator/drivers/powerscale/#install-driver) section to edit the parameters in the Custom Resource to enable CSM Authorization. + Refer to the [Install Driver](../../../../deployment/csmoperator/drivers/powerscale/#install-driver) section to edit the parameters in the Custom Resource to enable CSM Authorization. Under `modules`, enable the module named `authorization`: @@ -162,10 +162,10 @@ kubectl -n isilon create secret generic karavi-authorization-config --from-file= - name: authorization # enable: Enable/Disable csm-authorization enabled: true - configVersion: v1.10.0 + configVersion: v1.12.0 components: - name: karavi-authorization-proxy - image: dellemc/csm-authorization-sidecar:v1.10.0 + image: quay.io/dell/container-storage-modules/csm-authorization-sidecar:v1.12.0 envs: # proxyHost: hostname of the csm-authorization server - name: "PROXY_HOST" @@ -176,6 +176,9 @@ kubectl -n isilon create secret generic karavi-authorization-config --from-file= value: "true" ``` + Alternatively, you can use the minimal sample files provided + [here](https://github.com/dell/csm-operator/tree/main/samples/minimal-samples) and install the module using default values + 6. Install the Dell CSI PowerScale driver following the appropriate documenation for your installation method. -7. (Optional) Install [dellctl](../../../support/cli/#installation-instructions) to perform Kubernetes administrator commands for additional capabilities (e.g., list volumes). Please refer to the [dellctl documentation page](../../../support/cli) for the installation steps and command list. \ No newline at end of file +7. (Optional) Install [dellctl](../../../../support/cli/#installation-instructions) to perform Kubernetes administrator commands for additional capabilities (e.g., list volumes). Please refer to the [dellctl documentation page](../../../../support/cli) for the installation steps and command list. diff --git a/content/v1/authorization/v1.x GA/configuration/proxy-server/_index.md b/content/v1/authorization/v1.x/configuration/proxy-server/_index.md similarity index 100% rename from content/v1/authorization/v1.x GA/configuration/proxy-server/_index.md rename to content/v1/authorization/v1.x/configuration/proxy-server/_index.md diff --git a/content/v1/authorization/v1.x GA/design.md b/content/v1/authorization/v1.x/design.md similarity index 100% rename from content/v1/authorization/v1.x GA/design.md rename to content/v1/authorization/v1.x/design.md diff --git a/content/v1/authorization/v1.x GA/design1.png b/content/v1/authorization/v1.x/design1.png similarity index 100% rename from content/v1/authorization/v1.x GA/design1.png rename to content/v1/authorization/v1.x/design1.png diff --git a/content/v1/authorization/v1.x GA/design2.png b/content/v1/authorization/v1.x/design2.png similarity index 100% rename from content/v1/authorization/v1.x GA/design2.png rename to content/v1/authorization/v1.x/design2.png diff --git a/content/v1/authorization/v1.x GA/karavi-authorization-example.png b/content/v1/authorization/v1.x/karavi-authorization-example.png similarity index 100% rename from content/v1/authorization/v1.x GA/karavi-authorization-example.png rename to content/v1/authorization/v1.x/karavi-authorization-example.png diff --git a/content/v1/authorization/v1.x/release/_index.md b/content/v1/authorization/v1.x/release/_index.md new file mode 100644 index 0000000000..5b44bd05fe --- /dev/null +++ b/content/v1/authorization/v1.x/release/_index.md @@ -0,0 +1,21 @@ +--- +title: "Release notes" +linkTitle: "Release notes" +weight: 6 +Description: > + Dell Container Storage Modules (CSM) release notes for authorization +--- + +## Release Notes - CSM Authorization 1.12.0 + +{{% pageinfo color="primary" %}} +{{< message text="5" >}} +{{% /pageinfo %}} + +### New Features/Changes + +### Fixed Issues + +### Known Issues +| Issue | Workaround | +|-------|------------| diff --git a/content/v2/authorization/troubleshooting.md b/content/v1/authorization/v1.x/troubleshooting.md similarity index 98% rename from content/v2/authorization/troubleshooting.md rename to content/v1/authorization/v1.x/troubleshooting.md index 08a6c6aa3d..e3ac1f18c4 100644 --- a/content/v2/authorization/troubleshooting.md +++ b/content/v1/authorization/v1.x/troubleshooting.md @@ -7,7 +7,7 @@ Description: > --- {{% pageinfo color="primary" %}} -The CSM Authorization RPM will be deprecated in a future release. It is highly recommended that you use CSM Authorization Helm deployment or CSM Operator going forward. +{{< message text="5" >}} {{% /pageinfo %}} ## RPM Deployment @@ -208,4 +208,4 @@ If you are applying a new token in an existing driver installation, restart the ```bash kubectl -n rollout restart deploy/-controller kubectl -n rollout restart ds/-node -``` \ No newline at end of file +``` diff --git a/content/v1/authorization/v2.x/_index.md b/content/v1/authorization/v2.x/_index.md new file mode 100644 index 0000000000..44b8634921 --- /dev/null +++ b/content/v1/authorization/v2.x/_index.md @@ -0,0 +1,74 @@ +--- +title: Authorization - v2.x +linktitle: v2.x +weight: 4 +Description: > + Dell Technologies (Dell) Container Storage Modules (CSM) for Authorization v2.x. +tags: + - csm-authorization +--- + +The following diagram shows a high-level overview of CSM for Authorization with a `tenant-app` that is using a CSI driver to perform storage operations through the CSM for Authorization `proxy-server` to access the a Dell storage system. All requests from the CSI driver will contain the token for the given tenant that was granted by the Storage Administrator. + +![Alt text](image.png) + +This is the introduction to a Stateless Architecture for Authorization. The creation of storage, roles, and tenants is done through Custom Resources (CRs) which are tracked and contained within CSM Authorization. The underlying communication is consistent with the previous architecture which makes the creation of volumes and snapshots seamless. + +## CSM for Authorization Capabilities +{{}} +| Feature | PowerFlex | PowerMax | PowerScale | +| ------------------------------------------------------------------------------------------------------------------------------ | --------- | -------- | ---------- | +| Ability to set storage quota limits to ensure k8s tenants are not overconsuming storage | Yes | Yes | No | +| Ability to create access control policies to ensure k8s tenant clusters are not accessing storage that does not belong to them | Yes | Yes | No | +| Ability to shield storage credentials from Kubernetes administrators by storing them in vault | Yes | Yes | Yes | +| Ability to create snapshots from owned volumes that consume the storage quota | Yes | Yes | Yes | +| Ability to periodically query storage array to keep quota consumption in sync | Yes | Yes | No | +{{
}} + +### Snapshot Support + +As stated above, all snapshot requests that are associated with a volume that has been approved and created will go through a similar authorization processes ensuring that the snapshot fits within the allotted quota. + +```yaml +apiVersion: snapshot.storage.k8s.io/v1 +kind: VolumeSnapshot +metadata: + name: vol1-snapshot +spec: + volumeSnapshotClassName: vxflexos-snapclass + source: + persistentVolumeClaimName: vol1 +``` + +This will take a snapshot of the `persistent volume claim` named `vol1`. CSM Authorization will verify ownership with Redis to ensure that the tenant who is attempting to create the snapshot owns the `vol1` volume. If the tenant does own the volume, authorization will proceed to check to see if the snapshot fits within the allotted quota and add a record if it does. + +### Backend Storage Polling + +A configurable polling mechanism has been introduced to ensure that the tenant and Redis are always in sync with the backend storage configured. This is determined by the [volumePrefix](configuration#configuring-tenants) specified for the `tenant`. During polling, for each of the tenants and roles, the storage service will ensure that nothing has been removed or added by the storage admin which would lead to Redis being out of sync. + +If a volume is created with the matching `volumePrefix`, the new entry will be added to Redis and the available quota will be consumed accordingly. Similarly, if a snapshot is created from a volume that is owned by the tenant in the backend storage array, that will be added to Redis. + +Lastly, if there is any deletion on the backend storage array of a volume or snapshot that is owned by the tenant, that entry will be deleted from Redis and the available capacity will reflect accordingly. + +## Roles and Responsibilities + +The Stateless CSM Authorization contains the following roles: +- Storage Administrators +- Kubernetes Tenant Administrators + +### Storage Administrators + +Storage Administrators perform the following: + +- Storage System Management (create, get, delete) +- Role Management (create, get, delete) +- Tenant Management (create, get, delete) +- Token Management (create, revoke) + +For more information on the configuration of the above, see the configuration of the [Proxy Server](../v2.x/configuration/#configuring-storage). + +### Tenant Administrators + +Tenants of CSM for Authorization can use the token provided by the Storage Administrators in their storage requests. + +For more information on how to use the token and configuration, see configuration for the [PowerFlex driver](../v2.x/configuration/powerflex), [PowerMax driver](../v2.x/configuration/powermax), or the [PowerScale driver](../v2.x/configuration/powerscale). \ No newline at end of file diff --git a/content/v1/authorization/v2.0 Tech Preview/authorization-ha-example.png b/content/v1/authorization/v2.x/authorization-ha-example.png similarity index 100% rename from content/v1/authorization/v2.0 Tech Preview/authorization-ha-example.png rename to content/v1/authorization/v2.x/authorization-ha-example.png diff --git a/content/v1/authorization/v2.x/configuration/_index.md b/content/v1/authorization/v2.x/configuration/_index.md new file mode 100644 index 0000000000..f8f990b81a --- /dev/null +++ b/content/v1/authorization/v2.x/configuration/_index.md @@ -0,0 +1,197 @@ +--- +title: Configuration +linktitle: Configuration +weight: 2 +description: Configure CSM Authorization Proxy Server +--- +{{% pageinfo color="primary" %}} +{{< message text="1" >}} +{{% /pageinfo %}} +This section provides the details and instructions on how to configure CSM Authorization. + +## Configuring the CSM for Authorization Proxy Server + +Run `kubectl -n authorization get ingress` and `kubectl -n authorization get service` to see the Ingress rules for these services and the exposed port for accessing these services via the LoadBalancer. For example: + +```bash +kubectl -n authorization get ingress +``` +``` +NAME CLASS HOSTS ADDRESS PORTS AGE +proxy-server nginx csm-authorization.com 00, 000 86s +``` +```bash +kubectl -n authorization get service +``` +``` +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +authorization-cert-manager ClusterIP 00.000.000.000 000/TCP 28s +authorization-cert-manager-webhook ClusterIP 00.000.000.000 000/TCP 27s +authorization-ingress-nginx-controller LoadBalancer 00.000.000.000 00:00000/TCP,000:00000/TCP 27s +authorization-ingress-nginx-controller-admission ClusterIP 00.000.000.000 000/TCP 27s +proxy-server ClusterIP 00.000.000.000 000/TCP 28s +redis-csm ClusterIP 00.000.000.000 000/TCP 28s +rediscommander ClusterIP 00.000.000.000 000/TCP 27s +role-service ClusterIP 00.000.000.000 000/TCP 27s +sentinel ClusterIP 00.000.000.000 000/TCP 27s +storage-service ClusterIP 00.000.000.000 000/TCP 27s +tenant-service ClusterIP 00.000.000.000 000/TCP 28s +``` + +On the machine running `dellctl`, if the Ingress host is left default (`csm-authorization.com`) during installation or any of the hostnames don't resolve, the hostnames needs to be add to the `/etc/hosts` file. For example: + +```bash + csm-authorization.com +``` + +Afterwards, the storage administrator can configure Authorization with the following via Customer Resources (CRs): +- Storage systems +- Tenants +- Roles + +### Configuring Storage + +The storage types supported are `powerflex`, `powermax`, and `powerscale`. During the creation of a storage system and role, the storage type must be one of the supported types. + +A `storage` entity in CSM Authorization consists of the storage type (`powerflex`, `powermax` or `powerscale`), the system ID, the API endpoint, and the vault credentials path. Edit these parameters in the manifest: + + | Parameter | Description | Required | Default | + | ------------------------- | ------------------------------------------------------------------------------------ | -------- | ------- | + | type | The type of the stoage array. | Yes | - | + | endpoint | HTTPS REST API endpoint of the backend storage array. | Yes | - | + | systemID | System ID of the backend storage array. | Yes | - | + | vault.identifier | The identifier of the Vault to be used that was configured in the Authorization CR. | Yes | - | + | vault.kvEngine | The path to the KV secrets engine. | Yes | secret | + | vault.path | The location within the store that the credentials for the array are stored. | Yes | - | + | skipCertificateValidation | A boolean that enables/disables certificate validation of the backend storage array. | No | true | + | pollInterval | PollInterval is the polling frequency to test the storage connectivity. | No | 30s | + +For example, to create PowerFlex storage: + +```yaml +apiVersion: csm-authorization.storage.dell.com/v1 +kind: Storage +metadata: + name: powerflex +spec: + type: powerflex + endpoint: https://10.0.0.1 + systemID: 1000000000000000 + vault: + identifier: vault0 + kvEngine: secret + path: csm-authorization/powerflex/1000000000000000 + skipCertificateValidation: true + pollInterval: 30s +``` + +>__Note__: +> - The `systemID` can vary from storage type to storage type. Please contact the storage administrator for more details on how to obtain it. + +### Configuring Roles + +A `role` consists of a name, the storage array to use, and the quota limit for the storage pool to be used. Edit these parameters in the manifest: + + | Parameter | Description | Required | Default | + | ---------- | --------------------------------------------------------------- | -------- | ------- | + | name | The name of the role that will be used to bind with the tenant. | Yes | - | + | quota | The amount of allocated space for the specified role. | Yes | - | + | systemID | System ID of the backend storage array. | Yes | - | + | systemType | The type of the stoage array. | Yes | - | + | pool | The storage pool name. | Yes | - | + +For example, to create a role named `role1` using the PowerFlex storage created above with a quota limit of 128iB in storage pool `myStoragePool`: + +```yaml +apiVersion: csm-authorization.storage.dell.com/v1 +kind: CSMRole +metadata: + labels: + app.kubernetes.io/name: role + app.kubernetes.io/instance: role-sample + app.kubernetes.io/part-of: csm-authorization + app.kubernetes.io/managed-by: kustomize + app.kubernetes.io/created-by: csm-authorization + name: role1 +spec: + quota: 128GiB + systemID: 1000000000000000 + systemType: powerflex + pool: myStoragePool +``` + +>__Note__: +> - The `quota` must be set with iB (TiB/GiB etc). Example: 10 TiB or 512 GiB. If it is not, the quota enforcement will be inaccurate + +### Configuring Tenants + +A `tenant` is a Kubernetes cluster that a role will be bound to. Edit these parameters in the manifest: + + | Parameter | Description | Required | Default | + | ------------ | ------------------------------------------------------------------------------------------------------------------------------ | -------- | ------- | + | roles | A comma seperate list of roles that the tenant can be associated with. | Yes | - | + | approveSdc | ApproveSdc is used to enable an SDC to access the MDM while the SDC is in restricted access mode. | Yes | false | + | revoke | Revoke is a boolean to indicate whether tenant is revoked. Set to `true` to revoke the tenant but keep it in CSM Auth. | Yes | false | + | volumePrefix | The prefix that all volumes and snapshots will contain to show association with the tenant. It should not exceed 3 characters. | Yes | - | + +For example, to create a tenant named `csmtenant-sample`: + +```yaml +apiVersion: csm-authorization.storage.dell.com/v1 +kind: CSMTenant +metadata: + labels: + app.kubernetes.io/name: csmtenant + app.kubernetes.io/instance: csmtenant-sample + app.kubernetes.io/part-of: csm-authorization + app.kubernetes.io/managed-by: kustomize + app.kubernetes.io/created-by: csm-authorization + name: csmtenant-sample +spec: + roles: role1 + approveSdc: false + revoke: false + volumePrefix: tn1 + +``` + +### Generate a Token + +Once the tenant is created, an access/refresh token pair can be created for the tenant. The storage admin is responsible for generating and sending the token to the Kubernetes tenant admin. + +Generate an administrator token: + +```bash +dellctl admin token -n --access-token-expiration 1m30s --refresh-token-expiration 720h --jwt-signing-secret > admin.yaml +``` + +You can also pass in the `jwt-signing-secret` via terminal prompt by not supplying the `--jwt-signing-secret` argument: + +```bash +dellctl admin token -n --access-token-expiration 1m30s --refresh-token-expiration 720h > admin.yaml +``` + +```bash + dellctl generate token --admin-token admin.yaml --addr csm-authorization.com: --insecure true --tenant --access-token-expiration 30m0s --refresh-token-expiration 1480h0m0s > token.yaml +``` + +`token.yaml` will have a Kubernetes secret manifest that looks like this: + +```yaml +apiVersion: v1 +data: + access: ZXlKaGJHY2lPaUpJVXpJMU5pSXNJblI1Y0NJNklrcFhWQ0o5LmV5SmhkV1FpT2lKamMyMGlMQ0psZUhBaU9qRTNNVFkwTURRd016UXNJbWR5YjNWd0lqb2lZM050ZEdWdVlXNTBMWE5oYlhCc1pTSXNJbWx6Y3lJNkltTnZiUzVrWld4c0xtTnpiU0lzSW5KdmJHVnpJam9pY205c1pURWlMQ0p6ZFdJaU9pSmpjMjB0ZEdWdVlXNTBJbjAuRmtVTGotT01mSW9rN3ZWNmFKQURXR1dva1Bsd1huT2tZeWxSclZjN2F5Zw== + refresh: ZXlKaGJHY2lPaUpJVXpJMU5pSXNJblI1Y0NJNklrcFhWQ0o5LmV5SmhkV1FpT2lKamMyMGlMQ0psZUhBaU9qRTNNakUzTXpBeU16UXNJbWR5YjNWd0lqb2lZM050ZEdWdVlXNTBMWE5oYlhCc1pTSXNJbWx6Y3lJNkltTnZiUzVrWld4c0xtTnpiU0lzSW5KdmJHVnpJam9pY205c1pURWlMQ0p6ZFdJaU9pSmpjMjB0ZEdWdVlXNTBJbjAudWRYSFZ3MGg1dTdoTjZaVGJlNHgyYXRMWWhIamQta1ZtTFBVUHpXOHNIaw== +kind: Secret +metadata: + creationTimestamp: null + name: proxy-authz-tokens +type: Opaque +``` + +This secret must be applied in the driver namespace. + +>__Note__: +> - The `insecure` flag specifies to skip certificate validation when connecting to the Authorization proxy-server. +> - The `addr` flag is the address of the Authorization proxy-server. +> - The `tenant` flag specifies which tenant to generate the token for. diff --git a/content/v1/authorization/v2.x/configuration/powerflex/_index.md b/content/v1/authorization/v2.x/configuration/powerflex/_index.md new file mode 100644 index 0000000000..e484344c1a --- /dev/null +++ b/content/v1/authorization/v2.x/configuration/powerflex/_index.md @@ -0,0 +1,178 @@ +--- +title: PowerFlex +linktitle: PowerFlex +description: > + Enabling CSM Authorization for PowerFlex CSI Driver +--- +{{% pageinfo color="primary" %}} +{{< message text="1" >}} +{{% /pageinfo %}} +## Configuring PowerFlex CSI Driver with CSM for Authorization + +Given a setup where Kubernetes, a storage system, and the CSM for Authorization Proxy Server are deployed, follow these steps to configure the CSI Drivers to work with the Authorization sidecar: + +1. Apply the secret containing the tenant token data into the driver namespace. It's assumed that the Kubernetes administrator has the token secret manifest, generated by your storage administrator via [Generate a Token](../#generate-a-token), saved in `/tmp/token.yaml`. + + ```bash + kubectl apply -f /tmp/token.yaml -n vxflexos + ``` + + This takes the assumption that Powerflex will be installed in the `vxflexos` namespace. + +2. Edit these parameters in `samples/secret/karavi-authorization-config.json` file in the [CSI PowerFlex](https://github.com/dell/csi-powerflex/tree/main/samples) driver and update/add connection information for one or more backend storage arrays. In an instance where multiple CSI drivers are configured on the same Kubernetes cluster, the port range in the *endpoint* parameter must be different for each driver. + + | Parameter | Description | Required | Default | + | ------------------------- | ---------------------------------------------------------------------------------------------------------------- | -------- | ------------------------------ | + | username | Username for connecting to the backend storage array. This parameter is ignored. | No | - | + | password | Password for connecting to to the backend storage array. This parameter is ignored. | No | - | + | intendedEndpoint | HTTPS REST API endpoint of the backend storage array. | Yes | - | + | endpoint | HTTPS localhost endpoint that the authorization sidecar will listen on. | Yes | https://localhost:9400 | + | systemID | System ID of the backend storage array. | Yes | " " | + | skipCertificateValidation | A boolean that enables/disables certificate validation of the backend storage array. This parameter is not used. | No | true | + | isDefault | A boolean that indicates if the array is the default array. This parameter is not used. | No | default value from values.yaml | + + Create the karavi-authorization-config secret using this command: + + ```bash + + kubectl -n vxflexos create secret generic karavi-authorization-config --from-file=config=samples/secret/karavi-authorization-config.json -o yaml --dry-run=client | kubectl apply -f - + ``` + +3. Create the proxy-server-root-certificate secret. + + If running in *insecure* mode, create the secret with empty data: + + ```bash + + kubectl -n vxflexos create secret generic proxy-server-root-certificate --from-literal=rootCertificate.pem= -o yaml --dry-run=client | kubectl apply -f - + ``` + + Otherwise, create the proxy-server-root-certificate secret with the appropriate file: + + ```bash + + kubectl -n vxflexos create secret generic proxy-server-root-certificate --from-file=rootCertificate.pem=/path/to/rootCA -o yaml --dry-run=client | kubectl apply -f - + ``` + +4. Prepare the driver configuration secret, applicable to your driver installation method, to communicate with the CSM Authorization sidecar. + + **Operator** + + Refer to the [Create Secret](../../../../deployment/csmoperator/drivers/powerflex/#create-secret) section to prepare `secret.yaml` to configure the driver to communicate with the CSM Authorization sidecar. + + - Update `endpoint` to match the localhost endpoint in `samples/secret/karavi-authorization-config.json`. + + - Update `skipCertificateValidation` to `true`. + + - The `username` and `password` can be any value since they will be ignored. + + Example: + + ```yaml + - username: "ignored" + password: "ignored" + systemID: "ID2" + endpoint: "https://localhost:9400" + skipCertificateValidation: true + isDefault: true + mdm: "10.0.0.3,10.0.0.4" + ``` + + **Helm** + + Refer to the [Install the Driver](../../../../deployment/helm/drivers/installation/powerflex/#install-the-driver) section to edit the parameters in `samples/config.yaml` to configure the driver to communicate with the CSM Authorization sidecar. + + - Update `endpoint` to match the localhost endpoint in `samples/secret/karavi-authorization-config.json`. + + - Update `skipCertificateValidation` to `true`. + + - The `username` and `password` can be any value since they will be ignored. + + Example: + + ```yaml + - username: "ignored" + password: "ignored" + systemID: "ID2" + endpoint: "https://localhost:9400" + skipCertificateValidation: true + isDefault: true + mdm: "10.0.0.3,10.0.0.4" + ``` + +5. Enable CSM Authorization in the driver installation applicable to your installation method. + Alternatively, you can use the minimal sample files provided [here](https://github.com/dell/csm-operator/tree/main/samples/minimal-samples) and install the module using default value. + + **Operator** + + Refer to the [Install Driver](../../../../deployment/csmoperator/drivers/powerflex/#install-driver) section to edit the parameters in the Custom Resource to enable CSM Authorization. + + Under `modules`, enable the module named `authorization`: + + - Update the `enabled` field to `true.` + + - Update the `image` to the image of the CSM Authorization sidecar. In most cases, you can leave the default value. + + - Update the `PROXY_HOST` environment value to the hostname of the CSM Authorization Proxy Server. `csm-authorization.com` is a placeholder for the proxyHost. See the administrator of CSM for Authorization for the correct value. + + - Update the `SKIP_CERTIFICATE_VALIDATION` environment value to `true` or `false` depending on if you want to disable or enable certificate validation of the CSM Authorization Proxy Server. + + - Do not update the `configVersion`. You will notice in the example that it is set to v1.12.0, this ensures that Operator checks on version support do not prevent deployment of the v2.0.0 version of authorization. + + Example: + + ```yaml + modules: + # Authorization: enable csm-authorization for RBAC + - name: authorization + # enable: Enable/Disable csm-authorization + enabled: true + configVersion: v1.12.0 + components: + - name: karavi-authorization-proxy + image: quay.io/dell/container-storage-modules/csm-authorization-sidecar:v2.0.0 + envs: + # proxyHost: hostname of the csm-authorization server + - name: "PROXY_HOST" + value: "csm-authorization.com" + + # skipCertificateValidation: Enable/Disable certificate validation of the csm-authorization server + - name: "SKIP_CERTIFICATE_VALIDATION" + value: "true" + ``` + + **Helm** + + Refer to the [Install the Driver](../../../../deployment/helm/drivers/installation/powerflex/#install-the-driver) section to edit the parameters in `myvalues.yaml` to enable CSM Authorization. + + - Update `authorization.enabled` to `true`. + + - Update `images.authorization` to the image of the CSM Authorization sidecar. In most cases, you can leave the default value. + + - Update `authorization.proxyHost` to the hostname of the CSM Authorization Proxy Server. `csm-authorization.com` is a placeholder for the proxyHost. See the administrator of CSM for Authorization for the correct value. + + - Update `authorization.skipCertificateValidation` to `true` or `false` depending on if you want to disable or enable certificate validation of the CSM Authorization Proxy Server. + + Example: + + ```yaml + authorization: + enabled: true + + # sidecarProxyImage: the container image used for the csm-authorization-sidecar. + # Default value: quay.io/dell/container-storage-modules/csm-authorization-sidecar:v2.0.0 + sidecarProxyImage: quay.io/dell/container-storage-modules/csm-authorization-sidecar:v2.0.0 + + # proxyHost: hostname of the csm-authorization server + # Default value: None + proxyHost: csm-authorization.com + + # skipCertificateValidation: certificate validation of the csm-authorization server + # Allowed Values: + # "true" - TLS certificate verification will be skipped + # "false" - TLS certificate will be verified + # Default value: "true" + skipCertificateValidation: true + ``` + +1. Install the Dell CSI PowerFlex driver following the appropriate documenation for your installation method. diff --git a/content/v1/authorization/v2.x/configuration/powermax/_index.md b/content/v1/authorization/v2.x/configuration/powermax/_index.md new file mode 100644 index 0000000000..0a7d1bbd21 --- /dev/null +++ b/content/v1/authorization/v2.x/configuration/powermax/_index.md @@ -0,0 +1,210 @@ +--- +title: PowerMax +linktitle: PowerMax +description: > + Enabling CSM Authorization for PowerMax CSI Driver +--- +{{% pageinfo color="primary" %}} +{{< message text="1" >}} +{{% /pageinfo %}} +## Configuring PowerMax CSI Driver with CSM for Authorization + +Given a setup where Kubernetes, a storage system, and the CSM for Authorization Proxy Server are deployed, follow these steps to configure the CSI Drivers to work with the Authorization sidecar: + +1. Apply the secret containing the tenant token data into the driver namespace. It's assumed that the Kubernetes administrator has the token secret manifest, generated by your storage administrator via [Generate a Token](../#generate-a-token), saved in `/tmp/token.yaml`. + + ```bash + kubectl apply -f /tmp/token.yaml -n powermax + ``` + + This takes the assumption that PowerMax will be installed in the `powermax` namespace. + +2. Edit these parameters in `samples/secret/karavi-authorization-config.json` file in the [CSI PowerMax](https://github.com/dell/csi-powermax/tree/main/samples) driver and update/add connection information for one or more backend storage arrays. In an instance where multiple CSI drivers are configured on the same Kubernetes cluster, the port range in the *endpoint* parameter must be different for each driver. + + | Parameter | Description | Required | Default | + | --------- | ----------- | -------- |-------- | + | username | Username for connecting to the backend storage array. This parameter is ignored. | No | - | + | password | Password for connecting to to the backend storage array. This parameter is ignored. | No | - | + | intendedEndpoint | HTTPS REST API endpoint of the backend storage array. | Yes | - | + | endpoint | HTTPS localhost endpoint that the authorization sidecar will listen on. | Yes | https://localhost:9400 | + | systemID | System ID of the backend storage array. | Yes | " " | + | skipCertificateValidation | A boolean that enables/disables certificate validation of the backend storage array. This parameter is not used. | No | true | + | isDefault | A boolean that indicates if the array is the default array. This parameter is not used. | No | default value from values.yaml | + + Create the karavi-authorization-config secret using this command: + + ```bash + + kubectl -n powermax create secret generic karavi-authorization-config --from-file=config=samples/secret/karavi-authorization-config.json -o yaml --dry-run=client | kubectl apply -f - + ``` + +3. Create the proxy-server-root-certificate secret. + + If running in *insecure* mode, create the secret with empty data: + + ```bash + + kubectl -n powermax create secret generic proxy-server-root-certificate --from-literal=rootCertificate.pem= -o yaml --dry-run=client | kubectl apply -f - + ``` + + Otherwise, create the proxy-server-root-certificate secret with the appropriate file: + + ```bash + + kubectl -n powermax create secret generic proxy-server-root-certificate --from-file=rootCertificate.pem=/path/to/rootCA -o yaml --dry-run=client | kubectl apply -f - + ``` + +4. Prepare the driver configuration secret, applicable to your driver installation method, to communicate with the CSM Authorization sidecar. + + **Operator** + + Refer to the [Install Driver](../../../../deployment/csmoperator/drivers/powermax/#install-driver) section to prepare `powermax-creds.yaml` to configure the driver to communicate with the CSM Authorization sidecar. + + Leave `username` and `password` with the default values as they will be ignored. + + **Helm** + + Refer to the [Install the Driver](../../../../deployment/helm/drivers/installation/powermax/#install-the-driver) section where you edit `samples/secret/secret.yaml` with the credentials of the PowerMax. + + Leave `username` and `password` with the default values as they will be ignored. + +5. **Operator Only**: Prepare the reverse proxy configmap using sample [here](https://github.com/dell/csm-operator/blob/main/samples/csireverseproxy/config.yaml). Fill in the appropriate values for driver configuration. + Example: config.yaml + ```yaml + mode: StandAlone # Mode for the reverseproxy, should not be changed + port: 2222 + logLevel: debug + logFormat: text + standAloneConfig: + storageArrays: + - storageArrayId: "000000000001" # arrayID + primaryURL: "https://localhost:9400" # primary unisphere for arrayID + proxyCredentialSecrets: + - powermax-creds # credential secret for primary unisphere, e.g., powermax-creds + managementServers: + - url: "https://localhost:9400" # primary unisphere endpoint + arrayCredentialSecret: powermax-creds # credential secret, e.g., powermax-creds + skipCertificateValidation: true + ``` + +6. Enable CSM Authorization in the driver installation applicable to your installation method. + Alternatively, you can use the minimal sample files provided + [here](https://github.com/dell/csm-operator/tree/main/samples/minimal-samples) and install the module using default values + + **Operator** + + Refer to the [Install Driver](../../../../deployment/csmoperator/drivers/powermax/#install-driver) section to edit the parameters in the Custom Resource to enable CSM Authorization. + + Under `modules`, enable the module named `authorization`: + + - Update the `enabled` field to `true.` + + - Update the `image` to the image of the CSM Authorization sidecar. In most cases, you can leave the default value. + + - Update the `PROXY_HOST` environment value to the hostname of the CSM Authorization Proxy Server. `csm-authorization.com` is a placeholder for the proxyHost. See the administrator of CSM for Authorization for the correct value. + + - Update the `SKIP_CERTIFICATE_VALIDATION` environment value to `true` or `false` depending on if you want to disable or enable certificate validation of the CSM Authorization Proxy Server. + + - Do not update the `configVersion`. You will notice in the example that it is set to v1.12.0, this ensures that Operator checks on version support do not prevent deployment of the v2.0.0-alpha authorization tech preview. + + Example: + + ```yaml + modules: + # CSI Powermax Reverseproxy is a mandatory module for Powermax + - name: csireverseproxy + # enabled: Always set to true + enabled: true + forceRemoveModule: true + configVersion: v2.11.0 + components: + - name: csipowermax-reverseproxy + # image: Define the container images used for the reverse proxy + # Default value: None + image: quay.io/dell/container-storage-modules/csipowermax-reverseproxy:v2.11.0 + envs: + # "tlsSecret" defines the TLS secret that is created with certificate + # and its associated key + # Default value: None + # Example: "tls-secret" + - name: X_CSI_REVPROXY_TLS_SECRET + value: "csirevproxy-tls-secret" + - name: X_CSI_REVPROXY_PORT + value: "2222" + - name: X_CSI_CONFIG_MAP_NAME + value: "powermax-reverseproxy-config" + # deployAsSidecar defines the way reversproxy is installed with the driver + # set it true, if csm-auth is enabled / you want it as a sidecar container + # set it false, if you want it as a deployment + - name: "DeployAsSidecar" + value: "true" + + # Authorization: enable csm-authorization for RBAC + - name: authorization + # enable: Enable/Disable csm-authorization + enabled: true + configVersion: v1.12.0 + components: + - name: karavi-authorization-proxy + image: quay.io/dell/container-storage-modules/csm-authorization-sidecar:v2.0.0 + envs: + # proxyHost: hostname of the csm-authorization server + - name: "PROXY_HOST" + value: "csm-authorization.com" + + # skipCertificateValidation: Enable/Disable certificate validation of the csm-authorization server + - name: "SKIP_CERTIFICATE_VALIDATION" + value: "true" + ``` + + **Helm** + + Refer to the [Install the Driver](../../../../deployment/helm/drivers/installation/powermax/#install-the-driver) section to edit the parameters in `my-powermax-settings.yaml` file to configure the driver to communicate with the CSM Authorization sidecar. + + - Update `global.storageArrays.endpoint` to match the localhost endpoint in `samples/secret/karavi-authorization-config.json`. + + - Update `global.managementServers.endpoint` to match the localhost endpoint in `samples/secret/karavi-authorization-config.json`. + + - Update `authorization.enabled` to `true`. + + - Update `images.authorization` to the image of the CSM Authorization sidecar. In most cases, you can leave the default value. + + - Update `authorization.proxyHost` to the hostname of the CSM Authorization Proxy Server. `csm-authorization.com` is a placeholder for the proxyHost. See the administrator of CSM for Authorization for the correct value. + + - Update `authorization.skipCertificateValidation` to `true` or `false` depending on if you want to disable or enable certificate validation of the CSM Authorization Proxy Server. + + - Update `csireverseproxy.deployAsSidecar` to `true`. + + Example: + + ```yaml + global: + storageArrays: + - storageArrayId: "123456789" + endpoint: https://localhost:9400 + managementServers: + - endpoint: https://localhost:9400 + csireverseproxy: + # Set enabled to true if you want to deploy csireverseproxy as sidecar + # Allowed values: + # "true" - CSI reverse proxy will be deployed as a sidecar + # "false" - CSI reverse proxy will be deployed along with driver + # Default value: "true" + deployAsSidecar: true + authorization: + enabled: true + # sidecarProxyImage: the container image used for the csm-authorization-sidecar. + # Default value: quay.io/dell/container-storage-modules/csm-authorization-sidecar:v2.0.0 + sidecarProxyImage: quay.io/dell/container-storage-modules/csm-authorization-sidecar:v2.0.0 + # proxyHost: hostname of the csm-authorization server + # Default value: None + proxyHost: csm-authorization.com + # skipCertificateValidation: certificate validation of the csm-authorization server + # Allowed Values: + # "true" - TLS certificate verification will be skipped + # "false" - TLS certificate will be verified + # Default value: "true" + skipCertificateValidation: true + ``` + +7. Install the Dell CSI PowerMax driver following the appropriate documenation for your installation method. diff --git a/content/v1/authorization/v2.x/configuration/powerscale/_index.md b/content/v1/authorization/v2.x/configuration/powerscale/_index.md new file mode 100644 index 0000000000..6f0cfcf0f2 --- /dev/null +++ b/content/v1/authorization/v2.x/configuration/powerscale/_index.md @@ -0,0 +1,181 @@ +--- +title: PowerScale +linktitle: PowerScale +description: > + Enabling CSM Authorization for PowerScale CSI Driver +--- +{{% pageinfo color="primary" %}} +{{< message text="1" >}} +{{% /pageinfo %}} +## Configuring PowerScale CSI Driver with CSM for Authorization + +Given a setup where Kubernetes, a storage system, and the CSM for Authorization Proxy Server are deployed, follow these steps to configure the CSI Drivers to work with the Authorization sidecar: + +1. Apply the secret containing the token data into the driver namespace. It's assumed that the Kubernetes administrator has the token secret manifest, generated by your storage administrator via [Generate a Token](../#generate-a-token), saved in `/tmp/token.yaml`. + + ```console + kubectl apply -f /tmp/token.yaml -n isilon + ``` + + This takes the assumption that PowerScale will be installed in the `isilon` namespace. + +2. Edit these parameters in `samples/secret/karavi-authorization-config.json` file in [CSI PowerScale](https://github.com/dell/csi-powerscale/tree/main/samples/secret) driver and update/add connection information for one or more backend storage arrays. In an instance where multiple CSI drivers are configured on the same Kubernetes cluster, the port range in the *endpoint* parameter must be different for each driver. + + | Parameter | Description | Required | Default | + | ------------------------- | ---------------------------------------------------------------------------------------------------------------- | -------- | ------------------------------ | + | username | Username for connecting to the backend storage array. This parameter is ignored. | No | - | + | password | Password for connecting to to the backend storage array. This parameter is ignored. | No | - | + | intendedEndpoint | HTTPS REST API endpoint of the backend storage array. | Yes | - | + | endpoint | HTTPS localhost endpoint that the authorization sidecar will listen on. | Yes | https://localhost:9400 | + | systemID | Cluster name of the backend storage array. | Yes | " " | + | skipCertificateValidation | A boolean that enables/disables certificate validation of the backend storage array. This parameter is not used. | No | true | + | isDefault | A boolean that indicates if the array is the default array. This parameter is not used. | No | default value from values.yaml | + + Create the karavi-authorization-config secret using this command: + + ```bash + kubectl -n isilon create secret generic karavi-authorization-config --from-file=config=samples/secret/karavi-authorization-config.json -o yaml --dry-run=client | kubectl apply -f - + ``` + +3. Create the proxy-server-root-certificate secret. + + If running in *insecure* mode, create the secret with empty data: + + ```bash + + kubectl -n isilon create secret generic proxy-server-root-certificate --from-literal=rootCertificate.pem= -o yaml --dry-run=client | kubectl apply -f - + ``` + + Otherwise, create the proxy-server-root-certificate secret with the appropriate file: + + ```bash + + kubectl -n isilon create secret generic proxy-server-root-certificate --from-file=rootCertificate.pem=/path/to/rootCA -o yaml --dry-run=client | kubectl apply -f - + ``` + +4. Prepare the driver configuration secret, applicable to your driver installation method, to communicate with the CSM Authorization sidecar. + + **Operator** + + Refer to the [Prerequisite](../../../../deployment/csmoperator/drivers/powerscale/#prerequisite) section to prepare the `secret.yaml` file to configure the driver to communicate with the CSM Authorization sidecar. + + - Update `endpoint` to match the localhost endpoint in `samples/secret/karavi-authorization-config.json`. + + - Update `mountEndpoint` to the PowerScale OneFS API server. For example, 10.0.0.1. + + - Update `skipCertificateValidation` to `true`. + + - The `username` and `password` can be any value since they will be ignored. + + Example: + + ```yaml + isilonClusters: + - clusterName: "cluster1" + username: "ignored" + password: "ignored" + isDefault: true + endpoint: localhost + endpointPort: 9400 + mountEndpoint: 10.0.0.1 + skipCertificateValidation: true + ``` + + **Helm** + + Refer to the [Install the Driver](../../../../deployment/helm/drivers/installation/isilon/#install-the-driver) section to edit the parameters to prepare the `samples/secret/secret.yaml` file to configure the driver to communicate with the CSM Authorization sidecar. + + - Update `endpoint` to match the localhost endpoint in `samples/secret/karavi-authorization-config.json`. + + - Update `mountEndpoint` to the PowerScale OneFS API server. For example, 10.0.0.1. + + - Update `skipCertificateValidation` to `true`. + + - The `username` and `password` can be any value since they will be ignored. + + Example: + + ```yaml + isilonClusters: + - clusterName: "cluster1" + username: "ignored" + password: "ignored" + isDefault: true + endpoint: localhost + endpointPort: 9400 + mountEndpoint: 10.0.0.1 + skipCertificateValidation: true + ``` + +5. Enable CSM Authorization in the driver installation applicable to your installation method. + + **Operator** + + Refer to the [Install Driver](../../../../deployment/csmoperator/drivers/powerscale/#install-driver) section to edit the parameters in the Custom Resource to enable CSM Authorization. + + Under `modules`, enable the module named `authorization`: + + - Update the `enabled` field to `true.` + + - Update the `image` to the image of the CSM Authorization sidecar. In most cases, you can leave the default value. + + - Update the `PROXY_HOST` environment value to the hostname of the CSM Authorization Proxy Server. `csm-authorization.com` is a placeholder for the proxyHost. See the administrator of CSM for Authorization for the correct value. + + - Update the `SKIP_CERTIFICATE_VALIDATION` environment value to `true` or `false` depending on if you want to disable or enable certificate validation of the CSM Authorization Proxy Server. + + - Do not update the `configVersion`. You will notice in the example that it is set to v1.12.0, this ensures that Operator checks on version support do not prevent deployment of the v2.0.0 version of authorization. + + ```yaml + modules: + # Authorization: enable csm-authorization for RBAC + - name: authorization + # enable: Enable/Disable csm-authorization + enabled: true + configVersion: v1.12.0 + components: + - name: karavi-authorization-proxy + image: quay.io/dell/container-storage-modules/csm-authorization-sidecar:v2.0.0 + envs: + # proxyHost: hostname of the csm-authorization server + - name: "PROXY_HOST" + value: "csm-authorization.com" + + # skipCertificateValidation: Enable/Disable certificate validation of the csm-authorization server + - name: "SKIP_CERTIFICATE_VALIDATION" + value: "true" + ``` + + **Helm** + + Refer to the [Install the Driver](../../../../deployment/helm/drivers/installation/isilon/#install-the-driver) section to edit the parameters in `my-isilon-settings.yaml` file to enable CSM Authorization. + + - Update `authorization.enabled` to `true`. + + - Update `images.authorization` to the image of the CSM Authorization sidecar. In most cases, you can leave the default value. + + - Update `authorization.proxyHost` to the hostname of the CSM Authorization Proxy Server. `csm-authorization.com` is a placeholder for the proxyHost. See the administrator of CSM for Authorization for the correct value. + + - Update `authorization.skipCertificateValidation` to `true` or `false` depending on if you want to disable or enable certificate validation of the CSM Authorization Proxy Server. + + Example: + + ```yaml + authorization: + enabled: true + + # sidecarProxyImage: the container image used for the csm-authorization-sidecar. + sidecarProxyImage: quay.io/dell/container-storage-modules/csm-authorization-sidecar:v2.0.0 + + # proxyHost: hostname of the csm-authorization server + # Default value: None + proxyHost: csm-authorization.com + + # skipCertificateValidation: certificate validation of the csm-authorization server + # Allowed Values: + # "true" - TLS certificate verification will be skipped + # "false" - TLS certificate will be verified + # Default value: "true" + skipCertificateValidation: true + ``` + +6. Install the Dell CSI PowerScale driver following the appropriate documenation for your installation method. diff --git a/content/v1/authorization/v2.0 Tech Preview/image.png b/content/v1/authorization/v2.x/image.png similarity index 100% rename from content/v1/authorization/v2.0 Tech Preview/image.png rename to content/v1/authorization/v2.x/image.png diff --git a/content/v1/authorization/v2.x/release/_index.md b/content/v1/authorization/v2.x/release/_index.md new file mode 100644 index 0000000000..97b859b2f8 --- /dev/null +++ b/content/v1/authorization/v2.x/release/_index.md @@ -0,0 +1,13 @@ +--- +title: "Release notes" +linkTitle: "Release notes" +weight: 6 +Description: > + Dell Container Storage Modules (CSM) release notes for authorization +--- + +## Release Notes - CSM Authorization 2.0.0 + +### New Features/Changes + +- [#1281 - [FEATURE]: Stateless, GitOps, HA enabled deployment of the CSM Authorization proxy server ](https://github.com/dell/csm/issues/1281) diff --git a/content/v1/authorization/v2.x/troubleshooting.md b/content/v1/authorization/v2.x/troubleshooting.md new file mode 100644 index 0000000000..00a2acdeb1 --- /dev/null +++ b/content/v1/authorization/v2.x/troubleshooting.md @@ -0,0 +1,8 @@ +--- +title: "Troubleshooting" +linkTitle: "Troubleshooting" +weight: 5 +Description: > + Troubleshooting guide +--- + diff --git a/content/v1/cosidriver/_index.md b/content/v1/cosidriver/_index.md index 97c354c9d7..318729247f 100644 --- a/content/v1/cosidriver/_index.md +++ b/content/v1/cosidriver/_index.md @@ -51,6 +51,8 @@ Dell COSI Driver is a multi-backend driver, meaning that it can connect to multi | ObjectScale | 1.2.x | {{}} +> **NOTE:** Object Scale 1.2.x is planned for End of Standard Support on January 31st 2025. Please refer Dell Support documentation for more information. We plan to support COSI driver when a new version of ObjectScale is available. + ## Bucket Lifecycle Workflow 1. Create Bucket → Delete Bucket diff --git a/content/v1/csidriver/_index.md b/content/v1/csidriver/_index.md index c99154892f..323b4ccba2 100644 --- a/content/v1/csidriver/_index.md +++ b/content/v1/csidriver/_index.md @@ -16,7 +16,7 @@ The CSI Drivers by Dell implement an interface between [CSI](https://kubernetes- {{}} | Features | PowerMax | PowerFlex | Unity XT | PowerScale | PowerStore | |--------------------------|:--------:|:---------:|:---------:|:----------:|:----------:| -| CSI Driver version | 2.11.0 | 2.11.0 | 2.11.0 | 2.11.0 | 2.11.0 | +| CSI Driver version | 2.12.0 | 2.12.0 | 2.12.0 | 2.12.0 | 2.12.0 | | Static Provisioning | yes | yes | yes | yes | yes | | Dynamic Provisioning | yes | yes | yes | yes | yes | | Expand Persistent Volume | yes | yes | yes | yes | yes | @@ -25,7 +25,7 @@ The CSI Drivers by Dell implement an interface between [CSI](https://kubernetes- | Delete Snapshot | yes for LUN
no for NFS | yes | yes | yes | yes | | [Access Mode](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes) for [volumeMode: Filesystem](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#volume-mode)| RWO, RWOP

ROX, RWX **with NFS ONLY**| RWO, ROX, RWOP

RWX **with NFS ONLY** | RWO, ROX, RWOP

RWX **with NFS ONLY** | RWO, RWX, ROX, RWOP | RWO, RWOP

ROX, RWX **with NFS ONLY** | | Access Mode for `volumeMode: Block`| RWX, ROX, RWOP | RWX, ROX, RWOP | RWO, RWX | Not Supported | RWO, RWX, ROX, RWOP | -| CSI Volume Cloning | yes for LUN
no for NFS | yes for LUN
no for NFS | yes | yes | yes | +| CSI Volume Cloning | yes for LUN
no for NFS | yes for LUN
no for NFS | yes | yes | yes | | CSI Raw Block Volume | yes | yes | yes | no | yes | | CSI Ephemeral Volume | no | yes | yes | yes | yes | | Topology | yes | yes | yes | yes | yes | diff --git a/content/v1/csidriver/features/powerflex.md b/content/v1/csidriver/features/powerflex.md index bae17d0682..e428297fee 100644 --- a/content/v1/csidriver/features/powerflex.md +++ b/content/v1/csidriver/features/powerflex.md @@ -385,6 +385,18 @@ The CSI PowerFlex driver version 1.3 and later support the automatic deployment Refer to https://hub.docker.com/r/dellemc/sdc for supported OS versions. - There is no automated uninstallation of the SDC kernel module. Follow PowerFlex SDC documentation to manually uninstall the SDC driver from the node. +From CSM 1.12.0, you can disable automatic SDC deployment. + +By default, SDC deployment is enabled. If you do not want to deploy `sdc` with PowerFlex, it can be disabled by setting the `sdc.enabled` field to `false`. + +``` +node: + ... + sdc: + # enabled: Enable/Disable SDC + enabled: true +``` + ## Multiarray Support The CSI PowerFlex driver version 1.4 added support for managing multiple PowerFlex arrays from the single driver instance. This feature is enabled by default and integrated to even single instance installations. @@ -925,6 +937,38 @@ externalAccess: "10.0.0.0/24" This means that we allow for NFS Export created by driver to be consumed by address range `10.0.0.0-10.0.0.255`. +## Configuring NFS independent of SDC + +Starting from CSM 1.12.0, the CSI PowerFlex driver supports configuring NFS independent of SDC. This separation is helpful in scenarios where an SDC is not available in the cluster or additional network interfaces do not need to be deployed. + +To disable SDC deployment, update the values file and provide the interface names mapping for each of the nodes that are being used. + +**Helm** +``` +node: + ... + sdc: + # enabled: Enable/Disable SDC + enabled: false + ... + +interfaceNames: + # worker-1-jxsjoueeewabc.domain: "ens192" + # worker-2-jxsjoueeewabc.domain: "ens192" +``` + +**Operator** +``` +common: +... + - name: INTERFACE_NAMES: 'worker-1-jxsjoueeewabc.domain: "ens192", worker-2-jxsjoueeewabc.domain: "ens192"' +... +node: +... + - name: X_CSI_SDC_ENABLED + value: "false" +``` + ## Storage Capacity Tracking CSI-PowerFlex driver version 2.8.0 and above supports Storage Capacity Tracking. diff --git a/content/v1/csidriver/features/powermax.md b/content/v1/csidriver/features/powermax.md index d26823ebd7..dbfa143e0b 100644 --- a/content/v1/csidriver/features/powermax.md +++ b/content/v1/csidriver/features/powermax.md @@ -621,7 +621,10 @@ Without storage capacity tracking, pods get scheduled on a node satisfying the t Storage capacity can be tracked by setting the attribute `storageCapacity.enabled` to true in values.yaml (set to true by default) during driver installation. To configure how often driver checks for changed capacity, set the `storageCapacity.pollInterval` attribute (set to 5m by default). In case of driver installed via operator, this interval can be configured in the sample file provided [here.](https://github.com/dell/csm-operator/blob/main/samples) by editing the `--capacity-poll-interval` argument present in the provisioner sidecar. +## Metro support +The CSI PowerMax driver supports the provisioning of Metro volumes. The process and details of how to provision and use Metro volumes can be found [here](../../../replication/high-availability). +Please note that the Metro feature does not require the deployment of the replicator sidecar or the replication controller. ## Volume Limits diff --git a/content/v1/csidriver/features/powerscale.md b/content/v1/csidriver/features/powerscale.md index 7d2d429e23..37cddb9c49 100644 --- a/content/v1/csidriver/features/powerscale.md +++ b/content/v1/csidriver/features/powerscale.md @@ -1,684 +1,684 @@ ---- -title: PowerScale -Description: Code features for PowerScale Driver -weight: 1 ---- - -## Multicluster support - -You can connect a single CSI-PowerScale driver with multiple PowerScale clusters. - -**Pre-Requisites:** - -1. Creation of secret.yaml with credentials related to one or more Clusters. -2. Creation of (at least) one Storage class for each cluster. -3. Creation of custom-volumesnapshot classes with proper isiPath matching corresponding storage classes. -4. Inclusion of cluster name in volume handle, if you want to provision existing static volumes. - -## Consuming existing volumes with static provisioning - -You can use existing volumes from the PowerScale array as Persistent Volumes in your Kubernetes, perform the following steps: - -1. Open your volume in One FS, and take a note of volume-id. -2. Create PersistentVolume and use this volume-id as a volumeHandle in the manifest. Modify other parameters according to your needs. -3. In the following example, the PowerScale cluster accessZone is assumed as 'System', storage class as 'isilon', cluster name as 'pscale-cluster' and volume's internal name as 'isilonvol'. The volume-handle should be in the format of `=_=_==_=_==_=_=` -4. If Quotas are enabled in the driver, it is required to add the Quota ID to the description of the NFS export in this format: - `CSI_QUOTA_ID:sC-kAAEAAAAAAAAAAAAAQEpVAAAAAAAA` -5. Quota ID can be identified by querying the PowerScale system. - -```yaml -apiVersion: v1 -kind: PersistentVolume -metadata: - name: isilonstaticpv - namespace: default -spec: - capacity: - storage: 5Gi - accessModes: - - ReadWriteMany - persistentVolumeReclaimPolicy: Retain - storageClassName: isilon - csi: - driver: csi-isilon.dellemc.com - volumeAttributes: - Path: "/ifs/data/csi/isilonvol" - Name: "isilonvol" - AzServiceIP: 'XX.XX.XX.XX' - volumeHandle: isilonvol=_=_=652=_=_=System=_=_=pscale-cluster - claimRef: - name: isilonstaticpvc - namespace: default -``` - -3. Create PersistentVolumeClaim to use this PersistentVolume. - -```yaml -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: isilonstaticpvc - namespace: default -spec: - accessModes: - - ReadWriteMany - resources: - requests: - storage: 5Gi - volumeName: isilonstaticpv - storageClassName: isilon -``` - -4. Then use this PVC as a volume in a pod. - -```yaml -apiVersion: v1 -kind: Pod -metadata: - name: static-prov-pod -spec: - containers: - - name: test - image: docker.io/centos:latest - command: [ "/bin/sleep", "3600" ] - volumeMounts: - - mountPath: "/data0" - name: pvol - volumes: - - name: pvol - persistentVolumeClaim: - claimName: isilonstaticpvc -``` - -5. After the pod becomes `Ready` and `Running`, you can start to use this pod and volume. - -## PVC Creation Feature - -The following yaml content can be used to create a PVC without referring any PV. - -```yaml -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: testvolume - namespace: default -spec: - accessModes: - - ReadWriteMany - resources: - requests: - storage: 5Gi - storageClassName: isilon -``` - -## Volume Snapshot Feature - -The CSI PowerScale driver version 2.0 and later supports managing v1 snapshots. - -In order to use Volume Snapshots, ensure the following components have been deployed to your cluster: - -- Kubernetes Volume Snapshot CRDs -- Volume Snapshot Controller - -> For general use, update the snapshot controller YAMLs with an appropriate namespace before installing. For -> example, on a Vanilla Kubernetes cluster, update the namespace from default to kube-system before issuing the -> kubectl create command. - -### Volume Snapshot Class - -During the installation of CSI PowerScale driver version 2.0 and higher, no default Volume Snapshot Class will get created. - -The following are the manifests for the Volume Snapshot Class: - -1. VolumeSnapshotClass - -```yaml - -apiVersion: snapshot.storage.k8s.io/v1 -kind: VolumeSnapshotClass -metadata: - name: "isilon-snapclass" -driver: csi-isilon.dellemc.com -#The deletionPolicy of a volume snapshot class can either be Retain or Delete -#If the deletionPolicy is Delete, then the underlying storage snapshot is deleted along with the VolumeSnapshotContent object. -#If the deletionPolicy is Retain, then both the underlying snapshot and VolumeSnapshotContent remain -deletionPolicy: Delete -parameters: - #IsiPath should match with respective storageClass IsiPath - IsiPath: "/ifs/data/csi" -``` - -The following is a sample manifest for creating a Volume Snapshot using the **v1** snapshot APIs; The following snippet assumes that the persistent volume claim name is testvolume. - -```yaml -apiVersion: snapshot.storage.k8s.io/v1 -kind: VolumeSnapshot -metadata: - name: pvcsnap - namespace: default -spec: - volumeSnapshotClassName: isilon-snapclass - source: - persistentVolumeClaimName: testvolume -``` - -Once the VolumeSnapshot has been successfully created by the CSI PowerScale driver, a VolumeSnapshotContent object is automatically created. Once the status of the VolumeSnapshot object has the _readyToUse_ field set to _true_ , it is available for use. - -The following is the relevant section of VolumeSnapshot object status: - -```yaml -status: - boundVolumeSnapshotContentName: snapcontent-xxxxxxxxxxxxx - creationTime: "2020-07-16T08:42:12Z" - readyToUse: true -``` - -### Creating PVCs with Volume Snapshots as Source - -The following is a sample manifest for creating a PVC with a VolumeSnapshot as a source: - -```yaml -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: createfromsnap - namespace: default -spec: - storageClassName: isilon - dataSource: - name: pvcsnap - kind: VolumeSnapshot - apiGroup: snapshot.storage.k8s.io - accessModes: - - ReadWriteMany - resources: - requests: - storage: 5Gi -``` - -> Starting from CSI PowerScale driver version 2.2, different isi paths can be used to create PersistentVolumeClaim from VolumeSnapshot.This means the isi paths of the new volume and the VolumeSnapshot can be different. - -## Volume Expansion - -CSI PowerScale driver version 1.2 and later supports the expansion of Persistent Volumes (PVs). This expansion can be done either online (for example, when a PVC is attached to a node) or offline (for example, when a PVC is not attached to any node). - -To use this feature, the storage class that is used to create the PVC must have the attribute `allowVolumeExpansion` set to true. - -The following is a sample manifest for a storage class that allows for Volume Expansion: - -```yaml -apiVersion: storage.k8s.io/v1 -kind: StorageClass -metadata: - name: isilon-expand-sc - annotations: - storageclass.kubernetes.io/is-default-class: "false" -provisioner: "csi-isilon.dellemc.com" -reclaimPolicy: Delete -parameters: - ClusterName: - AccessZone: System - isiPath: "/ifs/data/csi" - AzServiceIP : 'XX.XX.XX.XX' - rootClientEnabled: "true" -allowVolumeExpansion: true -volumeBindingMode: Immediate -``` - -To resize a PVC, edit the existing PVC spec and set spec.resources.requests.storage to the intended size. For example, if you have a PVC isilon-pvc-demo of size 3Gi, then you can resize it to 30Gi by updating the PVC. - -```yaml -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: isilon-pvc-expansion-demo -spec: - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 30Gi # Updated size from 3Gi to 30Gi - storageClassName: isilon-expand-sc -``` - ->The Kubernetes Volume Expansion feature can only be used to increase the size of a volume. It cannot be used to shrink a volume. - -## Volume Cloning Feature - -The CSI PowerScale driver version 1.3 and later supports volume cloning. This allows specifying existing PVCs in the _dataSource_ field to indicate a user would like to clone a Volume. - -Source and destination PVC must be in the same namespace and have the same Storage Class. - -To clone a volume, you must first have an existing PVC: - -```yaml -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: existing-pvc -spec: - accessModes: - - ReadWriteMany - resources: - requests: - storage: 5Gi - storageClassName: isilon -``` - -The following is a sample manifest for cloning: - -```yaml -kind: PersistentVolumeClaim -apiVersion: v1 -metadata: - name: volume-from-volume - namespace: default -spec: - accessModes: - - ReadWriteMany - volumeMode: Filesystem - resources: - requests: - storage: 50Gi - storageClassName: isilon - dataSource: - kind: PersistentVolumeClaim - name: existing-pvc - apiGroup: "" -``` - -## Controller HA - -CSI PowerScale driver version 1.4.0 and later supports running multiple replicas of the controller pod. Leader election is only applicable for all sidecar containers and driver container will be running in all controller pods. In case of a failure, one of the standby pods becomes active and takes the position of leader. This is achieved by using native leader election mechanisms utilizing `kubernetes leases`. - -Additionally by leveraging `pod anti-affinity`, no two-controller pods are ever scheduled on the same node. - -To increase or decrease the number of controller pods, edit the following value in `myvalues.yaml` file: - -```yaml -controllerCount: 2 -``` - ->**NOTE:** The default value for controllerCount is 2. It is recommended to not change this unless really required. Also, if the controller count is greater than the number of available nodes (where the pods can be scheduled), some controller pods will remain in a Pending state. - -If you are using the Dell CSM Operator, the value to adjust is: - -```yaml -replicas: 2 -``` - -For more details about configuring Controller HA using the Dell CSM Operator, see the [Dell CSM Operator documentation](../../../deployment/csmoperator/#custom-resource-specification). - -## CSI Ephemeral Inline Volume - -The CSI PowerScale driver version 1.4.0 and later supports CSI ephemeral inline volumes. - -This feature serves as use cases for data volumes whose content and lifecycle are tied to a pod. For example, a driver might populate a volume with dynamically created secrets that are specific to the application running in the pod. Such volumes need to be created together with a pod and can be deleted as part of pod termination (ephemeral). They get defined as part of the pod spec (inline). - -At runtime, nested inline volumes follow the lifecycle of their associated pods where the driver handles all phases of volume operations as pods are created and destroyed. - -The following is a sample manifest for creating CSI ephemeral Inline Volume in pod manifest with CSI PowerScale driver. - -```yaml -kind: Pod -apiVersion: v1 -metadata: - name: my-csi-app-inline-volume -spec: - containers: - - name: my-frontend - image: busybox - command: [ "sleep", "100000" ] - volumeMounts: - - mountPath: "/data" - name: my-csi-volume - volumes: - - name: my-csi-volume - csi: - driver: csi-isilon.dellemc.com - volumeAttributes: - size: "2Gi" - ClusterName: "cluster1" -``` - -This manifest creates a pod in a given cluster and attaches a newly created ephemeral inline CSI volume to it. - -**Note**: Storage class is not supported in CSI ephemeral inline volumes and all parameters are driver specific. -CSI ephemeral volumes allow users to provide volumeAttributes directly to the CSI driver as part of the Pod spec. -These `volumeAttributes` are supported: size, ClusterName, AccessZone, IsiPath, IsiVolumePathPermissions, AzServiceIP. -For reference, check the description of parameters in the following example: [isilon.yaml](https://github.com/dell/csi-powerscale/blob/main/samples/storageclass/isilon.yaml) - -## Topology - -### Topology Support - -CSI PowerScale driver version 1.4.0 and later supports Topology by default which forces volumes to be placed on worker nodes that have connectivity to the backend storage. This results in nodes which have access to PowerScale Array being appropriately labeled. The driver leverages these labels to ensure that the driver components (controller, node) are spawned only on nodes wherein these labels exist. - -This covers use cases where: - -The CSI PowerScale driver may not be installed or running on some nodes where Users have chosen to restrict the nodes on accessing the PowerScale storage array. - -We support CustomTopology which enables users to apply labels for nodes - "csi-isilon.dellemc.com/XX.XX.XX.XX=csi-isilon.dellemc.com" and expect the labels to be honored by the driver. - -When “enableCustomTopology” is set to “true”, the CSI driver fetches custom labels “csi-isilon.dellemc.com/XX.XX.XX.XX=csi-isilon.dellemc.com” applied on worker nodes, and uses them to initialize node pod with custom PowerScale FQDN/IP. - -**Note:** Only a single cluster can be configured as part of secret.yaml for custom topology. - -### Topology Usage - -To utilize the Topology feature, create a custom `StorageClass` with `volumeBindingMode` set to `WaitForFirstConsumer` and specify the desired topology labels within `allowedTopologies` field of this custom storage class. This ensures that the Pod schedule takes advantage of the topology and the selected node has access to provisioned volumes. - -**Note:** Whenever a new storage cluster is being added in secret, even though it is dynamic, the new storage cluster IP address-related label is not added to worker nodes dynamically. The user has to spin off (bounce) driver-related pods (controller and node pods) in order to apply newly added information to be reflected in worker nodes. - -**Storage Class Example with Topology Support:** - -```yaml -# This is a sample manifest for utilizing the topology feature and mount options. -# PVCs created using this storage class will be scheduled -# only on the nodes with access to Isilon - -# Change all instances of to the IP of the PowerScale OneFS API server - -# Provide mount options through "mountOptions" attribute -# to create PVCs with mount options. - -apiVersion: storage.k8s.io/v1 -kind: StorageClass -metadata: - name: isilon -provisioner: csi-isilon.dellemc.com -reclaimPolicy: Delete -allowVolumeExpansion: true -parameters: - AccessZone: System - IsiPath: "/ifs/data/csi" - # AccessZone groupnet service IP. Update AzServiceIP in values.yaml if different than isiIP. - #AzServiceIP : 192.168.2.1 - # When a PVC is being created, it takes the storage class' value of "storageclass.rootClientEnabled", - # which determines, when a node mounts the PVC, in NodeStageVolume, whether to add the k8s node to - # the "Root clients" field (when true) or "Clients" field (when false) of the NFS export - RootClientEnabled: "false" - # Name of PowerScale cluster where pv will be provisioned - # This name should match with name of one of the cluster configs in isilon-creds secret - # If this parameter is not specified, then default cluster config in isilon-creds secret will be considered if available - #ClusterName: "" - -# volumeBindingMode controls when volume binding and dynamic provisioning should occur. -# Immediate mode indicates that volume binding and dynamic provisioning occurs once the PersistentVolumeClaim is created -# WaitForFirstConsumer mode will delay the binding and provisioning of a PersistentVolume -# until a Pod using the PersistentVolumeClaim is created -volumeBindingMode: WaitForFirstConsumer -# allowedTopologies helps scheduling pod on worker nodes which match all of below expressions -# If enableCustomTopology is set to true in helm values.yaml, then do not specify allowedTopologies -allowedTopologies: - - matchLabelExpressions: - - key: csi-isilon.dellemc.com/ - values: - - csi-isilon.dellemc.com -# specify additional mount options for when a Persistent Volume is being mounted on a node. -# To mount volume with NFSv4, specify mount option vers=4. Make sure NFSv4 is enabled on the Isilon Cluster. -mountOptions: ["", "", ..., ""] -``` - -For additional information, see the [Kubernetes Topology documentation](https://kubernetes-csi.github.io/docs/topology.html). - -## Support custom networks for NFS I/O traffic - -When allowedNetworks is specified for using custom networks to handle NFS traffic, and a user already -has workloads scheduled, there is a possibility that it might lead to backward compatibility issues. For example, ControllerUnPublish might not be able to completely remove clients from the NFS exports of previously created pods. - -Also, the previous workload will still be using the default network and not custom networks. For previous workloads to use custom networks, the recreation of pods is required. - -When csi-powerscale driver creates an NFS export, the traffic flows through the client specified in the export. By default, the client is the network interface for Kubernetes -communication (same IP/fqdn as k8s node) by default. - -For a cluster with multiple network interfaces and if a user wants to segregate k8s traffic from NFS traffic; you can use the `allowedNetworks` option. -`allowedNetworks` takes CIDR addresses as a parameter to match the IPs to be picked up by the driver to allow and route NFS traffic. - -## Volume Limit - -The CSI Driver for Dell PowerScale allows users to specify the maximum number of PowerScale volumes that can be used in a node. - -The user can set the volume limit for a node by creating a node label `max-isilon-volumes-per-node` and specifying the volume limit for that node. -
`kubectl label node max-isilon-volumes-per-node=` - -The user can also set the volume limit for all the nodes in the cluster by specifying the same to `maxIsilonVolumesPerNode` attribute in values.yaml. - ->**NOTE:**
The default value of `maxIsilonVolumesPerNode` is 0.
If `maxIsilonVolumesPerNode` is set to zero, then CO shall decide how many volumes of this type can be published by the controller to the node.

The volume limit specified to `maxIsilonVolumesPerNode` attribute is applicable to all the nodes in the cluster for which node label `max-isilon-volumes-per-node` is not set. - -## Storage Capacity Tracking - -CSI for PowerScale driver version 2.8.0 and above supports Storage Capacity Tracking. - -This feature helps the scheduler to make more informed choices about where to schedule pods which depends on unbound volumes with late binding (aka "wait for first consumer"). Pods will be scheduled on a node (satisfying the topology constraints) only if the requested capacity is available on the storage array. -If such a node is not available, the pods stay in Pending state. This means pods are not scheduled. - -Without storage capacity tracking, pods get scheduled on a node satisfying the topology constraints. If the required capacity is not available, volume attachment to the pods fails, and pods remain in ContainerCreating state. Storage capacity tracking eliminates unnecessary scheduling of pods when there is insufficient capacity. - -The attribute `storageCapacity.enabled` in `values.yaml` can be used to enable/disable the feature during driver installation using helm. This is by default set to true. To configure how often driver checks for changed capacity set `storageCapacity.pollInterval` attribute. In case of driver installed via operator, this interval can be configured in the sample file provided [here.](https://github.com/dell/csm-operator/blob/main/samples/) by editing the `--capacity-poll-interval` argument present in the provisioner sidecar. - -## Node selector in helm template - -Now user can define in which worker node, the CSI node pod daemonset can run (just like any other pod in Kubernetes world).For more information, refer to - -Similarly, users can define the tolerations based on various conditions like memory pressure, disk pressure and network availability. Refer to for more information. - -## Usage of SmartQuotas to Limit Storage Consumption - -CSI driver for Dell Isilon handles capacity limiting using SmartQuotas feature. - -To use the SmartQuotas feature user can specify the boolean value 'enableQuota' in myvalues.yaml or my-isilon-settings.yaml. - -Let us assume the user creates a PVC with 3 Gi of storage and 'SmartQuotas' have already been enabled in PowerScale Cluster. - -- When 'enableQuota' is set to 'true' - - The driver sets the hard limit of the PVC to 3Gi. - - The user adds data of 2Gi to the above said PVC (by logging into POD). It works as expected. - - The user tries to add 2Gi more data. - - Driver doesn't allow the user to enter more data as total data to be added is 4Gi and PVC limit is 3Gi. - - The user can expand the volume from 3Gi to 6Gi. The driver allows it and sets the hard limit of PVC to 6Gi. - - User retries adding 2Gi more data (which has been errored out previously). - - The driver accepts the data. - -- When 'enableQuota' is set to 'false' - - Driver doesn't set any hard limit against the PVC created. - - The user adds data of 2Gi to the above said PVC, which is having the size 3Gi (by logging into POD). It works as expected. - - The user tries to add 2Gi more data. Now the total size of data is 4Gi. - - Driver allows the user to enter more data irrespective of the initial PVC size (since no quota is set against this PVC) - - The user can expand the volume from an initial size of 3Gi to 4Gi or more. The driver allows it. - -If SmartQuota feature is enabled, user can also set other quota parameters such as Soft Limit , Advisory Limit and -soft grace period using storage class yaml file or pvc yaml file. - -**Storage Class Example with Quota Limit Parameters:** - -```yaml -apiVersion: storage.k8s.io/v1 -kind: StorageClass -metadata: - name: isilon -provisioner: csi-isilon.dellemc.com -reclaimPolicy: Delete -allowVolumeExpansion: true -parameters: - # The name of the access zone a volume can be created in - # Optional: true - # Default value: default value specified in values.yaml - # Examples: System, zone1 - AccessZone: System - - # The base path for the volumes to be created on PowerScale cluster. - # Ensure that this path exists on PowerScale cluster. - # Allowed values: unix absolute path - # Optional: true - # Default value: value specified in values.yaml for isiPath - # Examples: /ifs/data/csi, /ifs/engineering - IsiPath: /ifs/data/csi - - #Parameter to set Advisory Limit to quota - #Optional: true - #Default value: Limit not Set - #AdvisoryLimit: "50" - - #Parameter to set soft limit to quota - #Optional: true - #Default value: Limit not Set - #SoftLimit: "80" - - #Parameter which must be mentioned along with Soft Limit - #Soft Limit can be exceeded until the grace period - #Optional: true - #Default value: Limit not Set - #SoftGracePrd: "86400" - - # The permissions for isi volume directory path - # This value overrides the isiVolumePathPermissions attribute of corresponding cluster config in secret, if present - # Allowed values: valid octal mode number - # Default value: "0777" - # Examples: "0777", "777", "0755" - #IsiVolumePathPermissions: "0777" - - # AccessZone groupnet service IP. Update AzServiceIP if different than endpoint. - # Optional: true - # Default value: endpoint of the cluster ClusterName - #AzServiceIP : 192.168.2.1 - - # When a PVC is being created, this parameter determines, when a node mounts the PVC, - # whether to add the k8s node to the "Root clients" field or "Clients" field of the NFS export - # Allowed values: - # "true": adds k8s node to the "Root clients" field of the NFS export - # "false": adds k8s node to the "Clients" field of the NFS export - # Optional: true - # Default value: "false" - RootClientEnabled: "false" - -``` - -**PVC Example with Quota Limit Parameters:** - -```yaml -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: test-pvc -#Uncomment below 4 lines to set quota limit parameters -# labels: -# pvcSoftLimit: "10" -# pvcAdvisoryLimit: "50" -# pvcSoftGracePrd : "85400" -spec: - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 5Gi - storageClassName: isilon -``` - -Note - -- If quota limit values are specified in both storage class yaml and PVC yaml , then values mentioned in PVC yaml will get precedence. -- If few parameters are specified in storage class yaml and few in PVC yaml , then both will be combined and applied while quota creation - For Example: If advisory limit = 30 is mentioned in storage class yaml and soft limit = 50 and soft grace period = 86400 are mentioned in PVC yaml . - Then values set in quota will be advisory limit = 30, soft limit = 50 and soft grace period =86400. - -## Dynamic Logging Configuration - -This feature is introduced in CSI Driver for PowerScale version 1.6.0 and updated in version 2.0.0 - -### Helm based installation - -As part of driver installation, a ConfigMap with the name `isilon-config-params` is created, which contains an attribute `CSI_LOG_LEVEL` which specifies the current log level of CSI driver. - -Users can set the default log level by specifying log level to `logLevel` attribute in values.yaml during driver installation. - -To change the log level dynamically to a different value user can edit the same values.yaml, and run the following command - -```bash -cd dell-csi-helm-installer -./csi-install.sh --namespace isilon --values ./my-isilon-settings.yaml --upgrade -``` - -Note: here my-isilon-settings.yaml is a values.yaml file which user has used for driver installation. - -### Operator based installation - -As part of driver installation, a ConfigMap with the name `isilon-config-params` is created using the manifest located in the sample file. This ConfigMap contains an attribute `CSI_LOG_LEVEL` which specifies the current log level of the CSI driver. To set the default/initial log level user can set this field during driver installation. - -To update the log level dynamically user has to edit the ConfigMap `isilon-config-params` and update `CSI_LOG_LEVEL` to the desired log level. - -```bash -kubectl edit configmap -n isilon isilon-config-params -``` - ->Note: Prior to CSI Driver for PowerScale version 2.0.0, the log level was allowed to be updated dynamically through `logLevel` attribute in the secret object. - -## NAT Support - -CSI Driver for Dell PowerScale is supported in the NAT environment. - -## Configurable permissions for volume directory - -This feature is introduced in CSI Driver for PowerScale version 2.0.0 - -### Helm based installation - -The permissions for volume directory can now be configured in 3 ways: - -1. Through values.yaml -2. Through secrets -3. Through storage class - -```yaml - # isiVolumePathPermissions: The permissions for isi volume directory path - # This value acts as a default value for isiVolumePathPermissions, if not specified for a cluster config in secret - # Allowed values: valid octal mode number - # Default value: "0777" - # Examples: "0777", "777", "0755" - isiVolumePathPermissions: "0777" -``` - -The permissions present in values.yaml are the default for all cluster config. - -If the volume permission is not present in storage class then secrets are considered and if it is not present even in secrets then values.yaml is considered. - ->**Note:**
For volume creation from source (volume from snapshot/volume from volume) permissions are inherited from source.

Create myvalues.yaml/my-isilon-settings.yaml and storage class accordingly. - -### Operator based installation - -In the case of operator-based installation, default permission for powerscale directory is present in the samples file. - -Other ways of configuring powerscale volume permissions remain the same as helm-based installation. - -## PV/PVC Metrics - -CSI Driver for Dell PowerScale 2.1.0 and above supports volume health monitoring. This allows Kubernetes to report on the condition, status and usage of the underlying volumes. -For example, if a volume were to be deleted from the array, or unmounted outside of Kubernetes, Kubernetes will now report these abnormal conditions as events. - -### This feature can be enabled - -1. Alpha feature gate `CSIVolumeHealth` needs to be enabled for the node side monitoring to take effect. For more information, please refer to the [Kubernetes GitHub repository](https://github.com/kubernetes-csi/external-health-monitor/blob/master/README.md). -2. For controller plugin, by setting attribute `controller.healthMonitor.enabled` to `true` in `values.yaml` file. Also health monitoring interval can be changed through attribute `controller.healthMonitor.interval` in `values.yaml` file. -3. For node plugin, by setting attribute `node.healthMonitor.enabled` to `true` in `values.yaml` file. - -## Single Pod Access Mode for PersistentVolumes- ReadWriteOncePod - -Use `ReadWriteOncePod(RWOP)` access mode if you want to ensure that only one pod across the whole cluster can read that PVC or write to it. This is supported for CSI Driver for PowerScale 2.1.0+ and Kubernetes version 1.22+. - -### Creating a PersistentVolumeClaim -```yaml -kind: PersistentVolumeClaim -apiVersion: v1 -metadata: - name: single-writer-only -spec: - accessModes: - - ReadWriteOncePod # the volume can be mounted as read-write by a single pod across the whole cluster - resources: - requests: - storage: 1Gi -``` - -When this feature is enabled, the existing `ReadWriteOnce(RWO)` access mode restricts volume access to a single node and allows multiple pods on the same node to read from and write to the same volume. - -To migrate existing PersistentVolumes to use `ReadWriteOncePod`, please follow the instruction from [here](https://kubernetes.io/docs/tasks/administer-cluster/change-pv-access-mode-readwriteoncepod/). +--- +title: PowerScale +Description: Code features for PowerScale Driver +weight: 1 +--- + +## Multicluster support + +You can connect a single CSI-PowerScale driver with multiple PowerScale clusters. + +**Pre-Requisites:** + +1. Creation of secret.yaml with credentials related to one or more Clusters. +2. Creation of (at least) one Storage class for each cluster. +3. Creation of custom-volumesnapshot classes with proper isiPath matching corresponding storage classes. +4. Inclusion of cluster name in volume handle, if you want to provision existing static volumes. + +## Consuming existing volumes with static provisioning + +You can use existing volumes from the PowerScale array as Persistent Volumes in your Kubernetes, perform the following steps: + +1. Open your volume in One FS, and take a note of volume-id. +2. Create PersistentVolume and use this volume-id as a volumeHandle in the manifest. Modify other parameters according to your needs. +3. In the following example, the PowerScale cluster accessZone is assumed as 'System', storage class as 'isilon', cluster name as 'pscale-cluster' and volume's internal name as 'isilonvol'. The volume-handle should be in the format of `=_=_==_=_==_=_=` +4. If Quotas are enabled in the driver, it is required to add the Quota ID to the description of the NFS export in this format: + `CSI_QUOTA_ID:sC-kAAEAAAAAAAAAAAAAQEpVAAAAAAAA` +5. Quota ID can be identified by querying the PowerScale system. + +```yaml +apiVersion: v1 +kind: PersistentVolume +metadata: + name: isilonstaticpv + namespace: default +spec: + capacity: + storage: 5Gi + accessModes: + - ReadWriteMany + persistentVolumeReclaimPolicy: Retain + storageClassName: isilon + csi: + driver: csi-isilon.dellemc.com + volumeAttributes: + Path: "/ifs/data/csi/isilonvol" + Name: "isilonvol" + AzServiceIP: 'XX.XX.XX.XX' + volumeHandle: isilonvol=_=_=652=_=_=System=_=_=pscale-cluster + claimRef: + name: isilonstaticpvc + namespace: default +``` + +3. Create PersistentVolumeClaim to use this PersistentVolume. + +```yaml +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: isilonstaticpvc + namespace: default +spec: + accessModes: + - ReadWriteMany + resources: + requests: + storage: 5Gi + volumeName: isilonstaticpv + storageClassName: isilon +``` + +4. Then use this PVC as a volume in a pod. + +```yaml +apiVersion: v1 +kind: Pod +metadata: + name: static-prov-pod +spec: + containers: + - name: test + image: docker.io/centos:latest + command: [ "/bin/sleep", "3600" ] + volumeMounts: + - mountPath: "/data0" + name: pvol + volumes: + - name: pvol + persistentVolumeClaim: + claimName: isilonstaticpvc +``` + +5. After the pod becomes `Ready` and `Running`, you can start to use this pod and volume. + +## PVC Creation Feature + +The following yaml content can be used to create a PVC without referring any PV. + +```yaml +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: testvolume + namespace: default +spec: + accessModes: + - ReadWriteMany + resources: + requests: + storage: 5Gi + storageClassName: isilon +``` + +## Volume Snapshot Feature + +The CSI PowerScale driver version 2.0 and later supports managing v1 snapshots. + +In order to use Volume Snapshots, ensure the following components have been deployed to your cluster: + +- Kubernetes Volume Snapshot CRDs +- Volume Snapshot Controller + +> For general use, update the snapshot controller YAMLs with an appropriate namespace before installing. For +> example, on a Vanilla Kubernetes cluster, update the namespace from default to kube-system before issuing the +> kubectl create command. + +### Volume Snapshot Class + +During the installation of CSI PowerScale driver version 2.0 and higher, no default Volume Snapshot Class will get created. + +The following are the manifests for the Volume Snapshot Class: + +1. VolumeSnapshotClass + +```yaml + +apiVersion: snapshot.storage.k8s.io/v1 +kind: VolumeSnapshotClass +metadata: + name: "isilon-snapclass" +driver: csi-isilon.dellemc.com +#The deletionPolicy of a volume snapshot class can either be Retain or Delete +#If the deletionPolicy is Delete, then the underlying storage snapshot is deleted along with the VolumeSnapshotContent object. +#If the deletionPolicy is Retain, then both the underlying snapshot and VolumeSnapshotContent remain +deletionPolicy: Delete +parameters: + #IsiPath should match with respective storageClass IsiPath + IsiPath: "/ifs/data/csi" +``` + +The following is a sample manifest for creating a Volume Snapshot using the **v1** snapshot APIs; The following snippet assumes that the persistent volume claim name is testvolume. + +```yaml +apiVersion: snapshot.storage.k8s.io/v1 +kind: VolumeSnapshot +metadata: + name: pvcsnap + namespace: default +spec: + volumeSnapshotClassName: isilon-snapclass + source: + persistentVolumeClaimName: testvolume +``` + +Once the VolumeSnapshot has been successfully created by the CSI PowerScale driver, a VolumeSnapshotContent object is automatically created. Once the status of the VolumeSnapshot object has the _readyToUse_ field set to _true_ , it is available for use. + +The following is the relevant section of VolumeSnapshot object status: + +```yaml +status: + boundVolumeSnapshotContentName: snapcontent-xxxxxxxxxxxxx + creationTime: "2020-07-16T08:42:12Z" + readyToUse: true +``` + +### Creating PVCs with Volume Snapshots as Source + +The following is a sample manifest for creating a PVC with a VolumeSnapshot as a source: + +```yaml +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: createfromsnap + namespace: default +spec: + storageClassName: isilon + dataSource: + name: pvcsnap + kind: VolumeSnapshot + apiGroup: snapshot.storage.k8s.io + accessModes: + - ReadWriteMany + resources: + requests: + storage: 5Gi +``` + +> Starting from CSI PowerScale driver version 2.2, different isi paths can be used to create PersistentVolumeClaim from VolumeSnapshot.This means the isi paths of the new volume and the VolumeSnapshot can be different. + +## Volume Expansion + +CSI PowerScale driver version 1.2 and later supports the expansion of Persistent Volumes (PVs). This expansion can be done either online (for example, when a PVC is attached to a node) or offline (for example, when a PVC is not attached to any node). + +To use this feature, the storage class that is used to create the PVC must have the attribute `allowVolumeExpansion` set to true. + +The following is a sample manifest for a storage class that allows for Volume Expansion: + +```yaml +apiVersion: storage.k8s.io/v1 +kind: StorageClass +metadata: + name: isilon-expand-sc + annotations: + storageclass.kubernetes.io/is-default-class: "false" +provisioner: "csi-isilon.dellemc.com" +reclaimPolicy: Delete +parameters: + ClusterName: + AccessZone: System + isiPath: "/ifs/data/csi" + AzServiceIP : 'XX.XX.XX.XX' + rootClientEnabled: "true" +allowVolumeExpansion: true +volumeBindingMode: Immediate +``` + +To resize a PVC, edit the existing PVC spec and set spec.resources.requests.storage to the intended size. For example, if you have a PVC isilon-pvc-demo of size 3Gi, then you can resize it to 30Gi by updating the PVC. + +```yaml +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: isilon-pvc-expansion-demo +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 30Gi # Updated size from 3Gi to 30Gi + storageClassName: isilon-expand-sc +``` + +>The Kubernetes Volume Expansion feature can only be used to increase the size of a volume. It cannot be used to shrink a volume. + +## Volume Cloning Feature + +The CSI PowerScale driver version 1.3 and later supports volume cloning. This allows specifying existing PVCs in the _dataSource_ field to indicate a user would like to clone a Volume. + +Source and destination PVC must be in the same namespace and have the same Storage Class. + +To clone a volume, you must first have an existing PVC: + +```yaml +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: existing-pvc +spec: + accessModes: + - ReadWriteMany + resources: + requests: + storage: 5Gi + storageClassName: isilon +``` + +The following is a sample manifest for cloning: + +```yaml +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: volume-from-volume + namespace: default +spec: + accessModes: + - ReadWriteMany + volumeMode: Filesystem + resources: + requests: + storage: 50Gi + storageClassName: isilon + dataSource: + kind: PersistentVolumeClaim + name: existing-pvc + apiGroup: "" +``` + +## Controller HA + +CSI PowerScale driver version 1.4.0 and later supports running multiple replicas of the controller pod. Leader election is only applicable for all sidecar containers and driver container will be running in all controller pods. In case of a failure, one of the standby pods becomes active and takes the position of leader. This is achieved by using native leader election mechanisms utilizing `kubernetes leases`. + +Additionally by leveraging `pod anti-affinity`, no two-controller pods are ever scheduled on the same node. + +To increase or decrease the number of controller pods, edit the following value in `myvalues.yaml` file: + +```yaml +controllerCount: 2 +``` + +>**NOTE:** The default value for controllerCount is 2. It is recommended to not change this unless really required. Also, if the controller count is greater than the number of available nodes (where the pods can be scheduled), some controller pods will remain in a Pending state. + +If you are using the Dell CSM Operator, the value to adjust is: + +```yaml +replicas: 2 +``` + +For more details about configuring Controller HA using the Dell CSM Operator, see the [Dell CSM Operator documentation](../../../deployment/csmoperator/#custom-resource-specification). + +## CSI Ephemeral Inline Volume + +The CSI PowerScale driver version 1.4.0 and later supports CSI ephemeral inline volumes. + +This feature serves as use cases for data volumes whose content and lifecycle are tied to a pod. For example, a driver might populate a volume with dynamically created secrets that are specific to the application running in the pod. Such volumes need to be created together with a pod and can be deleted as part of pod termination (ephemeral). They get defined as part of the pod spec (inline). + +At runtime, nested inline volumes follow the lifecycle of their associated pods where the driver handles all phases of volume operations as pods are created and destroyed. + +The following is a sample manifest for creating CSI ephemeral Inline Volume in pod manifest with CSI PowerScale driver. + +```yaml +kind: Pod +apiVersion: v1 +metadata: + name: my-csi-app-inline-volume +spec: + containers: + - name: my-frontend + image: busybox + command: [ "sleep", "100000" ] + volumeMounts: + - mountPath: "/data" + name: my-csi-volume + volumes: + - name: my-csi-volume + csi: + driver: csi-isilon.dellemc.com + volumeAttributes: + size: "2Gi" + ClusterName: "cluster1" +``` + +This manifest creates a pod in a given cluster and attaches a newly created ephemeral inline CSI volume to it. + +**Note**: Storage class is not supported in CSI ephemeral inline volumes and all parameters are driver specific. +CSI ephemeral volumes allow users to provide volumeAttributes directly to the CSI driver as part of the Pod spec. +These `volumeAttributes` are supported: size, ClusterName, AccessZone, IsiPath, IsiVolumePathPermissions, AzServiceIP. +For reference, check the description of parameters in the following example: [isilon.yaml](https://github.com/dell/csi-powerscale/blob/main/samples/storageclass/isilon.yaml) + +## Topology + +### Topology Support + +CSI PowerScale driver version 1.4.0 and later supports Topology by default which forces volumes to be placed on worker nodes that have connectivity to the backend storage. This results in nodes which have access to PowerScale Array being appropriately labeled. The driver leverages these labels to ensure that the driver components (controller, node) are spawned only on nodes wherein these labels exist. + +This covers use cases where: + +The CSI PowerScale driver may not be installed or running on some nodes where Users have chosen to restrict the nodes on accessing the PowerScale storage array. + +We support CustomTopology which enables users to apply labels for nodes - "csi-isilon.dellemc.com/XX.XX.XX.XX=csi-isilon.dellemc.com" and expect the labels to be honored by the driver. + +When “enableCustomTopology” is set to “true”, the CSI driver fetches custom labels “csi-isilon.dellemc.com/XX.XX.XX.XX=csi-isilon.dellemc.com” applied on worker nodes, and uses them to initialize node pod with custom PowerScale FQDN/IP. + +**Note:** Only a single cluster can be configured as part of secret.yaml for custom topology. + +### Topology Usage + +To utilize the Topology feature, create a custom `StorageClass` with `volumeBindingMode` set to `WaitForFirstConsumer` and specify the desired topology labels within `allowedTopologies` field of this custom storage class. This ensures that the Pod schedule takes advantage of the topology and the selected node has access to provisioned volumes. + +**Note:** Whenever a new storage cluster is being added in secret, even though it is dynamic, the new storage cluster IP address-related label is not added to worker nodes dynamically. The user has to spin off (bounce) driver-related pods (controller and node pods) in order to apply newly added information to be reflected in worker nodes. + +**Storage Class Example with Topology Support:** + +```yaml +# This is a sample manifest for utilizing the topology feature and mount options. +# PVCs created using this storage class will be scheduled +# only on the nodes with access to Isilon + +# Change all instances of to the IP of the PowerScale OneFS API server + +# Provide mount options through "mountOptions" attribute +# to create PVCs with mount options. + +apiVersion: storage.k8s.io/v1 +kind: StorageClass +metadata: + name: isilon +provisioner: csi-isilon.dellemc.com +reclaimPolicy: Delete +allowVolumeExpansion: true +parameters: + AccessZone: System + IsiPath: "/ifs/data/csi" + # AccessZone groupnet service IP. Update AzServiceIP in values.yaml if different than isiIP. + #AzServiceIP : 192.168.2.1 + # When a PVC is being created, it takes the storage class' value of "storageclass.rootClientEnabled", + # which determines, when a node mounts the PVC, in NodeStageVolume, whether to add the k8s node to + # the "Root clients" field (when true) or "Clients" field (when false) of the NFS export + RootClientEnabled: "false" + # Name of PowerScale cluster where pv will be provisioned + # This name should match with name of one of the cluster configs in isilon-creds secret + # If this parameter is not specified, then default cluster config in isilon-creds secret will be considered if available + #ClusterName: "" + +# volumeBindingMode controls when volume binding and dynamic provisioning should occur. +# Immediate mode indicates that volume binding and dynamic provisioning occurs once the PersistentVolumeClaim is created +# WaitForFirstConsumer mode will delay the binding and provisioning of a PersistentVolume +# until a Pod using the PersistentVolumeClaim is created +volumeBindingMode: WaitForFirstConsumer +# allowedTopologies helps scheduling pod on worker nodes which match all of below expressions +# If enableCustomTopology is set to true in helm values.yaml, then do not specify allowedTopologies +allowedTopologies: + - matchLabelExpressions: + - key: csi-isilon.dellemc.com/ + values: + - csi-isilon.dellemc.com +# specify additional mount options for when a Persistent Volume is being mounted on a node. +# To mount volume with NFSv4, specify mount option vers=4. Make sure NFSv4 is enabled on the Isilon Cluster. +mountOptions: ["", "", ..., ""] +``` + +For additional information, see the [Kubernetes Topology documentation](https://kubernetes-csi.github.io/docs/topology.html). + +## Support custom networks for NFS I/O traffic + +When allowedNetworks is specified for using custom networks to handle NFS traffic, and a user already +has workloads scheduled, there is a possibility that it might lead to backward compatibility issues. For example, ControllerUnPublish might not be able to completely remove clients from the NFS exports of previously created pods. + +Also, the previous workload will still be using the default network and not custom networks. For previous workloads to use custom networks, the recreation of pods is required. + +When csi-powerscale driver creates an NFS export, the traffic flows through the client specified in the export. By default, the client is the network interface for Kubernetes +communication (same IP/fqdn as k8s node) by default. + +For a cluster with multiple network interfaces and if a user wants to segregate k8s traffic from NFS traffic; you can use the `allowedNetworks` option. +`allowedNetworks` takes CIDR addresses as a parameter to match the IPs to be picked up by the driver to allow and route NFS traffic. + +## Volume Limit + +The CSI Driver for Dell PowerScale allows users to specify the maximum number of PowerScale volumes that can be used in a node. + +The user can set the volume limit for a node by creating a node label `max-isilon-volumes-per-node` and specifying the volume limit for that node. +
`kubectl label node max-isilon-volumes-per-node=` + +The user can also set the volume limit for all the nodes in the cluster by specifying the same to `maxIsilonVolumesPerNode` attribute in values.yaml. + +>**NOTE:**
The default value of `maxIsilonVolumesPerNode` is 0.
If `maxIsilonVolumesPerNode` is set to zero, then CO shall decide how many volumes of this type can be published by the controller to the node.

The volume limit specified to `maxIsilonVolumesPerNode` attribute is applicable to all the nodes in the cluster for which node label `max-isilon-volumes-per-node` is not set. + +## Storage Capacity Tracking + +CSI for PowerScale driver version 2.8.0 and above supports Storage Capacity Tracking. + +This feature helps the scheduler to make more informed choices about where to schedule pods which depends on unbound volumes with late binding (aka "wait for first consumer"). Pods will be scheduled on a node (satisfying the topology constraints) only if the requested capacity is available on the storage array. +If such a node is not available, the pods stay in Pending state. This means pods are not scheduled. + +Without storage capacity tracking, pods get scheduled on a node satisfying the topology constraints. If the required capacity is not available, volume attachment to the pods fails, and pods remain in ContainerCreating state. Storage capacity tracking eliminates unnecessary scheduling of pods when there is insufficient capacity. + +The attribute `storageCapacity.enabled` in `values.yaml` can be used to enable/disable the feature during driver installation using helm. This is by default set to true. To configure how often driver checks for changed capacity set `storageCapacity.pollInterval` attribute. In case of driver installed via operator, this interval can be configured in the sample file provided [here.](https://github.com/dell/csm-operator/blob/main/samples/) by editing the `--capacity-poll-interval` argument present in the provisioner sidecar. + +## Node selector in helm template + +Now user can define in which worker node, the CSI node pod daemonset can run (just like any other pod in Kubernetes world).For more information, refer to + +Similarly, users can define the tolerations based on various conditions like memory pressure, disk pressure and network availability. Refer to for more information. + +## Usage of SmartQuotas to Limit Storage Consumption + +CSI driver for Dell Isilon handles capacity limiting using SmartQuotas feature. + +To use the SmartQuotas feature user can specify the boolean value 'enableQuota' in myvalues.yaml or my-isilon-settings.yaml. + +Let us assume the user creates a PVC with 3 Gi of storage and 'SmartQuotas' have already been enabled in PowerScale Cluster. + +- When 'enableQuota' is set to 'true' + - The driver sets the hard limit of the PVC to 3Gi. + - The user adds data of 2Gi to the above said PVC (by logging into POD). It works as expected. + - The user tries to add 2Gi more data. + - Driver doesn't allow the user to enter more data as total data to be added is 4Gi and PVC limit is 3Gi. + - The user can expand the volume from 3Gi to 6Gi. The driver allows it and sets the hard limit of PVC to 6Gi. + - User retries adding 2Gi more data (which has been errored out previously). + - The driver accepts the data. + +- When 'enableQuota' is set to 'false' + - Driver doesn't set any hard limit against the PVC created. + - The user adds data of 2Gi to the above said PVC, which is having the size 3Gi (by logging into POD). It works as expected. + - The user tries to add 2Gi more data. Now the total size of data is 4Gi. + - Driver allows the user to enter more data irrespective of the initial PVC size (since no quota is set against this PVC) + - The user can expand the volume from an initial size of 3Gi to 4Gi or more. The driver allows it. + +If SmartQuota feature is enabled, user can also set other quota parameters such as Soft Limit , Advisory Limit and +soft grace period using storage class yaml file or pvc yaml file. + +**Storage Class Example with Quota Limit Parameters:** + +```yaml +apiVersion: storage.k8s.io/v1 +kind: StorageClass +metadata: + name: isilon +provisioner: csi-isilon.dellemc.com +reclaimPolicy: Delete +allowVolumeExpansion: true +parameters: + # The name of the access zone a volume can be created in + # Optional: true + # Default value: default value specified in values.yaml + # Examples: System, zone1 + AccessZone: System + + # The base path for the volumes to be created on PowerScale cluster. + # Ensure that this path exists on PowerScale cluster. + # Allowed values: unix absolute path + # Optional: true + # Default value: value specified in values.yaml for isiPath + # Examples: /ifs/data/csi, /ifs/engineering + IsiPath: /ifs/data/csi + + #Parameter to set Advisory Limit to quota + #Optional: true + #Default value: Limit not Set + #AdvisoryLimit: "50" + + #Parameter to set soft limit to quota + #Optional: true + #Default value: Limit not Set + #SoftLimit: "80" + + #Parameter which must be mentioned along with Soft Limit + #Soft Limit can be exceeded until the grace period + #Optional: true + #Default value: Limit not Set + #SoftGracePrd: "86400" + + # The permissions for isi volume directory path + # This value overrides the isiVolumePathPermissions attribute of corresponding cluster config in secret, if present + # Allowed values: valid octal mode number + # Default value: "0777" + # Examples: "0777", "777", "0755" + #IsiVolumePathPermissions: "0777" + + # AccessZone groupnet service IP. Update AzServiceIP if different than endpoint. + # Optional: true + # Default value: endpoint of the cluster ClusterName + #AzServiceIP : 192.168.2.1 + + # When a PVC is being created, this parameter determines, when a node mounts the PVC, + # whether to add the k8s node to the "Root clients" field or "Clients" field of the NFS export + # Allowed values: + # "true": adds k8s node to the "Root clients" field of the NFS export + # "false": adds k8s node to the "Clients" field of the NFS export + # Optional: true + # Default value: "false" + RootClientEnabled: "false" + +``` + +**PVC Example with Quota Limit Parameters:** + +```yaml +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: test-pvc +#Uncomment below 4 lines to set quota limit parameters +# labels: +# pvcSoftLimit: "10" +# pvcAdvisoryLimit: "50" +# pvcSoftGracePrd : "85400" +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 5Gi + storageClassName: isilon +``` + +Note + +- If quota limit values are specified in both storage class yaml and PVC yaml , then values mentioned in PVC yaml will get precedence. +- If few parameters are specified in storage class yaml and few in PVC yaml , then both will be combined and applied while quota creation + For Example: If advisory limit = 30 is mentioned in storage class yaml and soft limit = 50 and soft grace period = 86400 are mentioned in PVC yaml . + Then values set in quota will be advisory limit = 30, soft limit = 50 and soft grace period =86400. + +## Dynamic Logging Configuration + +This feature is introduced in CSI Driver for PowerScale version 1.6.0 and updated in version 2.0.0 + +### Helm based installation + +As part of driver installation, a ConfigMap with the name `isilon-config-params` is created, which contains an attribute `CSI_LOG_LEVEL` which specifies the current log level of CSI driver. + +Users can set the default log level by specifying log level to `logLevel` attribute in values.yaml during driver installation. + +To change the log level dynamically to a different value user can edit the same values.yaml, and run the following command + +```bash +cd dell-csi-helm-installer +./csi-install.sh --namespace isilon --values ./my-isilon-settings.yaml --upgrade +``` + +Note: here my-isilon-settings.yaml is a values.yaml file which user has used for driver installation. + +### Operator based installation + +As part of driver installation, a ConfigMap with the name `isilon-config-params` is created using the manifest located in the sample file. This ConfigMap contains an attribute `CSI_LOG_LEVEL` which specifies the current log level of the CSI driver. To set the default/initial log level user can set this field during driver installation. + +To update the log level dynamically user has to edit the ConfigMap `isilon-config-params` and update `CSI_LOG_LEVEL` to the desired log level. + +```bash +kubectl edit configmap -n isilon isilon-config-params +``` + +>Note: Prior to CSI Driver for PowerScale version 2.0.0, the log level was allowed to be updated dynamically through `logLevel` attribute in the secret object. + +## NAT Support + +CSI Driver for Dell PowerScale is supported in the NAT environment. + +## Configurable permissions for volume directory + +This feature is introduced in CSI Driver for PowerScale version 2.0.0 + +### Helm based installation + +The permissions for volume directory can now be configured in 3 ways: + +1. Through values.yaml +2. Through secrets +3. Through storage class + +```yaml + # isiVolumePathPermissions: The permissions for isi volume directory path + # This value acts as a default value for isiVolumePathPermissions, if not specified for a cluster config in secret + # Allowed values: valid octal mode number + # Default value: "0777" + # Examples: "0777", "777", "0755" + isiVolumePathPermissions: "0777" +``` + +The permissions present in values.yaml are the default for all cluster config. + +If the volume permission is not present in storage class then secrets are considered and if it is not present even in secrets then values.yaml is considered. + +>**Note:**
For volume creation from source (volume from snapshot/volume from volume) permissions are inherited from source.

Create myvalues.yaml/my-isilon-settings.yaml and storage class accordingly. + +### Operator based installation + +In the case of operator-based installation, default permission for powerscale directory is present in the samples file. + +Other ways of configuring powerscale volume permissions remain the same as helm-based installation. + +## PV/PVC Metrics + +CSI Driver for Dell PowerScale 2.1.0 and above supports volume health monitoring. This allows Kubernetes to report on the condition, status and usage of the underlying volumes. +For example, if a volume were to be deleted from the array, or unmounted outside of Kubernetes, Kubernetes will now report these abnormal conditions as events. + +### This feature can be enabled + +1. Alpha feature gate `CSIVolumeHealth` needs to be enabled for the node side monitoring to take effect. For more information, please refer to the [Kubernetes GitHub repository](https://github.com/kubernetes-csi/external-health-monitor/blob/master/README.md). +2. For controller plugin, by setting attribute `controller.healthMonitor.enabled` to `true` in `values.yaml` file. Also health monitoring interval can be changed through attribute `controller.healthMonitor.interval` in `values.yaml` file. +3. For node plugin, by setting attribute `node.healthMonitor.enabled` to `true` in `values.yaml` file. + +## Single Pod Access Mode for PersistentVolumes- ReadWriteOncePod + +Use `ReadWriteOncePod(RWOP)` access mode if you want to ensure that only one pod across the whole cluster can read that PVC or write to it. This is supported for CSI Driver for PowerScale 2.1.0+ and Kubernetes version 1.22+. + +### Creating a PersistentVolumeClaim +```yaml +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: single-writer-only +spec: + accessModes: + - ReadWriteOncePod # the volume can be mounted as read-write by a single pod across the whole cluster + resources: + requests: + storage: 1Gi +``` + +When this feature is enabled, the existing `ReadWriteOnce(RWO)` access mode restricts volume access to a single node and allows multiple pods on the same node to read from and write to the same volume. + +To migrate existing PersistentVolumes to use `ReadWriteOncePod`, please follow the instruction from [here](https://kubernetes.io/docs/tasks/administer-cluster/change-pv-access-mode-readwriteoncepod/). diff --git a/content/v1/csidriver/features/powerstore.md b/content/v1/csidriver/features/powerstore.md index cd9d718a30..8d6d21c8fa 100644 --- a/content/v1/csidriver/features/powerstore.md +++ b/content/v1/csidriver/features/powerstore.md @@ -29,7 +29,8 @@ kubectl delete -f tests/simple/simple.yaml You can use existent volumes from PowerStore array as Persistent Volumes in your Kubernetes, perform the following steps: 1. Open your volume in PowerStore Management UI, and take a note of volume-id. The volume link must look similar to `https:///#/storage/volumes/0055558c-5ae1-4ed1-b421-6f5a9475c19f/capacity`, where the `volume-id` is `0055558c-5ae1-4ed1-b421-6f5a9475c19f`. -2. Create PersistentVolume and use this volume-id in volumeHandle in format in the manifest. Modify other parameters according to your needs. +2. Create PersistentVolume and use this volume-id in volumeHandle in format `` in the manifest. In case of Metro volume, the volumeHandle should be in the format ``. Modify other parameters according to your needs. + ```yaml apiVersion: v1 kind: PersistentVolume @@ -94,7 +95,7 @@ In order to use Volume Snapshots, ensure the following components have been depl - Volume Snapshot Controller - Volume Snapshot Class ->Note: From v1.4, the CSI PowerStore driver installation process will no longer create VolumeSnapshotClass. +>Note: From v1.4, the CSI PowerStore driver installation process will no longer create VolumeSnapshotClass. > If you want to create VolumeSnapshots, then create a VolumeSnapshotClass using the sample provided in the _samples_ folder ### Creating Volume Snapshots @@ -161,13 +162,13 @@ spec: ## iSCSI CHAP The CSI PowerStore driver Version 1.3.0 and later extends Challenge Handshake Authentication Protocol (CHAP) support by adding automatic credentials generation. -This means that you no longer need to provide chapsecret/chapuser credentials, they will be automatically generated by the driver for each host. +This means that you no longer need to provide chapsecret/chapuser credentials, they will be automatically generated by the driver for each host. -To enable this feature you need to set `connection.enableCHAP` to `true` when installing with **helm** or set `X_CSI_POWERSTORE_ENABLE_CHAP` to `true` in your PowerStore CustomResource when installing using **operator**. +To enable this feature you need to set `connection.enableCHAP` to `true` when installing with **helm** or set `X_CSI_POWERSTORE_ENABLE_CHAP` to `true` in your PowerStore CustomResource when installing using **operator**. The driver uses the generated chapsecret to configure the iSCSI node database on each node with iSCSI access. -When creating a new host on powerstore array driver will populate host chap credentials with generated values. When re-using already existing hosts driver must override existing CHAP credentials with newly generated ones. +When creating a new host on powerstore array driver will populate host chap credentials with generated values. When re-using already existing hosts driver must override existing CHAP credentials with newly generated ones. ## Volume Expansion @@ -191,6 +192,8 @@ parameters: csi.storage.k8s.io/fstype: xfs ``` +> Note: Volume expansion of Metro volume pairs requires that the Metro link be suspended prior to extending the volume. The Metro volume link can be restored after the volume has been resized. + To resize a PVC, edit the existing PVC spec and set spec.resources.requests.storage to the intended size. For example, if you have a PVC pstore-pvc-demo of size 3Gi, then you can resize it to 30Gi by updating the PVC. ```yaml @@ -298,7 +301,7 @@ spec: ## Ephemeral Inline Volume -The CSI PowerStore driver version 1.2 and later supports ephemeral inline CSI volumes. This feature allows CSI volumes to be specified directly in the pod specification. +The CSI PowerStore driver version 1.2 and later supports ephemeral inline CSI volumes. This feature allows CSI volumes to be specified directly in the pod specification. At runtime, nested inline volumes follow the ephemeral lifecycle of their associated pods where the driver handles all phases of volume operations as pods are created and destroyed. @@ -327,7 +330,7 @@ spec: arrayID: "unique" ``` -This manifest creates a pod and attaches a newly created ephemeral inline CSI volume to it. +This manifest creates a pod and attaches a newly created ephemeral inline CSI volume to it. To create `NFS` volume you need to provide `nasName:` parameters that point to the name of your NAS Server in pod manifest like so @@ -349,11 +352,11 @@ To create `NFS` volume you need to provide `nasName:` parameters that point to t By default number of replicas is set to 2, you can set `controller.replicas` parameter to 1 in `my-powerstore-settings.yaml` if you want to disable controller HA for your installation. When installing via Operator you can change `replicas` parameter in `spec.driver.csiDriverSpec` section in your PowerStore Custom Resource. -When multiple replicas of controller pods are in the cluster, each sidecar (attacher, provisioner, resizer, snapshotter) tries to get a lease so only one instance of each sidecar would be active in the cluster at a time. +When multiple replicas of controller pods are in the cluster, each sidecar (attacher, provisioner, resizer, snapshotter) tries to get a lease so only one instance of each sidecar would be active in the cluster at a time. ### Driver pod placement -You can configure where driver controller and worker pods must be placed. +You can configure where driver controller and worker pods must be placed. To configure use `nodeSelector` and `tolerations` mechanisms you can configure in your `my-powerstore-settings.yaml` For example, you can specify `tolerations` to assign driver controller pods on controller nodes too: @@ -397,7 +400,7 @@ This Topology support does not include customer-defined topology, users cannot c To use the Topology features user must create their own storage classes similar to those that can be found in `samples/storageclass` folder. -The following is one of example storage class manifest: +The following is one of example storage class manifest: ```yaml apiVersion: storage.k8s.io/v1 kind: StorageClass @@ -416,7 +419,7 @@ allowedTopologies: This example matches all nodes where the driver has a connection to PowerStore with an IP of `127.0.0.1` via FibreChannel. Similar examples can be found in mentioned folder for NFS, iSCSI and NVMe. -You can check what labels your nodes contain by running +You can check what labels your nodes contain by running ```bash kubectl get nodes --show-labels ``` @@ -437,20 +440,20 @@ The user can also set the volume limit for all the nodes in the cluster by speci >**NOTE:**
The default value of `maxPowerstoreVolumesPerNode` is 0.
If `maxPowerstoreVolumesPerNode` is set to zero, then CO shall decide how many volumes of this type can be published by the controller to the node.

The volume limit specified in the `maxPowerstoreVolumesPerNode` attribute is applicable to all the nodes in the cluster for which the node label `max-powerstore-volumes-per-node` is not set. -## Reuse PowerStore hostname +## Reuse PowerStore hostname The CSI PowerStore driver version 1.2 and later can automatically detect if the current node was already registered as a Host on the storage array before. It will check if Host initiators and node initiators (FC, iSCSI or NVMe) match. If they do, the driver will not create a new host and will take the existing name of the Host as nodeID. -## Multiarray support +## Multiarray support -The CSI PowerStore driver version 1.3.0 and later support managing multiple PowerStore arrays from the single driver instance. This feature is enabled by default and integrated to even single instance installations. +The CSI PowerStore driver version 1.3.0 and later support managing multiple PowerStore arrays from the single driver instance. This feature is enabled by default and integrated to even single instance installations. To manage multiple arrays you need to create an array connection configuration that lists multiple arrays. -### Creating array configuration +### Creating array configuration Create a file called `config.yaml` and populate it with the following content - + ```yaml arrays: - endpoint: "https://10.0.0.1/api/rest" # full URL path to the PowerStore API @@ -464,14 +467,14 @@ Create a file called `config.yaml` and populate it with the following content nfsAcls: "0777" # (Optional) defines permissions - POSIX mode bits or NFSv4 ACLs, to be set on NFS target mount directory. # NFSv4 ACls are supported for NFSv4 shares on NFSv4 enabled NAS servers only. POSIX ACLs are not supported and only POSIX mode bits are supported for NFSv3 shares. - endpoint: "https://10.0.0.2/api/rest" - globalID: "unique" - username: "user" + globalID: "unique" + username: "user" password: "password" - skipCertificateValidation: true - blockProtocol: "FC" + skipCertificateValidation: true + blockProtocol: "FC" ``` -Here we specify that we want to CSI driver to manage two arrays: one with an IP `10.0.0.1` and the other with an IP `10.0.0.2`, we want to connect to the first array with `iSCSI` protocol and with `FC` to the second array. Also, we want to be able to create NFS-based volume so we provide the name of the NAS to the first array. +Here we specify that we want to CSI driver to manage two arrays: one with an IP `10.0.0.1` and the other with an IP `10.0.0.2`, we want to connect to the first array with `iSCSI` protocol and with `FC` to the second array. Also, we want to be able to create NFS-based volume so we provide the name of the NAS to the first array. To use this config we need to create a Kubernetes secret from it, to do so create a file called `secret.yaml` in the same folder and populate it with the following content: @@ -486,7 +489,7 @@ data: config: CONFIG_YAML ``` -Apply the secret by running following command: +Apply the secret by running following command: ```bash sed "s/CONFIG_YAML/`cat config.yaml | base64 -w0`/g" secret.yaml | kubectl apply -f - @@ -494,7 +497,7 @@ sed "s/CONFIG_YAML/`cat config.yaml | base64 -w0`/g" secret.yaml | kubectl apply ### Creating storage classes -To be able to provision Kubernetes volumes using a specific array we need to create corresponding storage classes. +To be able to provision Kubernetes volumes using a specific array we need to create corresponding storage classes. Create file `storageclass.yaml` and populate it with the following content: @@ -524,14 +527,14 @@ parameters: csi.storage.k8s.io/fstype: "xfs" ``` -Here we specify two storage classes: one of them uses the first array and `ext4` filesystem, and the other uses the second array and `xfs` filesystem. +Here we specify two storage classes: one of them uses the first array and `ext4` filesystem, and the other uses the second array and `xfs` filesystem. Then we need to apply storage classes to Kubernetes using `kubectl`: ```bash kubectl create -f storageclass.yaml ``` -After that, you can use `powerstore-1` storage class to create volumes on the first array and `powerstore-2` storage class to create volumes on the second array. +After that, you can use `powerstore-1` storage class to create volumes on the first array and `powerstore-2` storage class to create volumes on the second array. ## Dynamic secret change detection @@ -551,11 +554,11 @@ the new configuration information. ## Configuring custom access to NFS exports -CSI PowerStore driver Version 1.3.0 and later supports the ability to configure NFS access to nodes that use dedicated storage networks. +CSI PowerStore driver Version 1.3.0 and later supports the ability to configure NFS access to nodes that use dedicated storage networks. -To enable this feature you need to specify `externalAccess` parameter in your helm `values.yaml` file or `X_CSI_POWERSTORE_EXTERNAL_ACCESS` variable when creating CustomResource using an operator. +To enable this feature you need to specify `externalAccess` parameter in your helm `values.yaml` file or `X_CSI_POWERSTORE_EXTERNAL_ACCESS` variable when creating CustomResource using an operator. -The value of that parameter is added as an additional entry to NFS Export host access. +The value of that parameter is added as an additional entry to NFS Export host access. For example the following notation: ```yaml @@ -570,20 +573,20 @@ This means that we allow for NFS Export created by driver to be consumed by addr CSI PowerStore driver version 1.4.0 onwards slightly changes the way arrays are being identified in runtime. In previous versions of the driver, a management IP address was used to identify an array. The address change could lead to an invalid state of PV. From version 1.4.0 a unique GlobalID string is used for an array identification. -It has to be specified in `config.yaml` and in Storage Classes. +It has to be specified in `config.yaml` and in Storage Classes. -The change provides backward compatibility with previously created PVs. +The change provides backward compatibility with previously created PVs. However, to provision new volumes, make sure to delete old Storage Classes and create new ones with `arrayID` instead of `arrayIP` specified. > NOTE: It is recommended to migrate the PVs to new identifiers before changing management IPs of storage systems. The recommended way to do it is to clone the existing volume and delete the old one. The cloned volume will automatically switch to using globalID instead of management IP. -## Root squashing +## Root squashing -CSI PowerStore driver version 1.4.0 and later allows users to enable root squashing for NFS volumes provisioned by the driver. +CSI PowerStore driver version 1.4.0 and later allows users to enable root squashing for NFS volumes provisioned by the driver. Root squashing rule prevents root users on NFS clients from exercising root privileges on the NFS server. -To enable this rule, you need to set parameter `allowRoot` to `false` in your NFS storage class. +To enable this rule, you need to set parameter `allowRoot` to `false` in your NFS storage class. Your storage class definition must look similar to this: @@ -600,10 +603,10 @@ parameters: ## Dynamic Logging Configuration -This feature is introduced in CSI Driver for PowerStore version 2.0.0. +This feature is introduced in CSI Driver for PowerStore version 2.0.0. ### Helm based installation -As part of driver installation, a ConfigMap with the name `powerstore-config-params` is created, which contains attributes `CSI_LOG_LEVEL` which specifies the current log level of CSI driver and `CSI_LOG_FORMAT` which specifies the current log format of CSI driver. +As part of driver installation, a ConfigMap with the name `powerstore-config-params` is created, which contains attributes `CSI_LOG_LEVEL` which specifies the current log level of CSI driver and `CSI_LOG_FORMAT` which specifies the current log format of CSI driver. Users can set the default log level by specifying log level to `logLevel` and log format to `logFormat` attribute in `my-powerstore-settings.yaml` during driver installation. @@ -613,7 +616,7 @@ cd dell-csi-helm-installer ./csi-install.sh --namespace csi-powerstore --values ./my-powerstore-settings.yaml --upgrade ``` -Note: here `my-powerstore-settings.yaml` is a `values.yaml` file which user has used for driver installation. +Note: here `my-powerstore-settings.yaml` is a `values.yaml` file which user has used for driver installation. ### Operator based installation @@ -636,7 +639,7 @@ The user will be able to install the driver and able to create pods. CSI Driver for Dell Powerstore 2.1.0 and above supports volume health monitoring. Alpha feature gate `CSIVolumeHealth` needs to be enabled for the node side monitoring to take effect. For more information, please refer to the [Kubernetes GitHub repository](https://github.com/kubernetes-csi/external-health-monitor/blob/master/README.md). To use this feature, set controller.healthMonitor.enabled and node.healthMonitor.enabled to true. To change the monitor interval, set controller.healthMonitor.interval parameter. -## Single Pod Access Mode for PersistentVolumes- ReadWriteOncePod +## Single Pod Access Mode for PersistentVolumes- ReadWriteOncePod Use `ReadWriteOncePod(RWOP)` access mode if you want to ensure that only one pod across the whole cluster can read that PVC or write to it. This is supported for CSI Driver for PowerStore 2.1.0+ and Kubernetes version 1.22+. @@ -690,7 +693,7 @@ nfsAcls: "A::OWNER@:rwatTnNcCy,A::GROUP@:rxtncy,A::EVERYONE@:rxtncy,A::user@doma **NVMeTCP Support** CSI Driver for Dell Powerstore 2.2.0 and above supports NVMe/TCP provisioning. To enable NVMe/TCP provisioning, blockProtocol on secret should be specified as `NVMeTCP`. ->Note: NVMe/TCP is not supported on RHEL 7.x versions and CoreOS. +>Note: NVMe/TCP is not supported on RHEL 7.x versions and CoreOS. >NVMe/TCP is supported with Powerstore 2.1 and above. **NVMeFC Support** @@ -699,7 +702,7 @@ CSI Driver for Dell Powerstore 2.3.0 and above supports NVMe/FC provisioning. To >NVMe-FC feature is supported with Helm. ->Note: +>Note: > In case blockProtocol is specified as `auto`, the driver will be able to find the initiators on the host and choose the protocol accordingly. If the host has multiple protocols enabled, then NVMeFC gets the highest priority followed by NVMeTCP, followed by FC and then iSCSI. ## Volume group snapshot Support @@ -708,10 +711,10 @@ CSI Driver for Dell Powerstore 2.3.0 and above supports creating volume groups a ## Configurable Volume Attributes (Optional) -The CSI PowerStore driver version 2.3.0 and above supports Configurable volume atttributes. +The CSI PowerStore driver version 2.3.0 and above supports Configurable volume atttributes. -PowerStore array provides a set of optional volume creation attributes. These attributes can be configured for the volume (block and NFS) at the time of creation through PowerStore CSI driver. -These attributes can be specified as labels in PVC yaml file. The following is a sample manifest for creating volume with some of the configurable volume attributes. +PowerStore array provides a set of optional volume creation attributes. These attributes can be configured for the volume (block and NFS) at the time of creation through PowerStore CSI driver. +These attributes can be specified as labels in PVC yaml file. The following is a sample manifest for creating volume with some of the configurable volume attributes. ```yaml apiVersion: v1 @@ -733,19 +736,19 @@ spec: ``` ->Note: Default description value is `pvcName-pvcNamespace`. +>Note: Default description value is `pvcName-pvcNamespace`. -This is the list of all the attributes supported by PowerStore CSI driver: +This is the list of all the attributes supported by PowerStore CSI driver: | Block Volume | NFS Volume | | --- | --- | | csi.dell.com/description
csi.dell.com/appliance_id
csi.dell.com/volume_group_id
csi.dell.com/protection_policy_id
csi.dell.com/performance_policy_id
csi.dell.com/app_type
csi.dell.com/app_type_other





| csi.dell.com/description
csi.dell.com/config_type
csi.dell.com/access_policy
csi.dell.com/locking_policy
csi.dell.com/folder_rename_policy
csi.dell.com/is_async_mtime_enabled
csi.dell.com/protection_policy_id
csi.dell.com/file_events_publishing_mode
csi.dell.com/host_io_size
csi.dell.com/flr_attributes.flr_create.mode
csi.dell.com/flr_attributes.flr_create.default_retention
csi.dell.com/flr_attributes.flr_create.maximum_retention
csi.dell.com/flr_attributes.flr_create.minimum_retention | -
+
**Note:** ->Refer to the PowerStore array specification for the allowed values for each attribute, at `https:///swaggerui/`. ->Make sure that the attributes specified are supported by the version of PowerStore array used. +>Refer to the PowerStore array specification for the allowed values for each attribute, at `https:///swaggerui/`. +>Make sure that the attributes specified are supported by the version of PowerStore array used. >Configurable Volume Attributes feature is supported with Helm. @@ -762,3 +765,7 @@ Without storage capacity tracking, pods get scheduled on a node satisfying the t The attribute `storageCapacity.enabled` in `my-powerstore-settings.yaml` can be used to enabled/disabled the feature during driver installation . To configure how often driver checks for changed capacity set `storageCapacity.pollInterval` attribute. In case of driver installed via operator, this interval can be configured in the sample files provided [here](https://github.com/dell/csm-operator/tree/main/samples) by editing the `capacity-poll-interval` argument present in the `provisioner` sidecar. +## Metro support +The CSI PowerStore driver supports the provisioning of Metro volumes. The process and details of how to provision and use Metro volumes can be found [here](../../../replication/high-availability). + +Please note that the Metro feature does not require the deployment of the replicator sidecar or the replication controller. diff --git a/content/v1/csidriver/release/powerflex.md b/content/v1/csidriver/release/powerflex.md index 27474b840a..389708e5ba 100644 --- a/content/v1/csidriver/release/powerflex.md +++ b/content/v1/csidriver/release/powerflex.md @@ -3,7 +3,9 @@ title: PowerFlex description: Release notes for PowerFlex CSI driver --- -## Release Notes - CSI PowerFlex v2.11.0 +## Release Notes - CSI PowerFlex v2.12.0 + + @@ -15,23 +17,15 @@ description: Release notes for PowerFlex CSI driver ### New Features/Changes -- [#1359 - [FEATURE]: Add Support for OpenShift Container Platform (OCP) 4.16 ](https://github.com/dell/csm/issues/1359) -- [#1400 - [FEATURE]: Support for Kubernetes 1.30](https://github.com/dell/csm/issues/1400) -- [#1358 - [FEATURE]: Support for PowerFlex 4.6](https://github.com/dell/csm/issues/1358) -- [#1397 - [FEATURE]: Observability upgrade is supported in CSM Operator](https://github.com/dell/csm/issues/1397) +- [#1472 - [FEATURE]: Support for Kubernetes 1.31](https://github.com/dell/csm/issues/1472) +- [#1508 - [FEATURE]: Add Support for KubeVirt](https://github.com/dell/csm/issues/1508) +- [#663 - [FEATURE]: Enable/disable automatic SDC deployment along with driver installation.](https://github.com/dell/csm/issues/663) ### Fixed Issues -- [#1209 - [BUG]: Doc hyper links in driver Readme is broken](https://github.com/dell/csm/issues/1209) -- [#1218 - [BUG]: Add the helm-charts-version parameter to the install command for all drivers in csm-docs](https://github.com/dell/csm/issues/1218) -- [#1237 - [BUG]: Error handling not good in node.go:nodeProbe() and other similar functions](https://github.com/dell/csm/issues/1237) -- [#1239 - [BUG]: Changes in new release of google.golang.org/protobuf is causing compilation issues](https://github.com/dell/csm/issues/1239) -- [#1270 - [BUG]: Missing entries for Resiliency in installation wizard template](https://github.com/dell/csm/issues/1270) -- [#1310 - [BUG]: CSI node pod crash after replacing OCP ingress certificate or restarting kubectl service](https://github.com/dell/csm/issues/1310) -- [#1350 - [BUG]: Document update : PowerFlex expecting secret CR as -config in operator ](https://github.com/dell/csm/issues/1350) -- [#1355 - [BUG]: Indentation of secret.yaml mentioned on the csm-doc portal for powerflex driver is incorrect.](https://github.com/dell/csm/issues/1355) -- [#1364 - [BUG]: mkfsFormatOption not working for powerflex](https://github.com/dell/csm/issues/1364) -- [#1366 - [BUG]: Support Minimum 3GB Volume Size for NFS in CSI-PowerFlex](https://github.com/dell/csm/issues/1366) +- [#1448 - [BUG]: CSM-operator build fails from disk space issue](https://github.com/dell/csm/issues/1448) +- [#1521 - [BUG]: PowerFlex e2e-fsgroup tests are failing](https://github.com/dell/csm/issues/1521) +- [#1546 - [BUG]: privTgt mount is lost after vxflexos-node pod restart](https://github.com/dell/csm/issues/1546) ### Known Issues diff --git a/content/v1/csidriver/release/powermax.md b/content/v1/csidriver/release/powermax.md index b703fdc691..a08cd6d55f 100644 --- a/content/v1/csidriver/release/powermax.md +++ b/content/v1/csidriver/release/powermax.md @@ -3,7 +3,7 @@ title: PowerMax description: Release notes for PowerMax CSI driver --- -## Release Notes - CSI PowerMax v2.11.0 +## Release Notes - CSI PowerMax v2.12.0 >Note: Auto SRDF group creation is currently not supported in PowerMaxOS 10.1 (6079) Arrays. @@ -16,24 +16,26 @@ description: Release notes for PowerMax CSI driver + + ### New Features/Changes -- [#1308 - [FEATURE]: NVMe TCP support for PowerMax ](https://github.com/dell/csm/issues/1308) -- [#1359 - [FEATURE]: Add Support for OpenShift Container Platform (OCP) 4.16 ](https://github.com/dell/csm/issues/1359) -- [#1400 - [FEATURE]: Support for Kubernetes 1.30](https://github.com/dell/csm/issues/1400) -- [#1082 - [FEATURE]: CSM Resiliency support for PowerMax](https://github.com/dell/csm/issues/1082) -- [#1397 - [FEATURE]: Observability upgrade is supported in CSM Operator](https://github.com/dell/csm/issues/1397) +- [#1410 - [FEATURE]: Adding support for PowerMax Magnolia](https://github.com/dell/csm/issues/1410) +- [#1472 - [FEATURE]: Support for Kubernetes 1.31](https://github.com/dell/csm/issues/1472) +- [#1473 - [FEATURE]: Add Support for OpenShift Container Platform (OCP) 4.17](https://github.com/dell/csm/issues/1473) +- [#1508 - [FEATURE]: Add Support for KubeVirt](https://github.com/dell/csm/issues/1508) ### Fixed Issues -- [#1209 - [BUG]: Doc hyper links in driver Readme is broken](https://github.com/dell/csm/issues/1209) -- [#1218 - [BUG]: Add the helm-charts-version parameter to the install command for all drivers in csm-docs](https://github.com/dell/csm/issues/1218) -- [#1238 - [BUG]: Missing mountPropagation param for Powermax node template in CSM-Operator](https://github.com/dell/csm/issues/1238) -- [#1239 - [BUG]: Changes in new release of google.golang.org/protobuf is causing compilation issues](https://github.com/dell/csm/issues/1239) -- [#1305 - [BUG]: Create volume even if the size is smaller than possible](https://github.com/dell/csm/issues/1305) -- [#1346 - [BUG]: Parsing an NVME response fails for list-subsys](https://github.com/dell/csm/issues/1346) -- [#1370 - [BUG]: API command to check filesystem is taking 20s + causing ControllerUnPublish to take 20+secs ](https://github.com/dell/csm/issues/1370) -- [#1372 - [BUG]: Make files in repositories build invalid images](https://github.com/dell/csm/issues/1372) +- [#1416 - [BUG]: Dell CSM Installation Issues](https://github.com/dell/csm/issues/1416) +- [#1418 - [BUG]: csi-powermax crashed when attempting to unmount volume from node](https://github.com/dell/csm/issues/1418) +- [#1425 - [BUG]: Incorrect Volume Creation Due to Idempotency in CreateVolume](https://github.com/dell/csm/issues/1425) +- [#1447 - [BUG]: Gobrick does not clean wwids from /etc/multipath/wwids after removing multipath devices ](https://github.com/dell/csm/issues/1447) +- [#1448 - [BUG]: CSM-operator build fails from disk space issue](https://github.com/dell/csm/issues/1448) +- [#1453 - [BUG]: Improve Documentation - Multipath configuration for FC and FC-NVMe attached arrays ](https://github.com/dell/csm/issues/1453) +- [#1499 - [BUG]: Fix Gosec error in service.go](https://github.com/dell/csm/issues/1499) +- [#1519 - [BUG]: Powermax Intergration test failing](https://github.com/dell/csm/issues/1519) +- [#1534 - [BUG]: CSI PowerStore unable to resize NVMe block PVC, even though volume on the array get's resized](https://github.com/dell/csm/issues/1534) ### Known Issues @@ -45,6 +47,7 @@ description: Release notes for PowerMax CSI driver | Automatic SRDF group creation is failing with "Unable to get Remote Port on SAN for Auto SRDF" for PowerMaxOS 10.1 arrays | Create the SRDF Group and add it to the storage class | | [Node stage is failing with error "wwn for FC device not found"](https://github.com/dell/csm/issues/1070)| This is an intermittent issue, rebooting the node will resolve this issue | | When the driver is installed using CSM Operator , few times, pods created using block volume are getting stuck in containercreating/terminating state or devices are not available inside the pod. | Update the daemonset with parameter `mountPropagation: "Bidirectional"` for volumedevices-path under volumeMounts section.| +| When running CSI-PowerMax with Replication in a multi-cluster configuration, the driver on the target cluster fails and the following error is seen in logs: `error="CSI reverseproxy service host or port not found, CSI reverseproxy not installed properly"` | The reverseproxy service needs to be created manually on the target cluster. Follow [the instructions here](../../../deployment/csmoperator/modules/replication#configuration-steps) to create it.| ### Note: - Support for Kubernetes alpha features like Volume Health Monitoring will not be available in Openshift environment as Openshift doesn't support enabling of alpha features for Production Grade clusters. diff --git a/content/v1/csidriver/release/powerscale.md b/content/v1/csidriver/release/powerscale.md index 4ab7bbf89a..c98ffab2ac 100644 --- a/content/v1/csidriver/release/powerscale.md +++ b/content/v1/csidriver/release/powerscale.md @@ -4,7 +4,9 @@ description: Release notes for PowerScale CSI driver --- -## Release Notes - CSI Driver for PowerScale v2.11.0 +## Release Notes - CSI Driver for PowerScale v2.12.0 + + @@ -16,21 +18,16 @@ description: Release notes for PowerScale CSI driver ### New Features/Changes -- [#1359 - [FEATURE]: Add Support for OpenShift Container Platform (OCP) 4.16 ](https://github.com/dell/csm/issues/1359) -- [#1400 - [FEATURE]: Support for Kubernetes 1.30](https://github.com/dell/csm/issues/1400) -- [#1397 - [FEATURE]: Observability upgrade is supported in CSM Operator](https://github.com/dell/csm/issues/1397) -- [#1398 - [FEATURE]: PowerScale OneFS 9.7 support ](https://github.com/dell/csm/issues/1398) +- [#1472 - [FEATURE]: Support for Kubernetes 1.31](https://github.com/dell/csm/issues/1472) +- [#1473 - [FEATURE]: Add Support for OpenShift Container Platform (OCP) 4.17](https://github.com/dell/csm/issues/1473) +- [#1508 - [FEATURE]: Add Support for KubeVirt](https://github.com/dell/csm/issues/1508) ### Fixed Issues -- [#1203 - [BUG]: OCP min/max version support](https://github.com/dell/csm/issues/1203) -- [#1209 - [BUG]: Doc hyper links in driver Readme is broken](https://github.com/dell/csm/issues/1209) -- [#1215 - [BUG]: Discrepancy in their secret](https://github.com/dell/csm/issues/1215) -- [#1218 - [BUG]: Add the helm-charts-version parameter to the install command for all drivers in csm-docs](https://github.com/dell/csm/issues/1218) -- [#1239 - [BUG]: Changes in new release of google.golang.org/protobuf is causing compilation issues](https://github.com/dell/csm/issues/1239) -- [#1270 - [BUG]: Missing entries for Resiliency in installation wizard template](https://github.com/dell/csm/issues/1270) -- [#1316 - [BUG]: PowerScale CSI - Creating PVC from csi snapshot is failing](https://github.com/dell/csm/issues/1316) -- [#1322 - [BUG]: PowerScale CSM: Updating the fsGroupPolicy in the csm is not updating the csidriver](https://github.com/dell/csm/issues/1322) +- [#1438 - [BUG]: Remove mutex locks from interceptors on method calls](https://github.com/dell/csm/issues/1438) +- [#1448 - [BUG]: CSM-operator build fails from disk space issue](https://github.com/dell/csm/issues/1448) +- [#1475 - [BUG]: CSM Operator - Changes to csiDriverSpec does not reflect in CSM state or csidrivers.storage.k8s.io object](https://github.com/dell/csm/issues/1475) +- [#1531 - [BUG]: CSM-Operator resets dell-replication-controller-config configmap](https://github.com/dell/csm/issues/1531) ### Known Issues diff --git a/content/v1/csidriver/release/powerstore.md b/content/v1/csidriver/release/powerstore.md index 64798e62c1..ffda20d3ea 100644 --- a/content/v1/csidriver/release/powerstore.md +++ b/content/v1/csidriver/release/powerstore.md @@ -3,7 +3,9 @@ title: PowerStore description: Release notes for PowerStore CSI driver --- -## Release Notes - CSI PowerStore v2.11.0 +## Release Notes - CSI PowerStore v2.12.0 + + @@ -15,20 +17,19 @@ description: Release notes for PowerStore CSI driver ### New Features/Changes -- [#1359 - [FEATURE]: Add Support for OpenShift Container Platform (OCP) 4.16 ](https://github.com/dell/csm/issues/1359) -- [#1400 - [FEATURE]: Support for Kubernetes 1.30](https://github.com/dell/csm/issues/1400) +- [#1472 - [FEATURE]: Support for Kubernetes 1.31](https://github.com/dell/csm/issues/1472) +- [#1473 - [FEATURE]: Add Support for OpenShift Container Platform (OCP) 4.17](https://github.com/dell/csm/issues/1473) +- [#1508 - [FEATURE]: Add Support for KubeVirt](https://github.com/dell/csm/issues/1508) +- [#1443 - [FEATURE]: PowerStore Sync / Metro for Block - CSM Replication](https://github.com/dell/csm/issues/1443) ### Fixed Issues -- [#1188 - [BUG]: Controller Pod keeps restarting due to "Lost connection to CSI driver" error](https://github.com/dell/csm/issues/1188) -- [#1209 - [BUG]: Doc hyper links in driver Readme is broken](https://github.com/dell/csm/issues/1209) -- [#1216 - [BUG]: Incorrect Error message in Resiliency Podmon in controllerCleanupPod() func](https://github.com/dell/csm/issues/1216) -- [#1218 - [BUG]: Add the helm-charts-version parameter to the install command for all drivers in csm-docs](https://github.com/dell/csm/issues/1218) -- [#1239 - [BUG]: Changes in new release of google.golang.org/protobuf is causing compilation issues](https://github.com/dell/csm/issues/1239) -- [#1270 - [BUG]: Missing entries for Resiliency in installation wizard template](https://github.com/dell/csm/issues/1270) -- [#1317 - [BUG]: CSM PowerStore - Remove the RESTAPI code that is not needed](https://github.com/dell/csm/issues/1317) -- [#1338 - [BUG]: Data loss (DL) when deleting PVC but leaves unusable volumesnapshot and volumesnapshotcontent](https://github.com/dell/csm/issues/1338) -- [#1346 - [BUG]: Parsing an NVME response fails for list-subsys](https://github.com/dell/csm/issues/1346) +- [#1447 - [BUG]: Gobrick does not clean wwids from /etc/multipath/wwids after removing multipath devices ](https://github.com/dell/csm/issues/1447) +- [#1458 - [BUG]: CSI-PowerStore Node Prefix is ignored](https://github.com/dell/csm/issues/1458) +- [#1530 - [BUG]: Duplicate host NQNs on nodes with no logs](https://github.com/dell/csm/issues/1530) +- [#1534 - [BUG]: CSI PowerStore unable to resize NVMe block PVC, even though volume on the array get's resized](https://github.com/dell/csm/issues/1534) +- [#1538 - [BUG]: Host definitions not being created after adding new appliance to secret](https://github.com/dell/csm/issues/1538) +- [#1539 - [BUG]: Wrong storage protocol used when multiple PowerStore arrays are defined in secret](https://github.com/dell/csm/issues/1539) ### Known Issues diff --git a/content/v1/csidriver/release/unity.md b/content/v1/csidriver/release/unity.md index b889bf3294..edb613665a 100644 --- a/content/v1/csidriver/release/unity.md +++ b/content/v1/csidriver/release/unity.md @@ -3,7 +3,9 @@ title: Unity XT description: Release notes for Unity XT CSI driver --- -## Release Notes - CSI Unity XT v2.11.0 +## Release Notes - CSI Unity XT v2.12.0 + + @@ -15,20 +17,13 @@ description: Release notes for Unity XT CSI driver ### New Features/Changes -- [#1359 - [FEATURE]: Add Support for OpenShift Container Platform (OCP) 4.16 ](https://github.com/dell/csm/issues/1359) -- [#1400 - [FEATURE]: Support for Kubernetes 1.30](https://github.com/dell/csm/issues/1400) -- [#1399 - [FEATURE]: Unity 5.4 Support](https://github.com/dell/csm/issues/1399) +- [#1472 - [FEATURE]: Support for Kubernetes 1.31](https://github.com/dell/csm/issues/1472) +- [#1473 - [FEATURE]: Add Support for OpenShift Container Platform (OCP) 4.17](https://github.com/dell/csm/issues/1473) ### Fixed Issues -- [#1198 - [BUG]: Topology-related node labels are not added automatically](https://github.com/dell/csm/issues/1198) -- [#1206 - [BUG]: Snapshot ingestion procedure for CSI Unity Driver misising ](https://github.com/dell/csm/issues/1206) -- [#1209 - [BUG]: Doc hyper links in driver Readme is broken](https://github.com/dell/csm/issues/1209) -- [#1218 - [BUG]: Add the helm-charts-version parameter to the install command for all drivers in csm-docs](https://github.com/dell/csm/issues/1218) -- [#1222 - [BUG]: Cannot configure export IP for CSI-Unity ](https://github.com/dell/csm/issues/1222) -- [#1239 - [BUG]: Changes in new release of google.golang.org/protobuf is causing compilation issues](https://github.com/dell/csm/issues/1239) -- [#1270 - [BUG]: Missing entries for Resiliency in installation wizard template](https://github.com/dell/csm/issues/1270) -- [#1279 - [BUG]: unable to install the UNITY driver in NAT Env](https://github.com/dell/csm/issues/1279) +- [#1447 - [BUG]: Gobrick does not clean wwids from /etc/multipath/wwids after removing multipath devices ](https://github.com/dell/csm/issues/1447) +- [#1448 - [BUG]: CSM-operator build fails from disk space issue](https://github.com/dell/csm/issues/1448) ### Known Issues diff --git a/content/v1/csidriver/troubleshooting/powermax.md b/content/v1/csidriver/troubleshooting/powermax.md index 66a3026544..27af1ef2c4 100644 --- a/content/v1/csidriver/troubleshooting/powermax.md +++ b/content/v1/csidriver/troubleshooting/powermax.md @@ -20,3 +20,4 @@ description: Troubleshooting PowerMax Driver | nodestage is failing with error `Error invalid IQN Target iqn.EMC.0648.SE1F` | 1. Update initiator name to full default name , ex: iqn.1993-08.org.debian:01:e9afae962192
2.Ensure that the iSCSI initiators are available on all the nodes where the driver node plugin will be installed and it should be full default name. | | Volume mount is failing on few OS(ex:VMware Virtual Platform) during node publish with error `wrong fs type, bad option, bad superblock` | 1. Check the multipath configuration(if enabled) 2. Edit Vm Advanced settings->hardware and add the param `disk.enableUUID=true` and reboot the node | | Standby controller pod is in crashloopbackoff state | Scale down the replica count of the controller pod's deployment to 1 using ```kubectl scale deployment --replicas=1 -n ``` | +| When running CSI-PowerMax with Replication in a multi-cluster configuration, the driver on the target cluster fails and the following error is seen in logs: `error="CSI reverseproxy service host or port not found, CSI reverseproxy not installed properly"` | The reverseproxy service needs to be created manually on the target cluster. Follow [the instructions here](../../../deployment/csmoperator/modules/replication#configuration-steps) to create it.| diff --git a/content/v1/csm_hexagon.png b/content/v1/csm_hexagon.png index bba9f9e0a1ff83da021f2a61bc9179e6869de690..9f999800cff104ca9ff51e711a7cb28afbc346de 100644 GIT binary patch literal 423322 zcmZ5{2UwG5_deEItF|I2QfrlpvPaygK&T3`6v_w@fkYXifKWkZmbMNA6&V4Uv9b&Z z5fBi_a3M>GvWE}>V}uYw0%Q=9{GSm2-}mF=y1Z2KKI@$O+~+>$d2{C0 zMdfFEJ8M@JmDQhARDL}7;}76BJsN@-@Yjk6SKDJMVe0*|*~8@53uc)qmg6?5=wB@9%%KcUGSkda3xFW0v2Ke-yTBAMfVObht(g{ExIJ z9~y1`{4QK$rFMKq$e-U6g^MNhOekg&2`jEIZ740ZBCy2J9ycrjy_8^?{d2U|?XEb=T8Sexh&ToG7B@$=`9 zyysALWcJ&sy6BK8b2Q_`?EAxDI_IGMUi3DZcy_=FXCh(YvO{ZRyCtl^N*s2dgr!=! ztBq%G?^ixA9EgyI2JTOc68>p7%-$eYfpM{vOE#^HUtuT++zYd5A<+ z%wD5h^~J9G9%|#ptthW(=)bXFUv}mCVt9pJ5oO5G{a)M_nV423mzD*IjbH1nl}wyx z)3-(>a@!Dn$QA@6BS1dglB*$*tY61S12brnfI1hHnczM7HeyJZ{yv%Mzj52&d@TXvu!=cVE)pJ!@Gw=q)EnMd0D|e z2dla7Gi&=JMhwJ7KPrbmrQ{rvJowTb!Y1nv6|>IZ4i0-SBI=Db1`76j5hin9VWW6| zD{%7845l1$m8aGhk_3AT92aQzf15`s*(=Y`f_%Rhur^du}s!8)g8PFio@c;}A;R&w?l$!4vg{-OE^ zYRgLHxH~6uoTz*H&b;GiP1H3e?fbJW+W!TY@+ZTt~{CT_~A!shi3z?Pi1AIDZ#(qH2)?pMu?NVH_-rr`X) zjSSyc=Cwbo?1sWwMXWQl;RnH(J+MC#><(X^xX~*gdf|B;F+s^v2#j&%WR-IpVWB!EP9AR(=iuLNYfsw(9PXmB5yt^s92j?%PFystiV*3Bl<6F&!Y{rBLrIfq#fVZ+16-K0i2{t2sNed zm9T89&{nX`3C(Yd_Vg{pr1$MVuWD6tIf#8wZ2N6zzXX;#nJ_{y`(QsLH23Ntx8e3n zX!Im{u&VO=&ji{8f|#@NVW{(9vSA=jTr&ACVL zW&pk&@7DFs6V;uqYjD4|_p*w!6T>XemCw612%rm}(VEHuDo^^lKaQ?Gv4xd2t!)mu z+%6I=Heo-VU$@RGjk{U-%+-1YzIq=7Q~s(SSU6phwlO(3BZTnRrTl^V#p{?`)5%=J zZ%-Cv_L}@ES)aSLFOrZKJbd5qleKjv<_)89eyljFtZ8v(+xEk`T#zFaKUaxE+ZK4h z5Oo0H4CnMq+S-)P5R7q0x>{g+bF_i-si&`vjThg8^E6M?^+FD0m63KO9#Bgjyg0le zkRD%k;myE)zU9x#XHS-c+17VS&d@LH_tH9228O`YSW>=o5njdjLtgBt= zIgu0Thh%TLy!jql^P6MGxxh*P03)-vMwGGLY#zind+2n$QVSf9uL}R%V62?&mwi>v z&&5jst?R8Ob~;-7f9$+qDzo>Cx@;goiu1m4RgIIM;G_A$FPo9w;M0pGpVZa1NcL-5 z9X`+?;uGtRN4G^^`evF~g<}p{_AO+BC@N09ksjZC&=H`cbc$eQHEeN(godwHKDsq9 zPB23O+k-bnrj;`B@y*r+0}I(8J|Rx++mAfpE-0Tnd*xAl!m%I)D_1^MSIc|~C=O>e z?2Ts6P5pc8OT#hcW2YN7p7#m_+>0%Av({N_sFvK~%r?LKWvt>Y^*HNG!wKbMkN>}6 zNC&>0k?Z-`-HxAXUOew7n91k+d`l~Hy&(Dsp*7{t#(b;`;AiA1oSmd2|Hg`Th|4!B zr|~#xraD{-cnljC$_pM2NR5wo?|R_1cuRqZ07=IUG+ZH4R8(F#)dWZJo`GMN0@p$c z*XpXNZFxXCkd+t~Z{^<_U8bCGYS-O?rjHlFWK2bj;I-|ot$Xi>;1(JId|(Y(x43!S zASLNPxBwzyKRAB}pP1UElM)~Q#Igc+3232mly>x(EeMM?l!qxKZtME21AC-9tZ0brB669dOp+oM~QdkeA6Ws}Xk zNLhKo(o-dy)YXztIaJL@1G0-OS5;kl=4pG5f)kxD)Z`5+@KgCCc&f}kf|t6KD4Z@0 z>oNkASl?X^?BJ0u&ojnaTl*WQaEckYSJcL)FAbr}<=)!o^giEHD@p{K#0-|W9oVbs z8I>TNHPL&wjT%TbQsU>VV=ndsF65o5>EU5A0NJUWbZVXG+0ck!k%*=%$>+uS;3Z80 z$j$%Xo!Z(%CbYu`qD9xlrrVd+y4t=Q)0&Tc{vpH?(iXUJ)xG%mkS;*nv>eV5vND*P z@7xhB{$_-6W8S2eZFCjhIA z4t~~B4z*SKMTMGgqLPw`{r6AwvUkcA}h zMAs4rFcZO3Q~tA~i32$?)0d{n{mpvcLJf~1*IX@S|)|*xP zZfUMR&VdiFgV2qNywbsGSRQx|KX3Yq)hTf)5B z5><*x)C1zK4V;ALoUR8JVcQ)<%IJWEBitn0rTOBo-%xMSa9-0n_+53mgN816EdL}R zpSu%Z{zWl&Dpk+fa7CsJ0-^T0=WlDUTz)6W^XQU+xRcNXrR8d9Z>PpOff7TyGUMZo zYqSLY8PWXJeb_iyNr_yF4_nN28ml2nG?IZ5;ReJyK~ugBEPgHv1$i*be}{JEaW|78 zTcUSsF}AkZ$;mI2rx}KAXqsyImY!b-J^-;(#ik@02j;I89!)qlvNkrE3E+pDeKT-e zGV7w`^4+pu+h5NDB5QDC-fDKTcd1X>Xf$q93DODRq^~c<%}O8rg1n2l)d6y{jP5_N zqjF`XTBGDKmws{5<_s?Cl{dSX|1In9#sYLTdO``N=GMCA!6qZ)2b0I#d6CYVT2}B) z6KsR88oWxsF7L&l^kU{tC0Cq1`7xGf1t=2|x?fYi$1^OFN;nmjr(&m%sA(z)uHf6+$Nhab>ckCeaJ^jWg$|q8ky_DtdcL zY7OR2WvHK>-7lz_{s?r7J^mN%)GW?vGJM~=l9ZcxW60Z~k1XJHqUklr9mHhDH?ZqiCG7>mc=6-R<-rK~gNlUD5 zpU4S8HpZqgsh&3(wsGhd8X#@Z(B)O7t!$(Bgo zb|I{I(P>NM7OSsyt98gzInQL#e&y8O4CqiaJog$HyuDq|@Z4(R^b7x^`;XksGu6aEj^zCb&9N2mK3^ zyKze&;1i?;P-oB4`;`FuNfE^UIao8;iTIPQKWMb)n`YWpPf{{mNKTBYK3o6ax|z4B-ts?vf%XKQf?1$iX(mlSmr2`50a7aybDzb&{_vH;|3>9nm*UgJR9OV)qoR_hgfa7=jVi`IrWnE8$L9g4##v?mQn zc2&Bq?$XMCgxv*neUfg1eSYQ;*zF^`Y52{sH$l?~T3A^l>aaAAej;s5>L7Qq&`Q4S z4ETt8hvG#ne5X6-e2|i&z zNL^l^*d*8XOQ$cT+}UKM&Y1FFsxcI@{M4qk+8a}kGEtKU^PA%mXO1Q{AnSZgr`K(T z-LzdpSis!4yFk$%PdQN)*>2*5nL7zRv&5ZOb0-4i|L*CFi!3?0Av5hK!wR?BEil)c z2Kf^F;0=VZFE}7>GSF57xau<~lgx6_{DB7kigin;nA(3AlL)cH|EQgsf@MlhXucvc zET_0rLQz}Xa9GI(#$z{*<^=pz*c^BBz``>`a?qKsM1Vn!{pt5Tr11QTbzRS0DzrS1OVbsRzVqR+& z&^56Xp3KKfScClV$M*IMi9Q=Iy!o=ns( zm_;!*)N%s$3ZBU6reAt{@oVCo;i%c{p7;>^tVHDSfrc1Y=-)~U+lRB=w4#pzxWOuS zZOFVoXNWSZLMIi-e*Aqtf_-XIT;!1s*P@@#V1O;uU6l5Ae~hhdx80-MyTPyRjTuF4 zE0SB958=s?>$v)DZa2ici4M~8`lP^}ZkV5Lw9CeSOg`lt!NZI7m4vGM5;R7{K;(r* z;=j}0m~z?coDbeGvotBT%m$qsZVAJ}ap(7SmR?74wRXhciKrB#-11|;8i?(b<7=uW zhPKr^gTl%bwl@BxgKJ}GN&LtY_rkTJlIrsBNp9uEvOoS^*q4pJj3QYd)M@W6E)r}z zvQMjhY11#Fo+)%x9?*_al|OCBe0cKM3R-WISFtzzMPdjBWTJ*8!be*x<>62}NV~Km z2Nl3rIj<}NN)v`ly2l@H{t%3L5;+~{y;d~oXHp>hnLFtqnyvzA13{^0e0%Wl3~PC~o~)?Y)jtGR-ZKy*r^d|I6QepD6FFvSL=gvL5eW@ATY< z-3`LQkN<+!{C%Le!^n{v(Lp`3r%C(fZC4W|j~(!HTQj@If6A6pkyk1-J=$Nn z4{TM zo?&&hhLwjtv{aOUf+3@G^@2^5)7yWqlN`!K+vg6I7Gf5;*utpEx=8s zf{)nL6#`b0gbi3kAJk$hH}D)3wGjJlA2kPB23pmj^9?9GBho>HjkC4r!+aF}eXz+WN@J2D6a7A4 zmG3~~WAYPm$($^Z3~Lot1GH1Q>9S|Q{snIVP>R=2CN_uHlw9Y|qui{v-tHuaf`r$= zNZ`9~p}OeASgdC@G#>#a{ER}Ix7nI6?cph`=)5Y$B6c^@+9Tl4ieb__gtKeo+`~?q z{#a@4UHP^xbEi?3eckkOGv4WifyaF?|4twhDY{x5<+(io>!amBq~N=+q17fj9;#z^ zdISj#ADfLu+r(Km-4$W}K{$h@H(act9=7a@i-C?Qx84q#7ScHW@6`CYcMmm&vOV3C z7NRdHQp$qQDlj06Z>~o`3(C>&l;Fw^P$=&=*HCK2_nuT$91dq zbY8H`I8xlKnLGmeHTOQ}D}_t{PqiU==8CS)=;Tq9+7{D)5P^McAP%B)iEL~m z>ReiY=pmz4jg;B!q$tqG-%j~WrzN464tO>nbT!)CR pML!+EFFc07RyBM#P7@l9 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� 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

rVR3Lp4Ucb8 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

(Uz)80VNU5I9IGUu~elo}|91|CBZH%qh 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

Dn#EhA>dh9|DVkDrz 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 Zs&nrR4gYcp?I(aQLtRsy3N6Q|{{}} + footer="Supported drivers: [PowerScale](csmoperator/drivers/powerscale/), [PowerStore](csmoperator/drivers/powerstore/), [PowerFlex](csmoperator/drivers/powerflex/), [PowerMax](csmoperator/drivers/powermax/), [Unity XT](csmoperator/drivers/unity/)
Supported modules: [Authorization](csmoperator/modules/authorization-v2.0/), [Replication](csmoperator/modules/replication/), [Observability](csmoperator/modules/observability/), [Resiliency](csmoperator/modules/resiliency/)">}} Dell CSM Operator is a Kubernetes Operator, which can be used to install and manage the CSI Drivers and CSM Modules provided by Dell for various storage platforms. This operator is available as a community operator for upstream Kubernetes and can be deployed using OperatorHub.io. The operator can be installed using OLM (Operator Lifecycle Manager) or manually. [...More on installation instructions](csmoperator/) {{< /card >}} @@ -41,16 +41,16 @@ The Container Storage Modules and the required CSI Drivers can each be deployed CSM for Observability can be deployed either via Helm/CSM operator/CSM for Observability Installer/CSM for Observability Offline Installer [...More on installation instructions](helm/modules/installation/observability/) {{< /card >}} - {{< card header="[Dell Container Storage Module for Authorization](helm/modules/installation/authorization/)" + {{< card header="[Dell Container Storage Module for Authorization](helm/modules/installation/authorization-v2.0/)" footer="Installs Authorization Module">}} - CSM Authorization can be installed by using the provided Helm v3 charts on Kubernetes platforms or CSM operator. - [...More on installation instructions](helm/modules/installation/authorization/) + CSM Authorization can be installed by using the provided Helm v3 charts on Kubernetes platforms or CSM operator. + [...More on installation instructions](helm/modules/installation/authorization-v2.0/) {{< /card >}} {{% /cardpane %}} {{% cardpane %}} {{< card header="[Dell Container Storage Module for Resiliency](helm/modules/installation/resiliency)" footer="Installs Resiliency Module">}} - CSI drivers that support Helm chart installation allow CSM for Resiliency to be _optionally_ installed by variables in the chart. It can be updated via _podmon_ block specified in the _values.yaml_. It can be installed via CSM operator as well. + CSI drivers that support Helm chart installation allow CSM for Resiliency to be _optionally_ installed by variables in the chart. It can be updated via _podmon_ block specified in the _values.yaml_. It can be installed via CSM operator as well. [...More on installation instructions](helm/modules/installation/resiliency) {{< /card >}} {{< card header="[Dell Container Storage Module for Replication](helm/modules/installation/replication)" @@ -59,10 +59,3 @@ The Container Storage Modules and the required CSI Drivers can each be deployed [...More on installation instructions](helm/modules/installation/replication) {{< /card >}} {{% /cardpane %}} -{{% cardpane %}} - {{< card header="[Dell Container Storage Module for Encryption](helm/modules/installation/encryption)" - footer="Installs Encryption Module">}} - Encryption can be optionally installed via the PowerScale CSI driver Helm chart. - [...More on installation instructions](helm/modules/installation/encryption) - {{< /card >}} -{{% /cardpane %}} diff --git a/content/v1/deployment/csminstallationwizard/_index.md b/content/v1/deployment/csminstallationwizard/_index.md index e8fd5038b3..25b74c4fc3 100644 --- a/content/v1/deployment/csminstallationwizard/_index.md +++ b/content/v1/deployment/csminstallationwizard/_index.md @@ -4,6 +4,9 @@ linkTitle: "CSM Installation Wizard" description: Container Storage Modules Installation Wizard weight: 1 --- +{{% pageinfo color="primary" %}} +{{< message text="1" >}} +{{% /pageinfo %}} The [Dell Container Storage Modules Installation Wizard](./src/index.html) is a webpage that generates a manifest file for installing Dell CSI Drivers and its supported CSM Modules, based on input from the user. It generates a single manifest file to install both Dell CSI Drivers and its supported CSM Modules, thereby eliminating the need to download individual Helm charts for drivers and modules. The user can enable or disable the necessary modules through the UI, and a manifest file is generated accordingly without manually editing the helm charts. @@ -13,33 +16,33 @@ The [Dell Container Storage Modules Installation Wizard](./src/index.html) is a | CSI Driver | Version | Helm | Operator | | ------------------ | --------- | ------ | --------- | -| CSI PowerStore | 2.11.0 |✔️ |✔️ | +| CSI PowerStore | 2.12.0 |✔️ |✔️ | +| CSI PowerStore | 2.11.1 |✔️ |✔️ | | CSI PowerStore | 2.10.1 |✔️ |✔️ | | CSI PowerStore | 2.9.1 |✔️ |✔️ | -| CSI PowerStore | 2.8.0 |✔️ |✔️ | +| CSI PowerMax | 2.12.0 |✔️ |✔️ | | CSI PowerMax | 2.11.0 |✔️ |✔️ | | CSI PowerMax | 2.10.1 |✔️ |✔️ | | CSI PowerMax | 2.9.1 |✔️ |✔️ | -| CSI PowerMax | 2.8.0 |✔️ |✔️ | +| CSI PowerFlex | 2.12.0 |✔️ |❌ | | CSI PowerFlex | 2.11.0 |✔️ |❌ | | CSI PowerFlex | 2.10.1 |✔️ |❌ | -| CSI PowerFlex | 2.9.1 |✔️ |❌ | -| CSI PowerFlex | 2.8.0 |✔️ |❌ | +| CSI PowerFlex | 2.9.1 |✔️ |❌ | +| CSI PowerScale | 2.12.0 |✔️ |✔️ | | CSI PowerScale | 2.11.0 |✔️ |✔️ | | CSI PowerScale | 2.10.1 |✔️ |✔️ | -| CSI PowerScale | 2.9.1 |✔️ |✔️ | -| CSI PowerScale | 2.8.0 |✔️ |✔️ | +| CSI PowerScale | 2.9.1 |✔️ |✔️ | +| CSI Unity XT | 2.12.0 |✔️ |❌ | | CSI Unity XT | 2.11.0 |✔️ |❌ | | CSI Unity XT | 2.10.1 |✔️ |❌ | -| CSI Unity XT | 2.9.1 |✔️ |❌ | -| CSI Unity XT | 2.8.0 |✔️ |❌ | +| CSI Unity XT | 2.9.1 |✔️ |❌ | >NOTE: The Installation Wizard currently does not support operator-based manifest file generation for Unity XT and PowerFlex drivers. ## Supported Dell CSM Modules -| CSM Modules | Version | -| ---------------------| --------- | +| CSM Modules | Version | +| ---------------------| --------- | | CSM Observability | 1.7.0+ | | CSM Replication | 1.7.0+ | | CSM Resiliency | 1.7.0+ | @@ -50,15 +53,15 @@ The [Dell Container Storage Modules Installation Wizard](./src/index.html) is a 2. Select the `Installation Type` as `Helm`/`Operator`. 3. Select the `Array`. 4. Enter the `Image Repository`. The default value is `dellemc`. -5. Select the `CSM Version`. -6. Select the modules for installation. If there are module specific inputs, enter their values. +5. Select the `CSM Version`. +6. Select the modules for installation. If there are module specific inputs, enter their values. 7. If needed, modify the `Controller Pods Count`. 8. If needed, select `Install Controller Pods on Control Plane` and/or `Install Node Pods on Control Plane`. 9. Enter the `Namespace`. The default value is `csi-`. 10. Click on `Generate YAML`. -13. A manifest file, `values.yaml` will be generated and downloaded. +13. A manifest file, `values.yaml` will be generated and downloaded. 14. A section `Run the following commands to install` will be displayed. -15. Run the commands displayed to install Dell CSI Driver and Modules using the generated manifest file. +15. Run the commands displayed to install Dell CSI Driver and Modules using the generated manifest file. ## Installation Using Helm Chart @@ -90,7 +93,7 @@ The [Dell Container Storage Modules Installation Wizard](./src/index.html) is a 5. If Observability is checked in the wizard, refer to [Observability](../csmoperator/modules/observability#post-installation-dependencies) to export metrics to Prometheus and load the Grafana dashboards. -6. If Authorization is checked in the wizard, only the sidecar is enabled. Refer to [Authorization](../../deployment/helm/modules/installation/authorization/) to install and configure the CSM Authorization Proxy Server. +6. If Authorization is checked in the wizard, only the sidecar is enabled. Refer to [Authorization](../../deployment/helm/modules/installation/authorization-v2.0/) to install and configure the CSM Authorization Proxy Server. 7. If Replication is checked in the wizard, refer to [Replication](../../deployment/helm/modules/installation/replication/) on configuring communication between Kubernetes clusters. @@ -119,7 +122,7 @@ The [Dell Container Storage Modules Installation Wizard](./src/index.html) is a 3. If Observability is checked in the wizard, refer to [Observability](../csmoperator/modules/observability) to export metrics to Prometheus and load the Grafana dashboards. -4. If Authorization is checked in the wizard, only the sidecar is enabled. Refer to [Authorization](../csmoperator/modules/authorization) to install and configure the CSM Authorization Proxy Server. +4. If Authorization is checked in the wizard, only the sidecar is enabled. Refer to [Authorization](../csmoperator/modules/authorization-v2.0) to install and configure the CSM Authorization Proxy Server. 5. If Replication is checked in the wizard, refer to [Replication](../csmoperator/modules/replication) for the necessary prerequisites required for this module. diff --git a/content/v1/deployment/csminstallationwizard/release/_index.md b/content/v1/deployment/csminstallationwizard/release/_index.md index 756c37405b..a329f84c51 100644 --- a/content/v1/deployment/csminstallationwizard/release/_index.md +++ b/content/v1/deployment/csminstallationwizard/release/_index.md @@ -5,7 +5,9 @@ weight: 5 description: Release notes for CSM Installation Wizard --- -## Release Notes - CSM Installation Wizard 1.3.0 +## Release Notes - CSM Installation Wizard 1.4.1 + + @@ -19,8 +21,7 @@ There are no new features in this release. ### Fixed Issues -- [#1270 - [BUG]: Missing entries for Resiliency in installation wizard template](https://github.com/dell/csm/issues/1270) -- [#1275 - [BUG]: Installation Wizard creates a 0Byte file when selecting Operator for the installation type](https://github.com/dell/csm/issues/1275) +- [#1540 - [BUG]: CSM Installation Wizard ](https://github.com/dell/csm/issues/1540) ### Known Issues diff --git a/content/v1/deployment/csminstallationwizard/src/csm-versions/default-values.properties b/content/v1/deployment/csminstallationwizard/src/csm-versions/default-values.properties index 7ec130a487..a4de686591 100644 --- a/content/v1/deployment/csminstallationwizard/src/csm-versions/default-values.properties +++ b/content/v1/deployment/csminstallationwizard/src/csm-versions/default-values.properties @@ -1,4 +1,4 @@ -csmVersion=1.11.0 +csmVersion=1.12.0 imageRepository=dellemc controllerCount=1 nodeSelectorLabel=node-role.kubernetes.io/control-plane: diff --git a/content/v1/deployment/csminstallationwizard/src/index.html b/content/v1/deployment/csminstallationwizard/src/index.html index 599eb0e03b..956d1031a9 100644 --- a/content/v1/deployment/csminstallationwizard/src/index.html +++ b/content/v1/deployment/csminstallationwizard/src/index.html @@ -16,7 +16,9 @@ -

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

+ +
+
Container Storage Modules (CSM) Installation Wizard @@ -80,10 +82,10 @@
@@ -344,13 +346,26 @@
+
+
+ + +
+
+
+ + SDC is required for using block storage. Verify your environment is supported on the SDC Release Notes before selecting this option. If your environment is not supported, refer to the manual installation instructions on the CSM Documentation. +
+
+
+
- +
- +
@@ -360,8 +375,14 @@
- - + + +
+
+
+ + +
diff --git a/content/v1/deployment/csminstallationwizard/src/package.json b/content/v1/deployment/csminstallationwizard/src/package.json index 90c788dfe1..799e93b1ca 100644 --- a/content/v1/deployment/csminstallationwizard/src/package.json +++ b/content/v1/deployment/csminstallationwizard/src/package.json @@ -18,8 +18,8 @@ "homepage": "https://github.com/dell/csm-docs/#readme", "devDependencies": { "jest": "^29.3.1", - "jest-environment-jsdom": "^29.3.1", - "jquery": "^3.6.3", - "jest-junit": "^15.0.0" + "jest-environment-jsdom": "^29.7.0", + "jest-junit": "^15.0.0", + "jquery": "^3.6.3" } } diff --git a/content/v1/deployment/csminstallationwizard/src/static/css/style.css b/content/v1/deployment/csminstallationwizard/src/static/css/style.css index e309e14b39..d58e50a03f 100644 --- a/content/v1/deployment/csminstallationwizard/src/static/css/style.css +++ b/content/v1/deployment/csminstallationwizard/src/static/css/style.css @@ -147,4 +147,4 @@ main { padding-bottom: 150px; - } \ No newline at end of file + } diff --git a/content/v1/deployment/csminstallationwizard/src/static/js/commands.js b/content/v1/deployment/csminstallationwizard/src/static/js/commands.js index 08f947709f..18af0fe845 100644 --- a/content/v1/deployment/csminstallationwizard/src/static/js/commands.js +++ b/content/v1/deployment/csminstallationwizard/src/static/js/commands.js @@ -26,6 +26,7 @@ var nodeSelectorNote = 'For the pod to be eligible to run on a node, the node mu const snapshotNote = 'If Snapshot is enabled, ensure the Snapshot CRDs are installed'; const certmanagerNote = 'If cert-manager is enabled, ensure the cert-manager CRDs are installed'; +const approveSdcNote = 'If approve SDC is not enabled, ensure to approve the SDC manually before provisioning'; const veleroNote = 'If Velero is enabled, please add the respective credentials and configurations in the YAML file.'; const podmonNote = 'Uncomment tolerations under node property, if CSM for Resiliency and CSI Driver pods monitor are enabled in the generated YAML'; const authorizationNote = 'Only the Authorization sidecar is enabled by the CSM Installation Wizard. The Proxy Server has to be installed and configured separately'; diff --git a/content/v1/deployment/csminstallationwizard/src/static/js/constants.js b/content/v1/deployment/csminstallationwizard/src/static/js/constants.js index 18787eed66..179562e14d 100644 --- a/content/v1/deployment/csminstallationwizard/src/static/js/constants.js +++ b/content/v1/deployment/csminstallationwizard/src/static/js/constants.js @@ -40,10 +40,10 @@ const CONSTANTS = { PROPERTIES: ".properties", HELM: "helm", OPERATOR: "operator", - CSM_HELM_V180: "1.1.0", CSM_HELM_V193: "1.2.1", CSM_HELM_V1102: "1.3.2", - CSM_HELM_V1110: "1.4.0", + CSM_HELM_V1111: "1.4.1", + CSM_HELM_V1120: "1.5.0", HELM_TAINTS: ` - key: "$KEY" operator: "Exists" diff --git a/content/v1/deployment/csminstallationwizard/src/static/js/generate-yaml.js b/content/v1/deployment/csminstallationwizard/src/static/js/generate-yaml.js index 6ee6df8fe8..19bcc6fdff 100644 --- a/content/v1/deployment/csminstallationwizard/src/static/js/generate-yaml.js +++ b/content/v1/deployment/csminstallationwizard/src/static/js/generate-yaml.js @@ -126,6 +126,7 @@ function setValues(csmMapValues, CONSTANTS_PARAM) { DriverValues.vSphereVCenterHost = $("#vSphere-vCenter-host").val(); DriverValues.vSphereVCenterCredSecret = $("#vSphere-vCenter-cred-secret").val(); DriverValues.renameSDC = $("#rename-sdc").prop('checked') ? true : false; + DriverValues.sdcEnabled = $("#enable-sdc").prop('checked') ? true : false; DriverValues.sdcPrefix = $("#sdc-prefix").val(); DriverValues.approveSDC = $("#approve-sdc").prop('checked') ? true : false; DriverValues.enableQuota = $("#enable-quota").prop('checked') ? true : false; @@ -186,6 +187,7 @@ function createYamlString(yamlTpl, yamlTplValues, driverParam, CONSTANTS_PARAM) yamlTpl = yamlTpl.replaceAll("$NODE_TOLERATIONS", yamlTplValues.nodeTolerations); yamlTpl = yamlTpl.replaceAll("$TARGET_ARRAY_ID", yamlTplValues.targetArrayID); yamlTpl = yamlTpl.replaceAll("$TARGET_UNISPHERE", yamlTplValues.targetUnisphere); + yamlTpl = yamlTpl.replaceAll("$SDC_ENABLED", yamlTplValues.sdcEnabled); yamlTpl = yamlTpl.replaceAll("$RENAME_SDC_ENABLED", yamlTplValues.renameSDC); yamlTpl = yamlTpl.replaceAll("$SDC_PREFIX", yamlTplValues.sdcPrefix); yamlTpl = yamlTpl.replaceAll("$APPROVE_SDC_ENABLED", yamlTplValues.approveSDC); diff --git a/content/v1/deployment/csminstallationwizard/src/static/js/tests/generate-yaml.test.js b/content/v1/deployment/csminstallationwizard/src/static/js/tests/generate-yaml.test.js index 5a7eb48ace..4d5fd390c8 100644 --- a/content/v1/deployment/csminstallationwizard/src/static/js/tests/generate-yaml.test.js +++ b/content/v1/deployment/csminstallationwizard/src/static/js/tests/generate-yaml.test.js @@ -42,10 +42,10 @@ const CONSTANTS = { PROPERTIES: ".properties", HELM: "helm", OPERATOR: "operator", - CSM_HELM_V180: "1.1.0", CSM_HELM_V193: "1.2.1", CSM_HELM_V1102: "1.3.2", - CSM_HELM_V1110: "1.4.0", + CSM_HELM_V1111: "1.4.1", + CSM_HELM_V1120: "1.5.0", HELM_TAINTS: ` - key: "$KEY" operator: "Exists" @@ -64,21 +64,21 @@ const CONSTANTS = { }; const testCSMMap = new Map([ - ["csmVersion", "1.7.0"], + ["csmVersion", "1.12.0"], ["imageRepository", "dellemc"], ["maxVolumesPerNode", "0"], ["controllerCount", "1"], ["volNamePrefix", "csivol"], ["snapNamePrefix", "csi-snap"], ["nodeSelectorLabel", "node-role.kubernetes.io/control-plane:"], - ["driverVersion", "v2.7.0"], + ["driverVersion", "v2.12.0"], ]); describe("GIVEN setValues function", () => { test("SHOULD return expected DriverValues for Helm", () => { document.body.innerHTML = ` + @@ -124,8 +125,8 @@ describe("GIVEN setValues function", () => { `; const expected = { - csmVersion: '1.7.0', - driverVersion: 'v2.7.0', + csmVersion: '1.12.0', + driverVersion: 'v2.12.0', imageRepository: 'dellemc', monitor: false, certSecretCount: '1', @@ -190,6 +191,7 @@ describe("GIVEN setValues function", () => { observabilityOperatorTopology: false, topologyEnabled: false, transportProtocol: "", + sdcEnabled: false, renameSDC: false, sdcPrefix: "", approveSDC: false, @@ -203,7 +205,7 @@ describe("GIVEN setValues function", () => { test("SHOULD return expected DriverValues for Operator", () => { document.body.innerHTML = ` + @@ -249,8 +252,8 @@ describe("GIVEN setValues function", () => { `; const expected = { - csmVersion: '1.7.0', - driverVersion: 'v2.7.0', + csmVersion: '1.12.0', + driverVersion: 'v2.12.0', imageRepository: 'dellemc', monitor: false, certSecretCount: '1', @@ -315,6 +318,7 @@ describe("GIVEN setValues function", () => { observabilityOperatorTopology: false, topologyEnabled: false, transportProtocol: "", + sdcEnabled: false, renameSDC: false, sdcPrefix: "", approveSDC: false, @@ -396,7 +400,605 @@ describe("GIVEN createYamlString function", () => { ######################## csi-powerstore: enabled: $POWERSTORE_ENABLED + version: v2.12.0 + images: + driverRepository: $IMAGE_REPOSITORY + ## Controller ATTRIBUTES + controller: + controllerCount: $CONTROLLER_COUNT + healthMonitor: + enabled: $HEALTH_MONITOR_ENABLED + nodeSelector: $CONTROLLER_POD_NODE_SELECTOR + replication: + enabled: $REPLICATION_ENABLED + image: quay.io/dell/container-storage-modules/dell-csi-replicator:v1.4.0 + vgsnapshot: + enabled: $VG_SNAPSHOT_ENABLED + image: quay.io/dell/container-storage-modules/csi-volumegroup-snapshotter:v1.2.0 + snapshot: + enabled: $SNAPSHOT_ENABLED + resizer: + enabled: $RESIZER_ENABLED + ## Node ATTRIBUTES + node: + healthMonitor: + enabled: $HEALTH_MONITOR_ENABLED + nodeSelector: $NODE_POD_NODE_SELECTOR + # Uncomment if CSM for Resiliency and CSI Driver pods monitor are enabled + # tolerations: + # - key: "offline.vxflexos.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + # - key: "vxflexos.podmon.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + # - key: "offline.unity.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + # - key: "unity.podmon.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + # - key: "offline.isilon.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + # - key: "isilon.podmon.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + # - key: "offline.powerstore.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + # - key: "powerstore.podmon.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + storageCapacity: + enabled: $STORAGE_CAPACITY_ENABLED + podmon: + enabled: $RESILIENCY_ENABLED + image: quay.io/dell/container-storage-modules/podmon:v1.5.0 + maxPowerstoreVolumesPerNode: $MAX_VOLUMES_PER_NODE + + ## K8S/PowerMax ATTRIBUTES + ########################################## + csi-powermax: + enabled: $POWERMAX_ENABLED + global: + storageArrays: + - storageArrayId: "" + endpoint: "" + backupEndpoint: "" + - storageArrayId: "" + endpoint: "" + managementServers: + - endpoint: "" + - endpoint: "" + version: v2.6.0 + images: + driverRepository: $IMAGE_REPOSITORY + clusterPrefix: $POWERMAX_CLUSTER_PREFIX + portGroups: "$POWERMAX_PORT_GROUPS" + controller: + controllerCount: $CONTROLLER_COUNT + snapshot: + enabled: $SNAPSHOT_ENABLED + resizer: + enabled: $RESIZER_ENABLED + healthMonitor: + enabled: $HEALTH_MONITOR_ENABLED + nodeSelector: $CONTROLLER_POD_NODE_SELECTOR + node: + healthMonitor: + enabled: $HEALTH_MONITOR_ENABLED + nodeSelector: $NODE_POD_NODE_SELECTOR + csireverseproxy: + image: quay.io/dell/container-storage-modules/csipowermax-reverseproxy:v2.5.0 + deployAsSidecar: true + replication: + enabled: $REPLICATION_ENABLED + image: quay.io/dell/container-storage-modules/dell-csi-replicator:v1.4.0 + migration: + enabled: $MIGRATION_ENABLED + image: quay.io/dell/container-storage-modules/dell-csi-migrator:v1.1.0 + nodeRescanSidecarImage: quay.io/dell/container-storage-modules/dell-csi-node-rescanner:v1.0.0 + authorization: + enabled: $AUTHORIZATION_ENABLED + sidecarProxyImage: quay.io/dell/container-storage-modules/csm-authorization-sidecar:v1.6.0 + proxyHost: $AUTHORIZATION_PROXY_HOST + skipCertificateValidation: $AUTHORIZATION_SKIP_CERTIFICATE_VALIDATION + vSphere: + enabled: $VSPHERE_ENABLED + fcPortGroup: "$VSPHERE_FC_PORT_GROUP" + fcHostName: "$VSPHERE_FC_HOST_NAME" + vCenterHost: "$VSPHERE_VCENTER_HOST" + vCenterCredSecret: $VSPHERE_VCENTER_CRED_SECRET + + ## CSI PowerFlex + ######################## + csi-vxflexos: + enabled: $POWERFLEX_ENABLED + version: v2.12.0 + images: + driverRepository: $IMAGE_REPOSITORY + powerflexSdc: dellemc/sdc:3.6.0.6 + certSecretCount: $CERT_SECRET_COUNT + controller: + replication: + enabled: $REPLICATION_ENABLED + image: quay.io/dell/container-storage-modules/dell-csi-replicator:v1.4.0 + healthMonitor: + enabled: $HEALTH_MONITOR_ENABLED + controllerCount: $CONTROLLER_COUNT + snapshot: + enabled: $SNAPSHOT_ENABLED + resizer: + enabled: $RESIZER_ENABLED + nodeSelector: $CONTROLLER_POD_NODE_SELECTOR + node: + healthMonitor: + enabled: $HEALTH_MONITOR_ENABLED + sdc: + enabled: $SDC_ENABLED + nodeSelector: $NODE_POD_NODE_SELECTOR + renameSDC: + enabled: $RENAME_SDC_ENABLED + sdcPrefix: $SDC_PREFIX + approveSDC: + enabled: $APPROVE_SDC_ENABLED + tolerations: + # Uncomment if CSM for Resiliency and CSI Driver pods monitor is enabled + # - key: "offline.vxflexos.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + # - key: "vxflexos.podmon.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + # - key: "offline.unity.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + # - key: "unity.podmon.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + # - key: "offline.isilon.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + # - key: "isilon.podmon.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + monitor: + enabled: $MONITOR_ENABLED + vgsnapshotter: + enabled: $VG_SNAPSHOT_ENABLED + image: quay.io/dell/container-storage-modules/csi-volumegroup-snapshotter:v1.2.0 + podmon: + enabled: $RESILIENCY_ENABLED + image: quay.io/dell/container-storage-modules/podmon:v1.5.0 + authorization: + enabled: $AUTHORIZATION_ENABLED + sidecarProxyImage: quay.io/dell/container-storage-modules/csm-authorization-sidecar:v1.6.0 + proxyHost: $AUTHORIZATION_PROXY_HOST + + ## CSI Unity + ######################## + csi-unity: + enabled: $UNITY_ENABLED + version: v2.12.0 + images: + driverRepository: $IMAGE_REPOSITORY + certSecretCount: 1 + fsGroupPolicy: $FSGROUP_POLICY + controller: + controllerCount: $CONTROLLER_COUNT + volumeNamePrefix: $VOLUME_NAME_PREFIX + snapshot: + enabled: $SNAPSHOT_ENABLED + snapNamePrefix: $SNAP_NAME_PREFIX + resizer: + enabled: $RESIZER_ENABLED + nodeSelector: + healthMonitor: + enabled: $HEALTH_MONITOR_ENABLED + node: + healthMonitor: + enabled: $HEALTH_MONITOR_ENABLED + nodeSelector: + tolerations: + # Uncomment if nodes you wish to use have the node-role.kubernetes.io/master taint + # - key: "node-role.kubernetes.io/master" + # operator: "Exists" + # effect: "NoExecute" + # Uncomment if nodes you wish to use have the node-role.kubernetes.io/control-plane taint + # - key: "node-role.kubernetes.io/control-plane" + # operator: "Exists" + # effect: "NoExecute" + # - key: "node.kubernetes.io/memory-pressure" + # operator: "Exists" + # effect: "NoExecute" + # - key: "node.kubernetes.io/disk-pressure" + # operator: "Exists" + # effect: "NoExecute" + # - key: "node.kubernetes.io/network-unavailable" + # operator: "Exists" + # effect: "NoExecute" + # Uncomment if CSM for Resiliency and CSI Driver pods monitor are enabled + # - key: "offline.vxflexos.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + # - key: "vxflexos.podmon.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + # - key: "offline.unity.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + # - key: "unity.podmon.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + # - key: "offline.isilon.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + # - key: "isilon.podmon.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + podmon: + enabled: $RESILIENCY_ENABLED + image: quay.io/dell/container-storage-modules/podmon:v1.5.0 + + ## K8S/Replication Module ATTRIBUTES + ########################################## + csm-replication: + enabled: $REPLICATION_ENABLED + + ## K8S/Observability Module ATTRIBUTES + ########################################## + karavi-observability: + enabled: $OBSERVABILITY_ENABLED + karaviMetricsPowerstore: + enabled: $POWERSTORE_OBSERVABILITY_METRICS_ENABLED + karaviMetricsPowerMax: + enabled: $POWERMAX_OBSERVABILITY_METRICS_ENABLED + karaviMetricsPowerflex: + enabled: $POWERFLEX_OBSERVABILITY_METRICS_ENABLED + karaviMetricsPowerscale: + enabled: $POWERSCALE_OBSERVABILITY_METRICS_ENABLED + cert-manager: + enabled: false + + ## K8S/Cert-manager ATTRIBUTES + ########################################## + cert-manager: + enabled: $CERT_MANAGER_ENABLED + `; + + const testObjectSdc = { + csmVersion: "1.12.0", + driverVersion: "v2.12.0", + imageRepository: "dellemc", + maxVolumesPerNode: "0", + controllerCount: "1", + fsGroupPolicy: "ReadWriteOnceWithFSType", + volNamePrefix: "csivol", + snapNamePrefix: "csi-snap", + controllerPodsNodeSelector: false, + nodePodsNodeSelector: false, + resiliency: false, + storageCapacity: false, + snapshot: true, + vgsnapshot: false, + resizer: true, + healthMonitor: false, + replication: false, + observability: true, + observabilityMetrics: true, + authorization: false, + authorizationSkipCertValidation: true, + vgsnapshotImage: "quay.io/dell/container-storage-modules/csi-volumegroup-snapshotter:v1.2.0", + replicationImage: "quay.io/dell/container-storage-modules/dell-csi-replicator:v1.4.0", + authorizationImage: "quay.io/dell/container-storage-modules/csm-authorization-sidecar:v1.6.0", + certManagerEnabled: false, + authorizationProxyHost: '', + monitor: false, + certSecretCount: 0, + storageArrayId: "", + storageArrayEndpointUrl: '""', + storageArrayBackupEndpointUrl: '""', + clusterPrefix: "", + portGroups: "", + vSphereEnabled: false, + vSphereFCPortGroup: "csi-vsphere-VC-PG", + vSphereFCHostName: "csi-vsphere-VC-HN", + vSphereVCenterHost: "00.000.000.00", + vSphereVCenterCredSecret: "vcenter-creds", + migration: false, + sdcEnabled: true, + renameSDC: false, + sdcPrefix: "sdc-test", + approveSDC: false + }; + + test("SHOULD return correct generated yaml file string for driver csi-powerflex", () => { + const expected = ` + ## K8S/DRIVER ATTRIBUTES + ######################## + csi-powerstore: + enabled: false + version: v2.12.0 + images: + driverRepository: dellemc + ## Controller ATTRIBUTES + controller: + controllerCount: 1 + healthMonitor: + enabled: false + nodeSelector: false + replication: + enabled: false + image: quay.io/dell/container-storage-modules/dell-csi-replicator:v1.4.0 + vgsnapshot: + enabled: false + image: quay.io/dell/container-storage-modules/csi-volumegroup-snapshotter:v1.2.0 + snapshot: + enabled: true + resizer: + enabled: true + ## Node ATTRIBUTES + node: + healthMonitor: + enabled: false + nodeSelector: false + # Uncomment if CSM for Resiliency and CSI Driver pods monitor are enabled + # tolerations: + # - key: "offline.vxflexos.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + # - key: "vxflexos.podmon.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + # - key: "offline.unity.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + # - key: "unity.podmon.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + # - key: "offline.isilon.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + # - key: "isilon.podmon.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + # - key: "offline.powerstore.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + # - key: "powerstore.podmon.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + storageCapacity: + enabled: false + podmon: + enabled: false + image: quay.io/dell/container-storage-modules/podmon:v1.5.0 + maxPowerstoreVolumesPerNode: 0 + + ## K8S/PowerMax ATTRIBUTES + ########################################## + csi-powermax: + enabled: false + global: + storageArrays: + # - storageArrayId: "" + # endpoint: "" + backupEndpoint: "" + # - storageArrayId: "" + # endpoint: "" + managementServers: + # - endpoint: "" + # - endpoint: "" version: v2.6.0 + images: + driverRepository: dellemc + clusterPrefix: + portGroups: "" + controller: + controllerCount: 1 + snapshot: + enabled: true + resizer: + enabled: true + healthMonitor: + enabled: false + nodeSelector: false + node: + healthMonitor: + enabled: false + nodeSelector: false + csireverseproxy: + image: quay.io/dell/container-storage-modules/csipowermax-reverseproxy:v2.5.0 + deployAsSidecar: true + replication: + enabled: false + image: quay.io/dell/container-storage-modules/dell-csi-replicator:v1.4.0 + migration: + enabled: false + image: quay.io/dell/container-storage-modules/dell-csi-migrator:v1.1.0 + nodeRescanSidecarImage: quay.io/dell/container-storage-modules/dell-csi-node-rescanner:v1.0.0 + authorization: + enabled: false + sidecarProxyImage: quay.io/dell/container-storage-modules/csm-authorization-sidecar:v1.6.0 + proxyHost: + skipCertificateValidation: true + vSphere: + enabled: false + fcPortGroup: "csi-vsphere-VC-PG" + fcHostName: "csi-vsphere-VC-HN" + vCenterHost: "00.000.000.00" + vCenterCredSecret: vcenter-creds + + ## CSI PowerFlex + ######################## + csi-vxflexos: + enabled: true + version: v2.12.0 + images: + driverRepository: dellemc + powerflexSdc: dellemc/sdc:3.6.0.6 + certSecretCount: 0 + controller: + replication: + enabled: false + image: quay.io/dell/container-storage-modules/dell-csi-replicator:v1.4.0 + healthMonitor: + enabled: false + controllerCount: 1 + snapshot: + enabled: true + resizer: + enabled: true + nodeSelector: false + node: + healthMonitor: + enabled: false + sdc: + enabled: true + nodeSelector: false + renameSDC: + enabled: false + sdcPrefix: sdc-test + approveSDC: + enabled: false + tolerations: + # Uncomment if CSM for Resiliency and CSI Driver pods monitor is enabled + # - key: "offline.vxflexos.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + # - key: "vxflexos.podmon.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + # - key: "offline.unity.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + # - key: "unity.podmon.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + # - key: "offline.isilon.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + # - key: "isilon.podmon.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + monitor: + enabled: false + vgsnapshotter: + enabled: false + image: quay.io/dell/container-storage-modules/csi-volumegroup-snapshotter:v1.2.0 + podmon: + enabled: false + image: quay.io/dell/container-storage-modules/podmon:v1.5.0 + authorization: + enabled: false + sidecarProxyImage: quay.io/dell/container-storage-modules/csm-authorization-sidecar:v1.6.0 + proxyHost: + + ## CSI Unity + ######################## + csi-unity: + enabled: false + version: v2.12.0 + images: + driverRepository: dellemc + certSecretCount: 1 + fsGroupPolicy: ReadWriteOnceWithFSType + controller: + controllerCount: 1 + volumeNamePrefix: csivol + snapshot: + enabled: true + snapNamePrefix: csi-snap + resizer: + enabled: true + nodeSelector: + healthMonitor: + enabled: false + node: + healthMonitor: + enabled: false + nodeSelector: + tolerations: + # Uncomment if nodes you wish to use have the node-role.kubernetes.io/master taint + # - key: "node-role.kubernetes.io/master" + # operator: "Exists" + # effect: "NoExecute" + # Uncomment if nodes you wish to use have the node-role.kubernetes.io/control-plane taint + # - key: "node-role.kubernetes.io/control-plane" + # operator: "Exists" + # effect: "NoExecute" + # - key: "node.kubernetes.io/memory-pressure" + # operator: "Exists" + # effect: "NoExecute" + # - key: "node.kubernetes.io/disk-pressure" + # operator: "Exists" + # effect: "NoExecute" + # - key: "node.kubernetes.io/network-unavailable" + # operator: "Exists" + # effect: "NoExecute" + # Uncomment if CSM for Resiliency and CSI Driver pods monitor are enabled + # - key: "offline.vxflexos.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + # - key: "vxflexos.podmon.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + # - key: "offline.unity.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + # - key: "unity.podmon.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + # - key: "offline.isilon.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + # - key: "isilon.podmon.storage.dell.com" + # operator: "Exists" + # effect: "NoSchedule" + podmon: + enabled: false + image: quay.io/dell/container-storage-modules/podmon:v1.5.0 + + ## K8S/Replication Module ATTRIBUTES + ########################################## + csm-replication: + enabled: false + + ## K8S/Observability Module ATTRIBUTES + ########################################## + karavi-observability: + enabled: true + karaviMetricsPowerstore: + enabled: false + karaviMetricsPowerMax: + enabled: false + karaviMetricsPowerflex: + enabled: true + karaviMetricsPowerscale: + enabled: false + cert-manager: + enabled: false + + ## K8S/Cert-manager ATTRIBUTES + ########################################## + cert-manager: + enabled: false + `; + + const received = createYamlString(testYAML, testObjectSdc, "powerflex", CONSTANTS); + expect(received).toEqual(expected); + }); + +}); + +describe("GIVEN createYamlString function", () => { + const testYAML = ` + ## K8S/DRIVER ATTRIBUTES + ######################## + csi-powerstore: + enabled: $POWERSTORE_ENABLED + version: v2.12.0 images: driverRepository: $IMAGE_REPOSITORY ## Controller ATTRIBUTES @@ -407,10 +1009,10 @@ describe("GIVEN createYamlString function", () => { nodeSelector: $CONTROLLER_POD_NODE_SELECTOR replication: enabled: $REPLICATION_ENABLED - image: dellemc/dell-csi-replicator:v1.4.0 + image: quay.io/dell/container-storage-modules/dell-csi-replicator:v1.4.0 vgsnapshot: enabled: $VG_SNAPSHOT_ENABLED - image: dellemc/csi-volumegroup-snapshotter:v1.2.0 + image: quay.io/dell/container-storage-modules/csi-volumegroup-snapshotter:v1.2.0 snapshot: enabled: $SNAPSHOT_ENABLED resizer: @@ -450,7 +1052,7 @@ describe("GIVEN createYamlString function", () => { enabled: $STORAGE_CAPACITY_ENABLED podmon: enabled: $RESILIENCY_ENABLED - image: dellemc/podmon:v1.5.0 + image: quay.io/dell/container-storage-modules/podmon:v1.5.0 maxPowerstoreVolumesPerNode: $MAX_VOLUMES_PER_NODE ## K8S/PowerMax ATTRIBUTES @@ -486,18 +1088,18 @@ describe("GIVEN createYamlString function", () => { enabled: $HEALTH_MONITOR_ENABLED nodeSelector: $NODE_POD_NODE_SELECTOR csireverseproxy: - image: dellemc/csipowermax-reverseproxy:v2.5.0 + image: quay.io/dell/container-storage-modules/csipowermax-reverseproxy:v2.5.0 deployAsSidecar: true replication: enabled: $REPLICATION_ENABLED - image: dellemc/dell-csi-replicator:v1.4.0 + image: quay.io/dell/container-storage-modules/dell-csi-replicator:v1.4.0 migration: enabled: $MIGRATION_ENABLED - image: dellemc/dell-csi-migrator:v1.1.0 - nodeRescanSidecarImage: dellemc/dell-csi-node-rescanner:v1.0.0 + image: quay.io/dell/container-storage-modules/dell-csi-migrator:v1.1.0 + nodeRescanSidecarImage: quay.io/dell/container-storage-modules/dell-csi-node-rescanner:v1.0.0 authorization: enabled: $AUTHORIZATION_ENABLED - sidecarProxyImage: dellemc/csm-authorization-sidecar:v1.6.0 + sidecarProxyImage: quay.io/dell/container-storage-modules/csm-authorization-sidecar:v1.6.0 proxyHost: $AUTHORIZATION_PROXY_HOST skipCertificateValidation: $AUTHORIZATION_SKIP_CERTIFICATE_VALIDATION vSphere: @@ -511,7 +1113,7 @@ describe("GIVEN createYamlString function", () => { ######################## csi-vxflexos: enabled: $POWERFLEX_ENABLED - version: v2.6.0 + version: v2.12.0 images: driverRepository: $IMAGE_REPOSITORY powerflexSdc: dellemc/sdc:3.6.0.6 @@ -519,7 +1121,7 @@ describe("GIVEN createYamlString function", () => { controller: replication: enabled: $REPLICATION_ENABLED - image: dellemc/dell-csi-replicator:v1.4.0 + image: quay.io/dell/container-storage-modules/dell-csi-replicator:v1.4.0 healthMonitor: enabled: $HEALTH_MONITOR_ENABLED controllerCount: $CONTROLLER_COUNT @@ -531,6 +1133,8 @@ describe("GIVEN createYamlString function", () => { node: healthMonitor: enabled: $HEALTH_MONITOR_ENABLED + sdc: + enabled: $SDC_ENABLED nodeSelector: $NODE_POD_NODE_SELECTOR renameSDC: enabled: $RENAME_SDC_ENABLED @@ -561,20 +1165,20 @@ describe("GIVEN createYamlString function", () => { enabled: $MONITOR_ENABLED vgsnapshotter: enabled: $VG_SNAPSHOT_ENABLED - image: dellemc/csi-volumegroup-snapshotter:v1.2.0 + image: quay.io/dell/container-storage-modules/csi-volumegroup-snapshotter:v1.2.0 podmon: enabled: $RESILIENCY_ENABLED - image: dellemc/podmon:v1.5.0 + image: quay.io/dell/container-storage-modules/podmon:v1.5.0 authorization: enabled: $AUTHORIZATION_ENABLED - sidecarProxyImage: dellemc/csm-authorization-sidecar:v1.6.0 + sidecarProxyImage: quay.io/dell/container-storage-modules/csm-authorization-sidecar:v1.6.0 proxyHost: $AUTHORIZATION_PROXY_HOST ## CSI Unity ######################## csi-unity: enabled: $UNITY_ENABLED - version: v2.6.0 + version: v2.12.0 images: driverRepository: $IMAGE_REPOSITORY certSecretCount: 1 @@ -633,7 +1237,7 @@ describe("GIVEN createYamlString function", () => { # effect: "NoSchedule" podmon: enabled: $RESILIENCY_ENABLED - image: dellemc/podmon:v1.5.0 + image: quay.io/dell/container-storage-modules/podmon:v1.5.0 ## K8S/Replication Module ATTRIBUTES ########################################## @@ -662,8 +1266,8 @@ describe("GIVEN createYamlString function", () => { `; const testObject = { - csmVersion: "1.6.0", - driverVersion: "v2.6.0", + csmVersion: "1.12.0", + driverVersion: "v2.12.0", imageRepository: "dellemc", maxVolumesPerNode: "0", controllerCount: "1", @@ -683,9 +1287,9 @@ describe("GIVEN createYamlString function", () => { observabilityMetrics: true, authorization: false, authorizationSkipCertValidation: true, - vgsnapshotImage: "dellemc/csi-volumegroup-snapshotter:v1.2.0", - replicationImage: "dellemc/dell-csi-replicator:v1.4.0", - authorizationImage: "dellemc/csm-authorization-sidecar:v1.6.0", + vgsnapshotImage: "quay.io/dell/container-storage-modules/csi-volumegroup-snapshotter:v1.2.0", + replicationImage: "quay.io/dell/container-storage-modules/dell-csi-replicator:v1.4.0", + authorizationImage: "quay.io/dell/container-storage-modules/csm-authorization-sidecar:v1.6.0", certManagerEnabled: false, authorizationProxyHost: '', monitor: false, @@ -701,6 +1305,7 @@ describe("GIVEN createYamlString function", () => { vSphereVCenterHost: "00.000.000.00", vSphereVCenterCredSecret: "vcenter-creds", migration: false, + sdcEnabled: false, renameSDC: false, sdcPrefix: "sdc-test", approveSDC: false @@ -712,7 +1317,7 @@ describe("GIVEN createYamlString function", () => { ######################## csi-powerstore: enabled: true - version: v2.6.0 + version: v2.12.0 images: driverRepository: dellemc ## Controller ATTRIBUTES @@ -723,10 +1328,10 @@ describe("GIVEN createYamlString function", () => { nodeSelector: false replication: enabled: false - image: dellemc/dell-csi-replicator:v1.4.0 + image: quay.io/dell/container-storage-modules/dell-csi-replicator:v1.4.0 vgsnapshot: enabled: false - image: dellemc/csi-volumegroup-snapshotter:v1.2.0 + image: quay.io/dell/container-storage-modules/csi-volumegroup-snapshotter:v1.2.0 snapshot: enabled: true resizer: @@ -766,7 +1371,7 @@ describe("GIVEN createYamlString function", () => { enabled: false podmon: enabled: false - image: dellemc/podmon:v1.5.0 + image: quay.io/dell/container-storage-modules/podmon:v1.5.0 maxPowerstoreVolumesPerNode: 0 ## K8S/PowerMax ATTRIBUTES @@ -802,18 +1407,18 @@ describe("GIVEN createYamlString function", () => { enabled: false nodeSelector: false csireverseproxy: - image: dellemc/csipowermax-reverseproxy:v2.5.0 + image: quay.io/dell/container-storage-modules/csipowermax-reverseproxy:v2.5.0 deployAsSidecar: true replication: enabled: false - image: dellemc/dell-csi-replicator:v1.4.0 + image: quay.io/dell/container-storage-modules/dell-csi-replicator:v1.4.0 migration: enabled: false - image: dellemc/dell-csi-migrator:v1.1.0 - nodeRescanSidecarImage: dellemc/dell-csi-node-rescanner:v1.0.0 + image: quay.io/dell/container-storage-modules/dell-csi-migrator:v1.1.0 + nodeRescanSidecarImage: quay.io/dell/container-storage-modules/dell-csi-node-rescanner:v1.0.0 authorization: enabled: false - sidecarProxyImage: dellemc/csm-authorization-sidecar:v1.6.0 + sidecarProxyImage: quay.io/dell/container-storage-modules/csm-authorization-sidecar:v1.6.0 proxyHost: skipCertificateValidation: true vSphere: @@ -827,7 +1432,7 @@ describe("GIVEN createYamlString function", () => { ######################## csi-vxflexos: enabled: false - version: v2.6.0 + version: v2.12.0 images: driverRepository: dellemc powerflexSdc: dellemc/sdc:3.6.0.6 @@ -835,7 +1440,7 @@ describe("GIVEN createYamlString function", () => { controller: replication: enabled: false - image: dellemc/dell-csi-replicator:v1.4.0 + image: quay.io/dell/container-storage-modules/dell-csi-replicator:v1.4.0 healthMonitor: enabled: false controllerCount: 1 @@ -847,6 +1452,8 @@ describe("GIVEN createYamlString function", () => { node: healthMonitor: enabled: false + sdc: + enabled: false nodeSelector: false renameSDC: enabled: false @@ -877,20 +1484,20 @@ describe("GIVEN createYamlString function", () => { enabled: false vgsnapshotter: enabled: false - image: dellemc/csi-volumegroup-snapshotter:v1.2.0 + image: quay.io/dell/container-storage-modules/csi-volumegroup-snapshotter:v1.2.0 podmon: enabled: false - image: dellemc/podmon:v1.5.0 + image: quay.io/dell/container-storage-modules/podmon:v1.5.0 authorization: enabled: false - sidecarProxyImage: dellemc/csm-authorization-sidecar:v1.6.0 + sidecarProxyImage: quay.io/dell/container-storage-modules/csm-authorization-sidecar:v1.6.0 proxyHost: ## CSI Unity ######################## csi-unity: enabled: false - version: v2.6.0 + version: v2.12.0 images: driverRepository: dellemc certSecretCount: 1 @@ -949,7 +1556,7 @@ describe("GIVEN createYamlString function", () => { # effect: "NoSchedule" podmon: enabled: false - image: dellemc/podmon:v1.5.0 + image: quay.io/dell/container-storage-modules/podmon:v1.5.0 ## K8S/Replication Module ATTRIBUTES ########################################## @@ -986,7 +1593,7 @@ describe("GIVEN createYamlString function", () => { ######################## csi-powerstore: enabled: false - version: v2.6.0 + version: v2.12.0 images: driverRepository: dellemc ## Controller ATTRIBUTES @@ -997,10 +1604,10 @@ describe("GIVEN createYamlString function", () => { nodeSelector: false replication: enabled: false - image: dellemc/dell-csi-replicator:v1.4.0 + image: quay.io/dell/container-storage-modules/dell-csi-replicator:v1.4.0 vgsnapshot: enabled: false - image: dellemc/csi-volumegroup-snapshotter:v1.2.0 + image: quay.io/dell/container-storage-modules/csi-volumegroup-snapshotter:v1.2.0 snapshot: enabled: true resizer: @@ -1040,7 +1647,7 @@ describe("GIVEN createYamlString function", () => { enabled: false podmon: enabled: false - image: dellemc/podmon:v1.5.0 + image: quay.io/dell/container-storage-modules/podmon:v1.5.0 maxPowerstoreVolumesPerNode: 0 ## K8S/PowerMax ATTRIBUTES @@ -1076,18 +1683,18 @@ describe("GIVEN createYamlString function", () => { enabled: false nodeSelector: false csireverseproxy: - image: dellemc/csipowermax-reverseproxy:v2.5.0 + image: quay.io/dell/container-storage-modules/csipowermax-reverseproxy:v2.5.0 deployAsSidecar: true replication: enabled: false - image: dellemc/dell-csi-replicator:v1.4.0 + image: quay.io/dell/container-storage-modules/dell-csi-replicator:v1.4.0 migration: enabled: false - image: dellemc/dell-csi-migrator:v1.1.0 - nodeRescanSidecarImage: dellemc/dell-csi-node-rescanner:v1.0.0 + image: quay.io/dell/container-storage-modules/dell-csi-migrator:v1.1.0 + nodeRescanSidecarImage: quay.io/dell/container-storage-modules/dell-csi-node-rescanner:v1.0.0 authorization: enabled: false - sidecarProxyImage: dellemc/csm-authorization-sidecar:v1.6.0 + sidecarProxyImage: quay.io/dell/container-storage-modules/csm-authorization-sidecar:v1.6.0 proxyHost: skipCertificateValidation: true vSphere: @@ -1101,7 +1708,7 @@ describe("GIVEN createYamlString function", () => { ######################## csi-vxflexos: enabled: true - version: v2.6.0 + version: v2.12.0 images: driverRepository: dellemc powerflexSdc: dellemc/sdc:3.6.0.6 @@ -1109,7 +1716,7 @@ describe("GIVEN createYamlString function", () => { controller: replication: enabled: false - image: dellemc/dell-csi-replicator:v1.4.0 + image: quay.io/dell/container-storage-modules/dell-csi-replicator:v1.4.0 healthMonitor: enabled: false controllerCount: 1 @@ -1121,6 +1728,8 @@ describe("GIVEN createYamlString function", () => { node: healthMonitor: enabled: false + sdc: + enabled: false nodeSelector: false renameSDC: enabled: false @@ -1151,20 +1760,20 @@ describe("GIVEN createYamlString function", () => { enabled: false vgsnapshotter: enabled: false - image: dellemc/csi-volumegroup-snapshotter:v1.2.0 + image: quay.io/dell/container-storage-modules/csi-volumegroup-snapshotter:v1.2.0 podmon: enabled: false - image: dellemc/podmon:v1.5.0 + image: quay.io/dell/container-storage-modules/podmon:v1.5.0 authorization: enabled: false - sidecarProxyImage: dellemc/csm-authorization-sidecar:v1.6.0 + sidecarProxyImage: quay.io/dell/container-storage-modules/csm-authorization-sidecar:v1.6.0 proxyHost: ## CSI Unity ######################## csi-unity: enabled: false - version: v2.6.0 + version: v2.12.0 images: driverRepository: dellemc certSecretCount: 1 @@ -1223,7 +1832,7 @@ describe("GIVEN createYamlString function", () => { # effect: "NoSchedule" podmon: enabled: false - image: dellemc/podmon:v1.5.0 + image: quay.io/dell/container-storage-modules/podmon:v1.5.0 ## K8S/Replication Module ATTRIBUTES ########################################## @@ -1261,7 +1870,7 @@ describe("GIVEN createYamlString function", () => { ######################## csi-powerstore: enabled: false - version: v2.6.0 + version: v2.12.0 images: driverRepository: dellemc ## Controller ATTRIBUTES @@ -1272,10 +1881,10 @@ describe("GIVEN createYamlString function", () => { nodeSelector: false replication: enabled: false - image: dellemc/dell-csi-replicator:v1.4.0 + image: quay.io/dell/container-storage-modules/dell-csi-replicator:v1.4.0 vgsnapshot: enabled: false - image: dellemc/csi-volumegroup-snapshotter:v1.2.0 + image: quay.io/dell/container-storage-modules/csi-volumegroup-snapshotter:v1.2.0 snapshot: enabled: true resizer: @@ -1315,7 +1924,7 @@ describe("GIVEN createYamlString function", () => { enabled: false podmon: enabled: false - image: dellemc/podmon:v1.5.0 + image: quay.io/dell/container-storage-modules/podmon:v1.5.0 maxPowerstoreVolumesPerNode: 0 ## K8S/PowerMax ATTRIBUTES @@ -1351,18 +1960,18 @@ describe("GIVEN createYamlString function", () => { enabled: false nodeSelector: false csireverseproxy: - image: dellemc/csipowermax-reverseproxy:v2.5.0 + image: quay.io/dell/container-storage-modules/csipowermax-reverseproxy:v2.5.0 deployAsSidecar: true replication: enabled: false - image: dellemc/dell-csi-replicator:v1.4.0 + image: quay.io/dell/container-storage-modules/dell-csi-replicator:v1.4.0 migration: enabled: false - image: dellemc/dell-csi-migrator:v1.1.0 - nodeRescanSidecarImage: dellemc/dell-csi-node-rescanner:v1.0.0 + image: quay.io/dell/container-storage-modules/dell-csi-migrator:v1.1.0 + nodeRescanSidecarImage: quay.io/dell/container-storage-modules/dell-csi-node-rescanner:v1.0.0 authorization: enabled: false - sidecarProxyImage: dellemc/csm-authorization-sidecar:v1.6.0 + sidecarProxyImage: quay.io/dell/container-storage-modules/csm-authorization-sidecar:v1.6.0 proxyHost: skipCertificateValidation: true vSphere: @@ -1376,7 +1985,7 @@ describe("GIVEN createYamlString function", () => { ######################## csi-vxflexos: enabled: false - version: v2.6.0 + version: v2.12.0 images: driverRepository: dellemc powerflexSdc: dellemc/sdc:3.6.0.6 @@ -1384,7 +1993,7 @@ describe("GIVEN createYamlString function", () => { controller: replication: enabled: false - image: dellemc/dell-csi-replicator:v1.4.0 + image: quay.io/dell/container-storage-modules/dell-csi-replicator:v1.4.0 healthMonitor: enabled: false controllerCount: 1 @@ -1396,6 +2005,8 @@ describe("GIVEN createYamlString function", () => { node: healthMonitor: enabled: false + sdc: + enabled: false nodeSelector: false renameSDC: enabled: false @@ -1426,20 +2037,20 @@ describe("GIVEN createYamlString function", () => { enabled: false vgsnapshotter: enabled: false - image: dellemc/csi-volumegroup-snapshotter:v1.2.0 + image: quay.io/dell/container-storage-modules/csi-volumegroup-snapshotter:v1.2.0 podmon: enabled: false - image: dellemc/podmon:v1.5.0 + image: quay.io/dell/container-storage-modules/podmon:v1.5.0 authorization: enabled: false - sidecarProxyImage: dellemc/csm-authorization-sidecar:v1.6.0 + sidecarProxyImage: quay.io/dell/container-storage-modules/csm-authorization-sidecar:v1.6.0 proxyHost: ## CSI Unity ######################## csi-unity: enabled: false - version: v2.6.0 + version: v2.12.0 images: driverRepository: dellemc certSecretCount: 1 @@ -1498,7 +2109,7 @@ describe("GIVEN createYamlString function", () => { # effect: "NoSchedule" podmon: enabled: false - image: dellemc/podmon:v1.5.0 + image: quay.io/dell/container-storage-modules/podmon:v1.5.0 ## K8S/Replication Module ATTRIBUTES ########################################## @@ -1538,7 +2149,7 @@ describe("GIVEN createYamlString function", () => { ######################## csi-powerstore: enabled: false - version: v2.6.0 + version: v2.12.0 images: driverRepository: dellemc ## Controller ATTRIBUTES @@ -1549,10 +2160,10 @@ describe("GIVEN createYamlString function", () => { nodeSelector: false replication: enabled: false - image: dellemc/dell-csi-replicator:v1.4.0 + image: quay.io/dell/container-storage-modules/dell-csi-replicator:v1.4.0 vgsnapshot: enabled: false - image: dellemc/csi-volumegroup-snapshotter:v1.2.0 + image: quay.io/dell/container-storage-modules/csi-volumegroup-snapshotter:v1.2.0 snapshot: enabled: true resizer: @@ -1592,7 +2203,7 @@ describe("GIVEN createYamlString function", () => { enabled: false podmon: enabled: false - image: dellemc/podmon:v1.5.0 + image: quay.io/dell/container-storage-modules/podmon:v1.5.0 maxPowerstoreVolumesPerNode: 0 ## K8S/PowerMax ATTRIBUTES @@ -1628,18 +2239,18 @@ describe("GIVEN createYamlString function", () => { enabled: false nodeSelector: false csireverseproxy: - image: dellemc/csipowermax-reverseproxy:v2.5.0 + image: quay.io/dell/container-storage-modules/csipowermax-reverseproxy:v2.5.0 deployAsSidecar: true replication: enabled: false - image: dellemc/dell-csi-replicator:v1.4.0 + image: quay.io/dell/container-storage-modules/dell-csi-replicator:v1.4.0 migration: enabled: false - image: dellemc/dell-csi-migrator:v1.1.0 - nodeRescanSidecarImage: dellemc/dell-csi-node-rescanner:v1.0.0 + image: quay.io/dell/container-storage-modules/dell-csi-migrator:v1.1.0 + nodeRescanSidecarImage: quay.io/dell/container-storage-modules/dell-csi-node-rescanner:v1.0.0 authorization: enabled: false - sidecarProxyImage: dellemc/csm-authorization-sidecar:v1.6.0 + sidecarProxyImage: quay.io/dell/container-storage-modules/csm-authorization-sidecar:v1.6.0 proxyHost: skipCertificateValidation: true vSphere: @@ -1653,7 +2264,7 @@ describe("GIVEN createYamlString function", () => { ######################## csi-vxflexos: enabled: false - version: v2.6.0 + version: v2.12.0 images: driverRepository: dellemc powerflexSdc: dellemc/sdc:3.6.0.6 @@ -1661,7 +2272,7 @@ describe("GIVEN createYamlString function", () => { controller: replication: enabled: false - image: dellemc/dell-csi-replicator:v1.4.0 + image: quay.io/dell/container-storage-modules/dell-csi-replicator:v1.4.0 healthMonitor: enabled: false controllerCount: 1 @@ -1673,6 +2284,8 @@ describe("GIVEN createYamlString function", () => { node: healthMonitor: enabled: false + sdc: + enabled: false nodeSelector: false renameSDC: enabled: false @@ -1703,20 +2316,20 @@ describe("GIVEN createYamlString function", () => { enabled: false vgsnapshotter: enabled: false - image: dellemc/csi-volumegroup-snapshotter:v1.2.0 + image: quay.io/dell/container-storage-modules/csi-volumegroup-snapshotter:v1.2.0 podmon: enabled: false - image: dellemc/podmon:v1.5.0 + image: quay.io/dell/container-storage-modules/podmon:v1.5.0 authorization: enabled: false - sidecarProxyImage: dellemc/csm-authorization-sidecar:v1.6.0 + sidecarProxyImage: quay.io/dell/container-storage-modules/csm-authorization-sidecar:v1.6.0 proxyHost: ## CSI Unity ######################## csi-unity: enabled: false - version: v2.6.0 + version: v2.12.0 images: driverRepository: dellemc certSecretCount: 1 @@ -1775,7 +2388,7 @@ describe("GIVEN createYamlString function", () => { # effect: "NoSchedule" podmon: enabled: false - image: dellemc/podmon:v1.5.0 + image: quay.io/dell/container-storage-modules/podmon:v1.5.0 ## K8S/Replication Module ATTRIBUTES ########################################## @@ -1814,7 +2427,7 @@ describe("GIVEN createYamlString function", () => { ######################## csi-powerstore: enabled: false - version: v2.6.0 + version: v2.12.0 images: driverRepository: dellemc ## Controller ATTRIBUTES @@ -1825,10 +2438,10 @@ describe("GIVEN createYamlString function", () => { nodeSelector: false replication: enabled: false - image: dellemc/dell-csi-replicator:v1.4.0 + image: quay.io/dell/container-storage-modules/dell-csi-replicator:v1.4.0 vgsnapshot: enabled: false - image: dellemc/csi-volumegroup-snapshotter:v1.2.0 + image: quay.io/dell/container-storage-modules/csi-volumegroup-snapshotter:v1.2.0 snapshot: enabled: true resizer: @@ -1868,7 +2481,7 @@ describe("GIVEN createYamlString function", () => { enabled: false podmon: enabled: false - image: dellemc/podmon:v1.5.0 + image: quay.io/dell/container-storage-modules/podmon:v1.5.0 maxPowerstoreVolumesPerNode: 0 ## K8S/PowerMax ATTRIBUTES @@ -1904,18 +2517,18 @@ describe("GIVEN createYamlString function", () => { enabled: false nodeSelector: false csireverseproxy: - image: dellemc/csipowermax-reverseproxy:v2.5.0 + image: quay.io/dell/container-storage-modules/csipowermax-reverseproxy:v2.5.0 deployAsSidecar: true replication: enabled: false - image: dellemc/dell-csi-replicator:v1.4.0 + image: quay.io/dell/container-storage-modules/dell-csi-replicator:v1.4.0 migration: enabled: false - image: dellemc/dell-csi-migrator:v1.1.0 - nodeRescanSidecarImage: dellemc/dell-csi-node-rescanner:v1.0.0 + image: quay.io/dell/container-storage-modules/dell-csi-migrator:v1.1.0 + nodeRescanSidecarImage: quay.io/dell/container-storage-modules/dell-csi-node-rescanner:v1.0.0 authorization: enabled: false - sidecarProxyImage: dellemc/csm-authorization-sidecar:v1.6.0 + sidecarProxyImage: quay.io/dell/container-storage-modules/csm-authorization-sidecar:v1.6.0 proxyHost: skipCertificateValidation: true vSphere: @@ -1929,7 +2542,7 @@ describe("GIVEN createYamlString function", () => { ######################## csi-vxflexos: enabled: false - version: v2.6.0 + version: v2.12.0 images: driverRepository: dellemc powerflexSdc: dellemc/sdc:3.6.0.6 @@ -1937,7 +2550,7 @@ describe("GIVEN createYamlString function", () => { controller: replication: enabled: false - image: dellemc/dell-csi-replicator:v1.4.0 + image: quay.io/dell/container-storage-modules/dell-csi-replicator:v1.4.0 healthMonitor: enabled: false controllerCount: 1 @@ -1949,6 +2562,8 @@ describe("GIVEN createYamlString function", () => { node: healthMonitor: enabled: false + sdc: + enabled: false nodeSelector: false renameSDC: enabled: false @@ -1979,20 +2594,20 @@ describe("GIVEN createYamlString function", () => { enabled: false vgsnapshotter: enabled: false - image: dellemc/csi-volumegroup-snapshotter:v1.2.0 + image: quay.io/dell/container-storage-modules/csi-volumegroup-snapshotter:v1.2.0 podmon: enabled: false - image: dellemc/podmon:v1.5.0 + image: quay.io/dell/container-storage-modules/podmon:v1.5.0 authorization: enabled: false - sidecarProxyImage: dellemc/csm-authorization-sidecar:v1.6.0 + sidecarProxyImage: quay.io/dell/container-storage-modules/csm-authorization-sidecar:v1.6.0 proxyHost: ## CSI Unity ######################## csi-unity: enabled: true - version: v2.6.0 + version: v2.12.0 images: driverRepository: dellemc certSecretCount: 1 @@ -2051,7 +2666,7 @@ describe("GIVEN createYamlString function", () => { # effect: "NoSchedule" podmon: enabled: false - image: dellemc/podmon:v1.5.0 + image: quay.io/dell/container-storage-modules/podmon:v1.5.0 ## K8S/Replication Module ATTRIBUTES ########################################## @@ -2082,5 +2697,4 @@ describe("GIVEN createYamlString function", () => { expect(received).toEqual(expected); }); - }); diff --git a/content/v1/deployment/csminstallationwizard/src/static/js/tests/ui-functions.test.js b/content/v1/deployment/csminstallationwizard/src/static/js/tests/ui-functions.test.js index e477a66b74..6df3584b9b 100644 --- a/content/v1/deployment/csminstallationwizard/src/static/js/tests/ui-functions.test.js +++ b/content/v1/deployment/csminstallationwizard/src/static/js/tests/ui-functions.test.js @@ -68,10 +68,10 @@ const CONSTANTS = { PROPERTIES: ".properties", HELM: "helm", OPERATOR: "operator", - CSM_HELM_V180: "1.1.0", CSM_HELM_V193: "1.2.1", CSM_HELM_V1102: "1.3.2", - CSM_HELM_V1110: "1.4.0", + CSM_HELM_V1111: "1.4.1", + CSM_HELM_V1120: "1.5.0", }; describe("GIVEN onAuthorizationChange function", () => { @@ -561,8 +561,8 @@ describe("GIVEN resetTaint function", () => { describe("GIVEN displayModules function", () => { const testHtml = ` @@ -722,7 +722,7 @@ describe("GIVEN displayCommands function", () => { - +
}} | COP/OS | Supported Versions | | ----------------- | :----------------: | -| Kubernetes | 1.28, 1.29, 1.30 | -| Red Hat OpenShift | 4.15, 4.16 | +| Kubernetes | 1.29, 1.30, 1.31 | +| Red Hat OpenShift | 4.16, 4.17 | {{
}} ## Supported Storage Platforms @@ -50,7 +50,7 @@ CSM for Resiliency provides the following capabilities: {{}} | | PowerFlex | Unity XT | PowerScale | PowerStore | PowerMax | | ------------- | :----------: | :-------------------------------: | :-------------------------------------: | :---------------------------: | :---------------------------: | -| Storage Array | 3.6.x, 4.5.x, 4.6.x | 5.2.x, 5.3.0, 5.4.x | OneFS 9.4, 9.5.0.x (x >= 5), 9.7 | 3.0, 3.2, 3.5, 3.6 | 2500/8500 PowerMax OS 10 (6079), Unisphere 10.x | +| Storage Array | 3.6.x, 4.5.x, 4.6.x | 5.2.x, 5.3.x, 5.4.x | OneFS 9.4, 9.5.0.x (x >= 5), 9.7, 9.8, 9.9 | 3.5, 3.6, 4.0 | 2500/8500 PowerMax OS 10 (6079), Unisphere 10.x | {{
}} ## Supported CSI Drivers @@ -189,6 +189,9 @@ Similarly, the label selector for csi-powerscale, csi-unity, csi-powerstore and 3. As noted previously in the Limitations and Exclusions section, CSM for Resiliency has not yet been verified to work with ReadWriteMany or ReadOnlyMany volumes. Also, it has not been verified to work with pod controllers other than StatefulSet. + ### Storage Array Upgrades +To avoid application pods getting stuck in a Pending state, CSM for Resiliency should be disabled for storage array upgrades; even if the storage array upgrade is advertised as non-distruptive. If the container orchestrator platform nodes lose connectivity with the array, which is more likely during an upgrade, then Resiliency will delete the application pods on the affected nodes and attempt to move them to a healthy node. If all of the nodes are affected, then the application pods will be stuck in a Pending state. + ## Recovering From Failures Normally CSM for Resiliency should be able to move pods that have been impacted by Node Failures to a healthy node. After the failed nodes have come back online, CSM for Resiliency cleans them up (especially any potential zombie pods) and then automatically removes the CSM for Resiliency node taint that prevents pods from being scheduled to the failed node(s). There are a few cases where this cannot be fully automated and operator intervention is required, including: diff --git a/content/v1/resiliency/release/_index.md b/content/v1/resiliency/release/_index.md index a9847a0256..fd9024192e 100644 --- a/content/v1/resiliency/release/_index.md +++ b/content/v1/resiliency/release/_index.md @@ -6,7 +6,9 @@ Description: > Dell Container Storage Modules (CSM) release notes for resiliency --- -## Release Notes - CSM Resiliency 1.10.0 +## Release Notes - CSM Resiliency 1.11.0 + + @@ -21,14 +23,12 @@ Description: > ### New Features/Changes -- [#1359 - [FEATURE]: Add Support for OpenShift Container Platform (OCP) 4.16 ](https://github.com/dell/csm/issues/1359) -- [#1400 - [FEATURE]: Support for Kubernetes 1.30](https://github.com/dell/csm/issues/1400) -- [#1082 - [FEATURE]: CSM Resiliency support for PowerMax](https://github.com/dell/csm/issues/1082) +- [#1472 - [FEATURE]: Support for Kubernetes 1.31](https://github.com/dell/csm/issues/1472) +- [#1473 - [FEATURE]: Add Support for OpenShift Container Platform (OCP) 4.17](https://github.com/dell/csm/issues/1473) ### Fixed Issues -- [#1216 - [BUG]: Incorrect Error message in Resiliency Podmon in controllerCleanupPod() func](https://github.com/dell/csm/issues/1216) - +There are no issues fixed in this release. ### Known Issues There are no known issues in this release. diff --git a/content/v1/secure/_index.md b/content/v1/secure/_index.md deleted file mode 100644 index 88e3b42ed3..0000000000 --- a/content/v1/secure/_index.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: "Secure" -linkTitle: "Secure" -weight: 9 -Description: > - Security features for Dell CSI drivers ---- -Secure is a suite of Dell Container Storage Modules (CSM) that brings security related features to Kubernetes users of Dell storage products. diff --git a/content/v1/secure/encryption/_index.md b/content/v1/secure/encryption/_index.md deleted file mode 100644 index 557b9229cb..0000000000 --- a/content/v1/secure/encryption/_index.md +++ /dev/null @@ -1,137 +0,0 @@ ---- -title: "Encryption" -linkTitle: "Encryption" -weight: 1 -Description: > - CSI Volumes Encryption ---- - -**NOTE:** Encryption is not supported for CSM 1.10.x release. Please refer to the [release notes](./release/) for more details. - -Encryption provides the capability to encrypt user data residing on volumes created by Dell CSI Drivers. - - - -> **NOTE:** This tech-preview release is not intended for use in production environment. - -> **NOTE:** Encryption requires a time-based license to create new encrypted volumes. Request a [trial license](../../support/license) prior to deployment. -> -> After the license expiration, existing encrypted volume can still be unlocked and used, but no new encrypted volumes can be created. - -The volume data is encrypted on the Kubernetes worker host running the application workload, transparently for the application. - -Under the hood, *gocryptfs*, an open-source FUSE based encryptor, is used to encrypt both files content and the names of files and directories. - -Files content is encrypted using AES-256-GCM and names are encrypted using AES-256-EME. - -*gocryptfs* needs a password to initialize and to unlock the encrypted file system. -Encryption generates 32 random bytes for the password and stores them in Hashicorp Vault. - -For detailed information on the cryptography behind gocryptfs, see [gocryptfs Cryptography](https://nuetzlich.net/gocryptfs/forward_mode_crypto). - -When a CSI Driver is installed with the Encryption feature enabled, two provisioners are registered in the cluster: - -**Provisioner for unencrypted volumes** - -This provisioner belongs to the storage driver and does not depend on the Encryption feature. Use a storage class with this provisioner to create regular unencrypted volumes. - -**Provisioner for encrypted volumes** - -This provisioner belongs to Encryption and registers with the name [`encryption.pluginName`](../../deployment/helm/modules/installation/encryption/#helm-chart-values) when Encryption is enabled. Use a storage class with this provisioner to create encrypted volumes. - -## Capabilities - -{{}} -| Feature | PowerScale | -| ------- | ---------- | -| Dynamic provisionings of new volumes | Yes | -| Static provisioning of new volumes | Yes | -| Volume snapshot creation | Yes | -| Volume creation from snapshot | Yes | -| Volume cloning | Yes | -| Volume expansion | Yes | -| Encrypted volume unlocking in a different cluster | Yes | -| User file and directory names encryption | Yes | -{{
}} - -## Limitations - -- Only file system volumes are supported. -- Existing volumes with data cannot be encrypted.
- **Workaround:** create a new encrypted volume of the same size and copy/move the data from the original *unencrypted* volume to the new *encrypted* volume. -- Encryption cannot be disabled in-place.
- **Workaround:** create a new unencrypted volume of the same size and copy/move the data from the original *encrypted* volume to the new *unencrypted* volume. -- Encrypted volume content can be seen in clear text through root access to the worker node or by obtaining shell access into the Encryption driver container. -- When deployed with PowerScale CSI driver, `controllerCount` has to be set to 1. -- No other CSM component can be enabled simultaneously with Encryption. -- The only supported authentication method for Vault is AppRole. -- Encryption secrets, config maps and encryption related values cannot be updated while the CSI driver is running: -the CSI driver must be restarted to pick up the change. - -## Supported Operating Systems/Container Orchestrator Platforms - -{{}} -| COP/OS | Supported Versions | -|-|-| -| Kubernetes | 1.26, 1.27, 1.28 | -| Red Hat OpenShift | 4.13, 4.14 | -{{
}} - -## Supported Storage Platforms - -{{}} -| | PowerScale | -| ------------- | ---------- | -| Storage Array | OneFS 9.3, 9.4, 9.5.0.5, 9.5.0.6 | -{{
}} - -## Supported CSI Drivers - -Encryption supports these CSI drivers and versions: -{{}} -| Storage Array | CSI Driver | Supported Versions | -| ------------- | ---------- | ------------------ | -| CSI Driver for Dell PowerScale | [csi-powerscale](https://github.com/dell/csi-powerscale) | v2.8 + | -{{
}} - -### PowerScale - -When enabling Encryption for PowerScale CSI Driver, make sure these requirements are met: -- PowerScale CSI Driver uses root credentials for the storage array where encrypted volumes will be placed -- OneFS NFS export configuration does not have root user mapping enabled -- All other CSM features like Authorization, Replication, Resiliency are disabled -- Health Monitor feature is disabled -- CSI driver `controllerCount` is set to 1 - -## Hashicorp Vault Support - -**Supported Vault version is 1.9.3 and newer.** - -Vault server (or cluster) is typically deployed in a dedicated Kubernetes cluster, but for the purpose of Encryption, it can be located anywhere. -Even the simplest standalone single instance server with in-memory storage will suffice for testing. - -> **NOTE:** Properly deployed and configured Vault is crucial for security of the volumes encrypted with Encryption. -Please refer to the Hashicorp Vault documentation regarding recommended deployment options. - -> **CAUTION:** Compromised Vault server or Vault storage back-end may lead to unauthorized access to the volumes encrypted with Encryption. - -> **CAUTION:** Destroyed Vault storage back-end or the encryption key stored in it, will make it impossible to unlock the volume encrypted with Encryption. -Access to the data will be lost for ever. - -Refer to [Vault Configuration section](../../deployment/helm/modules/installation/encryption/vault) for minimal configuration steps required to support Encryption and other configuration considerations. - -## Key Rotation (rekey) -This preview of Encryption includes the ability to change the KEK (Key Encryption Key) of an encrypted volume, an operation commonly known as Shallow Rekey, or -Shallow Key Rotation. The KEK is the 256-bit key that encrypts the Data Encryption Key which encrypts the data on the volume. - -## Kubernetes Worker Hosts Requirements - -- Each Kubernetes worker host should have SSH server running. -- SSH server should have SSH public key authentication enabled for user *root*. -- SSH server should remain running all the time whenever an application with an encrypted volume is running on the host. -> **NOTE:** Stopping the SSH server on the worker host makes any encrypted volume attached to this host [inaccessible](troubleshooting#ssh-stopped). -- Each Kubernetes worker host should have commands `fusermount` and `mount.fuse`. They are pre-installed in most Linux distros. -To install package *fuse* in Ubuntu/Debian run command similar to `apt install fuse`. -To install package *fuse* in SUSE run command similar to `zypper install fuse`. - - diff --git a/content/v1/secure/encryption/release/_index.md b/content/v1/secure/encryption/release/_index.md deleted file mode 100644 index 8d508c3db5..0000000000 --- a/content/v1/secure/encryption/release/_index.md +++ /dev/null @@ -1,19 +0,0 @@ - ---- -title: "Release Notes" -linkTitle: "Release Notes" -weight: 5 -Description: > - Release Notes ---- - -## Release Notes - CSM Encryption - - -### Fixed Issues - -There are no fixed issues in this release. - -### Known Issues - -There are no known issues in this release. diff --git a/content/v1/secure/encryption/troubleshooting.md b/content/v1/secure/encryption/troubleshooting.md deleted file mode 100644 index 0fdbf89107..0000000000 --- a/content/v1/secure/encryption/troubleshooting.md +++ /dev/null @@ -1,102 +0,0 @@ ---- -title: "Troubleshooting" -linkTitle: "Troubleshooting" -weight: 5 -Description: > - Troubleshooting ---- - -## Logs and Events - -The first and in most cases sufficient step in troubleshooting issues with a CSI driver that has Encryption enabled -is exploring logs of the Encryption driver and related Kubernetes components. These are some useful log sources: - -### CSI Driver Containers Logs - -The driver creates several *controller* and *node* pods. They can be listed with `kubectl -n get pods`. -The output will look similar to: - -``` -NAME READY STATUS RESTARTS AGE -isi-controller-84f697c874-2j6d4 10/10 Running 0 16h -isi-node-4gtwf 4/4 Running 0 16h -isi-node-lnzws 4/4 Running 0 16h -``` - -List containers in pod `isi-node-4gtwf` with `kubectl -n logs isi-node-4gtwf`. -Each pod has containers called `driver` which is the storage driver container and `driver-sec` which is the Encryption driver container. -These container's logs tend to provide the most important information, but other containers may give a hint too. -View the logs of `driver-sec` in `isi-node-4gtwf` with `kubectl -n logs isi-node-4gtwf driver-sec`. -The log level of this container can be changed by setting value [encryption.logLevel](../../../deployment/helm/modules/installation/encryption#helm-chart-values) and restarting the driver. - -Often it is necessary to see the logs produced on a specific Kubernetes worker host. -To find which *node* pod is running on which worker host, use `kubectl -n get pods -o wide`. - -### PersistentVolume, PersistentVolumeClaim and Application Pod Events - -Some errors may be logged to the related resource events that can be viewed with `kubectl describe` command for that resource. - -### Vault Server Logs - -Some errors related to communication with the Vault server and key requests may be logged on the Vault server side. -If you run a [test instance of the server in a Docker container](../../../deployment/helm/modules/installation/encryption/vault#vault-server-installation) you can view the logs with `docker logs vault-server`. - -## Typical Failure Reasons - -### Incorrect Vault related configuration - -- check [logs](#logs-and-events) -- check [vault-auth secret](../../../deployment/helm/modules/installation/encryption#secret-vault-auth) -- check [vault-cert secret](../../../deployment/helm/modules/installation/encryption#secret-vault-cert) -- check [vault-client-conf config map](../../../deployment/helm/modules/installation/encryption/#configmap-vault-client-conf) - -### Incorrect Vault server-side configuration - -- check [logs](#logs-and-events) -- check [Vault server configuration](../../../deployment/helm/modules/installation/encryption/vault#minimum-server-configuration) - -### Expired AppRole secret ID - -- [reset the role secret ID](../../../deployment/helm/modules/installation/encryption/vault#set-role-id-and-secret-id-to-the-role) - -### Incorrect CSI driver configuration - -- check the related CSI driver [troubleshooting steps](../../../csidriver/troubleshooting) - -### SSH server is stopped/restarted on the worker host {#ssh-stopped} - -This may manifest in: -- failure to start the CSI driver -- failure to create a new encrypted volume -- failure to access an encrypted volume (IO errors) - -Resolution: -- check SSH server is running on all worker host -- stop all workloads that use encrypted volumes on the node, then restart them - -### No license provided, or license expired - -This may manifest in: -- failure to start the CSI driver -- failure to create a new encrypted volume - -Resolution: -- obtain a [new valid license](../../../support/license) -- check the license is for the cluster on which the encrypted volumes are created -- check [encryption-license secret](../../../deployment/helm/modules/installation/encryption#secret-encryption-license) - -## Typical Rekey Failure reasons -If all rekeys in the cluster are failing -- check the Rekey controller helm chart values.yaml `provisioner` name against the Dell CSI driver chart `encryption.pluginName`, and ensure they match. -- check the Rekey controller helm chart values.yaml `port` number against the Dell CSI driver chart `encryption.apiPort`, and ensure they match. - -If Rekeys fail for a particular PV - - check that the volume is provisioned by the Encryption provisioner - - check that volume attachments exist for the said PV - - check that at least one node on which the PV is mounted is available and reachable - - check the Encryption provisioner logs for details that may indicate the failure reason - - check the Rekey controller log for the reason for failure - -If a Rekey results in a `Status.Phase` of `unknown` - - this implies the connection failed during the rekey process which may mean the volume was rekeyed - - an additional rekey attempt should work assuming a reliable connection to the Encryption provisioner. This may result in the volume being rekeyed twice. \ No newline at end of file diff --git a/content/v1/snapshots/volume-group-snapshots/_index.md b/content/v1/snapshots/volume-group-snapshots/_index.md index 513736e55a..221acc6027 100644 --- a/content/v1/snapshots/volume-group-snapshots/_index.md +++ b/content/v1/snapshots/volume-group-snapshots/_index.md @@ -5,6 +5,10 @@ weight: 8 Description: > Volume Group Snapshot module of Dell CSI drivers --- + +{{% pageinfo color="primary" %}} Dell CSM Volume Group Snapshotter will be deprecated in CSM 1.14 (May 2025) and will no longer be supported. +{{% /pageinfo %}} + ## Volume Group Snapshot Feature The Dell CSM Volume Group Snapshotter is an operator which extends Kubernetes API to support crash-consistent snapshots of groups of volumes. Volume Group Snapshot supports PowerFlex and PowerStore driver. @@ -57,7 +61,7 @@ vgsnapshotter: To deploy CSM Volume Group Snapshotter with the driver, these changes are required: 1. Enable CSM Volume Group Snapshotter by changing the vgsnapshotter.enabled boolean to true. -2. In the vgsnapshotter.image field, put the location of the image you created, or link to the one already built (such as the one on DockerHub, `dellemc/csi-volumegroup-snapshotter:v1.3.0`). +2. In the vgsnapshotter.image field, put the location of the image you created, or link to the one already built (such as the one on quay.io, `quay.io/dell/container-storage-modules/csi-volumegroup-snapshotter:v1.7.0`). 3. Install/upgrade the driver normally. You should now have VGS successfully deployed with the driver! diff --git a/content/v1/support/cert-csi/_index.md b/content/v1/support/cert-csi/_index.md index 7ed95db101..f8dc760a52 100644 --- a/content/v1/support/cert-csi/_index.md +++ b/content/v1/support/cert-csi/_index.md @@ -13,14 +13,14 @@ Any orchestrator platform, operating system or version that is not mentioned in You may qualify your environment for Dell CSI Drivers by executing the [Run All Test Suites](#run-all-test-suites) workflow. -Please submit your test results for our review [here](https://github.com/dell/csm/issues/new?assignees=&labels=type%2Fqualification&projects=&template=community_qualification.yml&title=%5BQualification%5D%3A+). If the results are a success, the orchestrator platform and version will be published under Community Qualified Configurations. +Please submit your test results for our review [here](https://github.com/dell/csm/issues/new?assignees=&labels=type%2Fqualification&projects=&template=community_qualification.yml&title=%5BQualification%5D%3A+). If the results are a success, the orchestrator platform and version will be published under Community Qualified Configurations. ## Installation There are three methods of installing `cert-csi`. 1. [Download the executable from the latest GitHub release](#download-release-linux). -2. [Pull the container image from DockerHub](#pull-the-container-image). +2. [Pull the container image from quay.io](#pull-the-container-image). 3. [Build the exectuable or container image locally](#building-locally). > The exectuable from the GitHub Release only supports Linux. For non-Linux users, you must build the `cert-csi` executable [locally](#building-locally). @@ -28,11 +28,7 @@ There are three methods of installing `cert-csi`. ### Download Release (Linux) > NOTE: Please ensure you delete any previously downloaded Cert-CSI binaries, as each release uses the same name (`cert-csi-linux-amd64`). After installing the latest version, run the `cert-csi -v` command to verify the installed version. -1. Download the latest release of the cert-csi zip file. - -```bash -wget https://github.com/dell/cert-csi/releases/download/v1.5.0/cert-csi-linux-amd64 -``` +1. Download `cert-csi` from [here](https://github.com/dell/cert-csi/releases/latest/download/cert-csi-linux-amd64) 2. Set the execute permission before running it. @@ -59,12 +55,12 @@ mv ./cert-csi-linux-amd64 ~/.local/bin/cert-csi {{< tabpane name="pulling-cert-csi-image" lang="bash">}} {{}} - docker pull dellemc/cert-csi:v1.5.0 + docker pull quay.io/dell/container-storage-modules/cert-csi:v1.6.0 {{}} {{}} - podman pull dellemc/cert-csi:v1.5.0 + podman pull quay.io/dell/container-storage-modules/cert-csi:v1.6.0 {{}} {{< /tabpane >}} @@ -78,7 +74,7 @@ mv ./cert-csi-linux-amd64 ~/.local/bin/cert-csi 1. Clone the repository ```bash -git clone -b "v1.5.0" https://github.com/dell/cert-csi.git && cd cert-csi +git clone -b "v1.6.0" https://github.com/dell/cert-csi.git && cd cert-csi ``` 2. Build cert-csi @@ -113,10 +109,10 @@ make install-ms cert-csi --help {{}} {{}} - docker run --rm -it -v ~/.kube/config:/root/.kube/config dellemc/cert-csi:v1.5.0 --help + docker run --rm -it -v ~/.kube/config:/root/.kube/config quay.io/dell/container-storage-modules/cert-csi:v1.6.0 --help {{}} {{}} - podman run --rm -it -v ~/.kube/config:/root/.kube/config dellemc/cert-csi:v1.5.0 --help + podman run --rm -it -v ~/.kube/config:/root/.kube/config quay.io/dell/container-storage-modules/cert-csi:v1.6.0 --help {{}} {{< /tabpane >}} @@ -132,11 +128,11 @@ make install-ms ## Run All Test Suites -You can use cert-csi to launch a test run against multiple storage classes to check if the driver adheres to advertised capabilities. +You can use cert-csi to launch a test run against multiple storage classes to check if the driver adheres to advertised capabilities. #### Preparing Config -To run the test suites you need to provide `.yaml` config with storage classes and their capabilities. You can use `example-certify-config.yaml` as an example. +To run the test suites you need to provide `.yaml` config with storage classes and their capabilities. You can use `example-certify-config.yaml` as an example. Template: ```yaml @@ -159,9 +155,9 @@ storageClasses: volumeAttributes: # volume attrs for EphemeralVolumeSuite. attr1: # volume attr for EphemeralVolumeSuite attr2: # volume attr for EphemeralVolumeSuite - capacityTracking: # capacityTracking test requires the storage class to have volume binding mode as 'WaitForFirstConsumer' + capacityTracking: driverNamespace: # namepsace where driver is installed - pollInterval: # duration to poll capacity (e.g., 2m) + pollInterval: # duration to poll capacity (e.g., 2m) ``` Driver specific examples: @@ -178,7 +174,7 @@ storageClasses: snapshot: true RWX: false ephemeral: - driver: csi-powerstore.dellemc.com + driver: csi-vxflexos.dellemc.com fstype: ext4 volumeAttributes: volumeName: "my-ephemeral-vol" @@ -192,7 +188,7 @@ storageClasses: clone: true snapshot: true RWX: true - RWOP: true + RWOP: false ephemeral: driver: csi-vxflexos.dellemc.com fstype: "nfs" @@ -202,7 +198,7 @@ storageClasses: storagepool: "sample" systemID: "sample" capacityTracking: - driverNamespace: powerstore + driverNamespace: vxflexos pollInterval: 2m @@ -216,7 +212,7 @@ storageClasses: expansion: true clone: true snapshot: true - RWX: false + RWX: true ephemeral: driver: csi-isilon.dellemc.com fstype: nfs @@ -227,9 +223,7 @@ storageClasses: IsiPath: "/ifs/data/sample" IsiVolumePathPermissions: "0777" AzServiceIP: "192.168.2.1" - capacityTracking: - driverNamespace: isilon - pollInterval: 2m + {{}} {{}} @@ -241,18 +235,18 @@ storageClasses: clone: true snapshot: true capacityTracking: - driverNamespace: powerstore + driverNamespace: powermax pollInterval: 2m - name: powermax-nfs minSize: 5Gi rawBlock: false expansion: true - clone: true - snapshot: true + clone: false + snapshot: false RWX: true - RWOP: true + RWOP: false capacityTracking: - driverNamespace: powerstore + driverNamespace: powermax pollInterval: 2m {{}} @@ -280,7 +274,7 @@ storageClasses: clone: true snapshot: true RWX: true - RWOP: true + RWOP: false ephemeral: driver: csi-powerstore.dellemc.com fstype: "nfs" @@ -301,7 +295,7 @@ storageClasses: minSize: 3Gi rawBlock: true expansion: true - clone: false + clone: true snapshot: true RWX: false ephemeral: @@ -310,16 +304,16 @@ storageClasses: volumeAttributes: arrayId: "array-id" storagePool: pool-name - protocol: NFS + protocol: iSCSI size: 5Gi - name: unity-nfs minSize: 3Gi rawBlock: false expansion: true - clone: false + clone: true snapshot: true RWX: true - RWOP: true + RWOP: false ephemeral: driver: csi-unity.dellemc.com fstype: "nfs" @@ -374,10 +368,10 @@ If you are using the container image, the `cert-config` file must be mounted int {{< tabpane name="running-container-certify" lang="bash">}} {{}} - docker run --rm -it -v ~/.kube/config:/root/.kube/config -v /home/user/example-certify-config.yaml:/example-certify-config.yaml dellemc/cert-csi:v1.5.0 certify --cert-config /example-certify-config.yaml --vsc + docker run --rm -it -v ~/.kube/config:/root/.kube/config -v /home/user/example-certify-config.yaml:/example-certify-config.yaml quay.io/dell/container-storage-modules/cert-csi:v1.6.0 certify --cert-config /example-certify-config.yaml --vsc {{}} {{}} - podman run --rm -it -v ~/.kube/config:/root/.kube/config -v /home/user/example-certify-config.yaml:/example-certify-config.yaml dellemc/cert-csi:v1.5.0 certify --cert-config /example-certify-config.yaml --vsc + podman run --rm -it -v ~/.kube/config:/root/.kube/config -v /home/user/example-certify-config.yaml:/example-certify-config.yaml quay.io/dell/container-storage-modules/cert-csi:v1.6.0 certify --cert-config /example-certify-config.yaml --vsc {{}} {{< /tabpane >}} @@ -427,7 +421,7 @@ Run `cert-csi test scaling -h` for more options. 11. Verifies the checksum of the data. ```bash -cert-csi test snap --sc --vsc +cert-csi test snap --sc --vsc ``` Run `cert-csi test snap -h` for more options. @@ -476,7 +470,7 @@ Run `cert-csi test multi-attach-vol -h` for more options. 10. Verifies the replication group name on ersistent Volume Claims. ```bash -cert-csi test replication --sc --vsc +cert-csi test replication --sc --vsc ``` Run `cert-csi test replication -h` for more options. @@ -519,7 +513,7 @@ Run `cert-csi test expansion -h` for more options. 2. Creates Persistent Volume Claim. 3. If the specified storage class binding mode is not `WaitForFirstConsumer`, waits for Persistent Volume Claim to be bound to Persistent Volumes. 4. Creates Pod to consume the Persistent Volume Claim. -5. Writes data to the volume. +5. Writes data to the volume. 5. Creates a Volume Snapshot from the Persistent Volume Claim. 6. Waits for the Volume Snapshot to be Ready. 7. Create a Persistent Volume Claim with raw block volume mode from the Volume Snapshot. @@ -567,10 +561,10 @@ If you are using the container image, the `attr` file must be mounted into the c {{< tabpane name="running-container-ephemeral-volume" lang="bash">}} {{}} - docker run --rm -it -v ~/.kube/config:/root/.kube/config -v /home/user/ephemeral-config.properties:/ephemeral-config.properties dellemc/cert-csi:v1.5.0 test ephemeral-volume --driver --attr /ephemeral-config.properties + docker run --rm -it -v ~/.kube/config:/root/.kube/config -v /home/user/ephemeral-config.properties:/ephemeral-config.properties quay.io/dell/container-storage-modules/cert-csi:v1.6.0 test ephemeral-volume --driver --attr /ephemeral-config.properties {{}} {{}} - podman run --rm -it -v ~/.kube/config:/root/.kube/config -v /home/user/ephemeral-config.properties:/ephemeral-config.properties dellemc/cert-csi:v1.5.0 test ephemeral-volume --driver --attr /ephemeral-config.properties + podman run --rm -it -v ~/.kube/config:/root/.kube/config -v /home/user/ephemeral-config.properties:/ephemeral-config.properties quay.io/dell/container-storage-modules/cert-csi:v1.6.0 test ephemeral-volume --driver --attr /ephemeral-config.properties {{}} {{< /tabpane >}} @@ -659,7 +653,7 @@ To use this feature, run cert-csi with the option `--image-config /path/to/confi ## Kubernetes End-To-End Tests All Kubernetes end to end tests require that you provide the driver config based on the storage class you want to test and the version of the kubernetes you want to test against. These are the mandatory parameters that you can provide in command like.. ```bash - --driver-config and --version "v1.25.0" + --driver-config and --version "v1.25.0" ``` ### Running kubernetes end-to-end tests @@ -689,7 +683,7 @@ cert-csi k8s-e2e --config --driver-config ./cert-csi k8s-e2e --config "/root/.kube/config" --driver-config "/root/e2e_config/config-iscsi.yaml" --focus "External.Storage.*" --timeout "2h" --version "v1.25.0" --focus-file "capacity.go" ``` -### Interacting with DB +### Interacting with DB #### Generating report from runs without running tests @@ -728,7 +722,7 @@ Options: To generate report from multiple databases, run the command: ```bash cert-csi report --tr : --tr ... --tabular --xml -Supported report types: +Supported report types: --xml --tabular ``` @@ -757,7 +751,7 @@ Commands: To run tests with driver resource usage metrics enabled, run the command: ```bash -cert-csi test --sc <...> --ns +cert-csi test --sc <...> --ns ``` #### Running custom hooks from program @@ -809,4 +803,4 @@ Tabular Report example ### Resource usage example chart -![img9](./img/resourceUsage.png) \ No newline at end of file +![img9](./img/resourceUsage.png) diff --git a/content/v1/support/cert-csi/qualified.md b/content/v1/support/cert-csi/qualified.md index 48b50e526d..29bd439c82 100644 --- a/content/v1/support/cert-csi/qualified.md +++ b/content/v1/support/cert-csi/qualified.md @@ -11,4 +11,8 @@ description: Community Qualified Configurations | [Ticket 1177](https://github.com/dell/csm/issues/1177) | Ubuntu OS 22.04 | Amazon EKS (K8s 1.29) | PowerFlex | SCINI | CSI v2.9.2 | | [Ticket 1361](https://github.com/dell/csm/issues/1361) | RHCOS 4.12 | OpenShift 4.12 | PowerStore | iSCSI| CSI v2.8.0 | | [Ticket 1362](https://github.com/dell/csm/issues/1362) | RHCOS 4.12 | OpenShift 4.12 | PowerScale | NFS | CSI v2.8.0 | +| [Ticket 1441](https://github.com/dell/csm/issues/1441)
[Ticket 1462](https://github.com/dell/csm/issues/1462) | Ubuntu 20.04.x | MKE 3.6.13 | PowerScale,
PowerFlex | iSCSI | CSI v2.11.0 | +| [Ticket 1442](https://github.com/dell/csm/issues/1442) | RHCOS 4.14.92 | OKE 4.14.31 | PowerScale | iSCSI| CSI v2.11.0 | +| [Ticket 1456](https://github.com/dell/csm/issues/1456) | RHCOS 4.14.92 | OKE 4.14.31 | PowerFlex | iSCSI| CSI v2.11.0 | +| [Ticket 1590](https://github.com/dell/csm/issues/1590) | RHCOS 4.14 | OpenShift 4.14 | Unity 680F 5.4.0.0.5.094 | NFS | CSI v2.12.0 | {{}} diff --git a/content/v1/support/cli/_index.md b/content/v1/support/cli/_index.md index 6d19f04766..76ffd562d2 100644 --- a/content/v1/support/cli/_index.md +++ b/content/v1/support/cli/_index.md @@ -28,10 +28,9 @@ This document outlines all dellctl commands, their intended use, options that ca | [dellctl schedule create for-backup](#dellctl-schedule-create-for-backup) | Create a schedule for application backups | | [dellctl schedule delete](#dellctl-schedule-delete) | Delete schedules | | [dellctl schedule get](#dellctl-schedule-get) | Get schedules | -| [dellctl encryption rekey](#dellctl-encryption-rekey) | Rekey an encrypted volume | -| [dellctl encryption rekey-status](#dellctl-encryption-rekey-status) | Get status of an encryption rekey operation | | [dellctl images](#dellctl-images) | List the container images needed by csi driver | -| [dellctl volume get](#dellctl-volume-get) | Gets PowerFlex volume infomation for a given tenant on a local cluster | +| [dellctl volume get](#dellctl-volume-get) | Gets driver volume information for a given tenant on a local cluster | +| [dellctl snapshot get](#dellctl-snapshot-get) | Gets driver snapshot information for a given tenant on a local cluster | | [dellctl admin token](#dellctl-admin-token) | Generate an administrator token for administrating CSM Authorization v2 | | [dellctl generate token](#dellctl-generate-token) | Generate a tenant token for configuring a Dell CSI Driver with CSM Authorization v2 | @@ -810,58 +809,17 @@ NAME STATUS CREATED PAUSED SCHEDULE LAS schedule1 Enabled 2022-11-04 08:33:35 +0000 UTC false @every 1h NA ``` -### dellctl encryption rekey -Encryption rekey with a name for the rekey object and volume name of an encrypted volume - -##### Flags - -``` - --cluster-id string Id of the cluster managed by dellctl - -h, --help help for get -``` - - -##### Output - - -```bash -dellctl encryption rekey myrekey k8s-5d2cc565d4 -``` -``` - INFO rekey request "myrekey" submitted successfully for persistent volume "k8s-5d2cc565d4". - INFO Run 'dellctl encryption rekey-status myrekey' for more details. -``` - - -### dellctl encryption rekey-status - -Encryption rekey status with name of the rekey object - -##### Flags - -``` - --cluster-id string Id of the cluster managed by dellctl - -h, --help help for get -``` - - -##### Output +--- -```bash -dellctl encryption rekey-status myrekey -``` -``` - INFO Status of rekey request myrekey = completed -``` ### dellctl images List the container images needed by csm components **NOTE.**: -# Supported CSM Components +#### Supported CSM Components [csi-vxflexos,csi-isilon,csi-powerstore,csi-unity,csi-powermax,csm-authorization] @@ -887,23 +845,7 @@ dellctl images --component csi-vxflexos ``` ``` Driver/Module Image Supported Orchestrator Versions Sidecar Images -dellemc/csi-vxflexos:v2.9.0 k8s1.28,k8s1.27,k8s1.26,ocp4.14,ocp4.13 registry.k8s.io/sig-storage/csi-attacher:v4.4.2 - registry.k8s.io/sig-storage/csi-provisioner:v3.6.2 - registry.k8s.io/sig-storage/csi-external-health-monitor-controller:v0.10.0 - registry.k8s.io/sig-storage/csi-snapshotter:v6.3.2 - registry.k8s.io/sig-storage/csi-resizer:v1.9.2 - registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.9.1 - dellemc/sdc:4.5 - -dellemc/csi-vxflexos:v2.8.0 k8s1.27,k8s1.26,k8s1.25,ocp4.13,ocp4.12 registry.k8s.io/sig-storage/csi-attacher:v4.3.0 - registry.k8s.io/sig-storage/csi-provisioner:v3.5.0 - registry.k8s.io/sig-storage/csi-external-health-monitor-controller:v0.9.0 - registry.k8s.io/sig-storage/csi-snapshotter:v6.2.2 - registry.k8s.io/sig-storage/csi-resizer:v1.8.0 - registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.8.0 - dellemc/sdc:3.6.1 - -dellemc/csi-vxflexos:v2.7.0 k8s1.27,k8s1.26,k8s1.25,ocp4.12,ocp4.11 registry.k8s.io/sig-storage/csi-attacher:v4.3.0 +quay.io/dell/container-storage-modules/csi-vxflexos:v2.12.0 k8s1.31,k8s1.30,k8s1.29,ocp4.17,ocp4.16 registry.k8s.io/sig-storage/csi-attacher:v4.3.0 registry.k8s.io/sig-storage/csi-provisioner:v3.5.0 registry.k8s.io/sig-storage/csi-external-health-monitor-controller:v0.9.0 registry.k8s.io/sig-storage/csi-snapshotter:v6.2.2 @@ -918,28 +860,21 @@ dellctl images --component csm-authorization ``` ``` Driver/Module Image Supported Orchestrator Versions Sidecar Images -dellemc/csm-authorization-sidecar:v1.9.0 k8s1.28,k8s1.27,k8s1.26 jetstack/cert-manager-cainjector:v1.6.1 +quay.io/dell/container-storage-modules/csm-authorization-sidecar:v1.12.0 k8s1.31,k8s1.30,k8s1.29 jetstack/cert-manager-cainjector:v1.6.1 jetstack/cert-manager-controller:v1.6.1 jetstack/cert-manager-webhook:v1.6.1 ingress-nginx/controller:v1.4.0 ingress-nginx/kube-webhook-certgen:v20220916-gd32f8c343 +``` + + +--- -dellemc/csm-authorization-sidecar:v1.8.0 k8s1.27,k8s1.26,k8s1.25 jetstack/cert-manager-cainjector:v1.6.1 - jetstack/cert-manager-controller:v1.6.1 - jetstack/cert-manager-webhook:v1.6.1 - ingress-nginx/controller:v1.4.0 - ingress-nginx/kube-webhook-certgen:v20220916-gd32f8c343 -dellemc/csm-authorization-sidecar:v1.7.0 k8s1.27,k8s1.26,k8s1.25 jetstack/cert-manager-cainjector:v1.6.1 - jetstack/cert-manager-controller:v1.6.1 - jetstack/cert-manager-webhook:v1.6.1 - ingress-nginx/controller:v1.4.0 - ingress-nginx/kube-webhook-certgen:v20220916-gd32f8c343 -``` ### dellctl volume get -Gets PowerFlex volume infomation for a given tenant on a local cluster +Gets the drivers volume information from the authorization proxy for a given tenant on a local cluster ##### Aliases get, ls, list @@ -955,24 +890,63 @@ Gets PowerFlex volume infomation for a given tenant on a local cluster ##### Output -Gets PowerFlex volume infomation for a given tenant on a local cluster. The namespace is the namespace where tenant secret is created. - ->Note: This was output was generated using Authorization Proxy version 1.5.1. Please ensure you are using version 1.5.1 or greater. +Gets the drivers volume information for a given tenant on a local cluster. The namespace is the namespace where tenant secret is created. ```bash -dellctl volume get --proxy --namespace vxflexos +dellctl volume get --proxy --namespace ``` ``` # dellctl volume get --proxy --namespace vxflexos +NAME VOLUME ID SIZE POOL SYSTEM ID PV NAME PV STATUS STORAGE CLASS PVC NAME NAMESPACE SNAPSHOT COUNT +tn1-k8s-82b35df793 c6c98e30000000d3 8.000000 pool1 636468e3638c840f 0 +tn1-k8s-e0e7958ee0 c6cf35ba000001a3 8.000000 pool1 636468e3638c840f k8s-e0e7958ee0 Bound vxflexos pvol-vxflexos default 2 +tn1-k8s-bc83d4c626 c6cf35c1000001a1 8.000000 pool1 636468e3638c840f k8s-bc83d4c626 Bound vxflexos vol-create-test-xbgnr snap-test-057de678 3 +``` + + +--- + + + +### dellctl snapshot get + +Gets the drivers snapshot information from the authorization proxy for a given tenant on a local cluster + +##### Aliases + get, ls, list + +##### Flags + +``` + -h, --help help for get + --insecure optionalBool[=true] provide flag to skip certificate validation + --namespace string namespace of the secret for the given tenant + --proxy string auth proxy endpoint to use +``` + +##### Output + +Get the drivers snapshot information for a given tenant on a local cluster. The namespace is the namespace where the tenant secret is created. + +```bash +dellctl snapshot get --proxy --namespace +``` +``` +# dellctl snapshot get --proxy --namespace vxflexos +NAME SNAPSHOT ID SIZE POOL SYSTEM ID ACCESS MODE SOURCE VOLUME ID +tn1-sn-8e51dfa6-6f64-4cac-a776- c6cf35c4000001aa 8.000000 pool1 636468e3638c840f ReadWrite c6cf35c1000001a1 +tn1-sn-27ff7d0c-b60d-4f5d-be2e- c6cf35c2000001a2 8.000000 pool1 636468e3638c840f ReadWrite c6cf35c1000001a1 +tn1-sn-85e32ce4-379b-4a9e-948b- c6cf35c3000001a9 8.000000 pool1 636468e3638c840f ReadWrite c6cf35c1000001a1 +tn1-sn-59c272f4-babd-4e24-951a- c6cf35bb000001a4 8.000000 pool1 636468e3638c840f ReadWrite c6cf35ba000001a3 +tn1-sn-2d1580a4-60ec-4082-8234- c6cf35bc000001a6 8.000000 pool1 636468e3638c840f ReadWrite c6cf35ba000001a3 -NAME VOLUME ID SIZE POOL SYSTEM ID PV NAME PV STATUS STORAGE CLASS PVC NAME NAMESPACE -k8s-e7c8b39112 a69bf18e00000008 8.000000 mypool 636468e3638c840f k8s-e7c8b39112 Released vxflexos demo-claim10 default -k8s-e6e2b46103 a69bf18f00000009 8.000000 mypool 636468e3638c840f k8s-e6e2b46103 Bound vxflexos demo-claim11 default -k8s-b1abb817d3 a69bf19000000001 8.000000 mypool 636468e3638c840f k8s-b1abb817d3 Bound vxflexos demo-claim13 default -k8s-28e4184f41 c6b2280d0000009a 8.000000 mypool 636468e3638c840f k8s-28e4184f41 Available local-storage -k8s-7296621062 a69b554f00000004 8.000000 mypool 636468e3638c840f ``` + +--- + + + ### dellctl admin token Generate an administrator token for administrating CSM Authorization v2 @@ -1001,6 +975,11 @@ dellctl admin token -n --jwt-signing-secret - Obtain trial License for Tech-preview of Dell Container Storage Modules (CSM) ---- - -The tech-preview releases of [Container Storage Modules](https://github.com/dell/csm) for Encryption require a license. This section details how to request a license. - -## Requesting a License -1. Request a license using the [Container Storage Modules License Request](https://app.smartsheet.com/b/form/5e46fad643874d56b1f9cf4c9f3071fb) by providing these details: -- **Full Name**: Full name of the person requesting the license -- **Email Address**: The license will be emailed to this email address -- **Company / Organization**: Company or organization where the license will be used -- **License Type**: Select *Encryption*. -- **List of kube-system namespace UIDs**: The license will only function on the provided list of Kubernetes clusters. Find the UID of the kube-system namespace using `kubectl get ns kube-system -o yaml` or similar `oc` command. Provide as a comma separated list of UIDs. -- (Optional) **Send me a copy of my responses**: A copy of the license request will be sent to the provided email address -2. After submitting the form, a response will be provided within several business days with an attachment containing the license. -3. Refer to the specific CSM module documentation for adding the license to the Kubernetes cluster. \ No newline at end of file diff --git a/content/v1/support/release/_index.md b/content/v1/support/release/_index.md index 22ee98c129..8a10b18d9b 100644 --- a/content/v1/support/release/_index.md +++ b/content/v1/support/release/_index.md @@ -10,7 +10,9 @@ Release notes for Container Storage Modules: [CSI Drivers](../../csidriver/release) -[CSM for Authorization](../../authorization/v1.x-ga/release) +[CSM for Authorization v1.x](../../authorization/v1.x/release) + +[CSM for Authorization v2.x](../../authorization/v2.x/release) [CSM for Observability](../../observability/release) @@ -18,8 +20,6 @@ Release notes for Container Storage Modules: [CSM for Resiliency](../../resiliency/release) -[CSM for Encryption](../../secure/encryption/release) - [CSM for Application Mobility](../../applicationmobility/release) [CSM Operator](../../deployment/csmoperator/release) diff --git a/content/v1/support/troubleshooting/_index.md b/content/v1/support/troubleshooting/_index.md index 738c24133f..3ff5de6296 100644 --- a/content/v1/support/troubleshooting/_index.md +++ b/content/v1/support/troubleshooting/_index.md @@ -10,7 +10,9 @@ Troubleshooting links for Container Storage Modules: [CSI Drivers](../../csidriver/troubleshooting) -[CSM for Authorization](../../authorization/v1.x-ga/troubleshooting) +[CSM for Authorization v1.x](../../authorization/v1.x/troubleshooting) + +[CSM for Authorization v2.x](../../authorization/v2.x/troubleshooting) [CSM for Observability](../../observability/troubleshooting) @@ -18,6 +20,4 @@ Troubleshooting links for Container Storage Modules: [CSM for Resiliency](../../resiliency/troubleshooting) -[CSM for Encryption](../../secure/encryption/troubleshooting) - [CSM Operator](../../deployment/csmoperator/troubleshooting) diff --git a/content/v2/_index.md b/content/v2/_index.md index 7fadd25cda..aacc25bd27 100644 --- a/content/v2/_index.md +++ b/content/v2/_index.md @@ -30,7 +30,7 @@ CSM is made up of multiple components including modules (enterprise capabilities {{% /cardpane %}} {{% cardpane %}} {{< card header="[**Resiliency**](resiliency/)" - footer="Supports [PowerFlex](csidriver/features/powerflex/) [PowerScale](csidriver/features/powerscale/) [Unity](csidriver/features/unity/) [PowerStore](csidriver/features/powerstore/)">}} + footer="Supports [PowerFlex](csidriver/features/powerflex/) [PowerScale](csidriver/features/powerscale/) [Unity](csidriver/features/unity/) [PowerStore](csidriver/features/powerstore/) [PowerMax](csidriver/features/powermax/)">}} CSM for Resiliency is designed to make Kubernetes Applications, including those that utilize persistent storage, more resilient to various failures. [...Learn more](resiliency/) {{< /card >}} @@ -42,8 +42,8 @@ CSM is made up of multiple components including modules (enterprise capabilities {{% /cardpane %}} {{% cardpane %}} {{< card header="[**Application Mobility**](applicationmobility/)" - footer="Supports all platforms">}} - Container Storage Modules for Application Mobility provide Kubernetes administrators the ability to clone their stateful application workloads and application data to other clusters, either on-premise or in the cloud. + footer="Supports [PowerFlex](csidriver/features/powerflex/) via Apex Navigator for Kubernetes">}} + Container Storage Modules for Application Mobility provide Kubernetes administrators the ability to clone their stateful application workloads and application data to other clusters in the cloud. [...Learn more](applicationmobility/) {{< /card >}} {{< card header="[**Encryption**](secure/encryption)" @@ -54,8 +54,8 @@ CSM is made up of multiple components including modules (enterprise capabilities {{% /cardpane %}} {{% cardpane %}} {{< card header="[License](support/license/)" - footer="Required for [Application Mobility](applicationmobility/) & [Encryption](secure/encryption/)">}} - The tech-preview releases of Application Mobility and Encryption require a license. + footer="Required for [Encryption](secure/encryption/)">}} + The tech-preview releases of Encryption require a license. Request a license using the [Container Storage Modules License Request](https://app.smartsheet.com/b/form/5e46fad643874d56b1f9cf4c9f3071fb) by providing the requested details. [...Learn more](support/license/) {{< /card >}} diff --git a/content/v2/applicationmobility/_index.md b/content/v2/applicationmobility/_index.md index ea727cc4d1..bc5913b636 100644 --- a/content/v2/applicationmobility/_index.md +++ b/content/v2/applicationmobility/_index.md @@ -7,13 +7,9 @@ Description: > --- {{% pageinfo color="primary" %}} -Application Mobility is available with [APEX Navigator for Kubernetes](https://www.dell.com/en-ca/dt/apex/storage/public-cloud/navigator.htm#kubernetes) for US-based customers +Application Mobility is available with [APEX Navigator for Kubernetes](https://www.dell.com/en-ca/dt/apex/storage/public-cloud/navigator.htm#kubernetes) {{% /pageinfo %}} ->> NOTE: This tech-preview release is not intended for use in production environment. - ->> NOTE: Application Mobility requires a time-based license. See [Deployment](../deployment/helm/modules/installation/applicationmobility/) for instructions. - Container Storage Modules for Application Mobility provide Kubernetes administrators the ability to clone their stateful application workloads and application data to other clusters, either on-premise or in the cloud. Application Mobility uses [Velero](https://velero.io) and its integration of [Restic](https://restic.net) to copy both application metadata and data to object storage. When a backup is requested, Application Mobility uses these options to determine how the application data is backed up: diff --git a/content/v2/applicationmobility/release/_index.md b/content/v2/applicationmobility/release/_index.md index b252668f77..75bbfe9842 100644 --- a/content/v2/applicationmobility/release/_index.md +++ b/content/v2/applicationmobility/release/_index.md @@ -5,19 +5,21 @@ weight: 5 Description: > Release Notes --- +{{% pageinfo color="primary" %}} +Application Mobility is available with [APEX Navigator for Kubernetes](https://www.dell.com/en-ca/dt/apex/storage/public-cloud/navigator.htm#kubernetes) +{{% /pageinfo %}} + +## Release Notes - CSM Application Mobility v1.1.0 -## Release Notes - CSM Application Mobility v1.0.2 ### New Features/Changes -Adds support for object stores using https +- [#1359 - [FEATURE]: Add Support for OpenShift Container Platform (OCP) 4.16 ](https://github.com/dell/csm/issues/1359) +- [#1400 - [FEATURE]: Support for Kubernetes 1.30](https://github.com/dell/csm/issues/1400) ### Fixed Issues -- Fixed backup sync issue where it was deleting all the backups, when it sees more than one BSLs -- Fixed the issue in the backup path where podvolumebackup objects were not created for volumes belonging to pods with the same name across namespace. -- Fixed the issue in the restore plugin. - +- [#1299 - [BUG]: Images of application mobility velero plugin and controller is not setting the correct image to the latest ](https://github.com/dell/csm/issues/1299) ### Known Issues diff --git a/content/v2/applicationmobility/troubleshooting.md b/content/v2/applicationmobility/troubleshooting.md deleted file mode 100644 index 93bea855d0..0000000000 --- a/content/v2/applicationmobility/troubleshooting.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: "Troubleshooting" -linkTitle: "Troubleshooting" -weight: 4 -Description: > - Troubleshooting ---- - -## Frequently Asked Questions -1. [How can I diagnose an issue with Application Mobility?](#how-can-i-diagnose-an-issue-with-application-mobility) -2. [How can I view logs?](#how-can-i-view-logs) -3. [How can I debug and troubleshoot issues with Kubernetes?](#how-can-i-debug-and-troubleshoot-issues-with-kubernetes) -4. [Why are there error logs about a license?](#why-are-there-error-logs-about-a-license) - -### How can I diagnose an issue with Application Mobility? - -Once you have attempted to install Application Mobility to your Kubernetes or OpenShift cluster, the first step in troubleshooting is locating the problem. - -Get information on the state of your Pods. -```console -kubectl get pods -n $namespace -``` -Get verbose output of the current state of a Pod. -```console -kubectl describe pod -n $namespace $pod -``` -### How can I view logs? - -View pod container logs. Output logs to a file for further debugging. -```console -kubectl logs -n $namespace $pod $container -kubectl logs -n $namespace $pod $container > $logFileName -``` - -### How can I debug and troubleshoot issues with Kubernetes? - -* To debug your application that may not be behaving correctly, please reference Kubernetes [troubleshooting applications guide](https://kubernetes.io/docs/tasks/debug-application-cluster/debug-application/). - -* For tips on debugging your cluster, please see this [troubleshooting guide](https://kubernetes.io/docs/tasks/debug-application-cluster/debug-cluster/). - -### Why are there error logs about a license? - -Application Mobility requires a license in order to function. See the [Deployment](../../deployment/helm/modules/installation/applicationmobility/) instructions for steps to request a license. - -There will be errors in the logs about the license for these cases: -- License does not exist -- License is not valid for the current Kubernetes cluster -- License has expired \ No newline at end of file diff --git a/content/v2/authorization/_index.md b/content/v2/authorization/_index.md index 04dc1f89d4..a1b5c26051 100644 --- a/content/v2/authorization/_index.md +++ b/content/v2/authorization/_index.md @@ -6,7 +6,7 @@ Description: > Dell Technologies (Dell) Container Storage Modules (CSM) for Authorization --- -[Container Storage Modules](https://github.com/dell/csm) (CSM) for Authorization is part of the open-source suite of Kubernetes storage enablers for Dell products. +[Container Storage Modules](https://github.com/dell/csm) (CSM) for Authorization is part of the open-source suite of Kubernetes storage enablers for Dell products. CSM for Authorization provides storage and Kubernetes administrators the ability to apply RBAC for Dell CSI Drivers. It does this by deploying a proxy between the CSI driver and the storage system to enforce role-based access and usage rules. @@ -14,55 +14,4 @@ Storage administrators of compatible storage platforms will be able to apply quo Kubernetes administrators will have an interface to create, delete, and manage roles/groups that storage rules may be applied. Administrators and/or users may then generate authentication tokens that may be used by tenants to use storage with proper access policies being automatically enforced. -The following diagram shows a high-level overview of CSM for Authorization with a `tenant-app` that is using a CSI driver to perform storage operations through the CSM for Authorization `proxy-server` to access the a Dell storage system. All requests from the CSI driver will contain the token for the given tenant that was granted by the Storage Administrator. - -![CSM for Authorization](./karavi-authorization-example.png "CSM for Authorization") - -## CSM for Authorization Capabilities -{{}} -| Feature | PowerFlex | PowerMax | PowerScale | Unity XT | PowerStore | -| - | - | - | - | - | - | -| Ability to set storage quota limits to ensure k8s tenants are not overconsuming storage | Yes | Yes | No (natively supported) | No | No | -| Ability to create access control policies to ensure k8s tenant clusters are not accessing storage that does not belong to them | Yes | Yes | No (natively supported) | No | No | -| Ability to shield storage credentials from Kubernetes administrators ensuring credentials are only handled by storage admins | Yes | Yes | Yes | No | No | -{{
}} - -**NOTE:** PowerScale OneFS implements its own form of Role-Based Access Control (RBAC). CSM for Authorization does not enforce any role-based restrictions for PowerScale. To configure RBAC for PowerScale, refer to the PowerScale OneFS [documentation](https://www.dell.com/support/home/en-us/product-support/product/isilon-onefs/docs). - -## Authorization Components Support Matrix -CSM for Authorization consists of 2 components - The authorization sidecar, bundled with the driver, communicates with the Authorization proxy server to validate access to Storage platforms. The authorization sidecar is backward compatible with older Authorization proxy server versions. However, it is highly recommended to have the Authorization proxy server and sidecar installed from the same release of CSM. - -**NOTE:** If the deployed CSI driver has a number of controller pods equal to the number of schedulable nodes in your cluster, CSM for Authorization may not be able to inject properly into the driver's controller pod. -To resolve this, please refer to our [troubleshooting guide](./troubleshooting) on the topic. - -## Roles and Responsibilities - -The CSM for Authorization CLI can be executed in the context of the following roles: -- Storage Administrators -- Kubernetes Tenant Administrators - -### Storage Administrators - -Storage Administrators can perform the following operations within CSM for Authorization - -- Tenant Management (create, get, list, delete, bind roles, unbind roles) -- Token Management (generate, revoke) -- Storage System Management (create, get, list, update, delete) -- Storage Access Roles Management (assign to a storage system with an optional quota) - -### Tenant Administrators - -Tenants of CSM for Authorization can use the token provided by the Storage Administrators in their storage requests. - -### Workflow - -1) Tenant Admin requests storage from a Storage Admin. -2) Storage Admin uses CSM Authorization CLI to:
- a) Create a tenant resource.
- b) Create a role permitting desired storage access.
- c) Assign the role to the tenant and generate a token.
-3) Storage Admin returns a token to the Tenant Admin. -4) Tenant Admin inputs the Token into their Kubernetes cluster as a Secret. -5) Tenant Admin updates CSI driver with CSM Authorization sidecar module. - -![CSM for Authorization Workflow](./design2.png "CSM for Authorization Workflow") +Currently, we have two versions of Authorization, **v1.x GA** and **v2.0 Tech Preview**. \ No newline at end of file diff --git a/content/v2/authorization/release/_index.md b/content/v2/authorization/release/_index.md deleted file mode 100644 index 7f187338c5..0000000000 --- a/content/v2/authorization/release/_index.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: "Release notes" -linkTitle: "Release notes" -weight: 6 -Description: > - Dell Container Storage Modules (CSM) release notes for authorization ---- - -## Release Notes - CSM Authorization 1.10.1 - - - - - - - - -### New Features/Changes - -- [#1284 - [FEATURE]: Support for Openshift 4.15](https://github.com/dell/csm/issues/1284) -- [#926 - [FEATURE]: Fixing the linting, formatting and vetting issues](https://github.com/dell/csm/issues/926) - -### Fixed Issues - - -### Known Issues -| Issue | Workaround | -|-------|------------| -| CSM Operator does not support dynamic namespaces for Authorization. Despite successful installation in a namespace other than "authorization", errors may arise during volume creation. | Use the default namespace "authorization" for installing Authorization using CSM Operator| diff --git a/content/v2/authorization/Backup and Restore/_index.md b/content/v2/authorization/v1.x GA/Backup and Restore/_index.md similarity index 100% rename from content/v2/authorization/Backup and Restore/_index.md rename to content/v2/authorization/v1.x GA/Backup and Restore/_index.md diff --git a/content/v1/authorization/v1.x GA/Backup and Restore/helm/_index.md b/content/v2/authorization/v1.x GA/Backup and Restore/helm/_index.md similarity index 100% rename from content/v1/authorization/v1.x GA/Backup and Restore/helm/_index.md rename to content/v2/authorization/v1.x GA/Backup and Restore/helm/_index.md diff --git a/content/v1/authorization/v1.x GA/Backup and Restore/rpm/_index.md b/content/v2/authorization/v1.x GA/Backup and Restore/rpm/_index.md similarity index 100% rename from content/v1/authorization/v1.x GA/Backup and Restore/rpm/_index.md rename to content/v2/authorization/v1.x GA/Backup and Restore/rpm/_index.md diff --git a/content/v1/authorization/v1.x GA/_index.md b/content/v2/authorization/v1.x GA/_index.md similarity index 100% rename from content/v1/authorization/v1.x GA/_index.md rename to content/v2/authorization/v1.x GA/_index.md diff --git a/content/v1/authorization/v1.x GA/cli.md b/content/v2/authorization/v1.x GA/cli.md similarity index 100% rename from content/v1/authorization/v1.x GA/cli.md rename to content/v2/authorization/v1.x GA/cli.md diff --git a/content/v1/authorization/v2.0 Tech Preview/configuration/_index.md b/content/v2/authorization/v1.x GA/configuration/_index.md similarity index 100% rename from content/v1/authorization/v2.0 Tech Preview/configuration/_index.md rename to content/v2/authorization/v1.x GA/configuration/_index.md diff --git a/content/v1/authorization/v1.x GA/configuration/powerflex/_index.md b/content/v2/authorization/v1.x GA/configuration/powerflex/_index.md similarity index 100% rename from content/v1/authorization/v1.x GA/configuration/powerflex/_index.md rename to content/v2/authorization/v1.x GA/configuration/powerflex/_index.md diff --git a/content/v1/authorization/v1.x GA/configuration/powermax/_index.md b/content/v2/authorization/v1.x GA/configuration/powermax/_index.md similarity index 100% rename from content/v1/authorization/v1.x GA/configuration/powermax/_index.md rename to content/v2/authorization/v1.x GA/configuration/powermax/_index.md diff --git a/content/v1/authorization/v1.x GA/configuration/powerscale/_index.md b/content/v2/authorization/v1.x GA/configuration/powerscale/_index.md similarity index 100% rename from content/v1/authorization/v1.x GA/configuration/powerscale/_index.md rename to content/v2/authorization/v1.x GA/configuration/powerscale/_index.md diff --git a/content/v2/authorization/configuration/proxy-server/_index.md b/content/v2/authorization/v1.x GA/configuration/proxy-server/_index.md similarity index 100% rename from content/v2/authorization/configuration/proxy-server/_index.md rename to content/v2/authorization/v1.x GA/configuration/proxy-server/_index.md diff --git a/content/v2/authorization/design.md b/content/v2/authorization/v1.x GA/design.md similarity index 100% rename from content/v2/authorization/design.md rename to content/v2/authorization/v1.x GA/design.md diff --git a/content/v2/authorization/design1.png b/content/v2/authorization/v1.x GA/design1.png similarity index 100% rename from content/v2/authorization/design1.png rename to content/v2/authorization/v1.x GA/design1.png diff --git a/content/v2/authorization/design2.png b/content/v2/authorization/v1.x GA/design2.png similarity index 100% rename from content/v2/authorization/design2.png rename to content/v2/authorization/v1.x GA/design2.png diff --git a/content/v2/authorization/karavi-authorization-example.png b/content/v2/authorization/v1.x GA/karavi-authorization-example.png similarity index 100% rename from content/v2/authorization/karavi-authorization-example.png rename to content/v2/authorization/v1.x GA/karavi-authorization-example.png diff --git a/content/v1/authorization/v1.x GA/release/_index.md b/content/v2/authorization/v1.x GA/release/_index.md similarity index 100% rename from content/v1/authorization/v1.x GA/release/_index.md rename to content/v2/authorization/v1.x GA/release/_index.md diff --git a/content/v1/authorization/v1.x GA/troubleshooting.md b/content/v2/authorization/v1.x GA/troubleshooting.md similarity index 100% rename from content/v1/authorization/v1.x GA/troubleshooting.md rename to content/v2/authorization/v1.x GA/troubleshooting.md diff --git a/content/v1/authorization/v2.0 Tech Preview/_index.md b/content/v2/authorization/v2.0 Tech Preview/_index.md similarity index 100% rename from content/v1/authorization/v2.0 Tech Preview/_index.md rename to content/v2/authorization/v2.0 Tech Preview/_index.md diff --git a/content/v2/authorization/v2.0 Tech Preview/authorization-ha-example.png b/content/v2/authorization/v2.0 Tech Preview/authorization-ha-example.png new file mode 100644 index 0000000000000000000000000000000000000000..5b8efc09e467690cf7bf9bffb29050d16c5cd234 GIT binary patch literal 121616 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

9e65;s-;dr78p?CQ-yZHuEW3{Auhhm$yy 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 literal 0 HcmV?d00001 diff --git a/content/v2/authorization/configuration/_index.md b/content/v2/authorization/v2.0 Tech Preview/configuration/_index.md similarity index 100% rename from content/v2/authorization/configuration/_index.md rename to content/v2/authorization/v2.0 Tech Preview/configuration/_index.md diff --git a/content/v1/authorization/v2.0 Tech Preview/configuration/powerflex/_index.md b/content/v2/authorization/v2.0 Tech Preview/configuration/powerflex/_index.md similarity index 100% rename from content/v1/authorization/v2.0 Tech Preview/configuration/powerflex/_index.md rename to content/v2/authorization/v2.0 Tech Preview/configuration/powerflex/_index.md diff --git a/content/v1/authorization/v2.0 Tech Preview/configuration/proxy-server/_index.md b/content/v2/authorization/v2.0 Tech Preview/configuration/proxy-server/_index.md similarity index 100% rename from content/v1/authorization/v2.0 Tech Preview/configuration/proxy-server/_index.md rename to content/v2/authorization/v2.0 Tech Preview/configuration/proxy-server/_index.md diff --git a/content/v2/authorization/v2.0 Tech Preview/image.png b/content/v2/authorization/v2.0 Tech Preview/image.png new file mode 100644 index 0000000000000000000000000000000000000000..d21d835580df2ad532372db677c3b209f70c4cdd GIT binary patch literal 178897 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%0D?-|3W0y#j$$V@ zD0T0q&hT7%6kdUXf8UP|%0pt-K>(YRgfau9HrAe zSc2q5;rSpnFa4s>>@=uX^n7&}q>4S4fquV1sU>&SxAVSPaKGFu~5>*gZWSI|Rb9(rA z{Gxln2=A~<&-iUj7ZxGiW4p~GgR!{_}nT;f~v(UJxNxc3$ zzI80i?gFUacpb)J-GiYx-aw+u@Jupew>#PE*!t5OPC$v;V)`F<-K_IjW%33?;Urak zt`lW|)5|C;sQ+=}Lf_uE^(C=?<6X)bf#a9{k5&f0!G=9fSsAqx0^7XsMn1gf1t?Cu z{u^Y`SafOry)t&F?hQ()(6taKaKbidisqIHqwJomOK_BaN zmODv`n9+}xSXgC*hXY~0wrf4kYZ5qMna73Xvy4V1P{2(u<6@|74`>p0)d}Qt5dBCw3JF0LJq_fm4zYAjkLv z0Pz)|c_Y4kKGkgtJ-{OsU{M&Ewn??Ur3bK1cYbAQ2B4{*4W^Sko&j2TV+62TQh@7f z^#Bm;m&P>3>>CJn+@mzWSB(P=A!?#)iGln33_4H3E`0#- zYzrWkY5gJQ!`?z4>doxzEr&BiHXMQNGMX3j-`ID#DWnE)RMNV^>#o*pg(Y+EMT zEq-6Wk-XcjRY5TFqq%2-L)I(6MTKNncnI4p3JdJHy}_K`na`hBM|S7i_tOEo2|(Bz zT-^`u;>WyJgKKKvXyU(V>`kT&Tcis+00DlES-=Lb?FZhqX`Tfb7-&RDvBvCJ@N)HP z^eE`{w>^-pECL`jg68^$i=eXBydnT8#Z$I?YPijFkF7|OY6p{#(@}uLR(cj7gS%Tk zm!)$T>3aZJ%=D!LpYSNdJQj?9lL=t#fSl#r{41y|iboBY-8`D6vl49PE0s(Z@eL^7(rI*P^38a2Aff*0-8p0M3FfWs6TV_sHFzsH zkK2e6ejkA*h_ACBLC`i(>+SmBdZdsqh|$=(Tq+v>d|q^*Azw$tq6-x7IU(k?)=QEF*cHOJwXi6fFoT@u7TfmTn`? z-AgS0e5^$fSVucQ;@foo>C8Vf^KaSVU%mVH>x%RwV>S#7%=-Ce|Jl`*y5a1rbM zJv1R9q0eu!7W%3mXSLna+YwbxV>Tn1wv{8lVnQO4jprw+v^o8lclLa<%tEWjBX}bgNoX7a2>CIiX0I`BT8AkpDC_haf2geL`2>Z@Yt0-jLiJeV-Qt9pCq)m zxBpxIS#SRH?a4CLZDwrF+4*^Al}Uf)w|!Mc?Mji`XrA51TYlz|nii`m>NhRfz`)>v z31;Kuq+G~+s~?}kVoZIL9W-4amy8aGoQ8)UkWf&LfbLB6@f*CNqT<73J=|gUAps6f zXmBv}+Z?O{3k#5u;{Ib{WeR#JxBL2B9nPYmkqZ4yM(irZgb+?2)z+_l7jAJ+0HjJrN9fzdbOK($C$QlgU zdYL!(wcS>5$H*Tpw8)vEA;xAZ7d|4XdAW#O5+o{@NRV$0C*$5by%(=S>>$@cmc2uhuC?o2Itl9vU|7HNO;z zL&zb6w10%;xC<8J=?z2p?nsar6+zy9EMH2q2b}BiQs^(j9g_wB&|>u~uctE;kH4ul z(av^k38PmZ5G~C=`$`s&%C?w6FyWne6@Bqu&x)%lLeTse4wn{NwVr&9Juzo-QQ>XH z(t^NCKB}xz%kSw9FD4aej3?al2;|0pCD=oL0piJ*$dl*j;khakHqR@|Z-AQH{&a!l zv@`O%hn#_-6wS43etP;npe2fjVNxkKI2ZwXhqywA+K+`M7Y1sDw0xnz1Ia8|h-m%X z+}MS*+4%VQIRL2IYl!5*%d+qy76Z>n9Wsr~oA%Qx<3AvKb`oa}p@43HcK#y@LDIjT zrzO*U4|YQ7{OUJPOO{Z;?RMRsA&)ToHeCb`1IzjXCCi=rzVGfwlFX*|%rjJE>Ammh z_g#nZ<{+lXnCj=qoJW%G=fs_8V{{KULQOZi@UD5Myib?=DeaFG<-8tU44jB;6DmJY zF9V9EG&1xjkcfwUqF&z@hwMa@Idm(vBVjt?H+yMHTrX{pTWt#Rws1i(yghs7Fo6|i zpiN3(gA`iFs9A>ha<_@bXxK&sI5%B@7?7alY-*Z6B;#{;W>oui8WG_3y=$F8j;AYv z&m{hjx2Fs$)kfW+vfsS)lsV_xe40PTKtREMa##EZG=V;_b6Vky+t}Jxd0u}#T57~< zYik3djC+*8a*X4spG4tP;)GQ)O{VXFBB4rhRgRWZ5m3Hgaje z#_E&5{eeO!;-a#|fuB!6u~$PC2<5BAGqxf2am<8Q)>`UIQ6yzHL=GH{$%tFyxeF;r z%D|@dz?y^8WltE^kXpy&q-qN&ga?umhDgv;U7f2Yyi(hlWx3N6;WArE9P&v+&=w&vt`|k4`cblFJR<;A!o`?3-4oM z>n8yUl9RqroW|HkKQk4VzXuPSZl7C+7G9X7Y-@Xa_XYj# zM7VBkn;^_nXozf;j1KoSEpN8n z?pkh?uXy+Zr?igN_6Vc)cKfo=e|YYMe|MeXwfNmE)O6^1a`2hA={p5Qh*SiM4aC~%>;9!c!o}8(KMk3G=f`t3+)CPyw?IdF%Y5gzqI``5Iu>Zcw?2C)e zgc&#qWP;E<$5oc{W{Cv5R09_$(j)nX?s%wovbt$`KYlEUjl@RB?>f&CIMYsk^8=J) zkS_;J;{HN&&Lp<;@$!-Zzj|4_Z45JMa6>5+QHLAQtgWr5LD)L;R%Sj}VHZmA*1S1!7~zW(9(%4+$swV>d^O?DUj@v=onIJC)B_;6z*@NySi z`tiI;u0epD5(qaO$u0lEnh$6GhzCHzob6`$l?3FHwHO%tONT-D1%sRfy6wS#%-2>-m7SzF~rX>;lK*2JYSRwH>b)Q4##0rtc)p1DBqDS7mD?v=@9o09u6qAy_?&Zw>!WkG!?=&5%& zyRQ<3wFb$jGa7o`>`S>aA|7D*Yu#JiU00Fi^I*T@^~j`@MorX{rQQ#YlyHKG0uQza z4?m-k&Tu5Qi719h1-C#Ykk((lnx?8zVj-i59S6|R}DkT@*R4{6X?RELMxfEkxMm7LkYOP(qhn21u*bkogFOJv-Cv~ z7KsUB&cxks|3tDBzzy{>ZQ}#!IN6JU$U{1T&Ir*AV9bOBzFSP{&r8;SdAd)Wn{V-O zX4I*cKyXg$CxhuXX!WE6cY}o2_MJJ#vrQCJE~wK*<~Aa279GU1 zoet#fO5`{cLCvuh!X7-S!kbyUh!l02uo(?~h$Q5C=d++GotQfx$Km&x6W;?G*T*Qddz=%kPCI2&bc#Ph z-lNf%^b*?SSLr8h6TChW_jgJ`e8nAv)>SRjez64$rvrusObuVl@TEW{%hNuB;f$F9U9#;n&H}=quQvkPCoo^)dq$ z1y&A?ETR?f4Btc(lBSbV`2ZBVpnaV!|0CdiU)2RT|8Kdg3$j?i4-y^hoD{hzF*L!d zhuhN%3A%98jDeY8@)d?F=5#ib(1){tT)Yq}1?b$ODWFy%Aw>&t*Am?#uZt|+-%59e z8fXlL(4Hh4=v)cW>46wgi9aTk6s5uTYa`(>Djx!5@bfh}3lxm7XRr$A)B-mb8fTJP zu<7#X=%^a@_?}8%Yy>uKoh#MVjc$v36(auN>UR{v(DSBS-Ei#|Ksneq%addP-0QFh z`1t-j2PwArMb^mOJn5LfAIn%ICxL>6-^Zy_wp#;ncwAo-Ft_J$08dgYw}e`#GTO#( zCI->~2qcN0I(?={Qe6E>0t3%LZ2x1|P{Z#J%fVZouQ;rH#3PQd=aL!KV2CEaBR6hzZbi{3?(+ChAMkF_9+PICAw z=kMvujzsAb(C?kS1LP$ajGpL}+z*$NHUt?RybrYQ8r3zub@MTGuYLuf^q;PkOTP;Y zT0UQ^X4Cve8@-g;CJ~@1S2eGbg+)ODKY`|IBKv3&W9RHBThTb&nkk!J?=nL3wvWT}GQh zxT-}EUM>@b|9!30gssU~(e$wi=Apd4i^{?fIux#Zbqb>%mAN-x*Knixs8`vp48}$r z^P8RoIrYqYS8LduQy#w9f^OB3wv(_QXAZ%o5rp5zy{NTUa^Ww`n1ffFnENKN>ettZ zgTJ)*J2W;C>PgRZo_bv7d|95*_I*x843Y^vvFmN(eic7CG9BLKy;u5F*d zO5ja3fmY@EVeO}woPR`Cz(K!HryWDX3uA)!O`TJU$FZwAR9KsBHYR2az{f9 zxmyxb(OV7r@qRa}%D6W?zp`a%7pU)1uKTJ%wMK=;^{L7R5JieLN|P=cCZY4%gRXP% zdLL96pLi&gzd{m#zj-66PvKXAJ0B@ZA()|Dicz zANigj-lz|wVs(J8e>LH!a#9Ino#q{#k&2iz^JCL*+ZQX?FU&m~!5->u0@<ONr8XL|d}3u*hc$=p4rwF&I+Q;7YQ1W=>#5KpM*4&lx1mGG$lU=iQR^GG^jd zd?#Ou&cU8HXlc_G;xrKUOqsBbngyR_(EhZ#U)0tT7gY-~#%mp-O=Ax(qK=#>bpN%_ z^{F||VNgs;LSX!D9|4NE;0Hi85xs|lV45L)q4}Px5mpgb=Pk@w6($|dZntH2M5+yA z*7l6gwQJb-{&`O5Xk9U-_MXH;s3bhp1l-M5HRn$TonaW9BiSb1=xI_l$1F-p&xXSm zhXEh+L*c?)jzS2hN(BS{vZ^P^?){n97^Y>-3G>OG^HjgEU^JykO}0Z)OYvWO;WEQw z2coVM+wP4l=goA($LwdBtafN_QY6MB14P63v{4vv`s**Mm#3W${G4=9NR|`sp2c)c z*u#i;CKINY?{w1zM1BXK@Nm*Hj|!?>1vJNXp7|YAArc%fjewHyOHLCy7Sm>0zZDo8vYE6!=v* z>03cY!3uV#v_~4@+#ePACtzZC;!(urK%_bkvu1qATD|&Wf+szbY)sl(LQ8Fx^8sZ& z<;RK@kmhN6bRxqvr}Nn70%9`#Q+8e5wVXmm%~(qeM~Q!*br)+SHeVytB7=vv>`6?- zjAje74Izk9@R64BE9)tK>&u(^@*bAM;}H|IU#O6tU_mxp&`+MDptAR-%|w$3rhN!T z6q6Ej%0~E?5AkLVY~uO>S)mlbq7Co5RMB4q0T7WC2$(8dRiQk6jorLu({|k7c+E_g(Ie7?4hU~{TPyxl$$WFwBY=C8LwM)eec&s_@+U24?JdA?}Av)(Jm z_~Ac1%+_S-`lN5hO8psLhHq9|jP+?L!x6lLS)REN)OxsMG?cwlobYIEI;@3i%l)x~ zO-6)2oYJJNH^xvyB9Co%JyzRBgi-7?-RN^w%YbGrLmH`jV7}UoPyoy_CQR-6BkAU# zTvT1xnyWEEsKq_Ciilp^1avL5#HwM$_Hj75bm3{-pMi?vr7}2JMV`K-`1&u0B=`C& zP3`c(hcj__xzM%O+B^9QiXr6dH@a7Mg1AD1dc?;wpL-JdZ_my$&9Rz#J26nvPS$@~ z;a<@{Q?-o=64WSpFtBkRMYCzvkA)MpU-fqoGyB!Gl0C`cfx_bpQ`yZ_<9&1+SVTW5 z?G1K@c`p#d=%?mmv14NM@8RD7NUnvT#iU!S+=Ur}hsdRm2XeeSTR+Ha1q7oKi{Iqf zBY1r=SQE$?DFPI*-7hHk?9h_o*quNzWG2=s^13hGPnFp99uW0_<#^~Ezc3T>xJtAnr@!i#%C z^v>9qGyU2GOMMeoqSP>jYO|L>+(>^Ta!Wks&gSCt4w9Lr^GEJ{Y=OT0mB4;bdz%T0 zS8Z-WzZ=#5QK()D4sd4cR*o|wYZd^VeIU2)JwW4q+a)AqPs9u(0}Xin#pn0ttj z>b;rNZ&)!{5hy=Ii>F-6p6Sr4cWt7m3l*Dm_hjPzaUv{clZ@?p!Ex8|)O(z>IAQbr zlU?oD<0m$KLtTyM-Oi9{(UxeuS!|uT26ZZbIxOyD>{wIxBY<#JNc|PG7qF6-Y&@N_ z*kFM^%B}&yG=|n$)R$)!LK?e&NgCV!m$X>F4)*JGSz&!xNwH=tY{_g{z)(S(q$UZ2 z8UtP`Ur=-yMtxLOlMlCP1wT=Dj60sbz383WnYD+aEVCX6IVmaW&2Gfl+yBIZj0gpk zVku0-i=(gLAlLWDh5<#(K^L+4B2qcQ8}OGYjyVpJ5cG8x)G(Yo1G$xE#>N+cyI9?? zY_r;98GMOrVvY<{w81L*dHsaKuH#O>tj<=9++}vQfU>ceaiHuD8=y z1xw%$#YCgx_-D#=E(1R$5@09yMdAkmb&S7b;|6Y6aEj%$&IteUT}F@j2Hr+}3AzCcNA@FCY}w17zx}b8xzC8 zdzSp-bC$9Ndsh7d>`X>dH$;3Kz-Sv9lKl@SBQUn@sns8c(DFM6R(S5kt>Ic}S%FHq zrvg`Tc@CkabLF2Tf~M*;zg*E8P0Lvy_$KD6o_m_GoT;vpaR1(t|~>M&YbqMP@laRgXXu3ngkDQHj>yhRYXdKAt|Fh z3XdFV-BSLb@XfZJ1%+^H;LLfg4@KT50Xa*?T{mb1{?rMEN-Xzjq2*_7FTX@ z-zCn!xDa4%6Td~lS+&UZ(auFIizr*bCK-#pxYN> zDxpWzMuwP<+UHq^MM`+lfTqomP)Z7V*mKdDufN#&NT6#~v=)DfCSqf(gk-TORrsXrJS26daGFBHDygL4d!Ct69xPGvqDSvk_$1zPQ>NF zU;74sPewHYU*zB^^N>3E+!$`ruOdt_L9LfAb*Un)mqPi0@TNI(~;ZY-xwOtoiO$ zNv$gcfvrO+^DCt)XgqZi0sYyeKRN_BqvQK$*XYxy(56?QKvvz3`@|lo0FZr`2Ds18 zvn3fWA%kql_H? zzH`zF!o`@yGd%34OaYJF76XrRWVbXe8?WIrW6C&T|&jt?l@X zElC2X-QO;nY83X4ix4bzwWUP|EdRswi!#K#h!E>L+3Ao&H(+_ARUVsz<=l5QA~;*W z`QA4hsOMcZbh?5uk@tm(v2K^Tg8X}AzOzcV!s#9-V~y+Th3-iS82zZ%`C+%+CQ+D? zIPSYl%v;2Ha{e(G<~U;QQomqga*pKIpvIqj!=GWvkh|?m2B|m8Nar|ddtY*+Uf!=% zq!+riuVNhv`e_CT1#K@l9t2DsJ8)HD>&Pamw<3%7S6mksR^fopTI65=UUU8m>$yD~ z9>YMGv&;94yM}PMkWl-be!mH9#I$zV3={e;IORzpc+)ml4r zZF!%zuVJ$%Mu(4@eA!Pp9Yju%#h|v|J8Vd8O(=`7x7~O6kB&o3Z0(P8URDPP~(4}?K7NZEQHeB~d1H`3b^=H^-H;G~DnjtIzILx~J(*Qk&DFES!|7Wk4x z;q+H6p1_fom*m}?4la)i(*#Bx)es_1>;>ANY-oDGX%Y<*PR|m+e3$Mgflb}a34)25S}Nqof>shyFO63c%of^a`l!sx5!`RWUrmCnH~11GMglA$*KGej z?rDK>_--~;8K1D$OzV2C7{g*<-7A z?=@)P7y(o7EhQ5|#;8v=Q4cvi@8!`L@453u2515tAV_0e^(QzRo`(Ta&AuQ z*oE=yEv7WMd;Em>RsE$-QB|YATMxU}zGA#I^nTKS;Y{ZA-ziiztb(Vcxc`=0RuA`cf2&X0b*P!r`O{kxJ!oH9oh>w|F=5plZ? zZwLIRi~HMw**IunzG|lVJlkt-@AUgR*hq~^z=B1_ z1&%}n19qB3^U#^@M(5VM4fmASi0vn0rVPl{b=sICspTrxOO!YbC<2uz&Q;(Ws$gpta73a{eML_C;#sYmxtKq? zZ&-c$kef?^j4=;pW7uY&vaN=xG50o(>&D8(5X_7&oJ9 zUb+oFGF<$d1UjTXOSid;v^w1tlMuryF%k|j% zljDm~D_?BvXTCp^9CDcSA*&ZFiwb_<W2 z4(Y-&@d)tXaugd%R3&FU}Z`i zw06J5eY(@v4$?XH6+JoPi#sg(XgTgiQCPvzxii|Q-R{ob=UNdGF6Xa<;J36B3 zzKQ4MC-|FmSOa{`n3?it7`6-NoDW#A5%P^Oer9B_J%zgZ7AL($N z-akRTZ;tLy;7YIRbtl+ia8mP|80Mg9+~j40)a0Wk_d)4 z)bZ(RN=c(8N;as0WFWE4%6 zi4`I|lb+iIdpIg!kB#KKHITCq3`xBBgPaty4WeZ=cz`Cx(otL+NYtL0v^)aWMMzwNIW*NF!Lqc9NJF-0ka{yvT+H!{UMo7 z*y0`nh!y%;n*e{2)!t;A+SsT0Z>=7aA{zl8+cP`WNFwiPAfXv@A&vT0WGWs#6uq9I zazOxrlK;(Hg;8czGT0hRMG{VY!9sap>DHB_aSs(_;RyL?6XZw}uHrM{Wlv9HnT*rD z*MA!KTOF;I_vBX!oV->Ats!BCp)k?%>m9zZPZr9&6Rud!B$rCjqour#A2e>p>H0yF z-JUK5VVi9$0kzw;%y=eA=zZ~N?CT|tr65&-zR{J)V(4^;^Tv1k^xXB(W-Q%*RIuOZq0pK4mG)f@c=TLZq&fKWGDG&)X!gA?8}N@GAebN!057<)0fkU%ra!CQ zRC?v8F}8G|f_Aonw9iH$tea-EvdYhQ>y#Vs7b9}~T|dRpE2`Z|S~SL=(j2G37TQ=A z(u*yIU_<)9l6jd^Rqk0RMBaIs{NM&<>7_;6V1xHal>N!8l+x2ONmiEl+=4{ z8H#p2lR3oWdodKWs;p=iTVo+My~DX;o1H1OFO1AyQUY$vK{m5Sl8dM3;-4w;h%wMO z-xTyuEVRsQWriS|`2_8snrNJeCRd;Zz*Q=NB#>kPvRYb+xF7e!7h8jQFRDbjx6?qG z^3RrRZQO8aWHlv~AC1jFy~57suq&K)$NmI&AmK8%kVQ{SMFnEQWC0LcIv(^2i})Ek zHAOgbgG8_$Pxfb~5q9pL&vc0fL!y1uu^bD(_+EgNN(5h-+tFMOi$d@ryFDQcJz^C0 z!wN|`o)79U1FG%A0umpiA3NL=i~{px`OdFs=gZ_9~|VYw2T zpy#mF@yK`-P>-iYPD|Huu6su0(N>0aXrF=n}ps_94e+^V6UA6z$8YX+(? zue5*z*$ToS6}|hQxV;yK>JKJHB3fx88pdJi!MPlEKvqp{H;7VpYgiEonev)7-aH7= zZg9ZBVOsH5Xl8U+S;13-;K@+qHt zhjnS)@W_aBehzWg)Q0OdW)Pg{g$VcKyleB2=G!g^k^zUMqpO#p(yrezquMLnA3L#( zw+BwB<5;b^(&`?QaiJ29-%e0`+*#K01LUuY?uTr)8J4MEySZlCE!*#+^*w$R(fz2J z@V))wXP$nN_PO(Y{n>7LJ=qf>FWaE9!4)d&NX6UviSA!2>e>AWt^B+bOz`+Ho-xG2 zzC?@l_F5a7x?+o}XHD+sxeIW;Iev&CQk@~2xSrBhB$`)Z zte@h-#NIncQGI`Gbvw;OtY`oVlFM}KWb4p+89`jFuyoZ0*rBS6w?N&R%V{D~q83RO ze_2tEMJBn8+e}Cf(|mMGXsGSL;oyTZ>)ZcLFv+L-f3fwIVO4Eyv`R>Kw}6CnNq4J+ z2-1y&G}7JOD&3%n(t>nuQX1**jt$a%=jMFp`_8%dK94_+p3P>hx#oIfykm?>{*nz7 zcN+hwh_lG#MePW}J&Ei{|6ihsXwI#a>%`}o0^Rs9G-pYMKm0{0(rL=IWLB*a0(E1K zrZ^VWG)!|KQ$rBMhb}U3d9w5MeG%ZBKd0|OlyEDtGo$4B7gBxx(|oNbVfdRW1A(f+ zy+#38GMoeAaJKc-k7QmO?bpd10Muuk<$C>~t&a2ajF|fd(0o9%#XGT{1Ox^y0VaGy zd2(cwd++N%)3^vrZEXM!KiB-%FCqROXrS)l;gSDzHv*O~y^!r+C**t~UXJ`&@GZCk zH)sNdVeR~j&|b_^U;91+wYO1NC&*6UybSwpI>-&t7rNsD-ru1Fh<~>G3&wIgldt%P zn&F8D88^ce%&URQ=UhT&d-0BrD(Rj}3PbVgUxFeG2?;5oI|Zdk^`$y1?5(B}JpL`} zdn>Gkh&7)^y*y{|FEM-3bvWw0NN_&yWdaHDTOtoKYDq2 z9XF!}JQiNyGida9^LL$hFLwam6dgcE91iR=S_TG`{uZ71`}=Rs)^dwptl}MmQN&s| zkcWgAN$LEw3;xh9B|p=B3PJQpudSp78eZ@HgbWt4>6xD zISnoCNi(wKkp5VD<4mjEb3jis)YkS98?`;v>*(KLI3?)nB1m6jSmaVt0V#I z!G5I^186c}zdHozfU*H!`}^STP!2q>zWM8G_x7T}E5uyCGx9aIr{jK2Av0iy?@v{H z{hQtieE=ptYz9qHS`}tSH|fByXb`$35eoI)33L6frtNN@M!3J3&J2H+P{S3qk> z8p?q^&x1rj;fbXXqW{mMhX{$o+6LI$`0qb%RDcpkNJJF6xoL4i*Z8Cvwj@ELMlooo zDIazu-Bb_e6#mjfabf=Vk;8_bLSE+_(?6|3fy%fQEc)MD6Mdor1TG%Cd2$$qTTSiL zEs=!0SU^C4T9fwr0yi(OI+f`C1HPx`rJzdvz29MdO(l$6yIKwGQi7tRqnp(3uT=`z zE)5l^(2ki`+0KzJEiGLdAW+{NoSw=8DafZe=bdrI_fXhZ-tYGP-(MpCw~EXD_xhx* zu)p~Uu$zkt27d#em%PNGAd4L;AVvt1Yh~cUrIc85+og&?YHGDVKy9}fd@%dxK-r=8 zi047fynhW8FDP^{U@3QIfc3G$UYpPpxTdBw+$jFVu^@Cey3IAqurQi? zT-Uz+dc>7uYf=$i$euvNRbPCkU)`c+9`|HC-OEAC6IGEnU3P}meAxNQ{dme5N9xp| zqd;oH`KqjASGBsVyN8l_P{_C~;cC)lj>OYi&%Upff^YU_kpeedT+drF&)C^HN~)-& z1ac+w|JxKn$1Nfp=;~MvWhZsqgxYf*leBz8o*Q&Ld;)=_%&~b8W5-Wg_Q)L@l;ZJP zSFh|ZDOXeK$OP!2?O1p&i#rZ8haH>6=TLc7FF~5MwF;H|I_IjT!t$AeXxkg8^NeYR zMgB||+iK3_wfL)t?2?tSN`)fxQKb<=ik;_>y;fBiO5p@kVq;XFQ}h}GbN&w%^~qT zY?J1u3o#{q8=&AlzLog1d(>5g>tuxWCOZDzgCvY@o>$fO8Lhg!G$V1onxh_d!7~Li z%~))fS#`lz8j-hd-p*YUH#d_O6}U4m`o)4$3zf3_&6v@rJrPx7W{mrTJtuv835cjJ zS}wH8Q12KUbindvjVaKj3NGafb#QukgyZrZ5E12flWzS0;GSxv0y^8QUil2 zJs`7_uDO40VZmv(!d&@2I0a#4)||W5T!t<~XsN6lF2#ctt?QO}fW#)qt`p2#N*Og( z`f_W&gzHK1QIC`KTJdeGE5w4$)+aq|bggQ?Oz`42`{7<8*OB+|E+wfMb|o$@01@sk(xNL+#- zm;rZ>ATWE+1xzt}Cnq3BgGDJrd3$?~5G<+~7*q#jSv|Bc1s$+VLnr6QhE3~%rw-l3 zeSU8+MZa1HQ`5hwyk2qb3{Mz`yJ;E8yT~&QS95mGZ4PnXl2lOKku)KuIHMtcf1=X! zs{MBlI*~`xyX7Q$zpe4SvXfs2{pW*WtmoFBpWgCW7NV{tdtK;O0~<1_LEe%Sg@uI;{e6eJy5zcgdPe5vNFYn0Owcyq@IT!EPHwvcb8{3Z zbrSb?hir%SpJzr9A$8o4YUF^1F`flct~gt%KNP}6q@nqPG>?>j zMC5cQ0u`A}>x4-)?ck?5M&7FjK03xFl1#ia_M{nA+Ie56WR8EcUKg^8^syBzXxj=0 zhU~DYysW;Z>W#^nrE&a}?D{~)Y+qGiEE$irH`(UgsXeiMMOB=;C=hqx_=HDSGk?2) zXwEGrke3m_vjel1=r@z{6O^=A`dyUuT?goi-7+NMK$Hn(Mwb&X?ZJ229z_ABSD$1E zwcf^e7;+?Eixg{r=$uou?>NFMdsvaGx>l zs65j48c&F6G48rw zxnaY(r%pT~q5huiCd-^UER}VU&xoK#BV$M$^-BTp)p`!I!xZXRnah7ns3z;KRt82M z%#N{MTh$!!p?VTgx)+`(3%V~S2MS@%Ikbt^cX8BTAnTM0nXDvSX}bPGfrZkTH5*tY zrl{7=8z4oa3*gjU>B7I(G+#G2DdAaH8fh2{q4UW5=J>gw^F461bN5;4SF7oYnJMDD zJEnM(v?z~qcwPna?E3C*6yW7Trl(0IBqT0>yJnGan>}{jpDj=?CI!@E)<~8g-87M{ zANcI_6S|n6JdwT|#lJ;audZ=FqQ|5XEo$P=mrDiG02LJ#plKBB>+c6^WQ8VgPK-sXJ-Z49VN8(bdz$?#^*H^uV-2=MBe4%@=+F?~C- z{`Q*&?z11Jjr>X|oSJ>PZIMWeM1lqCyff`V#(_R=Z+|YGS1kd`03bo2u^KNb(Ej-y zb?v-q2*{h&fN@c9!P`vIzqZb;w#V6i^n&jl1?Wsh#GVEF22iDNs9eK}WtjeL(qt*R z#q*QFlKHO>h(J)-7pI^1RXIx*U|Z$D;SE2F54O-?wLc_w0A<<mSOo_$ZCLt& zhig}5KAVVx+4k+73|tyXZ+qCv?U8 zPE&e``Goc~=R;Iq%dbFA4eKrTKHpt!A*){VJ5qV<*7$k5l-M6)saz4wlY=0d$foz5 z9{ysDqq)G>VDtAEwC@_FYyy^`sCjJ&<}K%Y)eEC?k08A`#Kd91VsYi8vZw@bAH$|( zD=!K@4n4B~?;6Zj2%SQZM@s4UJG^wjLmEqh-7loM3z#~J-Ja7bC@37$kpS_v`@v!> zz}aAnL4hB;$vWmzL4evn8Obi2vK{;bBi#2XDhcYlx*v9(HgaR8U4~8vq%Lz#t%|N< z{8zy(%=~cF@tl@fP^R+3L*(d)U<1uhs3z_Ue8lFI!W|zfPMMBZ1|2bzl- zm>$_XYRaEgdD*hm(M#;kdz$ZWC191?m0dlPzmmKG=ph z3J;D_1uh?h4k2le+1N1W=jVI&udlDU zKF@)f3meu9GRc|5WR7Iw}SU zElg|GA``<}TSN~nRM!{WWdWB>^U{hucl;2EVu^?PNeE1MZ zAMnACgkBtN6h5zy3b}XHmGp>HLF55DeSfx=DfN#n5b&JUNdu$VvQ?%l;IIwH@l zZy5@(Pa$Y#6%F`Fl!1*+T|2DL2VP;|@ffX;!j%KMN~Y(~tAP9K_(lsiUD)>P17Mtf z7p(xyRb(uzi8~tPEu?1qQl09OAN4>vMMF=&f}tiYjt5@%-+@s~*}x(cPzQVC{u9{I zTjPh5P29<9>7kPOx8c-eB*w48&EfeLn`sqcIkKqH4XcXsHZ1&OL)N=sYOX=CKb;V6 z*TW4o|#67=8u6XH5w#Rl>%e@(gK*bl?7^?bBhO{k9qt~~iV(LfnYdXWLJ z4|@f1hG20=4xv(mfrbW7r`ooo%&5)K%#8jc9fXV;*wz9s+@Sb)92k2NApAW4zH$(F z`v1D}gZZZiMPj47 z14gS5^yCl*(OMPQVx<6n5s7C>5VZCeoN|&f4yA^KQ#E z8LN||0k=J`aev|R6tMes)BDTu;(n{c9z;;3xC09#7wJ4T&WnSZ4GIJyEMHxxL;nsD zEb^MY2pisk7o*y5ory+RcR4y|9|fN2b(Gy`a4v0P^ohEoy)51>zy0u0+qK!2%+_;$ zii|Jwymg)#8!HQO<+)+>y03!$rr54pA0S3Xkb6Ff)ptJrJcRryGV>tS1aqJot6M%Jg{!u287VV-xWugED#D zPRJf#dIAQEfK@DsU|Mzt`tVfut2wUyZj8R)39LdJei$12h0a*>4sB28s*g`Ii7JOi5#46o1IrgDLuBx8@d$r zB+LJQy-pUq|GPZ;6zjq|^)AId&PK+@0h<=?Dfqvsn!1WK%O$7gs%&PkiINVRF!BBu z?14R7T576U_q~^go2M`es%k)Y-$$3tsukhXqH49A%N|zYD4L2>=B1U9`221j3wW** zy;7ZVYE`j0gZ0NdcInAPk!Wp~4oe=om3LOnjT2_XrHk;+{P0<+HVYi zc5aoRmF|`GhePNa;gB{`SqxU2!(KBwQFgvibT} zx40sV*66&?Q4{3-rNf`3cHtbw9#*&NI_(UTJ$?Ro_$JNtIvTdoq#i0XQxROonqKS8 zsG~ehb<5Q`PZJCYpN>JBcq#yW>@w?hED?O%Yr%hkVAA8DgP&2ZVa{E*(`og!UOhFV zV5h@M!SneK61GdL9=a68&y@wv7B4HYrs-s!WklbapA+K$rbsj1=?`2D18+K>lS2S_UC=1b!@V&hh?|eo>k2bPU?B5AMdgo7V%#n8 z=r->8^c1G1x}4U#*QEqu1^<;6fZ+rlY|Ivfg&$(pu(lPO!AE7(-NelFWW{$&OI8IU zKKlY+@OU|dKH^=bWGVwruk+5USwrIHyJ)UA`ft&@x(>W`iSwZ^^`^}07H;!&HrT19 zs|^$x^SJahS!|&do9#UzLMrq&vaGO4-{a4s!;}n z(-hdMOsH2ssV`|rL_aBzd`}u-(nF8F3mM`)2BwmuoRz^dM|^W00t|bS8#d#UZfg&d zO$NCcb%P&xYrud>9Gr(@Vqyr0h|~Z%G`QTSg#*)Z$?Y(|)9ojl`cIzbmJhBP+!|p2 zPCGw$J7JTmM?*s!Nit*kN3v=BtMiHTX>adfR;FH$&FwyHtJym@J|34ol*IdWuA#%2 zxg`^$9Ac-kOcY#o7d;&@=-gYqQeAkh*4!uJw~$0Gk@1FM$hz&F)3jMM*jy$6a3FTr zB)!~i2*cDF$O%7uH#%Ods#0wmUK?G|sJ{F$?_vJ0G(M5}qoDFf_caGRx5t* zyKg;7r)&e^U$n$M4RB!L1y;x5AuKun#V?4Xe5-aJbk6N-S4jL)K$STD9gmU2#x-}c zr7Y}tm*fYh%BNf+EJWl)PN$V2#cmN(J|8_dVvO+&NvsMqV%OD2iCRL2S#u`ju1=wA z-pZOno=dO}yGEpq70Z|34QV;Yj)U?l^n0)o&0Zti8+nluN15u9pA~!qv%V2{XTtUe zF=PrQvt8+`t{l59Zz^ZrtFP%_xeq*C`<1`_S$O_fU*01=$mohNvo`Wz^Q^0U-Mf|H z$!pgPZwG*9$^nciXh2;_z?}(aXIF~dl$%J;YgBMT*W2Mu^(*8zyg52&2XhRtX1-If zKD)8MtR`6Esw6w**SqVwMeHWhdREQ`hP_Xx-=!<0h1B85fLotr{qPi;2z4*JXn<%v zdn@D@yaP0uPa9yQIyyQ<`i-PuY!OsiTKa#zoZX#x3`zyBM1Xn#nlMon=V0{N4|Ms) zz`C5@^R(!4TO{uvi{4*mSM}pZ&wpy4%djz#ji;|zK+bhZ8>H!4)eFxhkqI^mug(8N zEMxTjOq-5>HLD59c|zN8ah^HZ)+p3DDZOlC+$7!o0KZxUeh~*h(YCe|jy8AcngwA( zH|tx2^^A4;o4K!))g5s+8pA%l0&1FG(!t@Y0}H*LgRCKj!38y!KkvI8`6tj6~+GhY?rQR=p(X(1Fy7 z#&NxmQLnBNcVwREpZTudVy3G21@Xd9D~-Rc%i6lSkQ7sSR9w2Qcxh3q|Ed$VBxDId z*JZZ;Au0AdD5d6=0W$rmYhv9BYv_GmLeKMj=^r`hz6DsWUk9Jca5BL#F7CU>sVV8L zy1hdD8@s{XPPo5*zfkZJrW8f%WSi;QY~J7^CDk!rE>8oc*k=Q&bL>Nm$k+POLbk#X z5OGy(IvnuRtK@>c)p!SjX*dy02yl6Z+y2ZP3Juv@xvx>5@$jz<#)EeTRI?PQ_>6wQ z;296-v&a73Ve}F7xby;#_^7C;(TOf#_{P!vB9>Al4tO;H<0=VQ+(uXmq|QUN2=P9u zaag%u9XBkL@F{Q*61KABP>M;LnHISb3{ zV5z9y7J*z)pW+k=$r<&EnEZpAy=;OCV<$*2`Y(75L?*> z8mv>cGvH%9B4$_*$vwl6nmSylqnlXOBd*!tf}z3tBM;6)WVg=%lpu<)`EH_bxGUXz zjWD&)%RS}MFq)%@v8G(ayT15*=3dcZbc}H=O$L4|6 z-)DFp3+YaOq(SyLcbPqHw~r1~Jif?sLJJPO?L0SvU{=n*4gN_4{pR&L;Gk&*2R}y2 zb(UiK{cBzE?+#>t4$ZLqTCvVXX`-yAAV{KY{cOT#w6p(p z;Wf4>x$(-fk;5Q70AsTc`WnN}LVM888{|kExy>^h5YJjTZW2l0fB7e(|9!WW8gf8o zXb1ic)?9lPzykKY?6AS$JV@H`LICNS3l#ch{DQ1qcu6^AhvEBnP2cK=UC-!r-BzQ+ zlKF2E0}hs2XMIF-;wSCbM8B8v`?Jg1C^nco^~!B$4zo(}E&+5I)+i}+#f2rBJ+xVZ z1b3$kaKA`m!vG=Ad#gV7fBh*Q0F^++N&`&THm83w|976bvJwbfy%_6PyqRIi8LZA< zO?53OW$qtVLmTMnOj@^u7zM4eM3X)~&(*+?;{A=Mcm@UIB$F--b67Xs;6{NKK*P^P z3SyWMc!L@Fy<>6Ho@U;xg;zb)>ay!1c1%P6NX5|)2tpNOg&HPc!ycTR{9mso07m&8 zmJt$Jbsm8uPwo+*V<%ycW5z^wgBW0^W!4R5-{FUunHgmV%T<^`Lr0M(zuE<$sEZg76)%P}?qh&s1#V-Ip8N4!))$nKz$w zbGkFEYt2i%lCJcLtd{%#?OJb5Ft2Kzp4MKwU0SVT`O)wzxT-4_g;LC?s9Ju>J7if6 zNWaQm_O!jjVOV$rVK@2?`aP&^Xd?zi{Jt^l9<=ajHU~dO{)R)8 z4*g8n~Tkc5psp1Fj^~dYYP@FIozz;if}7a->4l?o>*21ptHfA@GYyl1b$I zaeX>t*R$?(bD{yxRnWJKhg|i6=b=*j-gI~R=SzcobN9Q<#ctxFT6?SxbEq6>)jzqN z;z;pwElfSe`;_U6OjauD2k<~2G%y-KiLh9A&B`7~{dn&5HkaXRU1^AQdzWn5E2Hw- z%Nv^z3B?M(D)T`~*s!Z(-{=1+j)7O7)i?_fjN`%VG^i;6)4*uI@u_NlwtBHPFqTAI zUgpw=SmF$cvbaF!qiJL!vc>)3m@2h%B!l0^uSK&|@`+mgS?`YohKt**uidhiG;aZB z@uvyq@Y$d~AnX?LC$j&LQ)F;-wJEXU7XkrM3bS%*6t=Ar_WUz|rrU%00zew%%)I$W zW8a8M;JqEc*{i<7O>YQ1wrX|1?z|BBNV0!a< znbpzlKW?Q=F8e+fwTI}UOP_CBFnrg9$=(K_M)sA1X|7}**L?Cz?0Ev?<>m6bDrQj8 zY0hb+x-#5lnD?-;2$`1}9QA)RgNeo9yf2SiN582qt*_^^d!PNchV*o1Oy)$A1NL-= z_Z{s8jiS8oIi=Jf_cW}bg@wtTSK@g{+JF#Yzt%$l$Pk~!*x1;5$oR|$(!sm86-7mv zDH=4_x$~xG=%h2v@clI<`SpnyEoIng$Pt~~q;`Fq7@I#Glw}Ds$=+zigZN0dHaWd> z%gW!)8%0!d(R+oLTuG=!ga^~kN?WjXg~^tDHqI?ZmshiOnhkjiSDuNNJU+9E-`tUm zC_V7NLl&dXwS|#gm>-H<->Z*2{`0NZG2Sd^vwv@*ZMOUEN^QFg&FBgGKL2#ft(LIy zf+2n}BRiR}6FF?xY5~Y2Z{VhZT?g=Rjk|?8k#Y0@^C#Sg zit-H0IArS&p=iAv^*#ij?#jb14YTFrjl1tQu+e9nDN3jv&+%d_t``d;dh1xSq zJhz0Bqa5NOpH+5-Q|}FP+Tq~8+4!#Whfk*M)YEXEFlJ~Xw@er^<%7pr{acsZ9XFP* zL=Gq^={E@niY#LX-k@%kezSc#iBo);+48&^S-NQ-jrb0KFa}d1BhzHa?ZgIQGxCl? zMSSR8ku47vt#%d!e(r9ijm_99_GhwK59yh+)%A$EIttEwP4iFO&cXfYZyP4qr;nO@ zQTa!Zb~e;nhw_w{K1A>nI@@t8k??hnO7YgL=dpXCNsCS*R@?>;ndWm=i4GB=LJ`wS zMZ~|=BH=X}h1kA8pX2XF5TM^{Z#UsvB8=m7R6>K)%Zp3%L}BW;`JPZ(P^pNM8AfH9 zLAyeF&u~a@E=9-OwWP&g{)GYq^cCc-QZ!hE0MIQ+2={vy)O|oWB5&@s_}-e0Uj1o! z6FgDtY9E1atrtmBajePNuGp(mE9Oc)sNYwIc=7h$;W@% zFQ%5Ruj>k?8YxKGg(6-~yHjcfW|uQ_9~!+dgC!G9SJfl5 zyMTx3mS!T65WcBrPG#HPMa|2GtRF*Z?@8Qka5oIkN)16f#$~ZB^*Uv>GiMe84g?DOTWGba=5S&2v1IHk0I$~gEU}dRd@%T`lAP9>%(vz~F_K#bxrbw~?lH!5boXAA$ zC@H0coha)IkQ6}zHU^3uO(3K z)hd{L3M+__>hn z(!VVYi^)(pydIgwWRQI(S*-Ae)AmYFx4D7RJZ7Nl;a6k?tLSA{c&yUBmUU+3rS=Q< zyN@-NzX|nbHe=>;>9m!BINozOEd01-#ruXcTLB0Es*2_NPyHB*Dj(!^QHX8pJ3A!w z-QTaP6|Ig_ZKFhDpW$?qRC%&Ptbe0uQW->re-zxAHhmz=TGoP*byZVm!IfWW5zHG% zpL3VeWv^&iuqqsQR;##q{?c2GypG`N`nUs?UDrU2IODb`ggVrAskMT^&AuDXDzvZj zdTVdEb_9-P_7uTV_URwO7)6SRrtdaLc^h#@HA@-087!;xRjg$GRjlh}_vckD&#XVH{J|YW$6B zy87N%lPOH36Hm!wZvHg&mdTVk&b5gB%4K65D?WLubbZvL!#22h%(JA{WM(>(mGoBn( zGpZGGhd`Sm(TH4^2mFmR%MBw29@QH!TD~N2^mur>k+>MQXTr}+8!lDT`!xA@FK9qG zi&vGyB__}kYuVivgGJGNDc~hSz;P1oz!@rev208GwqVJ(BV?)e8*gIn0yOPIa!LI`_-XGda2W@}Ed{1|T8v*i5UPq<{g{8-Za!4n71VJTQVvm^;~>;+BFn_THLc zK+?bpI^N$Io1SHyDM6@NRpN8|g$@THRDtVTC_!zBbCbM|NCUG1v9z*#!%R9Vt5;3b zq^H7g%zRYB^)(OE>P97^mz`BAe59_ma%sL-r$%+S-e9-93d_9WaF!H$%k-KAgNawR z!r!Xw&ksCZHfUSXz}~B$E)=6y1v3U?KNt;m`6@MS!nvLFBG7^s<|v3~zTkdWD+mwC zxLh6_uzA&}VCIzGfX)!$KlzxU#)dTLo9}o>R-Fl7kru@o+PKV&%$39Pb2n6df>vaQ z+1QIQ%WRck%4CmC7F~2nZ<=-|ZYFV~@Sv83fN=cKzxK->O9V$C}22p>Jvgf#Xx7rpwB zV3B~EZ|=m?6$qANcdFHjrfMax@rvbkA#_Qvr0FJ?h8C$UF5hsYr*M($$yLd;F*Ps7 z{&_QGvWu?pZURXb!z%Z6@b~U17uG)8^RL9DT&)YJeb}8r%zhD9P_FFc;ki9$U#&Jgu*GT4u23v@cjB-?o3X${J$+v(%Vtg{Oistsi zkrBqix!$&m;}A@XH#dBr3ML*>q@HxuP&Vhiifpwo@}gQg#0fiW^52Wp&XpMv8_G5k z;VIB2Pas8aiL$A3BPEH5o6+IC?BXrZXyB^bp01Z@BrVY9$Lp!wk43Bw#NPBoREJN? zZpD&`7xUDqq^QADpQtu@G4^zGVu<{7h@$O`7gLEM-0YcE9@ozFrn1^yE%xmuFUd

N? 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 qmUy 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

    uK79TB(Bzrc=vpG>sNdLA8ZOurI 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 EFY%2qO8@`> literal 0 HcmV?d00001 diff --git a/content/v2/cosidriver/release/_index.md b/content/v2/cosidriver/release/_index.md index 2fbbebd148..03121d192b 100644 --- a/content/v2/cosidriver/release/_index.md +++ b/content/v2/cosidriver/release/_index.md @@ -5,7 +5,7 @@ weight: 6 description: Release Notes for COSI Driver --- -## Release Notes - COSI Driver v0.2.1 +## Release Notes - COSI Driver v0.3.0 diff --git a/content/v2/csidriver/_index.md b/content/v2/csidriver/_index.md index 90775a6fc6..c99154892f 100644 --- a/content/v2/csidriver/_index.md +++ b/content/v2/csidriver/_index.md @@ -16,7 +16,7 @@ The CSI Drivers by Dell implement an interface between [CSI](https://kubernetes- {{}} | Features | PowerMax | PowerFlex | Unity XT | PowerScale | PowerStore | |--------------------------|:--------:|:---------:|:---------:|:----------:|:----------:| -| CSI Driver version | 2.10.1 | 2.10.1 | 2.10.1 | 2.10.1 | 2.10.1 | +| CSI Driver version | 2.11.0 | 2.11.0 | 2.11.0 | 2.11.0 | 2.11.0 | | Static Provisioning | yes | yes | yes | yes | yes | | Dynamic Provisioning | yes | yes | yes | yes | yes | | Expand Persistent Volume | yes | yes | yes | yes | yes | @@ -25,7 +25,7 @@ The CSI Drivers by Dell implement an interface between [CSI](https://kubernetes- | Delete Snapshot | yes for LUN
    no for NFS | yes | yes | yes | yes | | [Access Mode](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes) for [volumeMode: Filesystem](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#volume-mode)| RWO, RWOP

    ROX, RWX **with NFS ONLY**| RWO, ROX, RWOP

    RWX **with NFS ONLY** | RWO, ROX, RWOP

    RWX **with NFS ONLY** | RWO, RWX, ROX, RWOP | RWO, RWOP

    ROX, RWX **with NFS ONLY** | | Access Mode for `volumeMode: Block`| RWX, ROX, RWOP | RWX, ROX, RWOP | RWO, RWX | Not Supported | RWO, RWX, ROX, RWOP | -| CSI Volume Cloning | yes for LUN
    no for NFS | yes for LUN
    no for NFS | yes | yes | yes | +| CSI Volume Cloning | yes for LUN
    no for NFS | yes for LUN
    no for NFS | yes | yes | yes | | CSI Raw Block Volume | yes | yes | yes | no | yes | | CSI Ephemeral Volume | no | yes | yes | yes | yes | | Topology | yes | yes | yes | yes | yes | @@ -41,7 +41,7 @@ The CSI Drivers by Dell implement an interface between [CSI](https://kubernetes- |---------------|:----------------:|:------------------:|:----------------:|:----------------:|:----------------:| | Fibre Channel | yes | N/A | yes | N/A | yes | | iSCSI | yes | N/A | yes | N/A | yes | -| NVMeTCP | N/A | N/A | N/A | N/A | yes | +| NVMeTCP | yes | N/A | N/A | N/A | yes | | NVMeFC | N/A | N/A | N/A | N/A | yes | | NFS | yes - SDNAS only (not eNAS) | yes | yes | yes | yes | | Other | N/A | ScaleIO protocol | N/A | N/A | N/A | @@ -50,3 +50,4 @@ The CSI Drivers by Dell implement an interface between [CSI](https://kubernetes- | Platform-specific configurable settings | Service Level selection
    iSCSI CHAP | - | Host IO Limit
    Tiering Policy
    NFS Host IO size
    Snapshot Retention duration | Access Zone
    NFS version (3 or 4);Configurable Export IPs | iSCSI CHAP | | Auto RDM(vSphere) | Yes(over FC) | N/A | N/A | N/A | N/A | {{
    }} + diff --git a/content/v2/csidriver/features/powerflex.md b/content/v2/csidriver/features/powerflex.md index f39156c07e..bae17d0682 100644 --- a/content/v2/csidriver/features/powerflex.md +++ b/content/v2/csidriver/features/powerflex.md @@ -765,6 +765,9 @@ The user can also set the volume limit for all the nodes in the cluster by speci ## NFS volume support Starting with version 2.8, the CSI driver for PowerFlex will support NFS volumes for PowerFlex storage systems version 4.0.x. +> NOTE: +> Starting from CSM 1.11.0, the CSI-PowerFlex driver will automatically round up NFS volume sizes to a minimum of 3GB if a smaller size is requested. This change prevents backend errors and ensures compatibility. + CSI driver will support following operations for NFS volumes: * Creation and deletion of a NFS volume with RWO/RWX/ROX access modes. diff --git a/content/v2/csidriver/features/powermax.md b/content/v2/csidriver/features/powermax.md index c21e42a153..d26823ebd7 100644 --- a/content/v2/csidriver/features/powermax.md +++ b/content/v2/csidriver/features/powermax.md @@ -399,6 +399,8 @@ After a successful installation of the driver, if a node Pod is running successf `csi-powermax.dellemc.com/\.fc` * If the worker node has ISCSI connectivity to the PowerMax array - `csi-powermax.dellemc.com/\.iscsi` +* If the worker node has NVMeTCP connectivity to the PowerMax array - +`csi-powermax.dellemc.com/\.nvmetcp` The values for all these keys are always set to the name of the provisioner which is usually `csi-powermax.dellemc.com`. @@ -575,7 +577,7 @@ CSI Driver for Dell PowerMax 2.5.0 and above supports auto RDM for vSphere over This feature supports volume provisioning on Kubernetes clusters running on vSphere (VMware hypervisor) via RDM mechanism. This feature enables the users to use PMAX CSI drivers with VMs on vSphere Hypervisor with the same feature and functionality as there with bare metal servers when they have only FC ports in PMAX storage. -It will be supported only on new/freshly installed clusters where the cluster is exclusively deployed in a virtualized vSphere environment. Having hybrid topologies like ISCSI or FC (in pass-through) is not supported. +It will be supported only on new/freshly installed clusters where the cluster is exclusively deployed in a virtualized vSphere environment. Having hybrid topologies like iSCSI, NVMeTCP or FC (in pass-through) is not supported. To use this feature - Set `vSphere.enabled` to true. @@ -636,3 +638,13 @@ This feature is also supported for limiting the volume provisioning on Kubernete >**NOTE:**
    The default value of `maxPowerMaxVolumesPerNode` is 0.
    If `maxPowerMaxVolumesPerNode` is set to zero, then CO shall decide how many volumes of this type can be published by the controller to the node.

    The volume limit specified to `maxPowerMaxVolumesPerNode` attribute is applicable to all the nodes in the cluster for which node label `max-powermax-volumes-per-node` is not set.
    Supported maximum number of RDM Volumes per VM is 60 as per the limitations.
    If the value is set both by node label and values.yaml file then node label value will get the precedence and user has to remove the node label in order to reflect the values.yaml value. +## NVMe/TCP Support + +The CSI Driver for Dell PowerMax supports NVMeTCP from v2.11.0. To enable NVMe/TCP provisioning, blockProtocol in settings file should be specified as NVMETCP. + +**Limitations**
    +These are the CSM modules not supported with NVMeTCP protocol: +- CSM Authorization +- CSM Observability +- CSM Application Mobility +- Metro Replication \ No newline at end of file diff --git a/content/v2/csidriver/features/powerscale.md b/content/v2/csidriver/features/powerscale.md index 3b3a2ad193..7d2d429e23 100644 --- a/content/v2/csidriver/features/powerscale.md +++ b/content/v2/csidriver/features/powerscale.md @@ -21,7 +21,7 @@ You can use existing volumes from the PowerScale array as Persistent Volumes in 1. Open your volume in One FS, and take a note of volume-id. 2. Create PersistentVolume and use this volume-id as a volumeHandle in the manifest. Modify other parameters according to your needs. -3. In the following example, the PowerScale cluster accessZone is assumed as 'System', storage class as 'isilon', cluster name as 'pscale-cluster' and volume's internal name as 'isilonvol'. The volume-handle should be in the format of `=_=_==_=_==_=_=` +3. In the following example, the PowerScale cluster accessZone is assumed as 'System', storage class as 'isilon', cluster name as 'pscale-cluster' and volume's internal name as 'isilonvol'. The volume-handle should be in the format of `=_=_==_=_==_=_=` 4. If Quotas are enabled in the driver, it is required to add the Quota ID to the description of the NFS export in this format: `CSI_QUOTA_ID:sC-kAAEAAAAAAAAAAAAAQEpVAAAAAAAA` 5. Quota ID can be identified by querying the PowerScale system. diff --git a/content/v2/csidriver/features/unity.md b/content/v2/csidriver/features/unity.md index 55436e73f7..d356d8d8cf 100644 --- a/content/v2/csidriver/features/unity.md +++ b/content/v2/csidriver/features/unity.md @@ -711,3 +711,16 @@ data: TENANT_NAME: "" ``` >Note: csi-unity supports Tenancy in multi-array setup, provided the TenantName is the same across Unity XT instances. + +## Support custom networks for NFS I/O traffic + +When `allowedNetworks` is specified for using custom networks to handle NFS traffic, and a user already +has workloads scheduled, there is a possibility that it might lead to backward compatibility issues. For example, ControllerUnPublish might not be able to completely remove clients from the NFS exports of previously created pods. + +Also, the previous workload will still be using the default network and not custom networks. For previous workloads to use custom networks, the recreation of pods is required. + +When csi-unity driver creates an NFS export, the traffic flows through the client specified in the export. By default, the client is the network interface for Kubernetes +communication (same IP/fqdn as k8s node) by default. + +For a cluster with multiple network interfaces and if a user wants to segregate k8s traffic from NFS traffic; you can use the `allowedNetworks` option. +`allowedNetworks` takes CIDR addresses as a parameter to match the IPs to be picked up by the driver to allow and route NFS traffic. diff --git a/content/v2/csidriver/release/powerflex.md b/content/v2/csidriver/release/powerflex.md index 3f1248ff36..27474b840a 100644 --- a/content/v2/csidriver/release/powerflex.md +++ b/content/v2/csidriver/release/powerflex.md @@ -3,7 +3,8 @@ title: PowerFlex description: Release notes for PowerFlex CSI driver --- -## Release Notes - CSI PowerFlex v2.10.1 +## Release Notes - CSI PowerFlex v2.11.0 + @@ -14,19 +15,23 @@ description: Release notes for PowerFlex CSI driver ### New Features/Changes -- [#1284 - [FEATURE]: Support for Openshift 4.15](https://github.com/dell/csm/issues/1284) -- [#1285 - [FEATURE]: Remove checks in code for non-supported installs of CSM](https://github.com/dell/csm/issues/1285) -- [#926 - [FEATURE]: Fixing the linting, formatting and vetting issues](https://github.com/dell/csm/issues/926) +- [#1359 - [FEATURE]: Add Support for OpenShift Container Platform (OCP) 4.16 ](https://github.com/dell/csm/issues/1359) +- [#1400 - [FEATURE]: Support for Kubernetes 1.30](https://github.com/dell/csm/issues/1400) +- [#1358 - [FEATURE]: Support for PowerFlex 4.6](https://github.com/dell/csm/issues/1358) +- [#1397 - [FEATURE]: Observability upgrade is supported in CSM Operator](https://github.com/dell/csm/issues/1397) ### Fixed Issues -- [#1081 - [BUG]: CSM driver repositories reference CSI Operator](https://github.com/dell/csm/issues/1081) -- [#1086 - [BUG]: PowerFlex driver fails to start on RKE](https://github.com/dell/csm/issues/1086) -- [#1101 - [BUG]: the `nasName` parameter in the powerflex secret is now mandatory](https://github.com/dell/csm/issues/1101) -- [#1140 - [BUG]: Cert-csi tests are not reporting the passed testcases in K8S E2E tests ](https://github.com/dell/csm/issues/1140) -- [#1163 - [BUG]: Resource quota bypass](https://github.com/dell/csm/issues/1163) -- [#1174 - [BUG]: Kubelet Configuration Directory setting should not have a comment about default value being None](https://github.com/dell/csm/issues/1174) -- [#1210 - [BUG]: Helm deployment of PowerFlex driver is failing](https://github.com/dell/csm/issues/1210) +- [#1209 - [BUG]: Doc hyper links in driver Readme is broken](https://github.com/dell/csm/issues/1209) +- [#1218 - [BUG]: Add the helm-charts-version parameter to the install command for all drivers in csm-docs](https://github.com/dell/csm/issues/1218) +- [#1237 - [BUG]: Error handling not good in node.go:nodeProbe() and other similar functions](https://github.com/dell/csm/issues/1237) +- [#1239 - [BUG]: Changes in new release of google.golang.org/protobuf is causing compilation issues](https://github.com/dell/csm/issues/1239) +- [#1270 - [BUG]: Missing entries for Resiliency in installation wizard template](https://github.com/dell/csm/issues/1270) +- [#1310 - [BUG]: CSI node pod crash after replacing OCP ingress certificate or restarting kubectl service](https://github.com/dell/csm/issues/1310) +- [#1350 - [BUG]: Document update : PowerFlex expecting secret CR as -config in operator ](https://github.com/dell/csm/issues/1350) +- [#1355 - [BUG]: Indentation of secret.yaml mentioned on the csm-doc portal for powerflex driver is incorrect.](https://github.com/dell/csm/issues/1355) +- [#1364 - [BUG]: mkfsFormatOption not working for powerflex](https://github.com/dell/csm/issues/1364) +- [#1366 - [BUG]: Support Minimum 3GB Volume Size for NFS in CSI-PowerFlex](https://github.com/dell/csm/issues/1366) ### Known Issues @@ -43,5 +48,5 @@ A CSI ephemeral pod may not get created in OpenShift 4.13 and fail with the erro ### Note: -- Support for Kubernetes alpha features like Volume Health Monitoring and RWOP (ReadWriteOncePod) access mode will not be available in Openshift environment as Openshift doesn't support enabling of alpha features for Production Grade clusters. -- For fixing [#1210 - [BUG]: Helm deployment of PowerFlex driver is failing](https://github.com/dell/csm/issues/1210), a new helm-chart has been released. In order to install this helm chart, we need to pass the flag `--helm-charts-version` during helm installation and flag `-v` during offline bundle installation with value `csi-vxflexos-2.10.1`. +- Support for Kubernetes alpha features like Volume Health Monitoring will not be available in Openshift environment as Openshift doesn't support enabling of alpha features for Production Grade clusters. +- For fixing [#1210 - [BUG]: Helm deployment of PowerFlex driver is failing](https://github.com/dell/csm/issues/1210), a new helm-chart has been released. In order to install this helm chart, we need to pass the flag `--helm-charts-version` during helm installation and flag `-v` during offline bundle installation with value `csi-vxflexos-2.11.0`. diff --git a/content/v2/csidriver/release/powermax.md b/content/v2/csidriver/release/powermax.md index 06b51d08c7..b703fdc691 100644 --- a/content/v2/csidriver/release/powermax.md +++ b/content/v2/csidriver/release/powermax.md @@ -3,7 +3,7 @@ title: PowerMax description: Release notes for PowerMax CSI driver --- -## Release Notes - CSI PowerMax v2.10.1 +## Release Notes - CSI PowerMax v2.11.0 >Note: Auto SRDF group creation is currently not supported in PowerMaxOS 10.1 (6079) Arrays. @@ -15,19 +15,25 @@ description: Release notes for PowerMax CSI driver + ### New Features/Changes -- [#1284 - [FEATURE]: Support for Openshift 4.15](https://github.com/dell/csm/issues/1284) -- [#1285 - [FEATURE]: Remove checks in code for non-supported installs of CSM](https://github.com/dell/csm/issues/1285) -- [#926 - [FEATURE]: Fixing the linting, formatting and vetting issues](https://github.com/dell/csm/issues/926) +- [#1308 - [FEATURE]: NVMe TCP support for PowerMax ](https://github.com/dell/csm/issues/1308) +- [#1359 - [FEATURE]: Add Support for OpenShift Container Platform (OCP) 4.16 ](https://github.com/dell/csm/issues/1359) +- [#1400 - [FEATURE]: Support for Kubernetes 1.30](https://github.com/dell/csm/issues/1400) +- [#1082 - [FEATURE]: CSM Resiliency support for PowerMax](https://github.com/dell/csm/issues/1082) +- [#1397 - [FEATURE]: Observability upgrade is supported in CSM Operator](https://github.com/dell/csm/issues/1397) ### Fixed Issues -- [#1081 - [BUG]: CSM driver repositories reference CSI Operator](https://github.com/dell/csm/issues/1081) -- [#1115 - [BUG]: CSI Powermax: Driver fails to restore snapshot to Metro Volumes](https://github.com/dell/csm/issues/1115) -- [#1140 - [BUG]: Cert-csi tests are not reporting the passed testcases in K8S E2E tests ](https://github.com/dell/csm/issues/1140) -- [#1174 - [BUG]: Kubelet Configuration Directory setting should not have a comment about default value being None](https://github.com/dell/csm/issues/1174) -- [#1175 - [BUG]: PowerMax : Metro: Failed to find Remote Symm WWN](https://github.com/dell/csm/issues/1175) +- [#1209 - [BUG]: Doc hyper links in driver Readme is broken](https://github.com/dell/csm/issues/1209) +- [#1218 - [BUG]: Add the helm-charts-version parameter to the install command for all drivers in csm-docs](https://github.com/dell/csm/issues/1218) +- [#1238 - [BUG]: Missing mountPropagation param for Powermax node template in CSM-Operator](https://github.com/dell/csm/issues/1238) +- [#1239 - [BUG]: Changes in new release of google.golang.org/protobuf is causing compilation issues](https://github.com/dell/csm/issues/1239) +- [#1305 - [BUG]: Create volume even if the size is smaller than possible](https://github.com/dell/csm/issues/1305) +- [#1346 - [BUG]: Parsing an NVME response fails for list-subsys](https://github.com/dell/csm/issues/1346) +- [#1370 - [BUG]: API command to check filesystem is taking 20s + causing ControllerUnPublish to take 20+secs ](https://github.com/dell/csm/issues/1370) +- [#1372 - [BUG]: Make files in repositories build invalid images](https://github.com/dell/csm/issues/1372) ### Known Issues diff --git a/content/v2/csidriver/release/powerscale.md b/content/v2/csidriver/release/powerscale.md index c2fdff0399..4ab7bbf89a 100644 --- a/content/v2/csidriver/release/powerscale.md +++ b/content/v2/csidriver/release/powerscale.md @@ -4,7 +4,8 @@ description: Release notes for PowerScale CSI driver --- -## Release Notes - CSI Driver for PowerScale v2.10.1 +## Release Notes - CSI Driver for PowerScale v2.11.0 + @@ -15,17 +16,21 @@ description: Release notes for PowerScale CSI driver ### New Features/Changes -- [#1284 - [FEATURE]: Support for Openshift 4.15](https://github.com/dell/csm/issues/1284) -- [#1285 - [FEATURE]: Remove checks in code for non-supported installs of CSM](https://github.com/dell/csm/issues/1285) -- [#926 - [FEATURE]: Fixing the linting, formatting and vetting issues](https://github.com/dell/csm/issues/926) +- [#1359 - [FEATURE]: Add Support for OpenShift Container Platform (OCP) 4.16 ](https://github.com/dell/csm/issues/1359) +- [#1400 - [FEATURE]: Support for Kubernetes 1.30](https://github.com/dell/csm/issues/1400) +- [#1397 - [FEATURE]: Observability upgrade is supported in CSM Operator](https://github.com/dell/csm/issues/1397) +- [#1398 - [FEATURE]: PowerScale OneFS 9.7 support ](https://github.com/dell/csm/issues/1398) ### Fixed Issues -- [#1081 - [BUG]: CSM driver repositories reference CSI Operator](https://github.com/dell/csm/issues/1081) -- [#1104 - [BUG]: The csm-isilon-controller keeps getting panic and is restarting ](https://github.com/dell/csm/issues/1104) -- [#1134 - [BUG]: PowerScale : Driver failing to re-authenticate if session cookies are expired ](https://github.com/dell/csm/issues/1134) -- [#1140 - [BUG]: Cert-csi tests are not reporting the passed testcases in K8S E2E tests ](https://github.com/dell/csm/issues/1140) -- [#1174 - [BUG]: Kubelet Configuration Directory setting should not have a comment about default value being None](https://github.com/dell/csm/issues/1174) +- [#1203 - [BUG]: OCP min/max version support](https://github.com/dell/csm/issues/1203) +- [#1209 - [BUG]: Doc hyper links in driver Readme is broken](https://github.com/dell/csm/issues/1209) +- [#1215 - [BUG]: Discrepancy in their secret](https://github.com/dell/csm/issues/1215) +- [#1218 - [BUG]: Add the helm-charts-version parameter to the install command for all drivers in csm-docs](https://github.com/dell/csm/issues/1218) +- [#1239 - [BUG]: Changes in new release of google.golang.org/protobuf is causing compilation issues](https://github.com/dell/csm/issues/1239) +- [#1270 - [BUG]: Missing entries for Resiliency in installation wizard template](https://github.com/dell/csm/issues/1270) +- [#1316 - [BUG]: PowerScale CSI - Creating PVC from csi snapshot is failing](https://github.com/dell/csm/issues/1316) +- [#1322 - [BUG]: PowerScale CSM: Updating the fsGroupPolicy in the csm is not updating the csidriver](https://github.com/dell/csm/issues/1322) ### Known Issues diff --git a/content/v2/csidriver/release/powerstore.md b/content/v2/csidriver/release/powerstore.md index a6faeca3db..64798e62c1 100644 --- a/content/v2/csidriver/release/powerstore.md +++ b/content/v2/csidriver/release/powerstore.md @@ -3,7 +3,8 @@ title: PowerStore description: Release notes for PowerStore CSI driver --- -## Release Notes - CSI PowerStore v2.10.1 +## Release Notes - CSI PowerStore v2.11.0 + @@ -14,18 +15,20 @@ description: Release notes for PowerStore CSI driver ### New Features/Changes -- [#1284 - [FEATURE]: Support for Openshift 4.15](https://github.com/dell/csm/issues/1284) -- [#1285 - [FEATURE]: Remove checks in code for non-supported installs of CSM](https://github.com/dell/csm/issues/1285) -- [#926 - [FEATURE]: Fixing the linting, formatting and vetting issues](https://github.com/dell/csm/issues/926) -- [#1129 - [FEATURE]: Support PowerStore v3.6](https://github.com/dell/csm/issues/1129) +- [#1359 - [FEATURE]: Add Support for OpenShift Container Platform (OCP) 4.16 ](https://github.com/dell/csm/issues/1359) +- [#1400 - [FEATURE]: Support for Kubernetes 1.30](https://github.com/dell/csm/issues/1400) ### Fixed Issues -- [#1081 - [BUG]: CSM driver repositories reference CSI Operator](https://github.com/dell/csm/issues/1081) -- [#1097 - [BUG]: Powerstore sanity tests are not working](https://github.com/dell/csm/issues/1097) -- [#1140 - [BUG]: Cert-csi tests are not reporting the passed testcases in K8S E2E tests ](https://github.com/dell/csm/issues/1140) -- [#1142 - [BUG]: Documentation : Multipath related instructions are missing in Powerstore prerequisites ](https://github.com/dell/csm/issues/1142) -- [#1174 - [BUG]: Kubelet Configuration Directory setting should not have a comment about default value being None](https://github.com/dell/csm/issues/1174) +- [#1188 - [BUG]: Controller Pod keeps restarting due to "Lost connection to CSI driver" error](https://github.com/dell/csm/issues/1188) +- [#1209 - [BUG]: Doc hyper links in driver Readme is broken](https://github.com/dell/csm/issues/1209) +- [#1216 - [BUG]: Incorrect Error message in Resiliency Podmon in controllerCleanupPod() func](https://github.com/dell/csm/issues/1216) +- [#1218 - [BUG]: Add the helm-charts-version parameter to the install command for all drivers in csm-docs](https://github.com/dell/csm/issues/1218) +- [#1239 - [BUG]: Changes in new release of google.golang.org/protobuf is causing compilation issues](https://github.com/dell/csm/issues/1239) +- [#1270 - [BUG]: Missing entries for Resiliency in installation wizard template](https://github.com/dell/csm/issues/1270) +- [#1317 - [BUG]: CSM PowerStore - Remove the RESTAPI code that is not needed](https://github.com/dell/csm/issues/1317) +- [#1338 - [BUG]: Data loss (DL) when deleting PVC but leaves unusable volumesnapshot and volumesnapshotcontent](https://github.com/dell/csm/issues/1338) +- [#1346 - [BUG]: Parsing an NVME response fails for list-subsys](https://github.com/dell/csm/issues/1346) ### Known Issues @@ -44,4 +47,4 @@ description: Release notes for PowerStore CSI driver ### Note: -- Support for Kubernetes alpha features like Volume Health Monitoring will not be available in Openshift environment as Openshift doesn't support enabling of alpha features for Production Grade clusters. +- Support for Kubernetes alpha features like Volume Health Monitoring will not be available in Openshift environment as Openshift doesn't support enabling of alpha features for Production Grade clusters. \ No newline at end of file diff --git a/content/v2/csidriver/release/unity.md b/content/v2/csidriver/release/unity.md index 2d775e9939..b889bf3294 100644 --- a/content/v2/csidriver/release/unity.md +++ b/content/v2/csidriver/release/unity.md @@ -3,7 +3,8 @@ title: Unity XT description: Release notes for Unity XT CSI driver --- -## Release Notes - CSI Unity XT v2.10.1 +## Release Notes - CSI Unity XT v2.11.0 + @@ -14,15 +15,20 @@ description: Release notes for Unity XT CSI driver ### New Features/Changes -- [#1284 - [FEATURE]: Support for Openshift 4.15](https://github.com/dell/csm/issues/1284) -- [#1285 - [FEATURE]: Remove checks in code for non-supported installs of CSM](https://github.com/dell/csm/issues/1285) -- [#926 - [FEATURE]: Fixing the linting, formatting and vetting issues](https://github.com/dell/csm/issues/926) +- [#1359 - [FEATURE]: Add Support for OpenShift Container Platform (OCP) 4.16 ](https://github.com/dell/csm/issues/1359) +- [#1400 - [FEATURE]: Support for Kubernetes 1.30](https://github.com/dell/csm/issues/1400) +- [#1399 - [FEATURE]: Unity 5.4 Support](https://github.com/dell/csm/issues/1399) ### Fixed Issues -- [#1081 - [BUG]: CSM driver repositories reference CSI Operator](https://github.com/dell/csm/issues/1081) -- [#1140 - [BUG]: Cert-csi tests are not reporting the passed testcases in K8S E2E tests ](https://github.com/dell/csm/issues/1140) -- [#1174 - [BUG]: Kubelet Configuration Directory setting should not have a comment about default value being None](https://github.com/dell/csm/issues/1174) +- [#1198 - [BUG]: Topology-related node labels are not added automatically](https://github.com/dell/csm/issues/1198) +- [#1206 - [BUG]: Snapshot ingestion procedure for CSI Unity Driver misising ](https://github.com/dell/csm/issues/1206) +- [#1209 - [BUG]: Doc hyper links in driver Readme is broken](https://github.com/dell/csm/issues/1209) +- [#1218 - [BUG]: Add the helm-charts-version parameter to the install command for all drivers in csm-docs](https://github.com/dell/csm/issues/1218) +- [#1222 - [BUG]: Cannot configure export IP for CSI-Unity ](https://github.com/dell/csm/issues/1222) +- [#1239 - [BUG]: Changes in new release of google.golang.org/protobuf is causing compilation issues](https://github.com/dell/csm/issues/1239) +- [#1270 - [BUG]: Missing entries for Resiliency in installation wizard template](https://github.com/dell/csm/issues/1270) +- [#1279 - [BUG]: unable to install the UNITY driver in NAT Env](https://github.com/dell/csm/issues/1279) ### Known Issues @@ -30,12 +36,13 @@ description: Release notes for Unity XT CSI driver |-------|------------| | Nodes not getting registered on Unity XT. | Creating wrapper around `hostname` command inside the node pod's driver container, that fails when `-I` flag is used. This will triggrer fallback behaviour in driver and should fix the issue. | | Topology-related node labels are not removed automatically. | Currently, when the driver is uninstalled, topology-related node labels are not getting removed automatically. There is an open issue in the Kubernetes to fix this. Until the fix is released, remove the labels manually after the driver un-installation using command **kubectl label node - - ...** Example: **kubectl label node csi-unity.dellemc.com/array123-iscsi-** Note: there must be - at the end of each label to remove it.| -| NFS Clone - Resize of the snapshot is not supported by Unity XT Platform, however the user should never try to resize the cloned NFS volume.| Currently, when the driver takes a clone of NFS volume, it succeeds but if the user tries to resize the NFS volumesnapshot, the driver will throw an error.| +| NFS Clone - Resize of the snapshot is not supported by Unity XT Platform, however, the user should never try to resize the cloned NFS volume.| Currently, when the driver takes a clone of NFS volume, it succeeds but if the user tries to resize the NFS volumesnapshot, the driver will throw an error.| | Delete namespace that has PVCs and pods created with the driver. The External health monitor sidecar crashes as a result of this operation.| Deleting the namespace deletes the PVCs first and then removes the pods in the namespace. This brings a condition where pods exist without their PVCs and causes the external-health-monitor sidecar to crash. This is a known issue and has been reported at https://github.com/kubernetes-csi/external-health-monitor/issues/100| | When a node goes down, the block volumes attached to the node cannot be attached to another node | This is a known issue and has been reported at https://github.com/kubernetes-csi/external-attacher/issues/215. Workaround:
    1. Force delete the pod running on the node that went down
    2. Delete the VolumeAttachment to the node that went down.
    Now the volume can be attached to the new node. | | A CSI ephemeral pod may not get created in OpenShift 4.13 and fail with the error `"error when creating pod: the pod uses an inline volume provided by CSIDriver csi-unity.dellemc.com, and the namespace has a pod security enforcement level that is lower than privileged."` | This issue occurs because OpenShift 4.13 introduced the CSI Volume Admission plugin to restrict the use of a CSI driver capable of provisioning CSI ephemeral volumes during pod admission. Therefore, an additional label `security.openshift.io/csi-ephemeral-volume-profile` in [csidriver.yaml](https://github.com/dell/helm-charts/blob/csi-unity-2.8.0/charts/csi-unity/templates/csidriver.yaml) file with the required security profile value should be provided. Follow [OpenShift 4.13 documentation for CSI Ephemeral Volumes](https://docs.openshift.com/container-platform/4.13/storage/container_storage_interface/ephemeral-storage-csi-inline.html) for more information. | -| If the volume limit is exhausted and there are pending pods and PVCs due to `exceed max volume count`, the pending PVCs will be bound to PVs and the pending pods will be scheduled to nodes when the driver pods are restarted. | It is advised not to have any pending pods or PVCs once the volume limit per node is exhausted on a CSI Driver. There is an open issue reported with kubenetes at https://github.com/kubernetes/kubernetes/issues/95911 with the same behavior. | +| If the volume limit is exhausted and there are pending pods and PVCs due to `exceed max volume count`, the pending PVCs will be bound to PVs and the pending pods will be scheduled to nodes when the driver pods are restarted. | It is advised not to have any pending pods or PVCs once the volume limit per node is exhausted on a CSI Driver. There is an open issue reported with Kubernetes at https://github.com/kubernetes/kubernetes/issues/95911 with the same behavior. | | fsGroupPolicy may not work as expected without root privileges for NFS only [https://github.com/kubernetes/examples/issues/260](https://github.com/kubernetes/examples/issues/260) | To get the desired behavior set “RootClientEnabled” = “true” in the storage class parameter | +| Controller publish is taking too long to complete/ Health monitoring is causing Unity array to panic by opening multiple sessions/ There are error messages in the log `context deadline exceeded`, when health monitoring is enabled | Disable volume health monitoring on the node and keep it only at the controller level. Refer [here](https://dell.github.io/csm-docs/docs/csidriver/features/unity/#volume-health-monitoring) for more information about enabling/disabling volume health monitoring| ### Note: -- Support for Kubernetes alpha features like Volume Health Monitoring will not be available in Openshift environment as Openshift doesn't support enabling of alpha features for Production Grade clusters. +- Support for Kubernetes alpha features like Volume Health Monitoring will not be available in the Openshift environment as Openshift doesn't support enabling of alpha features for Production Grade clusters. diff --git a/content/v2/csidriver/troubleshooting/powerflex.md b/content/v2/csidriver/troubleshooting/powerflex.md index e4c8f0dcf2..11b7af93f3 100644 --- a/content/v2/csidriver/troubleshooting/powerflex.md +++ b/content/v2/csidriver/troubleshooting/powerflex.md @@ -6,6 +6,7 @@ description: Troubleshooting PowerFlex Driver | Symptoms | Prevention, Resolution or Workaround | |------------|--------------| +| After installation vxflexos-node pods are in an `Init:CrashLoopBackOff` state in OpenShift 4.16 with error message: ```Back-off restarting failed container sdc in pod vxflexos-node``` on non-supported kernel versions. | Use SDC version 4.5.2.1 in OpenShift 4.16. | | The installation fails with the following error message:
    ```Node xxx does not have the SDC installed```| Install the PowerFlex SDC on listed nodes. The SDC must be installed on all the nodes that need to pull an image of the driver. | | When you run the command `kubectl describe pods vxflexos-controller-* –n vxflexos`, the system indicates that the driver image could not be loaded. | - If on Kubernetes, edit the `daemon.json` file found in the registry location and add
    ```{ "insecure-registries" :[ "hostname.cloudapp.net:5000" ] }```
    - If on OpenShift, run the command `oc edit image.config.openshift.io/cluster` and add registries to yaml file that is displayed when you run the command. | |The `kubectl logs -n vxflexos vxflexos-controller-* driver` logs show that the driver is not authenticated.| Check the username, password, and the gateway IP address for the PowerFlex system.| @@ -30,6 +31,7 @@ description: Troubleshooting PowerFlex Driver | In version v2.6.0, when a cluster node goes down, the block volumes attached to the node cannot be attached to another node. | This is a known issue reported at [kubernetes-csi/external-attacher#215](https://github.com/kubernetes-csi/external-attacher/issues/215). Workaround:
    1. Force delete the pod running on the node that went down.
    2. Delete the pod's persistent volume attachment on the node that went down. Now the volume can be attached to the new node. A CSI ephemeral pod may not get created in OpenShift 4.13 and fail with the error `"error when creating pod: the pod uses an inline volume provided by CSIDriver csi-vxflexos.dellemc.com, and the namespace has a pod security enforcement level that is lower than privileged."` | This issue occurs because OpenShift 4.13 introduced the CSI Volume Admission plugin to restrict the use of a CSI driver capable of provisioning CSI ephemeral volumes during pod admission. Therefore, an additional label `security.openshift.io/csi-ephemeral-volume-profile` in [csidriver.yaml](https://github.com/dell/helm-charts/blob/csi-vxflexos-2.8.0/charts/csi-vxflexos/templates/csidriver.yaml) file with the required security profile value should be provided. Follow [OpenShift 4.13 documentation for CSI Ephemeral Volumes](https://docs.openshift.com/container-platform/4.13/storage/container_storage_interface/ephemeral-storage-csi-inline.html) for more information. | | Standby controller pod is in crashloopbackoff state | Scale down the replica count of the controller pod's deployment to 1 using ```kubectl scale deployment --replicas=1 -n ``` | +|CSM object `vxflexos` is in falied state and CSI-Powerflex driver is not in running state | Verify the secret name: `kubectl get secret -n ` it should be in `-config` format. 1. Retrieve the existing secret: `kubectl get secret old-secret-name -n -o yaml > secret.yaml`
    2. Edit the secret.yaml file: Change metadata.name to -Config
    3. Apply the new secret: `kubectl apply -f secret.yaml`
    4. Delete the old secret: kubectl delete secret old-secret-name| > diff --git a/content/v2/csidriver/troubleshooting/powerscale.md b/content/v2/csidriver/troubleshooting/powerscale.md index 260b9a1555..cbba6686c0 100644 --- a/content/v2/csidriver/troubleshooting/powerscale.md +++ b/content/v2/csidriver/troubleshooting/powerscale.md @@ -19,5 +19,4 @@ Here are some installation failures that might be encountered and how to mitigat | When an attempt is made to create more than one ReadOnly PVC from the same volume snapshot, the second and subsequent requests result in PVCs in state `Pending`, with a warning `another RO volume from this snapshot is already present`. This is because the driver allows only one RO volume from a specific snapshot at any point in time. This is to allow faster creation(within a few seconds) of a RO PVC from a volume snapshot irrespective of the size of the volume snapshot. | Wait for the deletion of the first RO PVC created from the same volume snapshot. | |Driver install or upgrade fails because of an incompatible Kubernetes version, even though the version seems to be within the range of compatibility. For example: Error: UPGRADE FAILED: chart requires kubeVersion: >= 1.22.0 < 1.25.0 which is incompatible with Kubernetes V1.22.11-mirantis-1 | If you are using an extended Kubernetes version, please see the [helm Chart](https://github.com/dell/helm-charts/blob/main/charts/csi-isilon/Chart.yaml) and use the alternate kubeVersion check that is provided in the comments. Please note that this is not meant to be used to enable the use of pre-release alpha and beta versions, which is not supported.| | Standby controller pod is in crashloopbackoff state | Scale down the replica count of the controller pod's deployment to 1 using ```kubectl scale deployment --replicas=1 -n ``` | -| Driver install fails because of the incompatible helm values file specified in ```dell-csi-helm-installer``` - expected: v2.9.x, found: v2.8.0. | Change driver version in each file in ```dell/csi-powerscale/dell-csi-helm-installer``` from 2.8.0 to 2.9.x | | fsGroupPolicy may not work as expected without root privileges for NFS only [https://github.com/kubernetes/examples/issues/260](https://github.com/kubernetes/examples/issues/260) | To get the desired behavior set “RootClientEnabled” = “true” in the storage class parameter | diff --git a/content/v2/deployment/_index.md b/content/v2/deployment/_index.md index 28f9f27896..ff85a9e527 100644 --- a/content/v2/deployment/_index.md +++ b/content/v2/deployment/_index.md @@ -19,7 +19,7 @@ The Container Storage Modules and the required CSI Drivers can each be deployed {{% cardpane %}} - {{< card header="[Dell CSI Drivers Installation via Helm](helm/drivers/installation/)" + {{< card header="[Dell CSI Drivers Installation via Helm](helm/drivers)" footer="Installs [PowerStore](helm/drivers/installation/powerstore/) [PowerMax](helm/drivers/installation/powermax/) [PowerScale](helm/drivers/installation/isilon/) [PowerFlex](helm/drivers/installation/powerflex/) [Unity XT](helm/drivers/installation/unity/)">}} Dell CSI Helm installer installs the CSI Driver components using the provided Helm charts. [...More on installation instructions](helm/drivers/installation/) @@ -60,11 +60,6 @@ The Container Storage Modules and the required CSI Drivers can each be deployed {{< /card >}} {{% /cardpane %}} {{% cardpane %}} - {{< card header="[Dell Container Storage Module for Application Mobility](helm/modules/installation/applicationmobility)" - footer="Installs Application Mobility Module">}} - Application mobility module can be installed via helm charts. This is a tech preview release and it requires a license for installation. - [...More on installation instructions](helm/modules/installation/applicationmobility) - {{< /card >}} {{< card header="[Dell Container Storage Module for Encryption](helm/modules/installation/encryption)" footer="Installs Encryption Module">}} Encryption can be optionally installed via the PowerScale CSI driver Helm chart. diff --git a/content/v2/deployment/csminstallationwizard/_index.md b/content/v2/deployment/csminstallationwizard/_index.md index da058ef8ad..e8fd5038b3 100644 --- a/content/v2/deployment/csminstallationwizard/_index.md +++ b/content/v2/deployment/csminstallationwizard/_index.md @@ -13,26 +13,26 @@ The [Dell Container Storage Modules Installation Wizard](./src/index.html) is a | CSI Driver | Version | Helm | Operator | | ------------------ | --------- | ------ | --------- | +| CSI PowerStore | 2.11.0 |✔️ |✔️ | | CSI PowerStore | 2.10.1 |✔️ |✔️ | -| CSI PowerStore | 2.9.0 |✔️ |✔️ | +| CSI PowerStore | 2.9.1 |✔️ |✔️ | | CSI PowerStore | 2.8.0 |✔️ |✔️ | -| CSI PowerStore | 2.7.0 |✔️ |✔️ | +| CSI PowerMax | 2.11.0 |✔️ |✔️ | | CSI PowerMax | 2.10.1 |✔️ |✔️ | -| CSI PowerMax | 2.9.0 |✔️ |✔️ | -| CSI PowerMax | 2.8.0 |✔️ |✔️ | +| CSI PowerMax | 2.9.1 |✔️ |✔️ | | CSI PowerMax | 2.8.0 |✔️ |✔️ | +| CSI PowerFlex | 2.11.0 |✔️ |❌ | | CSI PowerFlex | 2.10.1 |✔️ |❌ | -| CSI PowerFlex | 2.9.0 |✔️ |❌ | +| CSI PowerFlex | 2.9.1 |✔️ |❌ | | CSI PowerFlex | 2.8.0 |✔️ |❌ | -| CSI PowerFlex | 2.7.0 |✔️ |❌ | +| CSI PowerScale | 2.11.0 |✔️ |✔️ | | CSI PowerScale | 2.10.1 |✔️ |✔️ | -| CSI PowerScale | 2.9.0 |✔️ |✔️ | +| CSI PowerScale | 2.9.1 |✔️ |✔️ | | CSI PowerScale | 2.8.0 |✔️ |✔️ | -| CSI PowerScale | 2.7.0 |✔️ |✔️ | +| CSI Unity XT | 2.11.0 |✔️ |❌ | | CSI Unity XT | 2.10.1 |✔️ |❌ | -| CSI Unity XT | 2.9.0 |✔️ |❌ | +| CSI Unity XT | 2.9.1 |✔️ |❌ | | CSI Unity XT | 2.8.0 |✔️ |❌ | -| CSI Unity XT | 2.7.0 |✔️ |❌ | >NOTE: The Installation Wizard currently does not support operator-based manifest file generation for Unity XT and PowerFlex drivers. @@ -102,7 +102,7 @@ The [Dell Container Storage Modules Installation Wizard](./src/index.html) is a ```terminal helm install dell/container-storage-modules -n --version -f - Example: helm install powerstore dell/container-storage-modules -n csi-powerstore --version 1.2.1 -f values.yaml + Example: helm install powerstore dell/container-storage-modules -n csi-powerstore --version 1.4.0 -f values.yaml ``` ## Installation Using Operator diff --git a/content/v2/deployment/csminstallationwizard/release/_index.md b/content/v2/deployment/csminstallationwizard/release/_index.md index b78a9f9b7d..756c37405b 100644 --- a/content/v2/deployment/csminstallationwizard/release/_index.md +++ b/content/v2/deployment/csminstallationwizard/release/_index.md @@ -5,7 +5,8 @@ weight: 5 description: Release notes for CSM Installation Wizard --- -## Release Notes - CSM Installation Wizard 1.2.1 +## Release Notes - CSM Installation Wizard 1.3.0 + @@ -14,9 +15,12 @@ description: Release notes for CSM Installation Wizard ### New Features/Changes +There are no new features in this release. ### Fixed Issues +- [#1270 - [BUG]: Missing entries for Resiliency in installation wizard template](https://github.com/dell/csm/issues/1270) +- [#1275 - [BUG]: Installation Wizard creates a 0Byte file when selecting Operator for the installation type](https://github.com/dell/csm/issues/1275) ### Known Issues diff --git a/content/v2/deployment/csminstallationwizard/src/csm-versions/default-values.properties b/content/v2/deployment/csminstallationwizard/src/csm-versions/default-values.properties index 2ba042bb0e..7ec130a487 100644 --- a/content/v2/deployment/csminstallationwizard/src/csm-versions/default-values.properties +++ b/content/v2/deployment/csminstallationwizard/src/csm-versions/default-values.properties @@ -1,4 +1,4 @@ -csmVersion=1.10.2 +csmVersion=1.11.0 imageRepository=dellemc controllerCount=1 nodeSelectorLabel=node-role.kubernetes.io/control-plane: diff --git a/content/v2/deployment/csminstallationwizard/src/index.html b/content/v2/deployment/csminstallationwizard/src/index.html index 5f462b8c62..599eb0e03b 100644 --- a/content/v2/deployment/csminstallationwizard/src/index.html +++ b/content/v2/deployment/csminstallationwizard/src/index.html @@ -80,10 +80,10 @@

    @@ -716,7 +716,7 @@
    - + diff --git a/content/v2/deployment/csminstallationwizard/src/static/css/style.css b/content/v2/deployment/csminstallationwizard/src/static/css/style.css index 6dd46cba17..e309e14b39 100644 --- a/content/v2/deployment/csminstallationwizard/src/static/css/style.css +++ b/content/v2/deployment/csminstallationwizard/src/static/css/style.css @@ -147,5 +147,4 @@ main { padding-bottom: 150px; - } - + } \ No newline at end of file diff --git a/content/v2/deployment/csminstallationwizard/src/static/js/constants.js b/content/v2/deployment/csminstallationwizard/src/static/js/constants.js index 56564f55c6..18787eed66 100644 --- a/content/v2/deployment/csminstallationwizard/src/static/js/constants.js +++ b/content/v2/deployment/csminstallationwizard/src/static/js/constants.js @@ -40,10 +40,10 @@ const CONSTANTS = { PROPERTIES: ".properties", HELM: "helm", OPERATOR: "operator", - CSM_HELM_V170: "1.0.0", CSM_HELM_V180: "1.1.0", CSM_HELM_V193: "1.2.1", CSM_HELM_V1102: "1.3.2", + CSM_HELM_V1110: "1.4.0", HELM_TAINTS: ` - key: "$KEY" operator: "Exists" diff --git a/content/v2/deployment/csminstallationwizard/src/static/js/tests/generate-yaml.test.js b/content/v2/deployment/csminstallationwizard/src/static/js/tests/generate-yaml.test.js index 913e946aec..5a7eb48ace 100644 --- a/content/v2/deployment/csminstallationwizard/src/static/js/tests/generate-yaml.test.js +++ b/content/v2/deployment/csminstallationwizard/src/static/js/tests/generate-yaml.test.js @@ -42,10 +42,10 @@ const CONSTANTS = { PROPERTIES: ".properties", HELM: "helm", OPERATOR: "operator", - CSM_HELM_V170: "1.0.0", CSM_HELM_V180: "1.1.0", CSM_HELM_V193: "1.2.1", CSM_HELM_V1102: "1.3.2", + CSM_HELM_V1110: "1.4.0", HELM_TAINTS: ` - key: "$KEY" operator: "Exists" diff --git a/content/v2/deployment/csminstallationwizard/src/static/js/tests/ui-functions.test.js b/content/v2/deployment/csminstallationwizard/src/static/js/tests/ui-functions.test.js index ec1356edf6..e477a66b74 100644 --- a/content/v2/deployment/csminstallationwizard/src/static/js/tests/ui-functions.test.js +++ b/content/v2/deployment/csminstallationwizard/src/static/js/tests/ui-functions.test.js @@ -68,10 +68,10 @@ const CONSTANTS = { PROPERTIES: ".properties", HELM: "helm", OPERATOR: "operator", - CSM_HELM_V170: "1.0.0", CSM_HELM_V180: "1.1.0", CSM_HELM_V193: "1.2.1", CSM_HELM_V1102: "1.3.2", + CSM_HELM_V1110: "1.4.0", }; describe("GIVEN onAuthorizationChange function", () => { @@ -257,18 +257,22 @@ describe("GIVEN onTopologyChange function", () => { document.body.innerHTML = `
    +
    `; onCertManagerChange("Temp topology note"); expect($("div#topology-note-wrapper").css("display")).toEqual("block"); + expect($("div#observability-operator-topology-wrapper").css("display")).toEqual("block"); }); test("SHOULD show topology components when option checked", () => { document.body.innerHTML = ` -
    +
    diff --git a/content/v3/deployment/csminstallationwizard/src/static/css/style.css b/content/v3/deployment/csminstallationwizard/src/static/css/style.css index d58e50a03f..6dd46cba17 100644 --- a/content/v3/deployment/csminstallationwizard/src/static/css/style.css +++ b/content/v3/deployment/csminstallationwizard/src/static/css/style.css @@ -148,3 +148,4 @@ main { padding-bottom: 150px; } + diff --git a/content/v3/deployment/csminstallationwizard/src/static/js/constants.js b/content/v3/deployment/csminstallationwizard/src/static/js/constants.js index 0c8b3abc46..56564f55c6 100644 --- a/content/v3/deployment/csminstallationwizard/src/static/js/constants.js +++ b/content/v3/deployment/csminstallationwizard/src/static/js/constants.js @@ -43,6 +43,7 @@ const CONSTANTS = { CSM_HELM_V170: "1.0.0", CSM_HELM_V180: "1.1.0", CSM_HELM_V193: "1.2.1", + CSM_HELM_V1102: "1.3.2", HELM_TAINTS: ` - key: "$KEY" operator: "Exists" diff --git a/content/v3/deployment/csminstallationwizard/src/static/js/tests/generate-yaml.test.js b/content/v3/deployment/csminstallationwizard/src/static/js/tests/generate-yaml.test.js index 20c48fbc5f..913e946aec 100644 --- a/content/v3/deployment/csminstallationwizard/src/static/js/tests/generate-yaml.test.js +++ b/content/v3/deployment/csminstallationwizard/src/static/js/tests/generate-yaml.test.js @@ -45,6 +45,7 @@ const CONSTANTS = { CSM_HELM_V170: "1.0.0", CSM_HELM_V180: "1.1.0", CSM_HELM_V193: "1.2.1", + CSM_HELM_V1102: "1.3.2", HELM_TAINTS: ` - key: "$KEY" operator: "Exists" diff --git a/content/v3/deployment/csminstallationwizard/src/static/js/tests/ui-functions.test.js b/content/v3/deployment/csminstallationwizard/src/static/js/tests/ui-functions.test.js index 5bb1171ae8..ec1356edf6 100644 --- a/content/v3/deployment/csminstallationwizard/src/static/js/tests/ui-functions.test.js +++ b/content/v3/deployment/csminstallationwizard/src/static/js/tests/ui-functions.test.js @@ -71,6 +71,7 @@ const CONSTANTS = { CSM_HELM_V170: "1.0.0", CSM_HELM_V180: "1.1.0", CSM_HELM_V193: "1.2.1", + CSM_HELM_V1102: "1.3.2", }; describe("GIVEN onAuthorizationChange function", () => { diff --git a/content/v3/deployment/csminstallationwizard/src/static/js/tests/utility.test.js b/content/v3/deployment/csminstallationwizard/src/static/js/tests/utility.test.js index 2c7b9b9f97..8191a4ffe3 100644 --- a/content/v3/deployment/csminstallationwizard/src/static/js/tests/utility.test.js +++ b/content/v3/deployment/csminstallationwizard/src/static/js/tests/utility.test.js @@ -48,6 +48,7 @@ const CONSTANT_PARAM = { CSM_HELM_V170: "1.0.0", CSM_HELM_V180: "1.1.0", CSM_HELM_V193: "1.2.1", + CSM_HELM_V1102: "1.3.2", HELM_TAINTS: ` - key: "$KEY" operator: "Exists" diff --git a/content/v3/deployment/csminstallationwizard/src/static/js/ui-functions.js b/content/v3/deployment/csminstallationwizard/src/static/js/ui-functions.js index ce54ae5ed8..f1b5139cae 100644 --- a/content/v3/deployment/csminstallationwizard/src/static/js/ui-functions.js +++ b/content/v3/deployment/csminstallationwizard/src/static/js/ui-functions.js @@ -472,8 +472,11 @@ function displayCommands(releaseNameValue, commandTitleValue, commandNoteValue, case "1.9.3": helmChartVersion = CONSTANTS.CSM_HELM_V193; break; + case "1.10.2": + helmChartVersion = CONSTANTS.CSM_HELM_V1102; + break; default: - helmChartVersion = CONSTANTS.CSM_HELM_V193; + helmChartVersion = CONSTANTS.CSM_HELM_V1102; break; } $("#command-text-area").show(); diff --git a/content/v2/deployment/csminstallationwizard/src/templates/helm/csm-1.7.0-values.template b/content/v3/deployment/csminstallationwizard/src/templates/helm/csm-1.10.2-values.template similarity index 73% rename from content/v2/deployment/csminstallationwizard/src/templates/helm/csm-1.7.0-values.template rename to content/v3/deployment/csminstallationwizard/src/templates/helm/csm-1.10.2-values.template index 665673aff8..8082ac7195 100644 --- a/content/v2/deployment/csminstallationwizard/src/templates/helm/csm-1.7.0-values.template +++ b/content/v3/deployment/csminstallationwizard/src/templates/helm/csm-1.10.2-values.template @@ -4,9 +4,23 @@ ########################################## csi-powerstore: enabled: $POWERSTORE_ENABLED - version: v2.7.0 + version: v2.10.1 images: - driverRepository: $IMAGE_REPOSITORY + # "driver" defines the container image, used for the driver container. + driver: dellemc/csi-powerstore:v2.10.1 + # CSI sidecars + attacher: registry.k8s.io/sig-storage/csi-attacher:v4.5.0 + provisioner: registry.k8s.io/sig-storage/csi-provisioner:v4.0.0 + snapshotter: registry.k8s.io/sig-storage/csi-snapshotter:v7.0.1 + resizer: registry.k8s.io/sig-storage/csi-resizer:v1.10.0 + registrar: registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.10.0 + healthmonitor: registry.k8s.io/sig-storage/csi-external-health-monitor-controller:v0.11.0 + + # CSM sidecars + replication: dellemc/dell-csi-replicator:v1.8.0 + vgsnapshotter: dellemc/csi-volumegroup-snapshotter:v1.4.0 + podmon: dellemc/podmon:v1.9.0 + metadataretriever: dellemc/csi-metadata-retriever:v1.6.0 ## Controller ATTRIBUTES controller: controllerCount: $CONTROLLER_COUNT @@ -17,11 +31,8 @@ csi-powerstore: tolerations: $CONTROLLER_TOLERATIONS replication: enabled: $REPLICATION_ENABLED - image: dellemc/dell-csi-replicator:v1.5.0 vgsnapshot: enabled: $VG_SNAPSHOT_ENABLED - image: dellemc/csi-volumegroup-snapshotter:v1.2.0 - metadataretriever: dellemc/csi-metadata-retriever:v1.4.0 snapshot: enabled: $SNAPSHOT_ENABLED snapNamePrefix: $SNAP_NAME_PREFIX @@ -62,7 +73,6 @@ csi-powerstore: enabled: $STORAGE_CAPACITY_ENABLED podmon: enabled: $RESILIENCY_ENABLED - image: dellemc/podmon:v1.6.0 controller: args: - "--csisock=unix:/var/run/csi/csi.sock" @@ -87,28 +97,48 @@ csi-powerstore: - "--driverPodLabelValue=dell-storage" - "--ignoreVolumelessPods=false" + maxPowerstoreVolumesPerNode: $MAX_VOLUMES_PER_NODE + podmonAPIPort: 8083 + ## K8S/CSI-PowerMax ATTRIBUTES ########################################## csi-powermax: enabled: $POWERMAX_ENABLED global: - storageArrays: - - storageArrayId: "$POWERMAX_STORAGE_ARRAY_ID" - endpoint: $POWERMAX_STORAGE_ARRAY_ENDPOINT_URL - backupEndpoint: $POWERMAX_STORAGE_ARRAY_BACKUP_ENDPOINT_URL - - storageArrayId: "$TARGET_ARRAY_ID" - endpoint: $TARGET_UNISPHERE - managementServers: - - endpoint: $POWERMAX_MANAGEMENT_SERVERS_ENDPOINT_URL - - endpoint: $TARGET_UNISPHERE - version: v2.7.0 + storageArrays: + - storageArrayId: "$POWERMAX_STORAGE_ARRAY_ID" + endpoint: $POWERMAX_STORAGE_ARRAY_ENDPOINT_URL + backupEndpoint: $POWERMAX_STORAGE_ARRAY_BACKUP_ENDPOINT_URL + - storageArrayId: "$TARGET_ARRAY_ID" + endpoint: $TARGET_UNISPHERE + managementServers: + - endpoint: $POWERMAX_MANAGEMENT_SERVERS_ENDPOINT_URL + - endpoint: $TARGET_UNISPHERE + version: v2.10.1 images: - driverRepository: $IMAGE_REPOSITORY + # "driver" defines the container image, used for the driver container. + driver: dellemc/csi-powermax:v2.10.1 + csireverseproxy: dellemc/csipowermax-reverseproxy:v2.9.0 + # CSI sidecars + attacher: registry.k8s.io/sig-storage/csi-attacher:v4.5.0 + provisioner: registry.k8s.io/sig-storage/csi-provisioner:v4.0.0 + snapshotter: registry.k8s.io/sig-storage/csi-snapshotter:v7.0.1 + resizer: registry.k8s.io/sig-storage/csi-resizer:v1.10.0 + registrar: registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.10.0 + healthmonitor: registry.k8s.io/sig-storage/csi-external-health-monitor-controller:v0.11.0 + # CSM sidecars + replication: dellemc/dell-csi-replicator:v1.8.0 + authorization: dellemc/csm-authorization-sidecar:v1.10.0 + migration: dellemc/dell-csi-migrator:v1.3.0 + noderescan: dellemc/dell-csi-node-rescanner:v1.2.0 clusterPrefix: $POWERMAX_CLUSTER_PREFIX portGroups: "$POWERMAX_PORT_GROUPS" fsGroupPolicy: "$FSGROUP_POLICY" + maxPowerMaxVolumesPerNode: $MAX_VOLUMES_PER_NODE enableCHAP: $ISCSI_CHAP_ENABLED transportProtocol: "$NODE_TRANSPORT_PROTOCOL" + storageCapacity: + enabled: $STORAGE_CAPACITY_ENABLED controller: controllerCount: $CONTROLLER_COUNT volumeNamePrefix: $VOLUME_NAME_PREFIX @@ -138,20 +168,17 @@ csi-powermax: operator: "Exists" effect: "NoExecute" csireverseproxy: - image: dellemc/csipowermax-reverseproxy:v2.6.0 deployAsSidecar: true replication: enabled: $REPLICATION_ENABLED - image: dellemc/dell-csi-replicator:v1.5.0 migration: enabled: $MIGRATION_ENABLED - image: dellemc/dell-csi-migrator:v1.1.1 - nodeRescanSidecarImage: dellemc/dell-csi-node-rescanner:v1.0.1 authorization: enabled: $AUTHORIZATION_ENABLED - sidecarProxyImage: dellemc/csm-authorization-sidecar:v1.7.0 proxyHost: $AUTHORIZATION_PROXY_HOST skipCertificateValidation: $AUTHORIZATION_SKIP_CERTIFICATE_VALIDATION + storageCapacity: + enabled: $STORAGE_CAPACITY_ENABLED vSphere: enabled: $VSPHERE_ENABLED fcPortGroup: "$VSPHERE_FC_PORT_GROUP" @@ -163,15 +190,28 @@ csi-powermax: ########################################## csi-vxflexos: enabled: $POWERFLEX_ENABLED - version: v2.7.0 + version: v2.10.1 images: - driverRepository: $IMAGE_REPOSITORY - powerflexSdc: dellemc/sdc:3.6.0.6 + # "driver" defines the container image, used for the driver container. + driver: dellemc/csi-vxflexos:v2.10.1 + # "powerflexSdc" defines the SDC image for init container. + powerflexSdc: dellemc/sdc:4.5 + # CSI sidecars + attacher: registry.k8s.io/sig-storage/csi-attacher:v4.5.0 + provisioner: registry.k8s.io/sig-storage/csi-provisioner:v4.0.0 + snapshotter: registry.k8s.io/sig-storage/csi-snapshotter:v7.0.1 + resizer: registry.k8s.io/sig-storage/csi-resizer:v1.10.0 + registrar: registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.10.0 + healthmonitor: registry.k8s.io/sig-storage/csi-external-health-monitor-controller:v0.11.0 + # CSM sidecars + replication: dellemc/dell-csi-replicator:v1.8.0 + vgsnapshotter: dellemc/csi-volumegroup-snapshotter:v1.4.0 + podmon: dellemc/podmon:v1.9.0 + authorization: dellemc/csm-authorization-sidecar:v1.10.0 certSecretCount: $CERT_SECRET_COUNT controller: replication: enabled: $REPLICATION_ENABLED - image: dellemc/dell-csi-replicator:v1.5.0 healthMonitor: enabled: $HEALTH_MONITOR_ENABLED controllerCount: $CONTROLLER_COUNT @@ -211,14 +251,16 @@ csi-vxflexos: # - key: "isilon.podmon.storage.dell.com" # operator: "Exists" # effect: "NoSchedule" + storageCapacity: + enabled: $STORAGE_CAPACITY_ENABLED + enableQuota: $QUOTA_ENABLED + externalAccess: monitor: enabled: $MONITOR_ENABLED vgsnapshotter: enabled: $VG_SNAPSHOT_ENABLED - image: dellemc/csi-volumegroup-snapshotter:v1.2.0 podmon: enabled: $RESILIENCY_ENABLED - image: dellemc/podmon:v1.6.0 controller: args: - "--csisock=unix:/var/run/csi/csi.sock" @@ -239,50 +281,52 @@ csi-vxflexos: - "--ignoreVolumelessPods=false" authorization: enabled: $AUTHORIZATION_ENABLED - sidecarProxyImage: dellemc/csm-authorization-sidecar:v1.7.0 proxyHost: $AUTHORIZATION_PROXY_HOST skipCertificateValidation: $AUTHORIZATION_SKIP_CERTIFICATE_VALIDATION + maxPowerflexVolumesPerNode: $MAX_VOLUMES_PER_NODE ## K8S/CSI-PowerScale ATTRIBUTES ########################################## csi-isilon: enabled: $POWERSCALE_ENABLED - version: "v2.7.0" + version: "v2.10.1" images: - driverRepository: $IMAGE_REPOSITORY - certSecretCount: $CERT_SECRET_COUNT + # "driver" defines the container image, used for the driver container. + driver: dellemc/csi-isilon:v2.10.1 + # CSI sidecars + attacher: registry.k8s.io/sig-storage/csi-attacher:v4.5.0 + provisioner: registry.k8s.io/sig-storage/csi-provisioner:v4.0.0 + snapshotter: registry.k8s.io/sig-storage/csi-snapshotter:v7.0.1 + resizer: registry.k8s.io/sig-storage/csi-resizer:v1.10.0 + registrar: registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.10.0 + healthmonitor: registry.k8s.io/sig-storage/csi-external-health-monitor-controller:v0.11.0 + # CSM sidecars + replication: dellemc/dell-csi-replicator:v1.8.0 + podmon: dellemc/podmon:v1.9.0 + authorization: dellemc/csm-authorization-sidecar:v1.10.0 + metadataretriever: dellemc/csi-metadata-retriever:v1.4.0 + encryption: dellemc/csm-encryption:v0.3.0 + certSecretCount: $CERT_SECRET_COUNT allowedNetworks: [] - verbose: 1 - enableCustomTopology: false - fsGroupPolicy: $FSGROUP_POLICY - storageCapacity: enabled: $STORAGE_CAPACITY_ENABLED - maxIsilonVolumesPerNode: $MAX_VOLUMES_PER_NODE - controller: controllerCount: $CONTROLLER_COUNT volumeNamePrefix: $VOLUME_NAME_PREFIX - replication: enabled: $REPLICATION_ENABLED - image: dellemc/dell-csi-replicator:v1.5.0 - snapshot: enabled: $SNAPSHOT_ENABLED snapNamePrefix: $SNAP_NAME_PREFIX - resizer: enabled: $RESIZER_ENABLED - healthMonitor: enabled: $HEALTH_MONITOR_ENABLED - nodeSelector: $CONTROLLER_POD_NODE_SELECTOR tolerations: $CONTROLLER_TOLERATIONS node: @@ -319,17 +363,13 @@ csi-isilon: healthMonitor: enabled: $HEALTH_MONITOR_ENABLED - authorization: enabled: $AUTHORIZATION_ENABLED - sidecarProxyImage: dellemc/csm-authorization-sidecar:v1.7.0 proxyHost: $AUTHORIZATION_PROXY_HOST skipCertificateValidation: $AUTHORIZATION_SKIP_CERTIFICATE_VALIDATION - # Enable this feature only after contact support for additional information podmon: enabled: $RESILIENCY_ENABLED - image: dellemc/podmon:v1.6.0 controller: args: - "--csisock=unix:/var/run/csi/csi.sock" @@ -341,7 +381,6 @@ csi-isilon: - "--driver-config-params=/csi-isilon-config-params/driver-config-params.yaml" - "--driverPodLabelValue=dell-storage" - "--ignoreVolumelessPods=false" - node: args: - "--csisock=unix:/var/lib/kubelet/plugins/csi-isilon/csi_sock" @@ -354,13 +393,25 @@ csi-isilon: - "--driverPodLabelValue=dell-storage" - "--ignoreVolumelessPods=false" + podmonAPIPort: 8083 + ## K8S/CSI-Unity ATTRIBUTES ########################################## csi-unity: enabled: $UNITY_ENABLED - version: v2.7.0 + version: v2.10.1 images: - driverRepository: $IMAGE_REPOSITORY + # "driver" defines the container image, used for the driver container. + driver: dellemc/csi-unity:v2.10.1 + # CSI sidecars + attacher: registry.k8s.io/sig-storage/csi-attacher:v4.5.0 + provisioner: registry.k8s.io/sig-storage/csi-provisioner:v4.0.0 + snapshotter: registry.k8s.io/sig-storage/csi-snapshotter:v7.0.1 + resizer: registry.k8s.io/sig-storage/csi-resizer:v1.10.0 + registrar: registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.10.0 + healthmonitor: registry.k8s.io/sig-storage/csi-external-health-monitor-controller:v0.11.0 + # CSM sidecars + podmon: dellemc/podmon:v1.9.0 certSecretCount: $CERT_SECRET_COUNT fsGroupPolicy: $FSGROUP_POLICY controller: @@ -408,9 +459,11 @@ csi-unity: # - key: "isilon.podmon.storage.dell.com" # operator: "Exists" # effect: "NoSchedule" + storageCapacity: + enabled: $STORAGE_CAPACITY_ENABLED + maxUnityVolumesPerNode: $MAX_VOLUMES_PER_NODE podmon: enabled: $RESILIENCY_ENABLED - image: dellemc/podmon:v1.6.0 controller: args: - "--csisock=unix:/var/run/csi/csi.sock" diff --git a/content/v3/deployment/csminstallationwizard/src/templates/helm/csm-1.8.0-values.template b/content/v3/deployment/csminstallationwizard/src/templates/helm/csm-1.8.0-values.template index 5b8f25d417..8aa9673e00 100644 --- a/content/v3/deployment/csminstallationwizard/src/templates/helm/csm-1.8.0-values.template +++ b/content/v3/deployment/csminstallationwizard/src/templates/helm/csm-1.8.0-values.template @@ -88,6 +88,7 @@ csi-powerstore: - "--ignoreVolumelessPods=false" maxPowerstoreVolumesPerNode: $MAX_VOLUMES_PER_NODE + podmonAPIPort: 8083 ## K8S/CSI-PowerMax ATTRIBUTES ########################################## diff --git a/content/v3/deployment/csminstallationwizard/src/templates/helm/csm-1.9.3-values.template b/content/v3/deployment/csminstallationwizard/src/templates/helm/csm-1.9.3-values.template index aea7a6f51f..99155d6415 100644 --- a/content/v3/deployment/csminstallationwizard/src/templates/helm/csm-1.9.3-values.template +++ b/content/v3/deployment/csminstallationwizard/src/templates/helm/csm-1.9.3-values.template @@ -73,8 +73,32 @@ csi-powerstore: enabled: $STORAGE_CAPACITY_ENABLED podmon: enabled: $RESILIENCY_ENABLED + controller: + args: + - "--csisock=unix:/var/run/csi/csi.sock" + - "--labelvalue=csi-powerstore" + - "--arrayConnectivityPollRate=60" + - "--driverPath=csi-powerstore.dellemc.com" + - "--mode=controller" + - "--skipArrayConnectionValidation=false" + - "--driver-config-params=/powerstore-config-params/driver-config-params.yaml" + - "--driverPodLabelValue=dell-storage" + - "--ignoreVolumelessPods=false" + + node: + args: + - "--csisock=unix:/var/lib/kubelet/plugins/csi-powerstore.dellemc.com/csi_sock" + - "--labelvalue=csi-powerstore" + - "--arrayConnectivityPollRate=60" + - "--driverPath=csi-powerstore.dellemc.com" + - "--mode=node" + - "--leaderelection=false" + - "--driver-config-params=/powerstore-config-params/driver-config-params.yaml" + - "--driverPodLabelValue=dell-storage" + - "--ignoreVolumelessPods=false" maxPowerstoreVolumesPerNode: $MAX_VOLUMES_PER_NODE + podmonAPIPort: 8083 ## K8S/CSI-PowerMax ATTRIBUTES ########################################## @@ -237,6 +261,24 @@ csi-vxflexos: enabled: $VG_SNAPSHOT_ENABLED podmon: enabled: $RESILIENCY_ENABLED + controller: + args: + - "--csisock=unix:/var/run/csi/csi.sock" + - "--labelvalue=csi-vxflexos" + - "--mode=controller" + - "--skipArrayConnectionValidation=false" + - "--driver-config-params=/vxflexos-config-params/driver-config-params.yaml" + - "--driverPodLabelValue=dell-storage" + - "--ignoreVolumelessPods=false" + node: + args: + - "--csisock=unix:/var/lib/kubelet/plugins/vxflexos.emc.dell.com/csi_sock" + - "--labelvalue=csi-vxflexos" + - "--mode=node" + - "--leaderelection=false" + - "--driver-config-params=/vxflexos-config-params/driver-config-params.yaml" + - "--driverPodLabelValue=dell-storage" + - "--ignoreVolumelessPods=false" authorization: enabled: $AUTHORIZATION_ENABLED proxyHost: $AUTHORIZATION_PROXY_HOST @@ -328,6 +370,30 @@ csi-isilon: # Enable this feature only after contact support for additional information podmon: enabled: $RESILIENCY_ENABLED + controller: + args: + - "--csisock=unix:/var/run/csi/csi.sock" + - "--labelvalue=csi-isilon" + - "--arrayConnectivityPollRate=60" + - "--driverPath=csi-isilon.dellemc.com" + - "--mode=controller" + - "--skipArrayConnectionValidation=false" + - "--driver-config-params=/csi-isilon-config-params/driver-config-params.yaml" + - "--driverPodLabelValue=dell-storage" + - "--ignoreVolumelessPods=false" + node: + args: + - "--csisock=unix:/var/lib/kubelet/plugins/csi-isilon/csi_sock" + - "--labelvalue=csi-isilon" + - "--arrayConnectivityPollRate=60" + - "--driverPath=csi-isilon.dellemc.com" + - "--mode=node" + - "--leaderelection=false" + - "--driver-config-params=/csi-isilon-config-params/driver-config-params.yaml" + - "--driverPodLabelValue=dell-storage" + - "--ignoreVolumelessPods=false" + + podmonAPIPort: 8083 ## K8S/CSI-Unity ATTRIBUTES ########################################## @@ -398,6 +464,26 @@ csi-unity: maxUnityVolumesPerNode: $MAX_VOLUMES_PER_NODE podmon: enabled: $RESILIENCY_ENABLED + controller: + args: + - "--csisock=unix:/var/run/csi/csi.sock" + - "--labelvalue=csi-unity" + - "--driverPath=csi-unity.dellemc.com" + - "--mode=controller" + - "--skipArrayConnectionValidation=false" + - "--driver-config-params=/unity-config/driver-config-params.yaml" + - "--driverPodLabelValue=dell-storage" + - "--ignoreVolumelessPods=false" + node: + args: + - "--csisock=unix:/var/lib/kubelet/plugins/unity.emc.dell.com/csi_sock" + - "--labelvalue=csi-unity" + - "--driverPath=csi-unity.dellemc.com" + - "--mode=node" + - "--leaderelection=false" + - "--driver-config-params=/unity-config/driver-config-params.yaml" + - "--driverPodLabelValue=dell-storage" + - "--ignoreVolumelessPods=false" ## K8S/Replication Module ATTRIBUTES ########################################## diff --git a/content/v2/deployment/csminstallationwizard/src/templates/operator/csm-isilon-1.7.0.template b/content/v3/deployment/csminstallationwizard/src/templates/operator/csm-isilon-1.10.2.template similarity index 96% rename from content/v2/deployment/csminstallationwizard/src/templates/operator/csm-isilon-1.7.0.template rename to content/v3/deployment/csminstallationwizard/src/templates/operator/csm-isilon-1.10.2.template index 5f6e36e28d..5fbcd9333a 100644 --- a/content/v2/deployment/csminstallationwizard/src/templates/operator/csm-isilon-1.7.0.template +++ b/content/v3/deployment/csminstallationwizard/src/templates/operator/csm-isilon-1.10.2.template @@ -16,16 +16,16 @@ spec: # true: enable storage capacity tracking # false: disable storage capacity tracking storageCapacity: $STORAGE_CAPACITY_ENABLED - # Config version for CSI PowerScale v2.7.0 driver - configVersion: v2.7.0 + # Config version for CSI PowerScale v2.10.1 driver + configVersion: v2.10.1 authSecret: isilon-creds replicas: $CONTROLLER_COUNT dnsPolicy: ClusterFirstWithHostNet # Uninstall CSI Driver and/or modules when CR is deleted forceRemoveDriver: true common: - # Image for CSI PowerScale driver v2.7.0 - image: "dellemc/csi-isilon:v2.7.0" + # Image for CSI PowerScale driver v2.10.1 + image: "dellemc/csi-isilon:v2.10.1" imagePullPolicy: IfNotPresent envs: # X_CSI_VERBOSE: Indicates what content of the OneFS REST API message should be logged in debug level logs @@ -245,10 +245,10 @@ spec: - name: authorization # enable: Enable/Disable csm-authorization enabled: $AUTHORIZATION_ENABLED - configVersion: v1.7.0 + configVersion: v1.10.0 components: - name: karavi-authorization-proxy - image: dellemc/csm-authorization-sidecar:v1.7.0 + image: dellemc/csm-authorization-sidecar:v1.10.0 envs: # proxyHost: hostname of the csm-authorization server - name: "PROXY_HOST" @@ -267,13 +267,13 @@ spec: # false: disable replication feature(do not install dell-csi-replicator sidecar) # Default value: false enabled: $REPLICATION_ENABLED - configVersion: v1.5.0 + configVersion: v1.8.0 components: - name: dell-csi-replicator # image: Image to use for dell-csi-replicator. This shouldn't be changed # Allowed values: string # Default value: None - image: dellemc/dell-csi-replicator:v1.5.0 + image: dellemc/dell-csi-replicator:v1.8.0 envs: # replicationPrefix: prefix to prepend to storage classes parameters # Allowed values: string @@ -289,7 +289,7 @@ spec: - name: dell-replication-controller-manager # image: Defines controller image. This shouldn't be changed # Allowed values: string - image: dellemc/dell-replication-controller:v1.5.0 + image: dellemc/dell-replication-controller:v1.7.0 envs: # TARGET_CLUSTERS_IDS: comma separated list of cluster IDs of the targets clusters. DO NOT include the source(wherever CSM Operator is deployed) cluster ID # Set the value to "self" in case of stretched/single cluster configuration @@ -317,23 +317,18 @@ spec: - name: "RETRY_INTERVAL_MAX" value: "5m" - - name: dell-replication-controller-init - # image: Defines replication init container image. This shouldn't be changed - # Allowed values: string - image: dellemc/dell-replication-init:v1.0.1 - # observability: allows to configure observability - name: observability # enabled: Enable/Disable observability enabled: $OBSERVABILITY_OPERATOR_ENABLED - configVersion: v1.5.0 + configVersion: v1.7.0 components: - name: topology # enabled: Enable/Disable topology enabled: $OBSERVABILITY_OPERATOR_TOPOLOGY # image: Defines karavi-topology image. This shouldn't be changed # Allowed values: string - image: dellemc/csm-topology:v1.5.0 + image: dellemc/csm-topology:v1.7.0 envs: # topology log level # Valid values: TRACE, DEBUG, INFO, WARN, ERROR, FATAL, PANIC @@ -367,7 +362,7 @@ spec: enabled: $OBSERVABILITY_OPERATOR_METRICS # image: Defines PowerScale metrics image. This shouldn't be changed # Allowed values: string - image: dellemc/csm-metrics-powerscale:v1.2.0 + image: dellemc/csm-metrics-powerscale:v1.4.0 envs: # POWERSCALE_MAX_CONCURRENT_QUERIES: set the default max concurrent queries to PowerScale # Allowed values: int @@ -436,10 +431,10 @@ spec: # false: disable Resiliency feature(do not deploy podmon sidecar) # Default value: false enabled: $OPERATOR_RESILIENCY_ENABLED - configVersion: v1.6.0 + configVersion: v1.8.0 components: - name: podmon-controller - image: dellemc/podmon:v1.6.0 + image: dellemc/podmon:v1.9.0 imagePullPolicy: IfNotPresent args: - "--labelvalue=$LABEL_VALUE" @@ -454,7 +449,7 @@ spec: - "--driverPath=csi-isilon.dellemc.com" - "--driver-config-params=/csi-isilon-config-params/driver-config-params.yaml" - name: podmon-node - image: dellemc/podmon:v1.6.0 + image: dellemc/podmon:v1.9.0 imagePullPolicy: IfNotPresent envs: # podmonAPIPort: Defines the port to be used within the kubernetes cluster diff --git a/content/v3/deployment/csminstallationwizard/src/templates/operator/csm-isilon-1.9.4.template b/content/v3/deployment/csminstallationwizard/src/templates/operator/csm-isilon-1.9.3.template similarity index 100% rename from content/v3/deployment/csminstallationwizard/src/templates/operator/csm-isilon-1.9.4.template rename to content/v3/deployment/csminstallationwizard/src/templates/operator/csm-isilon-1.9.3.template diff --git a/content/v2/deployment/csminstallationwizard/src/templates/operator/csm-powermax-1.7.0.template b/content/v3/deployment/csminstallationwizard/src/templates/operator/csm-powermax-1.10.2.template similarity index 74% rename from content/v2/deployment/csminstallationwizard/src/templates/operator/csm-powermax-1.7.0.template rename to content/v3/deployment/csminstallationwizard/src/templates/operator/csm-powermax-1.10.2.template index 660e40ede4..058cfd49f9 100644 --- a/content/v2/deployment/csminstallationwizard/src/templates/operator/csm-powermax-1.7.0.template +++ b/content/v3/deployment/csminstallationwizard/src/templates/operator/csm-powermax-1.10.2.template @@ -26,8 +26,13 @@ spec: # Allowed values: ReadWriteOnceWithFSType, File , None # Default value: ReadWriteOnceWithFSType fSGroupPolicy: "$FSGROUP_POLICY" - # Config version for CSI PowerMax v2.7.0 driver - configVersion: v2.7.0 + # storageCapacity: Helps the scheduler to schedule the pod on a node satisfying the topology constraints, only if the requested capacity is available on the storage array + # Allowed values: + # true: enable storage capacity tracking + # false: disable storage capacity tracking + storageCapacity: $STORAGE_CAPACITY_ENABLED + # Config version for CSI PowerMax v2.10.1 driver + configVersion: v2.10.1 # replica: Define the number of PowerMax controller nodes # to deploy to the Kubernetes release # Allowed values: n, where n > 0 @@ -39,8 +44,8 @@ spec: forceUpdate: false forceRemoveDriver: true common: - # Image for CSI PowerMax driver v2.7.0 - image: dellemc/csi-powermax:v2.7.0 + # Image for CSI PowerMax driver v2.10.1 + image: dellemc/csi-powermax:v2.10.1 # imagePullPolicy: Policy to determine if the image should be pulled prior to starting the container. # Allowed values: # Always: Always pull the image. @@ -177,6 +182,11 @@ spec: # Default value: false - name: X_CSI_TOPOLOGY_CONTROL_ENABLED value: "$TOPOLOGY_ENABLED" + # X_CSI_MAX_VOLUMES_PER_NODE: Defines the maximum PowerMax volumes that the controller can schedule on the node + # Allowed values: Any value greater than or equal to 0 + # Default value: "0" + - name: X_CSI_MAX_VOLUMES_PER_NODE + value: "$MAX_VOLUMES_PER_NODE" # nodeSelector: Define node selection constraints for node pods. # For the pod to be eligible to run on a node, the node must have each # of the indicated key-value pairs as labels. @@ -210,20 +220,26 @@ spec: - name: external-health-monitor enabled: $HEALTH_MONITOR_ENABLED args: [ "--monitor-interval=60s" ] + + # Uncomment the following to configure how often external-provisioner polls the driver to detect changed capacity + # Configure only when the storageCapacity is set as "true" + # Allowed values: 1m,2m,3m,...,10m,...,60m etc. Default value: 5m + #- name: provisioner + # args: ["--capacity-poll-interval=5m"] modules: # CSI Powermax Reverseproxy is a mandatory module for Powermax - name: csireverseproxy # enabled: Always set to true enabled: true - configVersion: v2.6.0 + configVersion: v2.9.0 forceRemoveModule: true components: - name: csipowermax-reverseproxy # image: Define the container images used for the reverse proxy # Default value: None - # Example: "csipowermax-reverseproxy:v2.6.0" - image: dellemc/csipowermax-reverseproxy:v2.6.0 + # Example: "csipowermax-reverseproxy:v2.9.0" + image: dellemc/csipowermax-reverseproxy:v2.9.0 envs: # "tlsSecret" defines the TLS secret that is created with certificate # and its associated key @@ -240,10 +256,10 @@ spec: - name: authorization # enabled: Enable/Disable csm-authorization enabled: $AUTHORIZATION_ENABLED - configVersion: v1.7.0 + configVersion: v1.9.0 components: - name: karavi-authorization-proxy - image: dellemc/csm-authorization-sidecar:v1.7.0 + image: dellemc/csm-authorization-sidecar:v1.10.0 envs: # proxyHost: hostname of the csm-authorization server - name: "PROXY_HOST" @@ -261,13 +277,13 @@ spec: # false: disable replication feature(do not install dell-csi-replicator sidecar) # Default value: false enabled: $REPLICATION_ENABLED - configVersion: v1.5.0 + configVersion: v1.8.0 components: - name: dell-csi-replicator # image: Image to use for dell-csi-replicator. This shouldn't be changed # Allowed values: string # Default value: None - image: dellemc/dell-csi-replicator:v1.5.0 + image: dellemc/dell-csi-replicator:v1.8.0 envs: # replicationPrefix: prefix to prepend to storage classes parameters # Allowed values: string @@ -283,7 +299,7 @@ spec: - name: dell-replication-controller-manager # image: Defines controller image. This shouldn't be changed # Allowed values: string - image: dellemc/dell-replication-controller:v1.5.0 + image: dellemc/dell-replication-controller:v1.7.0 envs: # TARGET_CLUSTERS_IDS: comma separated list of cluster IDs of the targets clusters. DO NOT include the source(wherever CSM Operator is deployed) cluster ID # Set the value to "self" in case of stretched/single cluster configuration @@ -310,7 +326,84 @@ spec: - name: "RETRY_INTERVAL_MAX" value: "5m" - - name: dell-replication-controller-init - # image: Defines replication init container image. This shouldn't be changed + # observability: allows to configure observability + - name: observability + # enabled: Enable/Disable observability + enabled: $OBSERVABILITY_OPERATOR_ENABLED + configVersion: v1.7.0 + components: + - name: topology + # enabled: Enable/Disable topology + enabled: $OBSERVABILITY_OPERATOR_TOPOLOGY + # image: Defines karavi-topology image. This shouldn't be changed + # Allowed values: string + image: dellemc/csm-topology:v1.7.0 + envs: + # topology log level + # Valid values: TRACE, DEBUG, INFO, WARN, ERROR, FATAL, PANIC + # Default value: "INFO" + - name: "TOPOLOGY_LOG_LEVEL" + value: "INFO" + + - name: otel-collector + # enabled: Enable/Disable OpenTelemetry Collector + enabled: $OBSERVABILITY_OPERATOR_OTEL + # image: Defines otel-collector image. This shouldn't be changed # Allowed values: string - image: dellemc/dell-replication-init:v1.0.1 + image: otel/opentelemetry-collector:0.42.0 + envs: + # image of nginx proxy image + # Allowed values: string + # Default value: "nginxinc/nginx-unprivileged:1.20" + - name: "NGINX_PROXY_IMAGE" + value: "nginxinc/nginx-unprivileged:1.20" + + - name: metrics-powermax + # enabled: Enable/Disable PowerMax metrics + enabled: $OBSERVABILITY_OPERATOR_METRICS + # image: Defines PowerMax metrics image. This shouldn't be changed + image: dellemc/csm-metrics-powermax:v1.2.0 + envs: + # POWERMAX_MAX_CONCURRENT_QUERIES: set the default max concurrent queries to PowerMax + # Allowed values: int + # Default value: 10 + - name: "POWERMAX_MAX_CONCURRENT_QUERIES" + value: "10" + # POWERMAX_CAPACITY_METRICS_ENABLED: enable/disable collection of capacity metrics + # Allowed values: ture, false + # Default value: true + - name: "POWERMAX_CAPACITY_METRICS_ENABLED" + value: "true" + # POWERMAX_PERFORMANCE_METRICS_ENABLED: enable/disable collection of volume performance metrics + # Allowed values: ture, false + # Default value: true + - name: "POWERMAX_PERFORMANCE_METRICS_ENABLED" + value: "true" + # POWERMAX_CAPACITY_POLL_FREQUENCY: set polling frequency to get capacity metrics data + # Allowed values: int + # Default value: 10 + - name: "POWERMAX_CAPACITY_POLL_FREQUENCY" + value: "10" + # POWERMAX_PERFORMANCE_POLL_FREQUENCY: set polling frequency to get volume performance data + # Allowed values: int + # Default value: 10 + - name: "POWERMAX_PERFORMANCE_POLL_FREQUENCY" + value: "10" + # PowerMax metrics log level + # Valid values: TRACE, DEBUG, INFO, WARN, ERROR, FATAL, PANIC + # Default value: "INFO" + - name: "POWERMAX_LOG_LEVEL" + value: "INFO" + # PowerMax Metrics Output logs in the specified format + # Valid values: TEXT, JSON + # Default value: "TEXT" + - name: "POWERMAX_LOG_FORMAT" + value: "TEXT" + # otel collector address + # Allowed values: String + # Default value: "otel-collector:55680" + - name: "COLLECTOR_ADDRESS" + value: "otel-collector:55680" + # configMap name which has all array/endpoint related info + - name: "X_CSI_CONFIG_MAP_NAME" + value: "powermax-reverseproxy-config" diff --git a/content/v3/deployment/csminstallationwizard/src/templates/operator/csm-powermax-1.8.0.template b/content/v3/deployment/csminstallationwizard/src/templates/operator/csm-powermax-1.8.0.template index dd237adc93..1ed702caec 100644 --- a/content/v3/deployment/csminstallationwizard/src/templates/operator/csm-powermax-1.8.0.template +++ b/content/v3/deployment/csminstallationwizard/src/templates/operator/csm-powermax-1.8.0.template @@ -256,10 +256,10 @@ spec: - name: authorization # enabled: Enable/Disable csm-authorization enabled: $AUTHORIZATION_ENABLED - configVersion: v1.8.0 + configVersion: v1.10.0 components: - name: karavi-authorization-proxy - image: dellemc/csm-authorization-sidecar:v1.8.0 + image: dellemc/csm-authorization-sidecar:v1.10.0 envs: # proxyHost: hostname of the csm-authorization server - name: "PROXY_HOST" diff --git a/content/v3/deployment/csminstallationwizard/src/templates/operator/csm-powermax-1.9.4.template b/content/v3/deployment/csminstallationwizard/src/templates/operator/csm-powermax-1.9.3.template similarity index 100% rename from content/v3/deployment/csminstallationwizard/src/templates/operator/csm-powermax-1.9.4.template rename to content/v3/deployment/csminstallationwizard/src/templates/operator/csm-powermax-1.9.3.template diff --git a/content/v2/deployment/csminstallationwizard/src/templates/operator/csm-powerstore-1.7.0.template b/content/v3/deployment/csminstallationwizard/src/templates/operator/csm-powerstore-1.10.2.template similarity index 92% rename from content/v2/deployment/csminstallationwizard/src/templates/operator/csm-powerstore-1.7.0.template rename to content/v3/deployment/csminstallationwizard/src/templates/operator/csm-powerstore-1.10.2.template index 96f64a0ff8..a985881d97 100644 --- a/content/v2/deployment/csminstallationwizard/src/templates/operator/csm-powerstore-1.7.0.template +++ b/content/v3/deployment/csminstallationwizard/src/templates/operator/csm-powerstore-1.10.2.template @@ -31,8 +31,8 @@ spec: # true: enable storage capacity tracking # false: disable storage capacity tracking storageCapacity: $STORAGE_CAPACITY_ENABLED - # Config version for CSI PowerStore v2.7.0 driver - configVersion: v2.7.0 + # Config version for CSI PowerStore v2.10.1 driver + configVersion: v2.10.1 # authSecret: This is the secret used to validate the default PowerStore secret used for installation # Allowed values: -config # For example: If the metadataName is set to powerstore, authSecret value should be set to powerstore-config @@ -43,8 +43,8 @@ spec: forceUpdate: false forceRemoveDriver: true common: - # Image for CSI PowerStore driver v2.7.0 - image: "dellemc/csi-powerstore:v2.7.0" + # Image for CSI PowerStore driver v2.10.1 + image: "dellemc/csi-powerstore:v2.10.1" imagePullPolicy: IfNotPresent envs: - name: X_CSI_POWERSTORE_NODE_NAME_PREFIX @@ -109,7 +109,7 @@ spec: # Leave as blank to consider all nodes # Allowed values: map of key-value pairs # Default value: None - nodeSelector:$CONTROLLER_POD_NODE_SELECTOR + nodeSelector: $CONTROLLER_POD_NODE_SELECTOR # tolerations: Define tolerations for the controllers, if required. # Leave as blank to install controller on worker nodes @@ -129,6 +129,11 @@ spec: # Default value: false - name: X_CSI_HEALTH_MONITOR_ENABLED value: "$HEALTH_MONITOR_ENABLED" + # X_CSI_POWERSTORE_MAX_VOLUMES_PER_NODE: Defines the maximum PowerStore volumes that can be created per node + # Allowed values: Any value greater than or equal to 0 + # Default value: "0" + - name: X_CSI_POWERSTORE_MAX_VOLUMES_PER_NODE + value: "$MAX_VOLUMES_PER_NODE" # nodeSelector: Define node selection constraints for node pods. # For the pod to be eligible to run on a node, the node must have each @@ -142,7 +147,7 @@ spec: # Leave as blank to install controller on worker nodes # Default value: None tolerations:$NODE_TOLERATIONS - + modules: - name: resiliency # enabled: Enable/Disable Resiliency feature @@ -151,10 +156,10 @@ spec: # false: disable Resiliency feature(do not deploy podmon sidecar) # Default value: false enabled: $OPERATOR_RESILIENCY_ENABLED - configVersion: v1.6.0 + configVersion: v1.9.0 components: - name: podmon-controller - image: dellemc/podmon:v1.6.0 + image: dellemc/podmon:v1.9.0 imagePullPolicy: IfNotPresent args: - "--labelvalue=$LABEL_VALUE" @@ -169,7 +174,7 @@ spec: - "--driver-config-params=/powerstore-config-params/driver-config-params.yaml" - "--driverPath=csi-powerstore.dellemc.com" - name: podmon-node - image: dellemc/podmon:v1.6.0 + image: dellemc/podmon:v1.9.0 imagePullPolicy: IfNotPresent envs: # podmonAPIPort: Defines the port to be used within the kubernetes cluster @@ -187,4 +192,4 @@ spec: - "--csisock=unix:/var/lib/kubelet/plugins/csi-powerstore.dellemc.com/csi_sock" - "--mode=node" - "--driver-config-params=/powerstore-config-params/driver-config-params.yaml" - - "--driverPath=csi-powerstore.dellemc.com" \ No newline at end of file + - "--driverPath=csi-powerstore.dellemc.com" diff --git a/content/v3/deployment/csminstallationwizard/src/templates/operator/csm-powerstore-1.9.4.template b/content/v3/deployment/csminstallationwizard/src/templates/operator/csm-powerstore-1.9.3.template similarity index 98% rename from content/v3/deployment/csminstallationwizard/src/templates/operator/csm-powerstore-1.9.4.template rename to content/v3/deployment/csminstallationwizard/src/templates/operator/csm-powerstore-1.9.3.template index ec074e85c1..d09a4cc1a5 100644 --- a/content/v3/deployment/csminstallationwizard/src/templates/operator/csm-powerstore-1.9.4.template +++ b/content/v3/deployment/csminstallationwizard/src/templates/operator/csm-powerstore-1.9.3.template @@ -156,10 +156,10 @@ spec: # false: disable Resiliency feature(do not deploy podmon sidecar) # Default value: false enabled: $OPERATOR_RESILIENCY_ENABLED - configVersion: v1.8.1 + configVersion: v1.9.0 components: - name: podmon-controller - image: dellemc/podmon:v1.8.1 + image: dellemc/podmon:v1.9.0 imagePullPolicy: IfNotPresent args: - "--labelvalue=$LABEL_VALUE" @@ -174,7 +174,7 @@ spec: - "--driver-config-params=/powerstore-config-params/driver-config-params.yaml" - "--driverPath=csi-powerstore.dellemc.com" - name: podmon-node - image: dellemc/podmon:v1.8.1 + image: dellemc/podmon:v1.9.0 imagePullPolicy: IfNotPresent envs: # podmonAPIPort: Defines the port to be used within the kubernetes cluster diff --git a/content/v3/deployment/csmoperator/_index.md b/content/v3/deployment/csmoperator/_index.md index 1f72fba3b4..d6839c4238 100644 --- a/content/v3/deployment/csmoperator/_index.md +++ b/content/v3/deployment/csmoperator/_index.md @@ -2,47 +2,18 @@ title: "CSM Operator" linkTitle: "CSM Operator" description: Container Storage Modules Operator -weight: 1 +weight: 2 --- The Dell Container Storage Modules Operator is a Kubernetes Operator, which can be used to install and manage the CSI Drivers and CSM Modules provided by Dell for various storage platforms. This operator is available as a community operator for upstream Kubernetes and can be deployed using OperatorHub.io. The operator can be installed using OLM (Operator Lifecycle Manager) or manually. -## Support Matrix - -Dell CSM Operator has been tested and qualified on Upstream Kubernetes and OpenShift. Supported versions are listed below: - -| Kubernetes Version | OpenShift Version | -| -------------------------- | -------------------- | -| 1.26, 1.27, 1.28 | 4.13, 4.14 | - ->NOTE: ->- Authorization module is only supported on Kubernetes platforms. - ## Supported CSM Components -The table below lists the driver and modules versions installable with the CSM Operator: - -| CSI Driver | Version | CSM Authorization | CSM Replication | CSM Observability | CSM Resiliency | -| ------------------ |---------|-------------------|-----------------|-------------------|----------------| -| CSI PowerScale | 2.9.1 | ✔ 1.9.1 | ✔ 1.7.1 | ✔ 1.7.0 | ✔ 1.8.1 | -| CSI PowerScale | 2.8.0 | ✔ 1.8.0 | ✔ 1.6.0 | ✔ 1.6.0 | ✔ 1.7.0 | -| CSI PowerScale | 2.7.0 | ✔ 1.7.0 | ✔ 1.5.0 | ✔ 1.5.0 | ✔ 1.6.0 | -| CSI PowerFlex | 2.9.2 | ✔ 1.9.1 | ✔ 1.7.1 | ✔ 1.7.0 | ✔ 1.8.1 | -| CSI PowerFlex | 2.8.0 | ✔ 1.8.0 | ✔ 1.6.0 | ✔ 1.6.0 | ✔ 1.7.0 | -| CSI PowerFlex | 2.7.0 | ✔ 1.7.0 | ✔ 1.5.0 | ✔ 1.5.0 | ✔ 1.6.0 | -| CSI PowerStore | 2.9.1 | ❌ | ❌ | ❌ | ✔ 1.8.0 | -| CSI PowerStore | 2.8.0 | ❌ | ❌ | ❌ | ✔ 1.7.0 | -| CSI PowerStore | 2.7.0 | ❌ | ❌ | ❌ | ✔ 1.6.0 | -| CSI PowerMax | 2.9.1 | ✔ 1.9.1 | ✔ 1.7.1 | ✔ 1.7.0 | ❌ | -| CSI PowerMax | 2.8.0 | ✔ 1.8.0 | ✔ 1.6.0 | ✔ 1.6.0 | ❌ | -| CSI PowerMax | 2.7.0 | ✔ 1.7.0 | ✔ 1.5.0 | ❌ | ❌ | -| CSI Unity XT | 2.9.1 | ❌ | ❌ | ❌ | ❌ | -| CSI Unity XT | 2.8.0 | ❌ | ❌ | ❌ | ❌ | -| CSI Unity XT | 2.7.0 | ❌ | ❌ | ❌ | ❌ | +Exhaustive sample files for the CRs are available [here (current version: v1.5.1)](https://github.com/dell/csm-operator/tree/v1.5.1/samples). ->NOTE: ->- Refer to sample files [here](https://github.com/dell/csm-operator/tree/main/samples). +These CR will be used for new deployment or upgrade. In most case, it is recommended to use the latest available version. +The full compatibility matrix of CSI/CSM versions for the CSM Operator is available [here](../../prerequisites/#csm-operator-compatibility-matrix) ## Installation Dell CSM Operator can be installed manually or via Operator Hub. @@ -57,14 +28,21 @@ The installation process involves the creation of a `Subscription` object either ![OpenShit Operator Hub CSM install](operator_hub_install.gif) ->NOTE: Dell CSM Operator is distributed as both `Certified` & `Community` editions. Both editions have the same codebase and are supported by Dell Technologies, the only difference is that the `Certified` version is validated by RedHat. The `Certified` version is often released couple of days/weeks after the `Community` version. +### Certified vs Community +Dell CSM Operator is distributed as both `Certified` & `Community` editions. + +Both editions have the same codebase and are supported by Dell Technologies, the only differences are: +* The `Certified` version is officially supported by Redhat by partnering with software vendors. +* The `Certified` version is often released couple of days/weeks after the `Community` version. +* The `Certified` version is specific to Openshift and can only be installed on specific Openshift versions where it is certified. +* The `Community` can be installed on any Kubernetes distributions. ### Manual Installation on a cluster without OLM 1. Install volume snapshot CRDs. For detailed snapshot setup procedure, [click here](../../snapshots/#volume-snapshot-feature). 2. Clone and checkout the required csm-operator version using ```bash -git clone -b v1.4.4 https://github.com/dell/csm-operator.git +git clone -b v1.5.1 https://github.com/dell/csm-operator.git ``` 3. `cd csm-operator` 4. _(Optional)_ If using a local Docker image, edit the `deploy/operator.yaml` file and set the image name for the CSM Operator Deployment. @@ -136,7 +114,7 @@ This needs to be performed on a Linux system with access to the Internet as a gi To build an offline bundle, the following steps are needed: 1. Clone and checkout the required csm-operator version using ```bash -git clone -b v1.4.3 https://github.com/dell/csm-operator.git +git clone -b v1.5.1 https://github.com/dell/csm-operator.git ``` 2. `cd csm-operator` 3. Run the `csm-offline-bundle.sh` script which will be found in the `scripts` directory with an argument of `-c` in order to create an offline bundle @@ -161,21 +139,21 @@ Here is the output of a request to build an offline bundle for the Dell CSM Oper * * Pulling and saving container images - dellemc/csi-isilon:v2.9.1 - dellemc/csi-metadata-retriever:v1.6.1 - dellemc/csipowermax-reverseproxy:v2.8.1 - dellemc/csi-powermax:v2.9.1 - dellemc/csi-powerstore:v2.9.1 - dellemc/csi-unity:v2.9.1 - dellemc/csi-vxflexos:v2.9.2 - dellemc/csm-authorization-sidecar:v1.9.1 - dellemc/csm-metrics-powerflex:v1.7.0 - dellemc/csm-metrics-powerscale:v1.4.0 + dellemc/csi-isilon:v2.10.1 + dellemc/csi-metadata-retriever:v1.6.0 + dellemc/csipowermax-reverseproxy:v2.9.0 + dellemc/csi-powermax:v2.10.1 + dellemc/csi-powerstore:v2.10.1 + dellemc/csi-unity:v2.10.1 + dellemc/csi-vxflexos:v2.10.1 + dellemc/csm-authorization-sidecar:v1.10.0 + dellemc/csm-metrics-powerflex:v1.8.0 + dellemc/csm-metrics-powerscale:v1.5.0 dellemc/csm-topology:v1.7.0 - dellemc/dell-csi-replicator:v1.7.0 - dellemc/dell-replication-controller:v1.7.0 + dellemc/dell-csi-replicator:v1.8.0 + dellemc/dell-replication-controller:v1.8.0 dellemc/sdc:4.5 - docker.io/dellemc/dell-csm-operator:v1.4.4 + docker.io/dellemc/dell-csm-operator:v1.5.1 gcr.io/kubebuilder/kube-rbac-proxy:v0.8.0 nginxinc/nginx-unprivileged:1.20 otel/opentelemetry-collector:0.42.0 @@ -265,8 +243,8 @@ Preparing a offline bundle for installation * * Loading docker images -Loaded image: docker.io/dellemc/csi-powerstore:v2.9.1 -Loaded image: docker.io/dellemc/csi-isilon:v2.9.1 +Loaded image: docker.io/dellemc/csi-powerstore:v2.10.1 +Loaded image: docker.io/dellemc/csi-isilon:v2.10.1 ... ... Loaded image: registry.k8s.io/sig-storage/csi-resizer:v1.9.2 @@ -275,7 +253,7 @@ Loaded image: registry.k8s.io/sig-storage/csi-snapshotter:v6.3.2 * * Tagging and pushing images - dellemc/csi-isilon:v2.9.1 -> localregistry:5000/dell-csm-operator/csi-isilon:v2.9.1 + dellemc/csi-isilon:v2.10.1 -> localregistry:5000/dell-csm-operator/csi-isilon:v2.10.1 dellemc/csi-metadata-retriever:v1.6.0 -> localregistry:5000/dell-csm-operator/csi-metadata-retriever:v1.6.0 ... ... @@ -285,8 +263,8 @@ Loaded image: registry.k8s.io/sig-storage/csi-snapshotter:v6.3.2 * * Preparing files within /root/dell-csm-operator-bundle - changing: dellemc/csi-isilon:v2.9.1 -> localregistry:5000/dell-csm-operator/csi-isilon:v2.9.1 - changing: dellemc/csi-metadata-retriever:v1.6.1 -> localregistry:5000/dell-csm-operator/csi-metadata-retriever:v1.6.1 + changing: dellemc/csi-isilon:v2.10.1 -> localregistry:5000/dell-csm-operator/csi-isilon:v2.10.1 + changing: dellemc/csi-metadata-retriever:v1.6.0 -> localregistry:5000/dell-csm-operator/csi-metadata-retriever:v1.6.0 ... ... changing: registry.k8s.io/sig-storage/csi-resizer:v1.9.2 -> localregistry:5000/dell-csm-operator/csi-resizer:v1.9.2 @@ -304,18 +282,6 @@ bash scripts/install.sh ``` >NOTE: Dell CSM Operator would install to the 'dell-csm-operator' namespace by default. -#### Perform Driver installation - -Now that the required images are available and the Operator is installed, you can proceed to install the driver by executing `kubectl create -f `. Manifests for all the supported drivers will be available inside the samples directory. Using Unity XT as an example -```bash -kubectl create -f samples/storage_csm_unity_v280.yaml -``` ->NOTE: Offline bundle supports install of only the latest version of Dell CSI Drivers - -**NOTE:** -1. Offline bundle installation is only supported with manual installs i.e. without using Operator Lifecycle Manager (OLM). -2. Install/uninstall of operator and drivers should be done using the files that are obtained after unpacking the offline bundle (dell-csm-operator-bundle.tar.gz) as that is where the image tags in the manifests are modified to point to the specified internal registry. - ## Uninstall ### Operator uninstallation on a cluster without OLM To uninstall a CSM operator, run `bash scripts/uninstall.sh`. This will uninstall the operator in `dell-csm-operator` namespace. @@ -342,7 +308,7 @@ The `Update approval` (**`InstallPlan`** in OLM terms) strategy plays a role whi #### Using Installation Script 1. Clone and checkout the required csm-operator version using ```bash -git clone -b v1.4.3 https://github.com/dell/csm-operator.git +git clone -b v1.5.0 https://github.com/dell/csm-operator.git ``` 2. `cd csm-operator` 3. Execute `bash scripts/install.sh --upgrade` . This command will install the latest version of the operator. @@ -376,7 +342,7 @@ The following notes explain some of the general items to take care of. 1. If you are trying to upgrade the CSI driver from an older version, make sure to modify the _configVersion_ field. ```yaml driver: - configVersion: v2.9.1 + configVersion: v2.10.0 ``` ## Custom Resource Definitions diff --git a/content/v3/deployment/csmoperator/drivers/_index.md b/content/v3/deployment/csmoperator/drivers/_index.md index f13d779234..7ad4986f00 100644 --- a/content/v3/deployment/csmoperator/drivers/_index.md +++ b/content/v3/deployment/csmoperator/drivers/_index.md @@ -58,7 +58,7 @@ The CSI Drivers and CSM Modules installed by the Dell CSM Operator can be update 1. If you are trying to upgrade the CSI driver from an older version, make sure to modify the _configVersion_ field if required. ```yaml driver: - configVersion: v2.9.1 + configVersion: v2.10.0 ``` 2. Do not try to update the operator by modifying the original `CustomResource` manifest file and running the `kubectl apply -f` command. As part of the driver installation, the Operator sets some annotations on the `CustomResource` object which are further utilized in some workflows (like detecting upgrade of drivers). If you run the `kubectl apply -f` command to update the driver, these annotations are overwritten and this may lead to failures. diff --git a/content/v3/deployment/csmoperator/drivers/powerflex.md b/content/v3/deployment/csmoperator/drivers/powerflex.md index 52ce9487f6..722e6c1530 100644 --- a/content/v3/deployment/csmoperator/drivers/powerflex.md +++ b/content/v3/deployment/csmoperator/drivers/powerflex.md @@ -31,7 +31,7 @@ kubectl get csm --all-namespaces - Optionally, enable sdc monitor by setting the enable flag for the sdc-monitor to true. Please note: - **If using sidecar**, you will need to edit the value fields under the HOST_PID and MDM fields by filling the empty quotes with host PID and the MDM IPs. - **If not using sidecar**, leave the enabled field set to false. -##### Example CR: [samples/storage_csm_powerflex_v290.yaml](https://github.com/dell/csm-operator/blob/v1.4.4/samples/storage_csm_powerflex_v290.yaml) +##### Example CR: [samples/storage_csm_powerflex_v2101.yaml](https://github.com/dell/csm-operator/blob/main/samples/storage_csm_powerflex_v2101.yaml) ```yaml sideCars: # sdc-monitor is disabled by default, due to high CPU usage @@ -111,7 +111,7 @@ For detailed PowerFlex installation procedure, see the _Dell PowerFlex Deploymen If replication feature is enabled, ensure the secret includes all the PowerFlex arrays involved in replication. - After editing the file, run this command to create a secret called `vxflexos-config`. + After editing the file, run this command to create a secret called `vxflexos-config`. If you are using a different namespace/secret name, just substitute those into the command. ```bash kubectl create secret generic vxflexos-config -n vxflexos --from-file=config=secret.yaml @@ -121,7 +121,7 @@ For detailed PowerFlex installation procedure, see the _Dell PowerFlex Deploymen ```bash - kubectl create secret generic vxflexos-config -n vxflexos --from-file=config=config.yaml -o yaml --dry-run=client | kubectl replace -f - + kubectl create secret generic vxflexos-config -n vxflexos --from-file=config=secret.yaml -o yaml --dry-run=client | kubectl replace -f - ``` ### Install Driver @@ -162,6 +162,8 @@ For detailed PowerFlex installation procedure, see the _Dell PowerFlex Deploymen This command will deploy the CSI-PowerFlex driver in the namespace specified in the input YAML file. 5. [Verify the CSI Driver installation](../#verifying-the-driver-installation) + +6. Refer https://github.com/dell/csi-powerflex/tree/main/samples for the sample files. **Note** : 1. Snapshotter and resizer sidecars are installed by default. diff --git a/content/v3/deployment/csmoperator/drivers/powermax.md b/content/v3/deployment/csmoperator/drivers/powermax.md index f7c1f088a3..c8afbabfcc 100644 --- a/content/v3/deployment/csmoperator/drivers/powermax.md +++ b/content/v3/deployment/csmoperator/drivers/powermax.md @@ -197,13 +197,14 @@ Use a tool such as `openssl` to generate this secret using the example below: ```bash openssl genrsa -out tls.key 2048 openssl req -new -x509 -sha256 -key tls.key -out tls.crt -days 3650 +kubectl create secret -n tls revproxy-certs --cert=tls.crt --key=tls.key kubectl create secret -n tls csirevproxy-tls-secret --cert=tls.crt --key=tls.key ``` ## Installation ### (Optional) Create secret for client-side TLS verification -Create a secret named powermax-certs in the namespace where the CSI PowerMax driver will be installed. This is an optional step and is only required if you are setting the env variable X_CSI_POWERMAX_SKIP_CERTIFICATE_VALIDATION to false. See the detailed documentation on how to create this secret [here](../../../../csidriver/installation/helm/powermax#certificate-validation-for-unisphere-rest-api-calls). +Create a secret named powermax-certs in the namespace where the CSI PowerMax driver will be installed. This is an optional step and is only required if you are setting the env variable X_CSI_POWERMAX_SKIP_CERTIFICATE_VALIDATION to false. See the detailed documentation on how to create this secret [here](../../../helm/drivers/installation/powermax#certificate-validation-for-unisphere-rest-api-calls). ### Install Driver @@ -312,6 +313,7 @@ Create a secret named powermax-certs in the namespace where the CSI PowerMax dri 6. Execute the following command to create the PowerMax custom resource:`kubectl create -f `. The above command will deploy the CSI-PowerMax driver. 7. The mandatory module CSI PowerMax Reverseproxy will be installed automatically with the same command. +8. Refer https://github.com/dell/csi-powermax/tree/main/samples for the sample files. ## Other features to enable ### Dynamic Logging Configuration diff --git a/content/v3/deployment/csmoperator/drivers/powerscale.md b/content/v3/deployment/csmoperator/drivers/powerscale.md index d7dd24d255..315a4090f0 100644 --- a/content/v3/deployment/csmoperator/drivers/powerscale.md +++ b/content/v3/deployment/csmoperator/drivers/powerscale.md @@ -100,7 +100,7 @@ kubectl get csm --all-namespaces The driver will continue to use previous values in case of an error found in the YAML file. 3. Create isilon-certs-n secret. - Please refer [this section](../../../../csidriver/installation/helm/isilon/#certificate-validation-for-onefs-rest-api-calls) for creating cert-secrets. + Please refer [this section](../../../../deployment/helm/drivers/installation/isilon/#certificate-validation-for-onefs-rest-api-calls) for creating cert-secrets. If certificate validation is skipped, empty secret must be created. To create an empty secret. Ex: empty-secret.yaml @@ -157,6 +157,8 @@ kubectl get csm --all-namespaces 6. [Verify the CSI Driver installation](../#verifying-the-driver-installation) +7. Refer https://github.com/dell/csi-powerscale/tree/main/samples for the sample files. + **Note** : 1. "Kubelet config dir path" is not yet configurable in case of Operator based driver installation. diff --git a/content/v3/deployment/csmoperator/drivers/powerstore.md b/content/v3/deployment/csmoperator/drivers/powerstore.md index 3941b3e7fd..3b0aed3b77 100644 --- a/content/v3/deployment/csmoperator/drivers/powerstore.md +++ b/content/v3/deployment/csmoperator/drivers/powerstore.md @@ -267,7 +267,7 @@ replication: The CRDs for replication can be obtained and installed from the csm-replication project on Github. Use `csm-replication/deploy/replicationcrds.all.yaml` located in csm-replication git repo for the installation. -CRDs should be configured during replication prepare stage with repctl as described in [install-repctl](../../../../replication/deployment/install-repctl) +CRDs should be configured during replication prepare stage with repctl as described in [install-repctl](../../../helm/modules/installation/replication/install-repctl) ### Namespace and PowerStore API Access Configuration 1. Create namespace. diff --git a/content/v3/deployment/csmoperator/drivers/unity.md b/content/v3/deployment/csmoperator/drivers/unity.md index 555072356c..3c936941fd 100644 --- a/content/v3/deployment/csmoperator/drivers/unity.md +++ b/content/v3/deployment/csmoperator/drivers/unity.md @@ -85,6 +85,8 @@ kubectl get csm --all-namespaces ``` 5. [Verify the CSI Driver installation](../#verifying-the-driver-installation) + +6. Refer https://github.com/dell/csi-unity/tree/main/samples for the sample files. **Note** : 1. "Kubelet config dir path" is not yet configurable in case of Operator based driver installation. diff --git a/content/v3/deployment/csmoperator/modules/authorization.md b/content/v3/deployment/csmoperator/modules/authorization.md index 1282e8a9fb..80b0c902a3 100644 --- a/content/v3/deployment/csmoperator/modules/authorization.md +++ b/content/v3/deployment/csmoperator/modules/authorization.md @@ -21,10 +21,10 @@ To deploy the Operator, follow the instructions available [here](../../#installa 2. Install cert-manager CRDs ```bash -kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v1.6.1/cert-manager.crds.yaml +kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v1.11.0/cert-manager.crds.yaml ``` -3. Prepare `samples/authorization/config.yaml` provided [here](https://github.com/dell/csm-operator/blob/main/samples/authorization/config.yaml) which contains the JWT signing secret. The following table lists the configuration parameters. +3. Prepare [samples/authorization/config.yaml](https://github.com/dell/csm-operator/blob/main/samples/authorization/config.yaml) which contains the JWT signing secret. The following table lists the configuration parameters. | Parameter | Description | Required | Default | | --------- | ------------------------------------------------------------ | -------- | ------- | @@ -51,7 +51,7 @@ kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/relea kubectl create secret generic karavi-config-secret -n authorization --from-file=config.yaml=samples/authorization/config.yaml -o yaml --dry-run=client | kubectl replace -f - ``` -4. Create the `karavi-storage-secret` using the file provided [here](https://github.com/dell/csm-operator/blob/main/samples/authorization/karavi-storage-secret.yaml) to store storage system credentials. +4. Create the [karavi-storage-secret](https://github.com/dell/csm-operator/blob/main/samples/authorization/karavi-storage-secret.yaml) to store storage system credentials. Use this command to create the secret: @@ -60,99 +60,11 @@ kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/relea kubectl create -f samples/authorization/karavi-storage-secret.yaml ``` -5. Prepare a storage class for Redis to use for persistence. If not supplied, the default storage class in your environment is used. - - Example, if using CSM Authorization for PowerScale: - - ```yaml - apiVersion: storage.k8s.io/v1 - kind: StorageClass - metadata: - name: isilon - provisioner: csi-isilon.dellemc.com - reclaimPolicy: Delete - allowVolumeExpansion: true - parameters: - # The name of the access zone a volume can be created in - # Optional: true - # Default value: default value specified in values.yaml - # Examples: System, zone1 - AccessZone: System - - # The base path for the volumes to be created on PowerScale cluster. - # Ensure that this path exists on PowerScale cluster. - # Allowed values: unix absolute path - # Optional: true - # Default value: value specified in values.yaml for isiPath - # Examples: /ifs/data/csi, /ifs/engineering - IsiPath: /ifs/data/csi - - # The permissions for isi volume directory path - # This value overrides the isiVolumePathPermissions attribute of corresponding cluster config in secret, if present - # Allowed values: valid octal mode number - # Default value: "0777" - # Examples: "0777", "777", "0755" - #IsiVolumePathPermissions: "0777" - - # AccessZone groupnet service IP. Update AzServiceIP if different than endpoint. - # Optional: true - # Default value: endpoint of the cluster ClusterName - #AzServiceIP : 192.168.2.1 - - # When a PVC is being created, this parameter determines, when a node mounts the PVC, - # whether to add the k8s node to the "Root clients" field or "Clients" field of the NFS export - # Allowed values: - # "true": adds k8s node to the "Root clients" field of the NFS export - # "false": adds k8s node to the "Clients" field of the NFS export - # Optional: true - # Default value: "false" - RootClientEnabled: "false" - - # Name of PowerScale cluster, where pv will be provisioned. - # This name should match with name of one of the cluster configs in isilon-creds secret. - # If this parameter is not specified, then default cluster config in isilon-creds secret - # will be considered if available. - # Optional: true - #ClusterName: - - # Sets the filesystem type which will be used to format the new volume - # Optional: true - # Default value: None - #csi.storage.k8s.io/fstype: "nfs" - - # volumeBindingMode controls when volume binding and dynamic provisioning should occur. - # Allowed values: - # Immediate: indicates that volume binding and dynamic provisioning occurs once the - # PersistentVolumeClaim is created - # WaitForFirstConsumer: will delay the binding and provisioning of a PersistentVolume - # until a Pod using the PersistentVolumeClaim is created - # Default value: Immediate - volumeBindingMode: Immediate - - # allowedTopologies helps scheduling pods on worker nodes which match all of below expressions. - # If enableCustomTopology is set to true in helm values.yaml, then do not specify allowedTopologies - # Change all instances of to the IP of the PowerScale OneFS API server - #allowedTopologies: - # - matchLabelExpressions: - # - key: csi-isilon.dellemc.com/ - # values: - # - csi-isilon.dellemc.com - - # specify additional mount options for when a Persistent Volume is being mounted on a node. - # To mount volume with NFSv4, specify mount option vers=4. Make sure NFSv4 is enabled on the Isilon Cluster - #mountOptions: ["", "", ..., ""] - ``` - - Save the file and create it by using - ```bash - kubectl create -f - ``` - ### Install CSM Authorization Proxy Server 1. Follow all the [prerequisites](#prerequisite). -2. Create a CR (Custom Resource) for Authorization using the sample file provided [here](https://github.com/dell/csm-operator/blob/v1.4.4/samples/authorization/csm_authorization_proxy_server_v190.yaml ). This file can be modified to use custom parameters if needed. +2. Create a CR (Custom Resource) for Authorization from a [sample manifest](https://github.com/dell/csm-operator/tree/main/samples/authorization). This file can be modified to use custom parameters if needed. 3. Users should configure the parameters in the CR. This table lists the primary configurable parameters of the Authorization Proxy Server and their default values: @@ -162,12 +74,15 @@ kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/relea | PROXY_HOST | The hostname to configure the self-signed certificate (if applicable), and the proxy service Ingress. | Yes | csm-authorization.com | | PROXY_INGRESS_CLASSNAME | The ingressClassName of the proxy-service Ingress. | Yes | nginx | | PROXY_INGRESS_HOSTS | Additional host rules to be applied to the proxy-service Ingress. | No | authorization-ingress-nginx-controller.authorization.svc.cluster.local | - | REDIS_STORAGE_CLASS | The storage class for Redis to use for persistence. If not supplied, the default storage class is used. | Yes | - | + | REDIS_STORAGE_CLASS | The storage class for Redis to use for persistence. If not supplied, a locally provisioned volume is used. | No | - | | **ingress-nginx** | This section configures the enablement of the NGINX Ingress Controller. | - | - | | enabled | Enable/Disable deployment of the NGINX Ingress Controller. Set to false if you already have an Ingress Controller installed. | No | true | | **cert-manager** | This section configures the enablement of cert-manager. | - | - | | enabled | Enable/Disable deployment of cert-manager. Set to false if you already have cert-manager installed. | No | true | +>__Note__: +> - If you specify `REDIS_STORAGE_CLASS`, the storage class must NOT be provisioned by the Dell CSI Driver to be configured with this installation of CSM Authorization. + **Optional:** To enable reporting of trace data with [Zipkin](https://zipkin.io/), use the `csm-config-params` configMap in the sample CR or dynamically by editing the configMap. @@ -181,7 +96,7 @@ To enable reporting of trace data with [Zipkin](https://zipkin.io/), use the `cs ```bash - kubectl create -f samples/authorization/csm_authorization_proxy_server_v190.yaml + kubectl create -f ``` >__Note__: @@ -196,12 +111,12 @@ To enable reporting of trace data with [Zipkin](https://zipkin.io/), use the `cs kubectl create secret tls karavi-auth-tls -n authorization --key --cert ``` - If using a self-signed certificate, prepare `samples/authorization/certificate_v190.yaml` provided [here](https://github.com/dell/csm-operator/blob/v1.4.4/samples/authorization/certificate_v190.yaml). An entry for each hostname specified in the CR must be added under `dnsNames` for the certificate to be valid for each Ingress. + If using a self-signed certificate, prepare a certificate file provided [here](https://github.com/dell/csm-operator/tree/main/samples/authorization). An entry for each hostname specified in the CR must be added under `dnsNames` for the certificate to be valid for each Ingress. Use this command to create the `karavi-auth-tls` secret: ```bash - kubectl create -f samples/authorization/certificate_v190.yaml + kubectl create -f ``` ### Verify Installation of the CSM Authorization Proxy Server @@ -213,12 +128,12 @@ Once the Authorization CR is created, you can verify the installation as mention ### Install Karavictl -Follow the instructions available in CSM Authorization for [Installing karavictl](../../../../authorization/deployment/helm/#install-karavictl). +Follow the instructions available in CSM Authorization for [Installing karavictl](../../../helm/modules/installation/authorization/#install-karavictl). -### Configuring the CSM Authorization Proxy Server +### Configure the CSM Authorization Proxy Server -Follow the instructions available in CSM Authorization for [Configuring the CSM Authorization Proxy Server](../../../../authorization/configuration/proxy-server/#configuring-the-csm-authorization-proxy-server). +Follow the instructions available in CSM Authorization for [Configuring the CSM Authorization Proxy Server](../../../helm/modules/installation/authorization/#configuring-the-csm-authorization-proxy-server). -### Configuring a Dell CSI Driver with CSM Authorization +### Configure a Dell CSI Driver with CSM Authorization -Follow the instructions available in CSM Authorization for [Configuring a Dell CSI Driver with CSM for Authorization](../../../../authorization/configuration/#configuring-a-dell-csi-driver-with-csm-for-authorization). +Follow the instructions available in CSM Authorization for [Configuring a Dell CSI Driver with CSM for Authorization](../../../helm/modules/installation/authorization/#configuring-a-dell-csi-driver-with-csm-for-authorization). diff --git a/content/v3/deployment/csmoperator/modules/observability.md b/content/v3/deployment/csmoperator/modules/observability.md index bc88bd0c7d..1e2dd58e5d 100644 --- a/content/v3/deployment/csmoperator/modules/observability.md +++ b/content/v3/deployment/csmoperator/modules/observability.md @@ -14,7 +14,8 @@ The CSM Observability module for supported Dell CSI Drivers can be installed via kubectl create namespace karavi ``` - Enable Observability module and components in [sample manifests](https://github.com/dell/csm-operator/tree/main/samples). If cert-manager has already been installed, don't enable it. -- Observability will deploy with self-signed certificates by default. If you want to have custom certificates created instead, please generate certificates and private keys, encode them in base64, and insert them into the sample file as shown below for whichever components you are enabling. If none of the pods deploy, check the operator logs to see if there is an error with the certificates. If the pods deploy but the karavi pods never complete, check the cert-manager controller logs to see if there are issues with certificate creation. +- To use Observablity with CSM Authorization, the [Authorization Proxy Server](../authorization/) should be installed and configured first. Then, enable the Authorization module along with the Observability module in the sample manifest. +- Observability will deploy with self-signed certificates by default. If you want to have custom certificates created instead, please generate certificates and private keys, encode them in base64, and insert them into the sample file as shown below for whichever components you are enabling: ``` # observability: allows to configure observability - name: observability @@ -46,9 +47,10 @@ The CSM Observability module for supported Dell CSI Drivers can be installed via - Notes: - If you enable `metrics-powerscale` or `metrics-powerflex`, you must enable `otel-collector` as well. - otel-collector cannot be enabled without a metrics component also enabled. - - If you are deploying multiple drivers, only enable topology, otel-collector, and cert-manager in the first driver. **For subsequent drivers, only enable the metrics component**. - - **When deleting a deployment with multiple drivers**, the driver that was created first must be deleted last. + - If you are deploying multiple drivers, only enable topology, otel-collector, and cert-manager in the first driver. For subsequent drivers, only enable the metrics component. When deleting the deployment, the driver that was created first must be deleted last. ## Install Observability - Once you have prepared the sample file(s) (one per driver being installed), deploy by running `kubectl apply -f ` on the sample file. + + diff --git a/content/v3/deployment/csmoperator/modules/replication.md b/content/v3/deployment/csmoperator/modules/replication.md index 6f7be547e2..c2775c3a68 100644 --- a/content/v3/deployment/csmoperator/modules/replication.md +++ b/content/v3/deployment/csmoperator/modules/replication.md @@ -31,14 +31,14 @@ This change will need to be made to the /etc/hosts file on: The [csm-replication](https://github.com/dell/csm-replication.git) GitHub repository is cloned to your source cluster as part of the installation. On your source cluster run the following to clone and build the repctl tool: ```bash -git clone -b v1.7.0 https://github.com/dell/csm-replication.git +git clone -b v1.8.0 https://github.com/dell/csm-replication.git cd csm-replication/repctl make build ``` Alternately, you can download a pre-built repctl binary from our [Releases](https://github.com/dell/csm-replication/releases) page. ```shell -wget https://github.com/dell/csm-replication/releases/download/v1.7.0/repctl-linux-amd64 +wget https://github.com/dell/csm-replication/releases/download/v1.8.0/repctl-linux-amd64 mv repctl-linux-amd64 repctl chmod +x repctl ``` diff --git a/content/v3/deployment/csmoperator/modules/resiliency.md b/content/v3/deployment/csmoperator/modules/resiliency.md index b788aa8c77..a4fb29fd7b 100644 --- a/content/v3/deployment/csmoperator/modules/resiliency.md +++ b/content/v3/deployment/csmoperator/modules/resiliency.md @@ -40,7 +40,7 @@ To enable this module, user should choose the sample file for the respective dri # false: disable Resiliency feature(do not deploy podmon sidecar) # Default value: false enabled: true - configVersion: v1.8.0 + configVersion: v1.9.0 components: - name: podmon-controller args: diff --git a/content/v3/csidriver/installation/operator/operator_migration.md b/content/v3/deployment/csmoperator/operator_migration.md similarity index 75% rename from content/v3/csidriver/installation/operator/operator_migration.md rename to content/v3/deployment/csmoperator/operator_migration.md index a056417347..f2546909e7 100644 --- a/content/v3/csidriver/installation/operator/operator_migration.md +++ b/content/v3/deployment/csmoperator/operator_migration.md @@ -16,8 +16,8 @@ description: > kubectl -n openshift-operators get CSIUnity kubectl -n openshift-operators get CSIUnity/test-unity -o yaml ``` -2. Map and update the settings from the CR in step 1 to the relevant CSM Operator CR - - As the yaml content may differ, ensure the values held in the step 1 CR backup are present in the new CR before installing the new driver. CR Samples table provided above can be used to compare and map the differences in attributes between Dell CSI Operator and CSM Operator CRs +2. Map and update the settings from the CR in step 1 to the relevant CSM Operator CR (found in [csm-operator repository](https://github.com/dell/csm-operator/blob/main/samples)). + - As the yaml content may differ, ensure the values held in the step 1 CR backup are present in the new CR before installing the new driver. CR Samples for [CSI Operator](https://github.com/dell/dell-csi-operator/tree/main/samples) and [CSM Operator](https://github.com/dell/csm-operator/tree/main/samples) can be used to compare and map the differences in attributes. - Ex: spec.driver.fsGroupPolicy in [CSI Operator](https://github.com/dell/dell-csi-operator/blob/main/samples/) maps to spec.driver.csiDriverSpec.fSGroupPolicy in [CSM Operator](https://github.com/dell/csm-operator/blob/main/samples/) 3. Retain (or do not delete) the secret, namespace, storage classes, and volume snapshot classes from the original deployment as they will be re-used in the CSM operator deployment 4. Uninstall the CR from the CSI Operator @@ -25,9 +25,9 @@ description: > kubectl delete / -n ``` 5. Uninstall the CSI Operator itself - - Instructions can be found [here](../../../../deployment/csmoperator/#uninstall) + - Instructions can be found [here](../../../deployment/csmoperator/#uninstall) 6. Install the CSM Operator - - Instructions can be found [here](../../../../deployment/csmoperator/#installation) + - Instructions can be found [here](../../../deployment/csmoperator/#installation) 7. Install the CR updated in step 2 - Instructions can be found [here](../#installing-csi-driver-via-operator) >NOTE: Uninstallation of the driver and the Operator is non-disruptive for mounted volumes. Nonetheless you can not create new volume, snapshot or move a Pod. @@ -55,10 +55,10 @@ description: > 6. Install the CSI driver through the CSM Operator in the OpenShift Web Console - Select *Create instance* under the provided Container Storage Module API - Use the CR backup from step 1 to manually map desired settings to the new CSI driver - - As the yaml content may differ, ensure the values held in the step 1 CR backup are present in the new CR before installing the new driver - - Ex: spec.driver.fsGroupPolicy in [PowerMax 2.7 for CSI Operator](https://github.com/dell/dell-csi-operator/blob/main/samples/powermax_v270_k8s_127.yaml#L17C5-L17C18) maps to spec.driver.csiDriverSpec.fSGroupPolicy in [PowerMax 2.9 for CSM Operator](https://github.com/dell/csm-operator/blob/v1.4.4/samples/storage_csm_powermax_v290.yaml#L28 ) + - As the yaml content may differ, ensure the values held in the step 1 CR backup are present in the new CR before installing the new driver. CR Samples for [CSI Operator](https://github.com/dell/dell-csi-operator/tree/main/samples) and [CSM Operator](https://github.com/dell/csm-operator/tree/main/samples) can be used to compare and map the differences in attributes. + - Ex: spec.driver.fsGroupPolicy in [CSI Operator](https://github.com/dell/dell-csi-operator/blob/main/samples/) maps to spec.driver.csiDriverSpec.fSGroupPolicy in [CSM Operator](https://github.com/dell/csm-operator/blob/main/samples/) >NOTE: Uninstallation of the driver and the Operator is non-disruptive for mounted volumes. Nonetheless you can not create new volume, snapshot or move a Pod. ## Testing -To test that the new installation is working, please follow the steps outlined [here](../../test) for your specific driver. +To test that the new installation is working, please follow the steps outlined [here](../../../csidriver/test) for your specific driver. diff --git a/content/v3/deployment/csmoperator/release/_index.md b/content/v3/deployment/csmoperator/release/_index.md index 0efac132a7..165479c0dd 100644 --- a/content/v3/deployment/csmoperator/release/_index.md +++ b/content/v3/deployment/csmoperator/release/_index.md @@ -6,77 +6,30 @@ Description: > Release notes for Dell Container Storage Modules Operator --- -## Release Notes - Container Storage Modules Operator v1.4.4 +## Release Notes - Container Storage Modules Operator v1.5.1 + + + + + + + + + + ### New Features/Changes -- [#947 - [FEATURE]: Support for Kubernetes 1.28](https://github.com/dell/csm/issues/947) -- [#1066 - [FEATURE]: Support for Openshift 4.14](https://github.com/dell/csm/issues/1066) -- [#996 - [FEATURE]: Dell CSI to Dell CSM Operator Migration Process](https://github.com/dell/csm/issues/996) -- [#1062 - [FEATURE]: CSM PowerMax: Support PowerMax v10.1 ](https://github.com/dell/csm/issues/1062) -- [#1158 - [FEATURE]: Automatically create certificates with CSM Operator Observability deployment ](https://github.com/dell/csm/issues/1158) +- [#1284 - [FEATURE]: Support for Openshift 4.15](https://github.com/dell/csm/issues/1284) +- [#926 - [FEATURE]: Fixing the linting, formatting and vetting issues](https://github.com/dell/csm/issues/926) ### Fixed Issues -- [#975 - [BUG]: Not able to take volumesnapshots ](https://github.com/dell/csm/issues/975) -- [#982 - [BUG]: Update resources limits for controller-manager to fix OOMKilled error](https://github.com/dell/csm/issues/982) -- [#988 - [BUG]: CSM Operator fails to install CSM Replication on the remote cluster](https://github.com/dell/csm/issues/988) -- [#989 - [BUG]: Allow volume prefix to be set via CSM operator](https://github.com/dell/csm/issues/989) -- [#990 - [BUG]: X_CSI_AUTH_TYPE cannot be set in CSM Operator](https://github.com/dell/csm/issues/990) -- [#1110 - [BUG]: Multi Controller defect - sidecars timeout](https://github.com/dell/csm/issues/1110) -- [#1117 - [BUG]: Operator crashes when deployed from OpenShift with OLM](https://github.com/dell/csm/issues/1117) -- [#1120 - [BUG]: Skip Certificate Validation is not propagated to Authorization module in CSM Operator](https://github.com/dell/csm/issues/1120) -- [#1122 - [BUG]: CSM Operator does not calculate status correctly when module is deployed with driver](https://github.com/dell/csm/issues/1122) -- [#1103 - [BUG]: CSM Operator doesn't apply fSGroupPolicy value to CSIDriver Object](https://github.com/dell/csm/issues/1103) -- [#1133 - [BUG]: CSM Operator does not calculate status correctly when application-mobility is deployed by itself](https://github.com/dell/csm/issues/1133)) -- [#1137 - [BUG]: CSM Operator intermittently does not calculate status correctly when deploying a driver](https://github.com/dell/csm/issues/1137)) -- [#1143 - [BUG]: CSM Operator does not calculate status correctly when deploying the authorization proxy server](https://github.com/dell/csm/issues/1143)) -- [#1146 - [BUG]: CSM Operator does not calculate status correctly when deploying observability with csi-powerscale](https://github.com/dell/csm/issues/1146)) -- [#1147 - [BUG]: CSM Operator labels csm objects with CSMVersion 1.8.0, an old version](https://github.com/dell/csm/issues/1147)) -- [#1156 - [BUG]: CSM object in success state when all CSI Powerflex pods are failing due to bad secret credentials](https://github.com/dell/csm/issues/1156)) -- [#1157 - [BUG]: If Authorization Proxy Server is installed in an alternate namespace by CSM Operator, the deployment fails](https://github.com/dell/csm/issues/1157)) -- [#1159 - [BUG]: CSM status is not always accurate when Observability installed with only one or two components](https://github.com/dell/csm/issues/1159)) -- [#1152 - [BUG]: CSI driver changes to facilitate SDC brownfield deployments](https://github.com/dell/csm/issues/1152)) -- [#1171 - [BUG]: CSM object occasionally stays in failed state when app-mobility is successfully deployed with csm-operator](https://github.com/dell/csm/issues/1171)) -- [#1189 - [BUG]: Change the Apex Connectivity Client access to the kube-proxy port to only connections within the client pod](https://github.com/dell/csm/issues/1189)) -- [#1190 - [BUG]: Change Apex Connectivity Client access to secrets to only the secrets it needs to manage](https://github.com/dell/csm/issues/1190)) +- [#1094 - [BUG]: CSM Operator offline install powerflex csi driver sidecar trying to pull from registry.k8s.io](https://github.com/dell/csm/issues/1094) +- [#1174 - [BUG]: Kubelet Configuration Directory setting should not have a comment about default value being None](https://github.com/dell/csm/issues/1174) ### Known Issues | Issue | Workaround | |-------|------------| -| The status field of a csm object as deployed by CSM Operator may, in limited cases, display an incorrect status for a deployment. | As a workaround, the health of the deployment can be determined by checking the health of the pods. | | When CSM Operator creates a deployment that includes secrets (e.g., application-mobility, observability, cert-manager, velero), these secrets are not deleted on uninstall and will be left behind. For example, the `karavi-topology-tls`, `otel-collector-tls`, and `cert-manager-webhook-ca` secrets will not be deleted. | This should not cause any issues on the system, but all secrets present on the cluster can be found with `kubectl get secrets -A`, and any unwanted secrets can be deleted with `kubectl delete secret -n `| | CSM Operator does not support dynamic namespaces for Authorization. Despite successful installation in a namespace other than "authorization", errors may arise during volume creation. | Use the default namespace "authorization" for installing Authorization using CSM Operator| -| The images of sideCars are currently missing in the sample YAMLs in the offline bundle. As a consequence, the csm-operator is pulling them from registry.k8s.io. | We recommend manually updating the images of sideCars in the sample YAML file, for example, `storage_csm_powerflex_v291.yaml`, before proceeding with the driver installation. Here is an example snippet for the sideCars section in the YAML file: - - ```yaml - sideCars: - # 'k8s' represents a string prepended to each volume created by the CSI driver - - name: provisioner - image: /csi-provisioner:v3.6.2 - args: ["--volume-name-prefix=k8s"] - - name: attacher - image: /csi-attacher:v4.4.2 - - name: registrar - image: /csi-node-driver-registrar:v2.9.1 - - name: resizer - image: /csi-resizer:v1.9.2 - - name: snapshotter - image: /csi-snapshotter:v6.3.2 - - # sdc-monitor is disabled by default, due to high CPU usage - - name: sdc-monitor - enabled: false - image: /sdc:4.5 - envs: - - name: HOST_PID - value: "1" - - name: MDM - value: "10.xx.xx.xx,10.xx.xx.xx" # Do not add mdm value here if it is present in secret - - # health monitor is disabled by default, refer to driver documentation before enabling it - # Also set the env variable controller.envs.X_CSI_HEALTH_MONITOR_ENABLED to "true". - - name: csi-external-health-monitor-controller - enabled: false - image: /csi-external-health-monitor-controller:v0.10.0 - args: ["--monitor-interval=60s"] diff --git a/content/v3/csidriver/installation/_index.md b/content/v3/deployment/helm/_index.md similarity index 57% rename from content/v3/csidriver/installation/_index.md rename to content/v3/deployment/helm/_index.md index 90e2b25f9d..4c4219bf2e 100644 --- a/content/v3/csidriver/installation/_index.md +++ b/content/v3/deployment/helm/_index.md @@ -1,11 +1,11 @@ --- -title: "Installation" -linkTitle: "Installation" -weight: 2 +title: "Helm" +linkTitle: "Helm" +weight: 3 description: Methods to install CSI Drivers tags: - install - csi-driver --- -Installation information for all the drivers/modules can be found on the individual driver's page in this section +Installation information for all the drivers/modules can be found on the individual driver's page in this section \ No newline at end of file diff --git a/content/v3/deployment/helm/drivers/_index.md b/content/v3/deployment/helm/drivers/_index.md new file mode 100644 index 0000000000..97b4252409 --- /dev/null +++ b/content/v3/deployment/helm/drivers/_index.md @@ -0,0 +1,6 @@ +--- +title: "CSI Drivers" +linkTitle: "CSI Drivers" +description: Deployment of Dell CSI Drivers using helm +weight: 1 +--- \ No newline at end of file diff --git a/content/v3/csidriver/installation/helm/_index.md b/content/v3/deployment/helm/drivers/installation/_index.md similarity index 93% rename from content/v3/csidriver/installation/helm/_index.md rename to content/v3/deployment/helm/drivers/installation/_index.md index 4bd95d84b7..d8f8300d18 100644 --- a/content/v3/csidriver/installation/helm/_index.md +++ b/content/v3/deployment/helm/drivers/installation/_index.md @@ -1,7 +1,7 @@ --- -title: "CSI Driver installation using Helm" -linkTitle: "Using Helm" -weight: 2 +title: "Installation" +linkTitle: "Installation" +weight: 1 Description: > Installation of CSI Drivers using Helm --- diff --git a/content/v3/csidriver/installation/helm/isilon.md b/content/v3/deployment/helm/drivers/installation/isilon.md similarity index 90% rename from content/v3/csidriver/installation/helm/isilon.md rename to content/v3/deployment/helm/drivers/installation/isilon.md index cd95c645c5..5d1cae3cb9 100644 --- a/content/v3/csidriver/installation/helm/isilon.md +++ b/content/v3/deployment/helm/drivers/installation/isilon.md @@ -9,15 +9,15 @@ The CSI Driver for Dell PowerScale can be deployed by using the provided Helm v3 The following are requirements to be met before installing the CSI Driver for Dell PowerScale: -- Install Kubernetes or OpenShift (see [supported versions](../../../../csidriver/#features-and-capabilities)) +- Install Kubernetes or OpenShift (see [supported versions](../../../../../csidriver/#features-and-capabilities)) - Install Helm 3 - Mount propagation is enabled on container runtime that is being used - `nfs-utils` package must be installed on nodes that will mount volumes - If using Snapshot feature, satisfy all Volume Snapshot requirements -- If enabling CSM for Authorization, please refer to the [Authorization deployment steps](../../../../authorization/deployment/) first -- If enabling CSM for Replication, please refer to the [Replication deployment steps](../../../../replication/deployment/) first -- If enabling CSM for Resiliency, please refer to the [Resiliency deployment steps](../../../../resiliency/deployment/) first -- If enabling Encryption, please refer to the [Encryption deployment steps](../../../../secure/encryption/deployment/) first +- If enabling CSM for Authorization, please refer to the [Authorization deployment steps](../../../../../deployment/helm/modules/installation/authorization/) first +- If enabling CSM for Replication, please refer to the [Replication deployment steps](../../../../../deployment/helm/modules/installation/replication/) first +- If enabling CSM for Resiliency, please refer to the [Resiliency deployment steps](../../../../../deployment/helm/modules/installation/resiliency/) first +- If enabling Encryption, please refer to the [Encryption deployment steps](../../../../../deployment/helm/modules/installation/encryption/) first ### Install Helm 3.0 @@ -33,7 +33,7 @@ Install Helm 3.0 on the master node before you install the CSI Driver for Dell P ### (Optional) Volume Snapshot Requirements - For detailed snapshot setup procedure, [click here.](../../../../snapshots/#optional-volume-snapshot-requirements) + For detailed snapshot setup procedure, [click here.](../../../../../snapshots/#optional-volume-snapshot-requirements) ### (Optional) Volume Health Monitoring @@ -88,29 +88,26 @@ replication: The CRDs for replication can be obtained and installed from the csm-replication project on Github. Use `csm-replication/deploy/replicationcrds.all.yaml` located in the csm-replication git repo for the installation. -CRDs should be configured during replication prepare stage with repctl as described in [install-repctl](../../../../replication/deployment/install-repctl) +CRDs should be configured during replication prepare stage with repctl as described in [install-repctl](../../../../helm/modules/installation/replication/install-repctl) ## Install the Driver **Steps** -1. Run `git clone -b v2.9.1 https://github.com/dell/csi-powerscale.git` to clone the git repository. +1. Run `git clone -b v2.10.1 https://github.com/dell/csi-powerscale.git` to clone the git repository. 2. Ensure that you have created the namespace where you want to install the driver. You can run `kubectl create namespace isilon` to create a new one. The use of "isilon" as the namespace is just an example. You can choose any name for the namespace. 3. Collect information from the PowerScale Systems like IP address, IsiPath, username, and password. Make a note of the value for these parameters as they must be entered in the *secret.yaml*. - - **Note**: The 'clusterName' serves as a logical, unique identifier for the array that should remain unchanged once it is included in the volume handle. Altering this identifier is not advisable, as it would result in the failure of all operations associated with the volume that was created earlier. - -4. Download `wget -O my-isilon-settings.yaml https://raw.githubusercontent.com/dell/helm-charts/csi-isilon-2.9.1/charts/csi-isilon/values.yaml` into `cd ../dell-csi-helm-installer` to customize settings for installation. +4. Download `wget -O my-isilon-settings.yaml https://raw.githubusercontent.com/dell/helm-charts/csi-isilon-2.10.1/charts/csi-isilon/values.yaml` into `cd ../dell-csi-helm-installer` to customize settings for installation. 5. Edit *my-isilon-settings.yaml* to set the following parameters for your installation: The following table lists the primary configurable parameters of the PowerScale driver Helm chart and their default values. More detailed information can be - found in the [`values.yaml`](https://github.com/dell/helm-charts/blob/csi-isilon-2.9.1/charts/csi-isilon/values.yaml) file in this repository. + found in the [`values.yaml`](https://github.com/dell/helm-charts/blob/csi-isilon-2.10.1/charts/csi-isilon/values.yaml) file in this repository. | Parameter | Description | Required | Default | | --------- | ----------- | -------- |-------- | | images | List all the images used by the CSI driver and CSM. If you use a private repository, change the registries accordingly. | Yes | "" | | logLevel | CSI driver log level | No | "debug" | | certSecretCount | Defines the number of certificate secrets, which the user is going to create for SSL authentication. (isilon-cert-0..isilon-cert-(n-1)); Minimum value should be 1.| Yes | 1 | - | [allowedNetworks](../../../features/powerscale/#support-custom-networks-for-nfs-io-traffic) | Defines the list of networks that can be used for NFS I/O traffic, CIDR format must be used. | No | [ ] | + | [allowedNetworks](../../../../../csidriver/features/powerscale/#support-custom-networks-for-nfs-io-traffic) | Defines the list of networks that can be used for NFS I/O traffic, CIDR format must be used. | No | [ ] | | maxIsilonVolumesPerNode | Defines the default value for a maximum number of volumes that the controller can publish to the node. If the value is zero CO SHALL decide how many volumes of this type can be published by the controller to the node. This limit is applicable to all the nodes in the cluster for which node label 'max-isilon-volumes-per-node' is not set. | Yes | 0 | | imagePullPolicy | Defines the policy to determine if the image should be pulled prior to starting the container | Yes | IfNotPresent | | verbose | Indicates what content of the OneFS REST API message should be logged in debug level logs | Yes | 1 | @@ -149,13 +146,13 @@ CRDs should be configured during replication prepare stage with repctl as descri | ignoreUnresolvableHosts | Allows new host to add to existing export list though any of the existing hosts from the same exports are unresolvable/doesn't exist anymore. | No | false | | noProbeOnStart | Define whether the controller/node plugin should probe all the PowerScale clusters during driver initialization | No | false | | autoProbe | Specify if automatically probe the PowerScale cluster if not done already during CSI calls | No | true | - | **authorization** | [Authorization](../../../../authorization/deployment) is an optional feature to apply credential shielding of the backend PowerScale. | - | - | + | **authorization** | [Authorization](../../../../../deployment/helm/modules/installation/authorization/) is an optional feature to apply credential shielding of the backend PowerScale. | - | - | | enabled | A boolean that enables/disables authorization feature. If enabled, isiAuthType must be set to 1. | No | false | | proxyHost | Hostname of the csm-authorization server. | No | Empty | | skipCertificateValidation | A boolean that enables/disables certificate validation of the csm-authorization proxy server. | No | true | - | **podmon** | [Podmon](../../../../resiliency/deployment) is an optional feature to enable application pods to be resilient to node failure. | - | - | + | **podmon** | [Podmon](../../../../../deployment/helm/modules/installation/resiliency/) is an optional feature to enable application pods to be resilient to node failure. | - | - | | enabled | A boolean that enables/disables podmon feature. | No | false | - | **encryption** | [Encryption](../../../../secure/encryption/deployment) is an optional feature to apply encryption to CSI volumes. | - | - | + | **encryption** | [Encryption](.../../../../../modules/installation/encryption/) is an optional feature to apply encryption to CSI volumes. | - | - | | enabled | A boolean that enables/disables Encryption feature. | No | false | *NOTE:* @@ -203,7 +200,7 @@ Create isilon-creds secret using the following command: - If any key/value is present in all *my-isilon-settings.yaml*, *secret*, and storageClass, then the values provided in storageClass parameters take precedence. - The user has to validate the yaml syntax and array-related key/values while replacing or appending the isilon-creds secret. The driver will continue to use previous values in case of an error found in the yaml file. - For the key isiIP/endpoint, the user can give either IP address or FQDN. Also, the user can prefix 'https' (For example, https://192.168.1.1) with the value. - - The *isilon-creds* secret has a *mountEndpoint* parameter which should only be updated and used when [Authorization](../../../../authorization) is enabled. + - The *isilon-creds* secret has a *mountEndpoint* parameter which should only be updated and used when [Authorization](../../../../../authorization) is enabled. 7. Install OneFS CA certificates by following the instructions from the next section, if you want to validate OneFS API server's certificates. If not, create an empty secret using the following command and an empty secret must be created for the successful installation of CSI Driver for Dell PowerScale. ```bash @@ -213,13 +210,10 @@ Create isilon-creds secret using the following command: 8. Install the driver using `csi-install.sh` bash script and default yaml by running ```bash - cd dell-csi-helm-installer && wget -O my-isilon-settings.yaml https://raw.githubusercontent.com/dell/helm-charts/csi-isilon-2.9.1/charts/csi-isilon/values.yaml && - ./csi-install.sh --namespace isilon --values my-isilon-settings.yaml --helm-charts-version + cd dell-csi-helm-installer && wget -O my-isilon-settings.yaml https://raw.githubusercontent.com/dell/helm-charts/csi-isilon-2.10.1/charts/csi-isilon/values.yaml && + ./csi-install.sh --namespace isilon --values my-isilon-settings.yaml ``` -*NOTE:* -- The parameter `--helm-charts-version` is optional and if you do not specify the flag, by default the `csi-install.sh` script will clone the version of the helm chart that is specified in the driver's [csi-install.sh](https://github.com/dell/csi-powerscale/blob/main/dell-csi-helm-installer/csi-install.sh#L16) file. If you wish to install the driver using a different version of the helm chart, you need to include this flag. Also, remember to delete the `helm-charts` repository present in the `csi-powerscale` directory if it was cloned before. - ## Certificate validation for OneFS REST API calls The CSI driver exposes an install parameter 'skipCertificateValidation' which determines if the driver diff --git a/content/v3/csidriver/installation/helm/powerflex.md b/content/v3/deployment/helm/drivers/installation/powerflex.md similarity index 90% rename from content/v3/csidriver/installation/helm/powerflex.md rename to content/v3/deployment/helm/drivers/installation/powerflex.md index aee8540bf5..ddad908371 100644 --- a/content/v3/csidriver/installation/helm/powerflex.md +++ b/content/v3/deployment/helm/drivers/installation/powerflex.md @@ -10,15 +10,16 @@ The CSI Driver for Dell PowerFlex can be deployed by using the provided Helm v3 ## Prerequisites The following are requirements that must be met before installing the CSI Driver for Dell PowerFlex: -- Install Kubernetes or OpenShift (see [supported versions](../../../../csidriver/#features-and-capabilities)) +- Install Kubernetes or OpenShift (see [supported versions](../../../../../csidriver/#features-and-capabilities)) - Install Helm 3.x - Enable Zero Padding on PowerFlex - Mount propagation is enabled on container runtime that is being used - Install PowerFlex Storage Data Client - If using Snapshot feature, satisfy all Volume Snapshot requirements - A user must exist on the array with a role _>= FrontEndConfigure_ -- If enabling CSM for Authorization, please refer to the [Authorization deployment steps](../../../../authorization/deployment/) first -- If multipath is configured, ensure CSI-PowerFlex volumes are blacklisted by multipathd. See [troubleshooting section](../../../troubleshooting/powerflex) for details +- If enabling CSM for Authorization, please refer to the [Authorization deployment steps](../../../../../deployment/helm/modules/installation/authorization/) first +- If multipath is configured, ensure CSI-PowerFlex volumes are blacklisted by multipathd. See [troubleshooting section](../../../../../csidriver/troubleshooting/powerflex) for details +- Secure boot is not supported; ensure that secure boot is disabled in the BIOS. ### Install Helm 3.x @@ -38,8 +39,9 @@ Verify that zero padding is enabled on the PowerFlex storage pools that will be ### Install PowerFlex Storage Data Client The CSI Driver for PowerFlex requires you to have installed the PowerFlex Storage Data Client (SDC) on all Kubernetes nodes which run the node portion of the CSI driver. -SDC could be installed automatically by CSI driver install on Kubernetes nodes with OS platform which support automatic SDC deployment; for Red Hat CoreOS (RHCOS), RHEL 7.9, RHEL 8.6. On Kubernetes nodes with OS version not supported by automatic install, you must perform the Manual SDC Deployment steps [below](#manual-sdc-deployment). +SDC could be installed automatically by CSI driver install on Kubernetes nodes with OS platform which support automatic SDC deployment; for Red Hat CoreOS (RHCOS) and RHEL. On Kubernetes nodes with OS version not supported by automatic install, you must perform the Manual SDC Deployment steps [below](#manual-sdc-deployment). Refer to https://hub.docker.com/r/dellemc/sdc for supported OS versions. +Please visit [E-Lab Navigator](https://elabnavigator.dell.com/eln/modernHomeSSM) for specific Dell Storage platform host operating system level support matrices. *NOTE:* To install CSI driver for Powerflex with automated SDC deployment, you need below two packages on worker nodes. 1. libaio @@ -67,12 +69,12 @@ When the driver is installed using values generated by installation wizard, then * `kubectl patch secret vxflexos-config -n vxflexos -p "{\"data\": { \"MDM\": \"\"}}"` ### (Optional) Volume Snapshot Requirements - For detailed snapshot setup procedure, [click here.](../../../../snapshots/#optional-volume-snapshot-requirements) + For detailed snapshot setup procedure, [click here.](../../../../../snapshots/#optional-volume-snapshot-requirements) ## Install the Driver **Steps** -1. Run `git clone -b v2.9.2 https://github.com/dell/csi-powerflex.git` to clone the git repository. +1. Run `git clone -b v2.10.1 https://github.com/dell/csi-powerflex.git` to clone the git repository. 2. A namespace for the driver is expected prior to running the command below. If one is not created already, you can run `kubectl create namespace vxflexos` to create a new one. Note that the namespace can be any user-defined name that follows the conventions for namespaces outlined by Kubernetes. In this example we assume that the namespace is 'vxflexos' @@ -91,7 +93,7 @@ Note that the namespace can be any user-defined name that follows the convention | skipCertificateValidation | Determines if the driver is going to validate certs while connecting to PowerFlex REST API interface. | true | true | | isDefault | An array having isDefault=true is for backward compatibility. This parameter should occur once in the list. | false | false | | mdm | mdm defines the MDM(s) that SDC should register with on start. This should be a list of MDM IP addresses or hostnames separated by comma. | true | - | - | nasName | nasName defines what NAS should be used for NFS volumes. NFS volumes are supported on arrays version 4.0.x | true | none | + | nasName | nasName defines what NAS should be used for NFS volumes. NFS volumes are supported on arrays version >=4.0.x | false | "" | Example: `samples/secret.yaml` @@ -136,22 +138,22 @@ Use the below command to replace or update the secret: *NOTE:* - The user needs to validate the YAML syntax and array-related key/values while replacing the vxflexos-creds secret. -- If you want to create a new array or update the MDM values in the secret, you will need to reinstall the driver. If you change other details, such as login information, the secret will dynamically update -- see [dynamic-array-configuration](../../../features/powerflex#dynamic-array-configuration) for more details. +- If you want to create a new array or update the MDM values in the secret, you will need to reinstall the driver. If you change other details, such as login information, the secret will dynamically update -- see [dynamic-array-configuration](../../../../../csidriver/features/powerflex#dynamic-array-configuration) for more details. - Old `json` format of the array configuration file is still supported in this release. If you already have your configuration in `json` format, you may continue to maintain it or you may transfer this configuration to `yaml`format and replace/update the secret. - "insecure" parameter has been changed to "skipCertificateValidation" as insecure is deprecated and will be removed from use in config.yaml or secret.yaml in a future release. Users can continue to use any one of "insecure" or "skipCertificateValidation" for now. The driver would return an error if both parameters are used. -- Please note that log configuration parameters from v1.5 will no longer work in v2.0 and higher. Please refer to the [Dynamic Logging Configuration](../../../features/powerflex#dynamic-logging-configuration) section in Features for more information. +- Please note that log configuration parameters from v1.5 will no longer work in v2.0 and higher. Please refer to the [Dynamic Logging Configuration](../../../../../csidriver/features/powerflex#dynamic-logging-configuration) section in Features for more information. - If the user is using complex K8s version like "v1.21.3-mirantis-1", use this kubeVersion check in helm/csi-unity/Chart.yaml file. kubeVersion: ">= 1.21.0-0 < 1.29.0-0" -5. Default logging options are set during Helm install. To see possible configuration options, see the [Dynamic Logging Configuration](../../../features/powerflex#dynamic-logging-configuration) section in Features. +5. Default logging options are set during Helm install. To see possible configuration options, see the [Dynamic Logging Configuration](../../../../../csidriver/features/powerflex#dynamic-logging-configuration) section in Features. 6. If using automated SDC deployment: - Check the SDC container image is the correct version for your version of PowerFlex. 7. Download the default values.yaml file ```bash - cd dell-csi-helm-installer && wget -O myvalues.yaml https://github.com/dell/helm-charts/raw/csi-vxflexos-2.9.2/charts/csi-vxflexos/values.yaml + cd dell-csi-helm-installer && wget -O myvalues.yaml https://github.com/dell/helm-charts/raw/csi-vxflexos-2.10.2/charts/csi-vxflexos/values.yaml ``` 8. If you are using custom images, check the fields under `images` in `my-vxflexos-settings.yaml` to make sure that they are pointing to the correct image repository. @@ -160,7 +162,7 @@ Use the below command to replace or update the secret: | Parameter | Description | Required | Default | | ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | ------- | -| version | Set to verify the values file version matches driver version and used to pull the image as part of the image name. | Yes | 2.9.2 | +| version | Set to verify the values file version matches driver version and used to pull the image as part of the image name. | Yes | 2.10.1 | | images | List all the images used by the CSI driver and CSM. If you use a private repository, change the registries accordingly. | Yes | "" | | images.powerflexSdc | Set to give the location of the SDC image used if automatic SDC deployment is being utilized. | Yes | dellemc/sdc:4.5 | | certSecretCount | Represents the number of certificate secrets, which the user is going to create for SSL authentication. | No | 0 | @@ -175,9 +177,9 @@ Use the below command to replace or update the secret: | allowRWOMultiPodAccess | Setting allowRWOMultiPodAccess to "true" will allow multiple pods on the same node to access the same RWO volume. This behavior conflicts with the CSI specification version 1.3. NodePublishVolume description that requires an error to be returned in this case. However, some other CSI drivers support this behavior and some customers desire this behavior. Customers use this option at their own risk. | Yes | false | | enableQuota | A boolean that, when enabled, will set quota limit for a newly provisioned NFS volume. | No | false | | externalAccess | Defines additional entries for hostAccess of NFS volumes, single IP address and subnet are valid entries | No | " " | -| **controller** | This section allows the configuration of controller-specific parameters. To maximize the number of available nodes for controller pods, see this section. For more details on the new controller pod configurations, see the [Features section](../../../features/powerflex#controller-ha) for Powerflex specifics. | - | - | +| **controller** | This section allows the configuration of controller-specific parameters. To maximize the number of available nodes for controller pods, see this section. For more details on the new controller pod configurations, see the [Features section](../../../../../csidriver/features/powerflex#controller-ha) for Powerflex specifics. | - | - | | volumeNamePrefix | Set so that volumes created by the driver have a default prefix. If one PowerFlex/VxFlex OS system is servicing several different Kubernetes installations or users, these prefixes help you distinguish them. | Yes | "k8s" | -| controllerCount | Set to deploy multiple controller instances. If the controller count is greater than the number of available nodes, excess pods remain in a pending state. It should be greater than 0. You can increase the number of available nodes by configuring the "controller" section in your values.yaml. For more details on the new controller pod configurations, see the [Features section](../../../features/powerflex#controller-ha) for Powerflex specifics. | Yes | 2 | +| controllerCount | Set to deploy multiple controller instances. If the controller count is greater than the number of available nodes, excess pods remain in a pending state. It should be greater than 0. You can increase the number of available nodes by configuring the "controller" section in your values.yaml. For more details on the new controller pod configurations, see the [Features section](../../../../../csidriver/features/powerflex#controller-ha) for Powerflex specifics. | Yes | 2 | | snapshot.enabled | A boolean that enable/disable volume snapshot feature. | No | true | | resizer.enabled | A boolean that enable/disable volume expansion feature. | No | true | | nodeSelector | Defines what nodes would be selected for pods of controller deployment. Leave as blank to use all nodes. Uncomment this section to deploy on master nodes exclusively. | Yes | " " | @@ -203,24 +205,24 @@ Use the below command to replace or update the secret: | **vgsnapshotter** | This section allows the configuration of the volume group snapshotter(vgsnapshotter) pod. | - | - | | enabled | A boolean that enable/disable vg snapshotter feature. | No | false | | image | Image for vg snapshotter. | No | " " | -| **podmon** | [Podmon](../../../../resiliency/deployment) is an optional feature to enable application pods to be resilient to node failure. | - | - | +| **podmon** | [Podmon](../../../../../deployment/helm/modules/installation/resiliency/) is an optional feature to enable application pods to be resilient to node failure. | - | - | | enabled | A boolean that enables/disables podmon feature. | No | false | -| **authorization** | [Authorization](../../../../authorization/deployment) is an optional feature to apply credential shielding of the backend PowerFlex. | - | - | +| **authorization** | [Authorization](../../../../../deployment/helm/modules/installation/authorization/) is an optional feature to apply credential shielding of the backend PowerFlex. | - | - | | enabled | A boolean that enables/disables authorization feature. | No | false | | proxyHost | Hostname of the csm-authorization server. | No | Empty | | skipCertificateValidation | A boolean that enables/disables certificate validation of the csm-authorization proxy server. | No | true | -10. Install the driver using `csi-install.sh` bash script by running `cd dell-csi-helm-installer && ./csi-install.sh --namespace vxflexos --values myvalues.yaml --helm-charts-version `. You may modify the release name with the `--release` arg. If arg is not provided, release will be named `vxflexos` by default. +10. Install the driver using `csi-install.sh` bash script by running `cd dell-csi-helm-installer && ./csi-install.sh --namespace vxflexos --values myvalues.yaml --helm-charts-version csi-vxflexos-2.10.2`. You may modify the release name with the `--release` arg. If arg is not provided, release will be named `vxflexos` by default. Alternatively, to do a helm install solely with Helm charts (without shell scripts), refer to `helm/README.md`. *NOTE:* -- The parameter `--helm-charts-version` is optional and if you do not specify the flag, by default the `csi-install.sh` script will clone the version of the helm chart that is specified in the driver's [csi-install.sh](https://github.com/dell/csi-powerflex/blob/main/dell-csi-helm-installer/csi-install.sh#L24) file. If you wish to install the driver using a different version of the helm chart, you need to include this flag. Also, remember to delete the `helm-charts` repository present in the `csi-powerflex` directory if it was cloned before. +- If you do not specify the `--helm-charts-version` flag, by default the `csi-install.sh` script will clone the version of the helm chart that is specified in the driver's [csi-install.sh](https://github.com/dell/csi-powerflex/blob/main/dell-csi-helm-installer/csi-install.sh#L24) file. If you wish to install the driver using a different version of the helm chart, you need to include this flag. Also, remember to delete the `helm-charts` repository present in the `csi-powerflex` directory if it was cloned before. - For detailed instructions on how to run the install scripts, refer to the README.md in the dell-csi-helm-installer folder. - Install script will validate MDM IP(s) in `vxflexos-config` secret and creates a new field consumed by the init container and sdc-monitor container - This install script also runs the `verify.sh` script. You will be prompted to enter the credentials for each of the Kubernetes nodes. The `verify.sh` script needs the credentials to check if SDC has been configured on all nodes. -- It is mandatory to run install script after changes to MDM configuration in `vxflexos-config` secret. Refer [dynamic-array-configuration](../../../features/powerflex#dynamic-array-configuration) +- It is mandatory to run install script after changes to MDM configuration in `vxflexos-config` secret. Refer [dynamic-array-configuration](../../../../../csidriver/features/powerflex#dynamic-array-configuration) - If an extended Kubernetes version is being used (e.g. `v1.21.3-mirantis-1`) and is failing the version check in Helm even though it falls in the allowed range, then you must go into `helm/csi-vxflexos/Chart.yaml` and replace the standard `kubeVersion` check with the commented-out alternative. *Please note* that this will also allow the use of pre-release alpha and beta versions of Kubernetes, which is not supported. - (Optional) Enable additional Mount Options - A user is able to specify additional mount options as needed for the driver. diff --git a/content/v3/csidriver/installation/helm/powermax.md b/content/v3/deployment/helm/drivers/installation/powermax.md similarity index 94% rename from content/v3/csidriver/installation/helm/powermax.md rename to content/v3/deployment/helm/drivers/installation/powermax.md index 09df896551..8d8291e19c 100644 --- a/content/v3/csidriver/installation/helm/powermax.md +++ b/content/v3/deployment/helm/drivers/installation/powermax.md @@ -10,7 +10,7 @@ CSI Driver for Dell PowerMax can be deployed by using the provided Helm v3 chart ## Prerequisites The following requirements must be met before installing CSI Driver for Dell PowerMax: -- Install Kubernetes or OpenShift (see [supported versions](../../../../csidriver/#features-and-capabilities)) +- Install Kubernetes or OpenShift (see [supported versions](../../../../../csidriver/#features-and-capabilities)) - Install Helm 3 - Fibre Channel requirements - iSCSI requirements @@ -20,7 +20,11 @@ The following requirements must be met before installing CSI Driver for Dell Pow - Mount propagation is enabled on container runtime that is being used - Linux multipathing requirements - If using Snapshot feature, satisfy all Volume Snapshot requirements -- If enabling CSM for Authorization, please refer to the [Authorization deployment steps](../../../../authorization/deployment/) first +- If enabling CSM for Authorization, please refer to the [Authorization deployment steps](../../../../../deployment/helm/modules/installation/authorization/) first +- If enabling CSM Replication, both source and target storage systems must be locally managed by Unisphere. + - _Example_: When using two Unisphere instances, the first Unisphere instance should be configured with the source storage system as locally + managed and target storage system as remotely managed. The second Unisphere configuration should mirror the first — locally managing the target storage system and + remotely managing the source storage system. - If using Powerpath , install the PowerPath for Linux requirements ### Prerequisite for CSI Reverse Proxy @@ -218,7 +222,7 @@ Set up the PowerPath for Linux as follows: >Note: Do not install Dell PowerPath if multi-path software is already installed, as they cannot co-exist with native multi-path software. ### (Optional) Volume Snapshot Requirements - For detailed snapshot setup procedure, [click here.](../../../../snapshots/#optional-volume-snapshot-requirements) + For detailed snapshot setup procedure, [click here.](../../../../../snapshots/#optional-volume-snapshot-requirements) ### (Optional) Replication feature Requirements @@ -232,13 +236,13 @@ replication: The CRDs for replication can be obtained and installed from the csm-replication project on Github. Use `csm-replication/deploy/replicationcrds.all.yaml` located in the csm-replication git repo for the installation. -CRDs should be configured during replication prepare stage with repctl as described in [install-repctl](../../../../replication/deployment/install-repctl) +CRDs should be configured during replication prepare stage with repctl as described in [install-repctl](../../../../../deployment/helm/modules/installation/replication/install-repctl) ## Install the Driver **Steps** -1. Run `git clone -b v2.9.1 https://github.com/dell/csi-powermax.git` to clone the git repository. This will include the Helm charts and dell-csi-helm-installer scripts. +1. Run `git clone -b v2.10.1 https://github.com/dell/csi-powermax.git` to clone the git repository. This will include the Helm charts and dell-csi-helm-installer scripts. 2. Ensure that you have created a namespace where you want to install the driver. You can run `kubectl create namespace powermax` to create a new one 3. Edit the `samples/secret/secret.yaml` file,to point to the correct namespace, and replace the values for the username and password parameters. These values can be obtained using base64 encoding as described in the following example: @@ -253,7 +257,7 @@ CRDs should be configured during replication prepare stage with repctl as descri ``` 5. Download the default values.yaml file ```bash - cd dell-csi-helm-installer && wget -O my-powermax-settings.yaml https://github.com/dell/helm-charts/raw/csi-powermax-2.9.1/charts/csi-powermax/values.yaml + cd dell-csi-helm-installer && wget -O my-powermax-settings.yaml https://github.com/dell/helm-charts/raw/csi-powermax-2.10.1/charts/csi-powermax/values.yaml ``` 6. Ensure the unisphere have 10.0 REST endpoint support by clicking on Unisphere -> Help (?) -> About in Unisphere for PowerMax GUI. 7. Edit the newly created file and provide values for the following parameters @@ -294,7 +298,7 @@ CRDs should be configured during replication prepare stage with repctl as descri | powerMaxDebug | Enables low level and http traffic logging between the CSI driver and Unisphere. Don't enable this unless asked to do so by the support team. | No | false | | enableCHAP | Determine if the driver is going to configure SCSI node databases on the nodes with the CHAP credentials. If enabled, the CHAP secret must be provided in the credentials secret and set to the key "chapsecret" | No | false | | fsGroupPolicy | Defines which FS Group policy mode to be used, Supported modes `None, File and ReadWriteOnceWithFSType` | No | "ReadWriteOnceWithFSType" | -| version | Current version of the driver. Don't modify this value as this value will be used by the install script. | Yes | v2.9.1 | +| version | Current version of the driver. Don't modify this value as this value will be used by the install script. | Yes | v2.10.1 | | images | List all the images used by the CSI driver and CSM. If you use a private repository, change the registries accordingly. | Yes | "" || driverRepository | Defines the registry of the container image used for the driver. | Yes | dellemc | | maxPowerMaxVolumesPerNode | Specifies the maximum number of volume that can be created on a node. | Yes| 0 | | **controller** | Allows configuration of the controller-specific parameters.| - | - | @@ -320,16 +324,16 @@ CRDs should be configured during replication prepare stage with repctl as descri | selfSignedCert | Set selfSignedCert to use a self-signed certificate | No | true | | certificateFile | certificateFile has tls.key content in encoded format | No | tls.crt.encoded64 | | privateKeyFile | privateKeyFile has tls.key content in encoded format | No | tls.key.encoded64 | -| **authorization** | [Authorization](../../../../authorization/deployment) is an optional feature to apply credential shielding of the backend PowerMax. | - | - | +| **authorization** | [Authorization](../../../../../deployment/helm/modules/installation/authorization/) is an optional feature to apply credential shielding of the backend PowerMax. | - | - | | enabled | A boolean that enables/disables authorization feature. | No | false | | proxyHost | Hostname of the csm-authorization server. | No | Empty | | skipCertificateValidation | A boolean that enables/disables certificate validation of the csm-authorization proxy server. | No | true | -| **migration** | [Migration](../../../../replication/migration/migrating-volumes-same-array) is an optional feature to enable migration between storage classes | - | - | +| **migration** | [Migration](../../../../../replication/migration/migrating-volumes-same-array) is an optional feature to enable migration between storage classes | - | - | | enabled | A boolean that enables/disables migration feature. | No | false | | image | Image for dell-csi-migrator sidecar. | No | " " | | nodeRescanSidecarImage | Image for node rescan sidecar which rescans nodes for identifying new paths. | No | " " | | migrationPrefix | enables migration sidecar to read required information from the storage class fields | No | migration.storage.dell.com | -| **replication** | [Replication](../../../../replication/deployment) is an optional feature to enable replication & disaster recovery capabilities of PowerMax to Kubernetes clusters.| - | - | +| **replication** | [Replication](../../../../../deployment/helm/modules/installation/replication/) is an optional feature to enable replication & disaster recovery capabilities of PowerMax to Kubernetes clusters.| - | - | | enabled | A boolean that enables/disables replication feature. | No | false | | replicationContextPrefix | enables side cars to read required information from the volume context | No | powermax | | replicationPrefix | Determine if replication is enabled | No | replication.storage.dell.com | @@ -346,7 +350,7 @@ CRDs should be configured during replication prepare stage with repctl as descri 8. Install the driver using `csi-install.sh` bash script by running ```bash - cd ../dell-csi-helm-installer && ./csi-install.sh --namespace powermax --values ./my-powermax-settings.yaml --helm-charts-version + cd ../dell-csi-helm-installer && ./csi-install.sh --namespace powermax --values ./my-powermax-settings.yaml ``` 9. Or you can also install the driver using standalone helm chart using the command ```bash @@ -354,7 +358,6 @@ CRDs should be configured during replication prepare stage with repctl as descri ``` *Note:* -- The parameter `--helm-charts-version` is optional and if you do not specify the flag, by default the `csi-install.sh` script will clone the version of the helm chart that is specified in the driver's [csi-install.sh](https://github.com/dell/csi-powermax/blob/main/dell-csi-helm-installer/csi-install.sh#L52) file. If you wish to install the driver using a different version of the helm chart, you need to include this flag. Also, remember to delete the `helm-charts` repository present in the `csi-powermax` directory if it was cloned before. - For detailed instructions on how to run the install scripts, see the readme document in the dell-csi-helm-installer folder. - There are a set of samples provided [here](#sample-values-file) to help you configure the driver with reverse proxy - This script also runs the verify.sh script in the same directory. You will be prompted to enter the credentials for each of the Kubernetes nodes. The `verify.sh` script needs the credentials to check if the iSCSI initiators have been configured on all nodes. You can also skip the verification step by specifying the `--skip-verify-node` option diff --git a/content/v3/csidriver/installation/helm/powerstore.md b/content/v3/deployment/helm/drivers/installation/powerstore.md similarity index 97% rename from content/v3/csidriver/installation/helm/powerstore.md rename to content/v3/deployment/helm/drivers/installation/powerstore.md index 23409b156e..df90fe989d 100644 --- a/content/v3/csidriver/installation/helm/powerstore.md +++ b/content/v3/deployment/helm/drivers/installation/powerstore.md @@ -9,7 +9,7 @@ The CSI Driver for Dell PowerStore can be deployed by using the provided Helm v3 ## Prerequisites The following are requirements to be met before installing the CSI Driver for Dell PowerStore: -- A Kubernetes or OpenShift cluster (see [supported versions](../../../../csidriver/#features-and-capabilities)) +- A Kubernetes or OpenShift cluster (see [supported versions](../../../../../csidriver/#features-and-capabilities)) - Install Helm 3.x - If you plan to use either the Fibre Channel, iSCSI, NVMe/TCP, or NVMe/FC protocols, refer to either _Fibre Channel requirements_ or _Set up the iSCSI Initiator_ or _Set up the NVMe Initiator_ sections below. You can use NFS volumes without FC, iSCSI, NVMe/TCP, or NVMe/FC configurations. > You can use either the Fibre Channel (FC), iSCSI, NVMe/TCP, or NVMe/FC protocol, but you do not need all four to be enabled. @@ -250,7 +250,7 @@ Alternatively, you can check the status of the multipath service by entering the For additional information refer to the [Dell Host Connectivity Guide](https://elabnavigator.dell.com/vault/pdf/Linux.pdf?key=1725374107988). ### (Optional) Volume Snapshot Requirements - For detailed snapshot setup procedure, [click here.](../../../../snapshots/#optional-volume-snapshot-requirements) + For detailed snapshot setup procedure, [click here.](../../../../../snapshots/#optional-volume-snapshot-requirements) ### Volume Health Monitoring @@ -294,12 +294,12 @@ replication: The CRDs for replication can be obtained and installed from the csm-replication project on Github. Use `csm-replication/deploy/replicationcrds.all.yaml` located in csm-replication git repo for the installation. -CRDs should be configured during replication prepare stage with repctl as described in [install-repctl](../../../../replication/deployment/install-repctl) +CRDs should be configured during replication prepare stage with repctl as described in [install-repctl](../../../../../deployment/helm/modules/installation/replication/install-repctl) ## Install the Driver **Steps** -1. Run `git clone -b v2.9.1 https://github.com/dell/csi-powerstore.git` to clone the git repository. +1. Run `git clone -b v2.10.1 https://github.com/dell/csi-powerstore.git` to clone the git repository. 2. Ensure that you have created namespace where you want to install the driver. You can run `kubectl create namespace csi-powerstore` to create a new one. "csi-powerstore" is just an example. You can choose any name for the namespace. But make sure to align to the same namespace during the whole installation. 3. Edit `samples/secret/secret.yaml` file and configure connection information for your PowerStore arrays changing following parameters: @@ -326,7 +326,7 @@ CRDs should be configured during replication prepare stage with repctl as descri > If you do not specify `arrayID` parameter in the storage class then the array that was specified as the default would be used for provisioning volumes. 6. Download the default values.yaml file ```bash - cd dell-csi-helm-installer && wget -O my-powerstore-settings.yaml https://github.com/dell/helm-charts/raw/csi-powerstore-2.9.1/charts/csi-powerstore/values.yaml + cd dell-csi-helm-installer && wget -O my-powerstore-settings.yaml https://github.com/dell/helm-charts/raw/csi-powerstore-2.10.1/charts/csi-powerstore/values.yaml ``` 7. Edit the newly created values file and provide values for the following parameters `vi my-powerstore-settings.yaml`: @@ -361,7 +361,7 @@ CRDs should be configured during replication prepare stage with repctl as descri | allowAutoRoundOffFilesystemSize | Allows the controller to round off filesystem to 3Gi which is the minimum supported value | No | false | | storageCapacity.enabled | Allows to enable/disable storage capacity tracking feature | No | true | storageCapacity.pollInterval | Configure how often the driver checks for changed capacity | No | 5m -| podmon.enabled | Allows to enable/disable [Resiliency](../../../../resiliency/deployment#powerstore-specific-recommendations) feature | No | false +| podmon.enabled | Allows to enable/disable [Resiliency](../../../../../deployment/helm/modules/installation/resiliency#powerstore-specific-recommendations) feature | No | false 8. Install the driver using `csi-install.sh` bash script by running ```bash diff --git a/content/v3/csidriver/installation/helm/unity.md b/content/v3/deployment/helm/drivers/installation/unity.md similarity index 95% rename from content/v3/csidriver/installation/helm/unity.md rename to content/v3/deployment/helm/drivers/installation/unity.md index a13e38c3d8..a008f1a6c0 100644 --- a/content/v3/csidriver/installation/helm/unity.md +++ b/content/v3/deployment/helm/drivers/installation/unity.md @@ -12,7 +12,7 @@ Before you install CSI Driver for Unity XT, verify the requirements that are men ### Requirements -* Install Kubernetes or OpenShift (see [supported versions](../../../../csidriver/#features-and-capabilities)) +* Install Kubernetes or OpenShift (see [supported versions](../../../../../csidriver/#features-and-capabilities)) * Install Helm v3 * To use FC protocol, the host must be zoned with Unity XT array and Multipath needs to be configured * To use iSCSI protocol, iSCSI initiator utils packages needs to be installed and Multipath needs to be configured @@ -78,7 +78,7 @@ Install CSI Driver for Unity XT using this procedure. * As a pre-requisite for running this procedure, you must have the downloaded files, including the Helm chart from the source [git repository](https://github.com/dell/csi-unity) with the command ```bash - git clone -b v2.9.1 https://github.com/dell/csi-unity.git + git clone -b v2.10.1 https://github.com/dell/csi-unity.git ``` * In the top-level dell-csi-helm-installer directory, there should be two scripts, `csi-install.sh` and `csi-uninstall.sh`. * Ensure _unity_ namespace exists in Kubernetes cluster. Use the `kubectl create namespace unity` command to create the namespace if the namespace is not present. @@ -98,12 +98,12 @@ Procedure 2. Get the required values.yaml using the command below: ```bash -cd dell-csi-helm-installer && wget -O my-unity-settings.yaml https://github.com/dell/helm-charts/raw/csi-unity-2.9.1/charts/csi-unity/values.yaml +cd dell-csi-helm-installer && wget -O my-unity-settings.yaml https://github.com/dell/helm-charts/raw/csi-unity-2.10.1/charts/csi-unity/values.yaml ``` 3. Edit `values.yaml` to set the following parameters for your installation: - The following table lists the primary configurable parameters of the Unity XT driver chart and their default values. More detailed information can be found in the [`values.yaml`](https://github.com/dell/helm-charts/blob/csi-unity-2.9.1/charts/csi-unity/values.yaml) file in this repository. + The following table lists the primary configurable parameters of the Unity XT driver chart and their default values. More detailed information can be found in the [`values.yaml`](https://github.com/dell/helm-charts/blob/csi-unity-2.10.1/charts/csi-unity/values.yaml) file in this repository. | Parameter | Description | Required | Default | | --------- | ----------- | -------- |-------- | @@ -240,16 +240,13 @@ cd dell-csi-helm-installer && wget -O my-unity-settings.yaml https://github.com/ **Note:** Parameters "allowRWOMultiPodAccess" and "syncNodeInfoInterval" have been enabled for configuration in values.yaml and this helps users to dynamically change these values without the need for driver re-installation. -6. If you want to leverage snapshotting feature, the pre-requisite is to install external-snapshotter. Installation of external-snapshotter is required only for Kubernetes and is available by default with OpenShift installations. [Click here](../../../../snapshots/#optional-volume-snapshot-requirements) to follow the procedure to install external-snapshotter. +6. If you want to leverage snapshotting feature, the pre-requisite is to install external-snapshotter. Installation of external-snapshotter is required only for Kubernetes and is available by default with OpenShift installations. [Click here](../../../../../snapshots/#optional-volume-snapshot-requirements) to follow the procedure to install external-snapshotter. 7. Run the command to proceed with the installation using bash script. ```bash - ./csi-install.sh --namespace unity --values ./myvalues.yaml --helm-charts-version + ./csi-install.sh --namespace unity --values ./myvalues.yaml ``` - *NOTE:* - - The parameter `--helm-charts-version` is optional and if you do not specify the flag, by default the `csi-install.sh` script will clone the version of the helm chart that is specified in the driver's [csi-install.sh](https://github.com/dell/csi-unity/blob/main/dell-csi-helm-installer/csi-install.sh#L22) file. If you wish to install the driver using a different version of the helm chart, you need to include this flag. Also, remember to delete the `helm-charts` repository present in the `csi-unity` directory if it was cloned before. - A successful installation must display messages that look similar to the following samples: ``` ------------------------------------------------------ @@ -330,7 +327,7 @@ cd dell-csi-helm-installer && wget -O my-unity-settings.yaml https://github.com/ **Syntax**: ```bash - git clone -b csi-unity-2.9.1 https://github.com/dell/helm-charts + git clone -b csi-unity-2.10.1 https://github.com/dell/helm-charts helm install dell/container-storage-modules -n --version -f diff --git a/content/v3/csidriver/uninstall/_index.md b/content/v3/deployment/helm/drivers/uninstall/_index.md similarity index 89% rename from content/v3/csidriver/uninstall/_index.md rename to content/v3/deployment/helm/drivers/uninstall/_index.md index 5667a4122f..27e0d5923f 100644 --- a/content/v3/csidriver/uninstall/_index.md +++ b/content/v3/deployment/helm/drivers/uninstall/_index.md @@ -1,7 +1,7 @@ --- title: "Uninstallation" linkTitle: "Uninstallation" -weight: 3 +weight: 2 description: Methods to uninstall Dell CSI Driver --- @@ -31,5 +31,5 @@ Options: ## Uninstall a CSI driver installed via Dell CSM Operator -For uninstalling any CSI drivers deployed by the Dell CSM Operator, refer to instructions [here](../../deployment/csmoperator/drivers/#uninstall-csi-driver) +For uninstalling any CSI drivers deployed by the Dell CSM Operator, refer to instructions [here](../../../../deployment/csmoperator/drivers/#uninstall-csi-driver) diff --git a/content/v3/csidriver/upgradation/_index.md b/content/v3/deployment/helm/drivers/upgrade/_index.md similarity index 50% rename from content/v3/csidriver/upgradation/_index.md rename to content/v3/deployment/helm/drivers/upgrade/_index.md index dc05a6bae1..18cda2dc44 100644 --- a/content/v3/csidriver/upgradation/_index.md +++ b/content/v3/deployment/helm/drivers/upgrade/_index.md @@ -2,8 +2,7 @@ title: "Upgrade" tags: - upgrade - - csi-driver weight: 3 -Description: Upgrade Dell CSI Drivers +Description: Upgrading Dell CSI Drivers --- diff --git a/content/v3/csidriver/upgradation/drivers/isilon.md b/content/v3/deployment/helm/drivers/upgrade/isilon.md similarity index 51% rename from content/v3/csidriver/upgradation/drivers/isilon.md rename to content/v3/deployment/helm/drivers/upgrade/isilon.md index 805e212950..924a0b0581 100644 --- a/content/v3/csidriver/upgradation/drivers/isilon.md +++ b/content/v3/deployment/helm/drivers/upgrade/isilon.md @@ -6,36 +6,33 @@ tags: weight: 1 Description: Upgrade PowerScale CSI driver --- -You can upgrade the CSI Driver for Dell PowerScale using Helm or Dell CSI Operator. +You can upgrade the CSI Driver for Dell PowerScale using Helm or Dell CSM Operator. -## Upgrade Driver from version 2.7.0 to 2.8.0 using Helm +## Upgrade Driver from version 2.9.0 to 2.10.1 using Helm **Note:** While upgrading the driver via helm, controllerCount variable in myvalues.yaml can be at most one less than the number of worker nodes. ### Steps -1. Clone the repository using `git clone -b v2.8.0 https://github.com/dell/csi-powerscale.git` +1. Clone the repository using `git clone -b v2.10.1 https://github.com/dell/csi-powerscale.git` 2. Change to directory dell-csi-helm-installer to install the Dell PowerScale `cd dell-csi-helm-installer` 3. Download the default values.yaml using following command: ```bash - wget -O my-isilon-settings.yaml https://raw.githubusercontent.com/dell/helm-charts/csi-isilon-2.8.0/charts/csi-isilon/values.yaml + wget -O my-isilon-settings.yaml https://raw.githubusercontent.com/dell/helm-charts/csi-isilon-2.10.1/charts/csi-isilon/values.yaml ``` Edit the _my-isilon-settings.yaml_ as per the requirements. 4. Upgrade the CSI Driver for Dell PowerScale using following command: ```bash - ./csi-install.sh --namespace isilon --values ./my-isilon-settings.yaml --helm-charts-version --upgrade + ./csi-install.sh --namespace isilon --values ./my-isilon-settings.yaml --upgrade ``` -*NOTE:* -- The parameter `--helm-charts-version` is optional and if you do not specify the flag, by default the `csi-install.sh` script will clone the version of the helm chart that is specified in the driver's [csi-install.sh](https://github.com/dell/csi-powerscale/blob/main/dell-csi-helm-installer/csi-install.sh#L16) file. If you wish to install the driver using a different version of the helm chart, you need to include this flag. Also, remember to delete the `helm-charts` repository present in the `csi-powerscale` directory if it was cloned before. - ## Upgrade using Dell CSM Operator **Note:** Upgrading the Operator does not upgrade the CSI Driver. -1. Please upgrade the Dell CSM Operator by following [here](../../../../deployment/csmoperator/#upgrade) -2. Once the operator is upgraded, to upgrade the driver, refer [here](../../../../deployment/csmoperator/#upgrade-driver-using-dell-csm-operator) +1. Please upgrade the Dell CSM Operator by following [here](../../../../../deployment/csmoperator/#upgrade) +2. Once the operator is upgraded, to upgrade the driver, refer [here](../../../../../deployment/csmoperator/#upgrade-driver-using-dell-csm-operator) diff --git a/content/v3/csidriver/upgradation/drivers/powerflex.md b/content/v3/deployment/helm/drivers/upgrade/powerflex.md similarity index 61% rename from content/v3/csidriver/upgradation/drivers/powerflex.md rename to content/v3/deployment/helm/drivers/upgrade/powerflex.md index 7708c6582e..d85cb7618f 100644 --- a/content/v3/csidriver/upgradation/drivers/powerflex.md +++ b/content/v3/deployment/helm/drivers/upgrade/powerflex.md @@ -10,25 +10,24 @@ Description: Upgrade PowerFlex CSI driver You can upgrade the CSI Driver for Dell PowerFlex using Helm or Dell CSM Operator. -## Update Driver from v2.8.0 to v2.9.2 using Helm +## Update Driver from v2.9.2 to v2.10.1 using Helm **Steps** -1. Run `git clone -b v2.9.2 https://github.com/dell/csi-powerflex.git` to clone the git repository and get the v2.9.2 driver. +1. Run `git clone -b v2.10.1 https://github.com/dell/csi-powerflex.git` to clone the git repository and get the v2.10.1 driver. 2. You need to create secret.yaml with the configuration of your system. - Check this section in installation documentation: [Install the Driver](../../../installation/helm/powerflex#install-the-driver) 3. Update myvalues file as needed. 4. Run the `csi-install` script with the option _\-\-upgrade_ by running: ```bash - cd ../dell-csi-helm-installer && ./csi-install.sh --namespace vxflexos --values ./myvalues.yaml --helm-charts-version --upgrade + cd ../dell-csi-helm-installer && ./csi-install.sh --namespace vxflexos --values ./myvalues.yaml --helm-charts-version csi-vxflexos-2.10.2 --upgrade ``` *NOTE:* -- The parameter `--helm-charts-version` is optional and if you do not specify the flag, by default the `csi-install.sh` script will clone the version of the helm chart that is specified in the driver's [csi-install.sh](https://github.com/dell/csi-powerflex/blob/main/dell-csi-helm-installer/csi-install.sh#L24) file. If you wish to install the driver using a different version of the helm chart, you need to include this flag. Also, remember to delete the `helm-charts` repository present in the `csi-powerflex` directory if it was cloned before. +- If you do not specify the `--helm-charts-version` flag, by default the `csi-install.sh` script will clone the version of the helm chart that is specified in the driver's [csi-install.sh](https://github.com/dell/csi-powerflex/blob/main/dell-csi-helm-installer/csi-install.sh#L24) file. If you wish to upgrade the driver using a different version of the helm chart, you need to include this flag. Also, remember to delete the `helm-charts` repository present in the `csi-powerflex` directory if it was cloned before. - If you are upgrading from a driver version that was installed using Helm v2, ensure that you install Helm3 before installing the driver. - To update any installation parameter after the driver has been installed, change the `myvalues.yaml` file and run the install script with the option _\-\-upgrade_, for example: ```bash - ./csi-install.sh --namespace vxflexos --values ./myvalues.yaml --helm-charts-version --upgrade + ./csi-install.sh --namespace vxflexos --values ./myvalues.yaml --helm-charts-version csi-vxflexos-2.10.2 --upgrade ``` - The logging configuration from v1.5 will not work in v2.1, since the log configuration parameters are now set in the myvalues.yaml file located at dell-csi-helm-installer/myvalues.yaml. Please set the logging configuration parameters in the myvalues.yaml file. @@ -50,5 +49,5 @@ You can upgrade the CSI Driver for Dell PowerFlex using Helm or Dell CSM Operato ## Upgrade using Dell CSM Operator: **Note:** Upgrading the Operator does not upgrade the CSI Driver. -1. Upgrade the Dell CSM Operator by following [here](../../../../deployment/csmoperator/#to-upgrade-dell-csm-operator-perform-the-following-steps) -2. Once the operator is upgraded, to upgrade the driver, refer [here](../../../../deployment/csmoperator/#upgrade-driver-using-dell-csm-operator) +1. Upgrade the Dell CSM Operator by following [here](../../../../../deployment/csmoperator/#to-upgrade-dell-csm-operator-perform-the-following-steps) +2. Once the operator is upgraded, to upgrade the driver, refer [here](../../../../../deployment/csmoperator/#upgrade-driver-using-dell-csm-operator) diff --git a/content/v3/csidriver/upgradation/drivers/powermax.md b/content/v3/deployment/helm/drivers/upgrade/powermax.md similarity index 67% rename from content/v3/csidriver/upgradation/drivers/powermax.md rename to content/v3/deployment/helm/drivers/upgrade/powermax.md index d38f7b6f73..131b9787b9 100644 --- a/content/v3/csidriver/upgradation/drivers/powermax.md +++ b/content/v3/deployment/helm/drivers/upgrade/powermax.md @@ -16,19 +16,18 @@ You can upgrade CSI Driver for Dell PowerMax using Helm or Dell CSM Operator. 1. Upgrade the Unisphere to have 10.0 endpoint support.Please find the instructions [here.](https://dl.dell.com/content/manual34878027-dell-unisphere-for-powermax-10-0-0-installation-guide.pdf?language=en-us&ps=true) 2. Update the `my-powermax-settings.yaml` to have endpoint with 10.0 support. -## Update Driver from v2.8 to v2.9.1 using Helm +## Update Driver from v2.9 to v2.10.1 using Helm **Steps** -1. Run `git clone -b v2.9.1 https://github.com/dell/csi-powermax.git` to clone the git repository and get the driver. +1. Run `git clone -b v2.10.1 https://github.com/dell/csi-powermax.git` to clone the git repository and get the driver. 2. Update the values file as needed. 3. Run the `csi-install` script with the option _\-\-upgrade_ by running: ```bash - cd ../dell-csi-helm-installer && ./csi-install.sh --namespace powermax --values ./my-powermax-settings.yaml --upgrade --helm-charts-version + cd ../dell-csi-helm-installer && ./csi-install.sh --namespace powermax --values ./my-powermax-settings.yaml --upgrade ``` *NOTE:* -- The parameter `--helm-charts-version` is optional and if you do not specify the flag, by default the `csi-install.sh` script will clone the version of the helm chart that is specified in the driver's [csi-install.sh](https://github.com/dell/csi-powermax/blob/main/dell-csi-helm-installer/csi-install.sh#L52) file. If you wish to install the driver using a different version of the helm chart, you need to include this flag. Also, remember to delete the `helm-charts` repository present in the `csi-powermax` directory if it was cloned before. - If you are upgrading from a driver version that was installed using Helm v2, ensure that you install Helm3 before installing the driver. - To update any installation parameter after the driver has been installed, change the `my-powermax-settings.yaml` file and run the install script with the option _\-\-upgrade_, for example: ```bash @@ -56,5 +55,5 @@ You can upgrade CSI Driver for Dell PowerMax using Helm or Dell CSM Operator. ## Upgrade using Dell CSM Operator: **Note:** Upgrading the Operator does not upgrade the CSI Driver. -1. Upgrade the Dell CSM Operator by following [here](../../../../deployment/csmoperator/#to-upgrade-dell-csm-operator-perform-the-following-steps) -2. Once the operator is upgraded, to upgrade the driver, refer [here](../../../../deployment/csmoperator/#upgrade-driver-using-dell-csm-operator) +1. Upgrade the Dell CSM Operator by following [here](../../../../../deployment/csmoperator/#to-upgrade-dell-csm-operator-perform-the-following-steps) +2. Once the operator is upgraded, to upgrade the driver, refer [here](../../../../../deployment/csmoperator/#upgrade-driver-using-dell-csm-operator) diff --git a/content/v3/csidriver/upgradation/drivers/powerstore.md b/content/v3/deployment/helm/drivers/upgrade/powerstore.md similarity index 71% rename from content/v3/csidriver/upgradation/drivers/powerstore.md rename to content/v3/deployment/helm/drivers/upgrade/powerstore.md index 40021a0296..323cf98f70 100644 --- a/content/v3/csidriver/upgradation/drivers/powerstore.md +++ b/content/v3/deployment/helm/drivers/upgrade/powerstore.md @@ -9,12 +9,12 @@ Description: Upgrade PowerStore CSI driver You can upgrade the CSI Driver for Dell PowerStore using Helm. -## Update Driver from v2.8.0 to v2.9.1 using Helm +## Update Driver from v2.9.0 to v2.10.1 using Helm Note: While upgrading the driver via helm, controllerCount variable in myvalues.yaml can be at most one less than the number of worker nodes. **Steps** -1. Run `git clone -b v2.9.1 https://github.com/dell/csi-powerstore.git` to clone the git repository and get the driver. +1. Run `git clone -b v2.10.1 https://github.com/dell/csi-powerstore.git` to clone the git repository and get the driver. 2. Edit `samples/secret/secret.yaml` file and configure connection information for your PowerStore arrays changing the following parameters: - *endpoint*: defines the full URL path to the PowerStore API. - *globalID*: specifies what storage cluster the driver should use @@ -38,18 +38,16 @@ Note: While upgrading the driver via helm, controllerCount variable in myvalues. kubectl create secret generic powerstore-config -n csi-powerstore --from-file=config=secret.yaml ``` -5. Download the default values.yaml file `cd dell-csi-helm-installer && wget -O my-powerstore-settings.yaml https://github.com/dell/helm-charts/raw/csi-powerstore-2.9.1/charts/csi-powerstore/values.yaml` and update parameters as per the requirement. +5. Download the default values.yaml file `cd dell-csi-helm-installer && wget -O my-powerstore-settings.yaml https://github.com/dell/helm-charts/raw/csi-powerstore-2.10.1/charts/csi-powerstore/values.yaml` and update parameters as per the requirement. 6. Run the `csi-install` script with the option _\-\-upgrade_ by running: ```bash - ./csi-install.sh --namespace csi-powerstore --values ./my-powerstore-settings.yaml --upgrade --helm-charts-version + ./csi-install.sh --namespace csi-powerstore --values ./my-powerstore-settings.yaml --upgrade ``` - *NOTE:* -- The parameter `--helm-charts-version` is optional and if you do not specify the flag, by default the `csi-install.sh` script will clone the version of the helm chart that is specified in the driver's [csi-install.sh](https://github.com/dell/csi-powerstore/blob/main/dell-csi-helm-installer/csi-install.sh#L13) file. If you wish to install the driver using a different version of the helm chart, you need to include this flag. Also, remember to delete the `helm-charts` repository present in the `csi-powerstore` directory if it was cloned before. ## Upgrade using Dell CSM Operator: **Note:** Upgrading the Operator does not upgrade the CSI Driver. -1. Please upgrade the Dell CSM Operator by following [here](../../../../deployment/csmoperator/#to-upgrade-dell-csm-operator-perform-the-following-steps) -2. Once the operator is upgraded, to upgrade the driver, refer [here](../../../../deployment/csmoperator/#upgrade-driver-using-dell-csm-operator) +1. Please upgrade the Dell CSM Operator by following [here](../../../../../deployment/csmoperator/#to-upgrade-dell-csm-operator-perform-the-following-steps) +2. Once the operator is upgraded, to upgrade the driver, refer [here](../../../../../deployment/csmoperator/#upgrade-driver-using-dell-csm-operator) diff --git a/content/v3/csidriver/upgradation/drivers/unity.md b/content/v3/deployment/helm/drivers/upgrade/unity.md similarity index 57% rename from content/v3/csidriver/upgradation/drivers/unity.md rename to content/v3/deployment/helm/drivers/upgrade/unity.md index 25a5fd17e0..0e23dc090a 100644 --- a/content/v3/csidriver/upgradation/drivers/unity.md +++ b/content/v3/deployment/helm/drivers/upgrade/unity.md @@ -7,7 +7,7 @@ weight: 1 Description: Upgrade Unity XT CSI driver --- -You can upgrade the CSI Driver for Dell Unity XT using Helm or Dell CSI Operator. +You can upgrade the CSI Driver for Dell Unity XT using Helm or Dell CSM Operator. **Note:** 1. User has to re-create existing custom-storage classes (if any) according to the latest format. @@ -20,23 +20,20 @@ You can upgrade the CSI Driver for Dell Unity XT using Helm or Dell CSI Operator Preparing myvalues.yaml is the same as explained in the install section. -To upgrade the driver from csi-unity v2.7.0 to csi-unity v2.8.0 +To upgrade the driver from csi-unity v2.9.0 to csi-unity v2.10.1 -1. Get the latest csi-unity v2.8.0 code from Github using `git clone -b v2.8.0 https://github.com/dell/csi-unity.git`. +1. Get the latest csi-unity v2.10.1 code from Github using `git clone -b v2.10.1 https://github.com/dell/csi-unity.git`. 2. Copy the helm/csi-unity/values.yaml to the new location csi-unity/dell-csi-helm-installer and rename it to myvalues.yaml. Customize settings for installation by editing myvalues.yaml as needed. 3. Navigate to csi-unity/dell-csi-hem-installer folder and execute this command: ```bash - ./csi-install.sh --namespace unity --values ./myvalues.yaml --helm-charts-version --upgrade + ./csi-install.sh --namespace unity --values ./myvalues.yaml --upgrade ``` -*NOTE:* -- The parameter `--helm-charts-version` is optional and if you do not specify the flag, by default the `csi-install.sh` script will clone the version of the helm chart that is specified in the driver's [csi-install.sh](https://github.com/dell/csi-unity/blob/main/dell-csi-helm-installer/csi-install.sh#L22) file. If you wish to install the driver using a different version of the helm chart, you need to include this flag. Also, remember to delete the `helm-charts` repository present in the `csi-unity` directory if it was cloned before. - ### Upgrade using Dell CSM Operator: **Note:** Upgrading the Operator does not upgrade the CSI Driver. -1. Upgrade the Dell CSM Operator by following [here](../../../../deployment/csmoperator/#to-upgrade-dell-csm-operator-perform-the-following-steps) -2. Once the operator is upgraded, to upgrade the driver, refer [here](../../../../deployment/csmoperator/#upgrade-driver-using-dell-csm-operator) +1. Upgrade the Dell CSM Operator by following [here](../../../../../deployment/csmoperator/#to-upgrade-dell-csm-operator-perform-the-following-steps) +2. Once the operator is upgraded, to upgrade the driver, refer [here](../../../../../deployment/csmoperator/#upgrade-driver-using-dell-csm-operator) diff --git a/content/v3/deployment/helm/modules/_index.md b/content/v3/deployment/helm/modules/_index.md new file mode 100644 index 0000000000..5493a71b5a --- /dev/null +++ b/content/v3/deployment/helm/modules/_index.md @@ -0,0 +1,6 @@ +--- +title: "CSM Modules" +linkTitle: "CSM Modules" +description: Deployment of Dell CSM Modules using helm +weight: 1 +--- \ No newline at end of file diff --git a/content/v3/deployment/helm/modules/installation/_index.md b/content/v3/deployment/helm/modules/installation/_index.md new file mode 100644 index 0000000000..61a683caa1 --- /dev/null +++ b/content/v3/deployment/helm/modules/installation/_index.md @@ -0,0 +1,6 @@ +--- +title: "Installation" +linkTitle: "Installation" +description: Deployment of Dell CSM Modules using helm +weight: 1 +--- \ No newline at end of file diff --git a/content/v2/deployment/helm/modules/installation/applicationmobility/_index.md b/content/v3/deployment/helm/modules/installation/applicationmobility/_index.md similarity index 100% rename from content/v2/deployment/helm/modules/installation/applicationmobility/_index.md rename to content/v3/deployment/helm/modules/installation/applicationmobility/_index.md diff --git a/content/v1/deployment/helm/modules/installation/authorization/_index.md b/content/v3/deployment/helm/modules/installation/authorization/_index.md similarity index 97% rename from content/v1/deployment/helm/modules/installation/authorization/_index.md rename to content/v3/deployment/helm/modules/installation/authorization/_index.md index c6015fb6cb..3a2231ab19 100644 --- a/content/v1/deployment/helm/modules/installation/authorization/_index.md +++ b/content/v3/deployment/helm/modules/installation/authorization/_index.md @@ -9,8 +9,6 @@ description: > The CSM Authorization karavictl CLI is no longer actively maintained or supported. It will be deprecated in a future release. {{% /pageinfo %}} ->> NOTE: Authorization v2.0 Tech Preview is not supported through Helm. - CSM Authorization can be installed by using the provided Helm v3 charts on Kubernetes platforms. The following CSM Authorization components are installed in the specified namespace: @@ -144,7 +142,7 @@ mv ./karavictl ~/.local/bin/karavictl # and then append (or prepend) ~/.local/bin to $PATH ``` -Karavictl commands and intended use can be found [here](../../../../../authorization/v1.x-ga/cli/). +Karavictl commands and intended use can be found [here](../../../../../authorization/cli/). ## Configuring the CSM Authorization Proxy Server @@ -162,7 +160,7 @@ NAME CLASS HOSTS ADDRESS PORTS AG proxy-server nginx csm-authorization.com 00, 000 86s ``` ```bash -kubectl -n authorization get service +kubectl -n auth get service ``` ``` NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE @@ -184,13 +182,13 @@ On the machine running `karavictl`, the `/etc/hosts` file needs to be updated wi csm-authorization.com ``` -Please continue following the steps outlined in the [proxy server](../../../../../authorization/v1.x-ga/configuration/proxy-server) configuration. +Please continue following the steps outlined in the [proxy server](../../../../../authorization/configuration/proxy-server) configuration. ## Configuring a Dell CSI Driver with CSM for Authorization The second part of CSM for Authorization deployment is to configure one or more of the [supported](../../../../../authorization#supported-csi-drivers) CSI drivers. This is controlled by the Kubernetes tenant admin. -Please continue following the configuration steps for a specific CSI Driver [here](../../../../../authorization/v1.x-ga/configuration/). +Please continue following the configuration steps for a specific CSI Driver [here](../../../../../authorization/configuration/). ## Updating CSM for Authorization Proxy Server Configuration diff --git a/content/v1/deployment/helm/modules/installation/encryption/_index.md b/content/v3/deployment/helm/modules/installation/encryption/_index.md similarity index 100% rename from content/v1/deployment/helm/modules/installation/encryption/_index.md rename to content/v3/deployment/helm/modules/installation/encryption/_index.md diff --git a/content/v1/deployment/helm/modules/installation/encryption/rekey.md b/content/v3/deployment/helm/modules/installation/encryption/rekey.md similarity index 100% rename from content/v1/deployment/helm/modules/installation/encryption/rekey.md rename to content/v3/deployment/helm/modules/installation/encryption/rekey.md diff --git a/content/v1/deployment/helm/modules/installation/encryption/vault.md b/content/v3/deployment/helm/modules/installation/encryption/vault.md similarity index 98% rename from content/v1/deployment/helm/modules/installation/encryption/vault.md rename to content/v3/deployment/helm/modules/installation/encryption/vault.md index 06992d454e..086960a6cc 100644 --- a/content/v1/deployment/helm/modules/installation/encryption/vault.md +++ b/content/v3/deployment/helm/modules/installation/encryption/vault.md @@ -239,6 +239,6 @@ With the default server settings, role level values control TTL in this way: `token_ttl=30m` - sets the default client token TTL to 30 minutes. 30 minutes are counted from the login time and from any following token renewal. The client token will only be able to renew 3 times before reaching it total allowed TTL of 2 hours. -Existing role values can be changed using `vault write auth/kubernetes/role/csm-authorization token_ttl=30m token_explicit_max_ttl=2h`. +Existing role values can be changed using `vault write auth/approle/role/dea-role token_ttl=30m token_explicit_max_ttl=2h`. > Selecting too short TTL values will result in excessive overhead in Encryption to remain authenticated to the Vault server. diff --git a/content/v3/observability/deployment/_index.md b/content/v3/deployment/helm/modules/installation/observability/_index.md similarity index 98% rename from content/v3/observability/deployment/_index.md rename to content/v3/deployment/helm/modules/installation/observability/_index.md index 8d8862c3b9..fef071bd98 100644 --- a/content/v3/observability/deployment/_index.md +++ b/content/v3/deployment/helm/modules/installation/observability/_index.md @@ -1,18 +1,11 @@ --- -title: Deployment -linktitle: Deployment +title: Observability +linktitle: Observability weight: 3 description: > - Dell Container Storage Modules (CSM) for Observability Deployment + Dell Technologies (Dell) Container Storage Modules (CSM) for Observability Helm deployment --- -CSM for Observability can be deployed in one of four ways: - -- [Helm](./helm) -- [CSM for Observability Installer](./online) -- [CSM for Observability Offline Installer](./offline) -- [Operator](./operator) - ## Post Installation Dependencies The following third-party components are required in the same Kubernetes cluster where CSM for Observability has been deployed: @@ -568,7 +561,7 @@ In this case all storage system requests made by CSM for Observability will not ``` 3. Copy the configmap `powermax-reverseproxy-config` from the CSI Driver for Dell PowerMax namespace to the CSM namespace. - __Note:__ Observability for PowerMax works only with [CSI PowerMax driver with Proxy in StandAlone mode](../../csidriver/installation/helm/powermax/#csi-powermax-driver-with-proxy-in-standalone-mode). + ```console kubectl get configmap powermax-reverseproxy-config -n [CSI_DRIVER_NAMESPACE] -o yaml | sed 's/namespace: [CSI_DRIVER_NAMESPACE]/namespace: [CSM_NAMESPACE]/' | kubectl create -f - diff --git a/content/v3/observability/deployment/helm.md b/content/v3/deployment/helm/modules/installation/observability/deployment.md similarity index 86% rename from content/v3/observability/deployment/helm.md rename to content/v3/deployment/helm/modules/installation/observability/deployment.md index 2256cbb0ca..d8d77beed2 100644 --- a/content/v3/observability/deployment/helm.md +++ b/content/v3/deployment/helm/modules/installation/observability/deployment.md @@ -11,7 +11,7 @@ The Container Storage Modules (CSM) for Observability Helm chart bootstraps an O ## Prerequisites - Helm 3.x -- The deployment of one or more [supported](../../#supported-csi-drivers) Dell CSI drivers +- The deployment of one or more supported Dell CSI drivers ## Install the CSM for Observability Helm Chart **Steps** @@ -49,7 +49,7 @@ The Container Storage Modules (CSM) for Observability Helm chart bootstraps an O kubectl get secret [VXFLEXOS-CONFIG] -n [CSI_DRIVER_NAMESPACE] -o yaml | sed 's/name: [VXFLEXOS-CONFIG]/name: vxflexos-config/' | sed 's/namespace: [CSI_DRIVER_NAMESPACE]/namespace: [CSM_NAMESPACE]/' | kubectl create -f - ``` - If [CSM for Authorization is enabled](../../../authorization/deployment/#configuring-a-dell-csi-driver-with-csm-for-authorization) for CSI PowerFlex, perform the following steps: + If [CSM for Authorization is enabled](../../authorization/#configuring-a-dell-csi-driver-with-csm-for-authorization) for CSI PowerFlex, perform the following steps: 2. Copy the driver configuration parameters ConfigMap from the CSI PowerFlex namespace into the CSM for Observability namespace: @@ -104,7 +104,7 @@ The Container Storage Modules (CSM) for Observability Helm chart bootstraps an O kubectl get secret [ISILON-CREDS] -n [CSI_DRIVER_NAMESPACE] -o yaml | sed 's/name: [ISILON-CREDS]/name: isilon-creds/' | sed 's/namespace: [CSI_DRIVER_NAMESPACE]/namespace: [CSM_NAMESPACE]/' | kubectl create -f - ``` - If [CSM for Authorization is enabled](../../../authorization/deployment/#configuring-a-dell-csi-driver-with-csm-for-authorization) for CSI PowerScale, perform these steps: + If [CSM for Authorization is enabled](../../authorization/#configuring-a-dell-csi-driver-with-csm-for-authorization) for CSI PowerScale, perform these steps: 2. Copy the driver configuration parameters ConfigMap from the CSI PowerScale namespace into the CSM for Observability namespace: @@ -130,8 +130,7 @@ The Container Storage Modules (CSM) for Observability Helm chart bootstraps an O ### PowerMax 1. Copy the configmap `powermax-reverseproxy-config` from the CSI Driver for Dell PowerMax namespace to the CSM namespace. - __Note:__ Observability for PowerMax works only with [CSI PowerMax driver with Proxy in StandAlone mode](../../../csidriver/installation/helm/powermax/#csi-powermax-driver-with-proxy-in-standalone-mode). - + ```bash kubectl get configmap powermax-reverseproxy-config -n [CSI_DRIVER_NAMESPACE] -o yaml | sed 's/namespace: [CSI_DRIVER_NAMESPACE]/namespace: [CSM_NAMESPACE]/' | kubectl create -f - @@ -162,7 +161,7 @@ The Container Storage Modules (CSM) for Observability Helm chart bootstraps an O done ``` - If [CSM for Authorization is enabled](../../../authorization/deployment/#configuring-a-dell-csi-driver-with-csm-for-authorization) for CSI PowerMax, perform these steps: + If [CSM for Authorization is enabled](../../authorization/#configuring-a-dell-csi-driver-with-csm-for-authorization) for CSI PowerMax, perform these steps: 3. Copy the driver configuration parameters ConfigMap from the CSI PowerMax namespace into the CSM for Observability namespace: @@ -186,31 +185,31 @@ The Container Storage Modules (CSM) for Observability Helm chart bootstraps an O ``` - 5. Configure the [parameters](#configuration) and install the CSM for Observability Helm Chart +5. Configure the [parameters](#configuration) and install the CSM for Observability Helm Chart - A default values.yaml file is located [here](https://github.com/dell/helm-charts/blob/main/charts/karavi-observability/values.yaml) that can be used for installation. This can be copied into a file named `myvalues.yaml` and either used as is or modified accordingly. + A default values.yaml file is located [here](https://github.com/dell/helm-charts/blob/main/charts/karavi-observability/values.yaml) that can be used for installation. This can be copied into a file named `myvalues.yaml` and either used as is or modified accordingly. - __Note:__ - - The default `values.yaml` is configured to deploy the CSM for Observability Topology service on install. - - If CSM for Authorization is enabled for CSI PowerFlex, the `karaviMetricsPowerflex.authorization` parameters must be properly configured in your values file for CSM Observability. - - If CSM for Authorization is enabled for CSI PowerScale, the `karaviMetricsPowerscale.authorization` parameters must be properly configured in your values file for CSM Observability. - - If CSM for Authorization is enabled for CSI PowerMax, the `karaviMetricsPowerMax.authorization` parameters must be properly configured in your values file for CSM Observability. + __Note:__ + - The default `values.yaml` is configured to deploy the CSM for Observability Topology service on install. + - If CSM for Authorization is enabled for CSI PowerFlex, the `karaviMetricsPowerflex.authorization` parameters must be properly configured in your values file for CSM Observability. + - If CSM for Authorization is enabled for CSI PowerScale, the `karaviMetricsPowerscale.authorization` parameters must be properly configured in your values file for CSM Observability. + - If CSM for Authorization is enabled for CSI PowerMax, the `karaviMetricsPowerMax.authorization` parameters must be properly configured in your values file for CSM Observability. - ```console + ```console - helm install karavi-observability dell/karavi-observability -n [CSM_NAMESPACE] -f myvalues.yaml - ``` + helm install karavi-observability dell/karavi-observability -n [CSM_NAMESPACE] -f myvalues.yaml + ``` - Alternatively, you can specify each parameter using the '--set key=value[,key=value]' and/or '--set-file key=value[,key=value] arguments to 'helm install'. For example: + Alternatively, you can specify each parameter using the '--set key=value[,key=value]' and/or '--set-file key=value[,key=value] arguments to 'helm install'. For example: - ```console + ```console - helm install karavi-observability dell/karavi-observability -n [CSM_NAMESPACE] \ - --set-file karaviTopology.certificateFile= \ - --set-file karaviTopology.privateKeyFile= \ - --set-file otelCollector.certificateFile= \ - --set-file otelCollector.privateKeyFile= - ``` + helm install karavi-observability dell/karavi-observability -n [CSM_NAMESPACE] \ + --set-file karaviTopology.certificateFile= \ + --set-file karaviTopology.privateKeyFile= \ + --set-file otelCollector.certificateFile= \ + --set-file otelCollector.privateKeyFile= + ``` ## Configuration @@ -237,7 +236,7 @@ The following table lists the configurable parameters of the CSM for Observabili | `karaviMetricsPowerflex.volumePollFrequencySeconds` | The polling frequency (in seconds) to gather volume metrics | `10` | | `karaviMetricsPowerflex.storageClassPoolPollFrequencySeconds` | The polling frequency (in seconds) to gather storage class/pool metrics | `10` | | `karaviMetricsPowerflex.concurrentPowerflexQueries` | The number of simultaneous metrics queries to make to Powerflex(MUST be less than 10; otherwise, several request errors from Powerflex will ensue. | `10` | -| `karaviMetricsPowerflex.authorization.enabled` | [Authorization](../../../authorization) is an optional feature to apply credential shielding of the backend PowerFlex. | `false` | +| `karaviMetricsPowerflex.authorization.enabled` | [Authorization](../../authorization) is an optional feature to apply credential shielding of the backend PowerFlex. | `false` | | `karaviMetricsPowerflex.authorization.proxyHost` | Hostname of the csm-authorization server. | | | `karaviMetricsPowerflex.authorization.skipCertificateValidation` | A boolean that enables/disables certificate validation of the csm-authorization server. | | | `karaviMetricsPowerflex.sdcMetricsEnabled` | Enable PowerFlex SDC Metrics Collection | `true` | @@ -278,7 +277,7 @@ The following table lists the configurable parameters of the CSM for Observabili | `karaviMetricsPowerscale.isiClientOptions.isiSkipCertificateValidation` | Skip OneFS API server's certificates | `true` | | `karaviMetricsPowerscale.isiClientOptions.isiAuthType` | 0 to enable session-based Authentication; 1 to enables basic Authentication | `1` | | `karaviMetricsPowerscale.isiClientOptions.isiLogVerbose` | Decide High/Medium/Low content of the OneFS REST API message | `0` | -| `karaviMetricsPowerscale.authorization.enabled` | [Authorization](../../../authorization) is an optional feature to apply credential shielding of the backend PowerScale. | `false` | +| `karaviMetricsPowerscale.authorization.enabled` | [Authorization](../../authorization) is an optional feature to apply credential shielding of the backend PowerScale. | `false` | | `karaviMetricsPowerscale.authorization.proxyHost` | Hostname of the csm-authorization server. | | | `karaviMetricsPowerscale.authorization.skipCertificateValidation` | A boolean that enables/disables certificate validation of the csm-authorization server. | | | `karaviMetricsPowerMax.capacityMetricsEnabled` | Enable PowerMax capacity metric Collection | `true` | @@ -286,6 +285,6 @@ The following table lists the configurable parameters of the CSM for Observabili | `karaviMetricsPowerMax.capacityPollFrequencySeconds` | The polling frequency (in seconds) to gather capacity metrics | `20` | | `karaviMetricsPowerMax.performancePollFrequencySeconds` | The polling frequency (in seconds) to gather performance metrics | `20` | | `karaviMetricsPowerMax.concurrentPowerMaxQueries` | The number of simultaneous metrics queries to make to PowerMax (MUST be less than 10; otherwise, several request errors from PowerMax will ensue.) | `10` | -| `karaviMetricsPowerMax.authorization.enabled` | [Authorization](../../../authorization) is an optional feature to apply credential shielding of the backend PowerMax. | `false` | +| `karaviMetricsPowerMax.authorization.enabled` | [Authorization](../../authorization) is an optional feature to apply credential shielding of the backend PowerMax. | `false` | | `karaviMetricsPowerMax.authorization.proxyHost` | Hostname of the csm-authorization server. | | | `karaviMetricsPowerMax.authorization.skipCertificateValidation` | A boolean that enables/disables certificate validation of the csm-authorization server. | | diff --git a/content/v3/observability/deployment/online.md b/content/v3/deployment/helm/modules/installation/observability/installer.md similarity index 98% rename from content/v3/observability/deployment/online.md rename to content/v3/deployment/helm/modules/installation/observability/installer.md index 465626a8ee..8c0c5b224a 100644 --- a/content/v3/observability/deployment/online.md +++ b/content/v3/deployment/helm/modules/installation/observability/installer.md @@ -36,7 +36,7 @@ If the Authorization module is enabled for the CSI drivers installed in the same ## Prerequisites - Helm 3.x -- The deployment of one or more [supported](../#supported-csi-drivers) Dell CSI drivers +- The deployment of one or more supported Dell CSI drivers ## Online Installer @@ -101,7 +101,7 @@ To perform an online installation of CSM for Observability, the following steps 3. Execute the installation script. The following example will install CSM for Observability into the CSM namespace. - A sample values.yaml file is located [here](https://github.com/dell/helm-charts/blob/main/charts/karavi-observability/values.yaml). This can be copied into a file named `myvalues.yaml` and modified accordingly for the installer command below. Configuration options are outlined in the [Helm chart deployment section](../helm#configuration). + A sample values.yaml file is located [here](https://github.com/dell/helm-charts/blob/main/charts/karavi-observability/values.yaml). This can be copied into a file named `myvalues.yaml` and modified accordingly for the installer command below. Configuration options are outlined in the [Helm chart deployment section](../deployment#configuration). __Note:__ - The default `values.yaml` is configured to deploy the CSM for Observability Topology service on install. diff --git a/content/v3/replication/deployment/_index.md b/content/v3/deployment/helm/modules/installation/replication/_index.md similarity index 69% rename from content/v3/replication/deployment/_index.md rename to content/v3/deployment/helm/modules/installation/replication/_index.md index 7a0af6d942..a7c1042848 100644 --- a/content/v3/replication/deployment/_index.md +++ b/content/v3/deployment/helm/modules/installation/replication/_index.md @@ -1,6 +1,6 @@ --- -title: "Deployment" -linkTitle: "Deployment" +title: "Replication" +linkTitle: "Replication" weight: 1 Description: > Installation for Dell Container Storage Module (CSM) for Replication diff --git a/content/v3/replication/deployment/configmap-secrets.md b/content/v3/deployment/helm/modules/installation/replication/configmap-secrets.md similarity index 100% rename from content/v3/replication/deployment/configmap-secrets.md rename to content/v3/deployment/helm/modules/installation/replication/configmap-secrets.md diff --git a/content/v3/replication/deployment/install-repctl.md b/content/v3/deployment/helm/modules/installation/replication/install-repctl.md similarity index 96% rename from content/v3/replication/deployment/install-repctl.md rename to content/v3/deployment/helm/modules/installation/replication/install-repctl.md index 9715a917a4..963785930b 100644 --- a/content/v3/replication/deployment/install-repctl.md +++ b/content/v3/deployment/helm/modules/installation/replication/install-repctl.md @@ -13,14 +13,14 @@ Before you begin, make sure you have the repctl tool available. You can download a pre-built repctl binary from our [Releases](https://github.com/dell/csm-replication/releases) page. ```shell -wget https://github.com/dell/csm-replication/releases/download/v1.7.1/repctl-linux-amd64 +wget https://github.com/dell/csm-replication/releases/download/v1.8.0/repctl-linux-amd64 mv repctl-linux-amd64 repctl chmod +x repctl ``` Alternately, if you want to build the binary yourself, you can follow these steps: ```shell -git clone -b v1.7.1 https://github.com/dell/csm-replication.git +git clone -b v1.8.0 https://github.com/dell/csm-replication.git cd csm-replication/repctl make build ``` diff --git a/content/v3/replication/deployment/install-script.md b/content/v3/deployment/helm/modules/installation/replication/install-script.md similarity index 93% rename from content/v3/replication/deployment/install-script.md rename to content/v3/deployment/helm/modules/installation/replication/install-script.md index a01226fd5d..52506ba306 100644 --- a/content/v3/replication/deployment/install-script.md +++ b/content/v3/deployment/helm/modules/installation/replication/install-script.md @@ -9,11 +9,11 @@ description: Installation of CSM for Replication using script (Helm chart) > **_NOTE:_** These steps should be repeated on all Kubernetes clusters where you want to configure replication. ```shell -git clone -b v1.7.1 https://github.com/dell/csm-replication.git +git clone -b v1.8.0 https://github.com/dell/csm-replication.git cd csm-replication kubectl create ns dell-replication-controller # Download and modify the default values.yaml file if you wish to customize your deployment in any way -wget -O myvalues.yaml https://raw.githubusercontent.com/dell/helm-charts/csm-replication-1.7.1/charts/csm-replication/values.yaml +wget -O myvalues.yaml https://raw.githubusercontent.com/dell/helm-charts/csm-replication-1.8.0/charts/csm-replication/values.yaml bash scripts/install.sh --values ./myvalues.yaml ``` >Note: Current installation method allows you to specify custom `:` entries to be appended to controller's `/etc/hosts` file. It can be useful if controller is being deployed in private environment where DNS is not set up properly, but kubernetes clusters use FQDN as API server's address. diff --git a/content/v3/replication/deployment/installation.md b/content/v3/deployment/helm/modules/installation/replication/installation.md similarity index 100% rename from content/v3/replication/deployment/installation.md rename to content/v3/deployment/helm/modules/installation/replication/installation.md diff --git a/content/v3/replication/deployment/powerflex.md b/content/v3/deployment/helm/modules/installation/replication/powerflex.md similarity index 99% rename from content/v3/replication/deployment/powerflex.md rename to content/v3/deployment/helm/modules/installation/replication/powerflex.md index c2fb027620..2f8b64c5be 100644 --- a/content/v3/replication/deployment/powerflex.md +++ b/content/v3/deployment/helm/modules/installation/replication/powerflex.md @@ -67,7 +67,7 @@ You can leave other parameters like `replicationContextPrefix`, and `replication After enabling the replication module you can continue to install the CSI driver for PowerFlex following the usual installation procedure, just ensure you've added the array information for all of the arrays being used in the -[secret](../../../csidriver/installation/helm/powerflex#install-the-driver). +[secret](../../../../drivers/installation/powerflex#install-the-driver). > **_NOTE:_** You need to install your driver on all clusters where you want to use replication. Both arrays must be accessible from each cluster. diff --git a/content/v3/replication/deployment/powermax.md b/content/v3/deployment/helm/modules/installation/replication/powermax.md similarity index 97% rename from content/v3/replication/deployment/powermax.md rename to content/v3/deployment/helm/modules/installation/replication/powermax.md index eef17ca267..158965cf58 100644 --- a/content/v3/replication/deployment/powermax.md +++ b/content/v3/deployment/helm/modules/installation/replication/powermax.md @@ -15,12 +15,6 @@ CSI driver for Dell PowerMax supports necessary extension calls from `dell-csi-e ### Before Installation #### On Storage Array - -For CSM Replication, both source and target storage systems must be locally managed by Unisphere. -> _Example_: When using two Unisphere instances, the first Unisphere instance should be configured with the source storage system as locally -managed and target storage system as remotely managed. The second Unisphere configuration should mirror the first — locally managing the target storage system and -remotely managing the source storage system. - Configure SRDF connection between multiple PowerMax instances. Follow instructions by PowerMax storage for creating the SRDF Groups between a set of arrays. You can ensure that you configured remote arrays by navigating to the `Data Protection` tab and choosing `SRDF Groups` on the managing Unisphere of your array. You should see a list of remote systems with the SRDF Group number that is configured and the Online field set to a green tick. diff --git a/content/v3/replication/deployment/powerscale.md b/content/v3/deployment/helm/modules/installation/replication/powerscale.md similarity index 100% rename from content/v3/replication/deployment/powerscale.md rename to content/v3/deployment/helm/modules/installation/replication/powerscale.md diff --git a/content/v3/replication/deployment/powerstore.md b/content/v3/deployment/helm/modules/installation/replication/powerstore.md similarity index 100% rename from content/v3/replication/deployment/powerstore.md rename to content/v3/deployment/helm/modules/installation/replication/powerstore.md diff --git a/content/v3/replication/deployment/storageclasses.md b/content/v3/deployment/helm/modules/installation/replication/storageclasses.md similarity index 100% rename from content/v3/replication/deployment/storageclasses.md rename to content/v3/deployment/helm/modules/installation/replication/storageclasses.md diff --git a/content/v3/resiliency/deployment/helm.md b/content/v3/deployment/helm/modules/installation/resiliency/_index.md similarity index 99% rename from content/v3/resiliency/deployment/helm.md rename to content/v3/deployment/helm/modules/installation/resiliency/_index.md index cd5e8a35af..005c23c7b8 100644 --- a/content/v3/resiliency/deployment/helm.md +++ b/content/v3/deployment/helm/modules/installation/resiliency/_index.md @@ -1,6 +1,6 @@ --- -title: Helm -linktitle: Helm +title: Resiliency +linktitle: Resiliency weight: 3 description: > Dell Container Storage Modules (CSM) for Resiliency installation diff --git a/content/v3/deployment/helm/modules/uninstall/_index.md b/content/v3/deployment/helm/modules/uninstall/_index.md new file mode 100644 index 0000000000..1cd30cebac --- /dev/null +++ b/content/v3/deployment/helm/modules/uninstall/_index.md @@ -0,0 +1,6 @@ +--- +title: "Uninstallation" +linkTitle: "Uninstallation" +description: Uninstallation of Dell CSM Modules using helm +weight: 1 +--- \ No newline at end of file diff --git a/content/v3/applicationmobility/uninstallation.md b/content/v3/deployment/helm/modules/uninstall/applicationmobility.md similarity index 85% rename from content/v3/applicationmobility/uninstallation.md rename to content/v3/deployment/helm/modules/uninstall/applicationmobility.md index f98f8e8f5a..79e065076e 100644 --- a/content/v3/applicationmobility/uninstallation.md +++ b/content/v3/deployment/helm/modules/uninstall/applicationmobility.md @@ -1,6 +1,6 @@ --- -title: Uninstallation -linktitle: Uninstallation +title: Application mobility +linktitle: Application mobility weight: 2 description: > Uninstallation diff --git a/content/v1/deployment/helm/modules/uninstall/authorization.md b/content/v3/deployment/helm/modules/uninstall/authorization.md similarity index 100% rename from content/v1/deployment/helm/modules/uninstall/authorization.md rename to content/v3/deployment/helm/modules/uninstall/authorization.md diff --git a/content/v1/deployment/helm/modules/uninstall/encryption.md b/content/v3/deployment/helm/modules/uninstall/encryption.md similarity index 100% rename from content/v1/deployment/helm/modules/uninstall/encryption.md rename to content/v3/deployment/helm/modules/uninstall/encryption.md diff --git a/content/v3/observability/uninstall/_index.md b/content/v3/deployment/helm/modules/uninstall/observability.md similarity index 92% rename from content/v3/observability/uninstall/_index.md rename to content/v3/deployment/helm/modules/uninstall/observability.md index d5930ccb2c..21095c0a46 100644 --- a/content/v3/observability/uninstall/_index.md +++ b/content/v3/deployment/helm/modules/uninstall/observability.md @@ -1,6 +1,6 @@ --- -title: Uninstallation -linktitle: Uninstallation +title: Observability +linktitle: Observability weight: 3 description: > Dell Container Storage Modules (CSM) for Observability Uninstallation diff --git a/content/v3/replication/uninstall.md b/content/v3/deployment/helm/modules/uninstall/replication.md similarity index 90% rename from content/v3/replication/uninstall.md rename to content/v3/deployment/helm/modules/uninstall/replication.md index 450fedd38f..6e8f7bafba 100644 --- a/content/v3/replication/uninstall.md +++ b/content/v3/deployment/helm/modules/uninstall/replication.md @@ -1,6 +1,6 @@ --- -title: Uninstall -linktitle: Uninstall +title: Replication +linktitle: Replication weight: 10 description: > Dell Container Storage Modules (CSM) for Replication Uninstallation @@ -43,4 +43,4 @@ All replication groups should be deleted before deleting the replication group C ## Uninstalling the replication sidecar -To uninstall the replication sidecar, you need to uninstall the CSI Driver. Please view the [uninstall](../../csidriver/uninstall) page for the driver itself. +To uninstall the replication sidecar, you need to uninstall the CSI Driver. Please view the [uninstall](../../../drivers/uninstall) page for the driver itself. diff --git a/content/v3/deployment/helm/modules/uninstall/resiliency.md b/content/v3/deployment/helm/modules/uninstall/resiliency.md new file mode 100644 index 0000000000..c19e2889e8 --- /dev/null +++ b/content/v3/deployment/helm/modules/uninstall/resiliency.md @@ -0,0 +1,28 @@ +--- +title: Resiliency +linktitle: Resiliency +weight: 2 +description: > + Dell Container Storage Modules (CSM) for Resiliency Uninstallation +--- + +This section outlines the uninstallation steps for Container Storage Modules (CSM) for Resiliency. + +## Uninstalling the sidecar in the CSI Driver + +To uninstall the sidecar in the CSI Driver, the following steps are required. + +**Steps** +>NOTE: If you do not wish to uninstall the driver, please follow the steps below for Resiliency uninstallation through driver upgrade. +1. Uninstall the driver + - [Helm](../../../drivers/uninstall/#uninstall-a-csi-driver-installed-via-helm) + - [Operator](../../../../csmoperator/drivers/#uninstall-csi-driver) +2. Reinstall the driver with the `podmon` feature disabled + - [Helm](../../../drivers/installation/) + - [Operator](../../../../csmoperator/drivers/#installing-csi-driver-via-operator) + +### Uninstallation through driver upgrade +1. Disable the `podmon` feature in your values file +2. Upgrade the driver + - [Helm](../../../drivers/upgrade/) + - [Operator](../../../../csmoperator/drivers/#update-csi-drivers) \ No newline at end of file diff --git a/content/v3/deployment/helm/modules/upgrade/_index.md b/content/v3/deployment/helm/modules/upgrade/_index.md new file mode 100644 index 0000000000..a0674a231a --- /dev/null +++ b/content/v3/deployment/helm/modules/upgrade/_index.md @@ -0,0 +1,8 @@ +--- +title: "Upgrade" +tags: + - upgrade +weight: 3 +Description: Upgrade Dell CSM Modules +--- + diff --git a/content/v3/deployment/helm/modules/upgrade/authorization.md b/content/v3/deployment/helm/modules/upgrade/authorization.md new file mode 100644 index 0000000000..31a3b5f9c0 --- /dev/null +++ b/content/v3/deployment/helm/modules/upgrade/authorization.md @@ -0,0 +1,41 @@ +--- +title: Authorization +linktitle: Authorization +weight: 3 +description: > + Dell Technologies (Dell) Container Storage Modules (CSM) for Authorization Upgrade +--- + +This section outlines the upgrade steps for Container Storage Modules (CSM) for Authorization. The upgrade of CSM for Authorization is handled in 2 parts: +- Helm Chart Upgrade +- Upgrading the Dell CSI drivers with CSM for Authorization enabled + +## Helm Chart Upgrade + +1. To upgrade an existing Helm installation of CSM for Authorization to the latest release, download the latest Helm charts. + ```bash + helm repo update + ``` + +2. Check if the latest Helm chart version is available: + ```bash + helm search repo dell + ``` + + ``` + NAME CHART VERSION APP VERSION DESCRIPTION + dell/csm-authorization 1.10.0 1.10.0 CSM for Authorization is part of the [Container... + ``` + +3. Upgrade to the latest CSM for Authorization release: + ```bash + helm upgrade --version $latest_chart_version -f myvalues.yaml authorization dell/csm-authorization -n authorization + ``` + +## Upgrading Dell CSI Driver(s) with CSM for Authorization enabled + +Given a setup where the CSM for Authorization proxy server is already upgraded to the latest version, follow the upgrade instructions for the applicable CSI Driver(s) to upgrade the driver and the CSM for Authorization sidecar + +- [Upgrade PowerFlex CSI driver](../../../drivers/upgrade/powerflex/) +- [Upgrade PowerMax CSI driver](../../../drivers/upgrade/powermax/) +- [Upgrade PowerScale CSI driver](../../../drivers/upgrade/isilon/) diff --git a/content/v3/observability/upgrade/_index.md b/content/v3/deployment/helm/modules/upgrade/observability.md similarity index 77% rename from content/v3/observability/upgrade/_index.md rename to content/v3/deployment/helm/modules/upgrade/observability.md index 95e716efe6..5189a21520 100644 --- a/content/v3/observability/upgrade/_index.md +++ b/content/v3/deployment/helm/modules/upgrade/observability.md @@ -1,6 +1,6 @@ --- -title: Upgrade -linktitle: Upgrade +title: Observability +linktitle: Observability weight: 3 description: > Dell Container Storage Modules (CSM) for Observability Upgrade @@ -13,7 +13,7 @@ This section outlines the upgrade steps for Container Storage Modules (CSM) for ## Helm Chart Upgrade -CSM for Observability Helm upgrade supports [Helm](../deployment/helm), [Online Installer](../deployment/online), and [Offline Installer](../deployment/offline) deployments. +CSM for Observability Helm upgrade supports [Helm](../../installation/observability/deployment), [Online Installer](../../installation/observability/installer/), and [Offline Installer](../../../../offline/modules) deployments. To upgrade an existing Helm installation of CSM for Observability to the latest release, download the latest Helm charts. @@ -28,10 +28,10 @@ helm search repo dell ``` ``` NAME CHART VERSION APP VERSION DESCRIPTION -dell/karavi-observability 1.7.0 1.7.0 CSM for Observability is part of the [Container... +dell/karavi-observability 1.8.0 1.8.0 CSM for Observability is part of the [Container... ``` ->Note: If using cert-manager CustomResourceDefinitions older than v1.5.3, delete the old CRDs and install v1.5.3 of the CRDs prior to upgrade. See [Prerequisites](../deployment/helm#prerequisites) for location of CRDs. +>Note: If using cert-manager CustomResourceDefinitions older than v1.5.3, delete the old CRDs and install v1.5.3 of the CRDs prior to upgrade. See [Prerequisites](../../installation/observability/deployment#prerequisites) for location of CRDs. Upgrade to the latest CSM for Observability release: @@ -47,17 +47,17 @@ Upgrade Offline Installer deployment: helm upgrade --version $latest_chart_version karavi-observability dell/karavi-observability -n $namespace ``` -The [configuration](../deployment/helm#configuration) section lists all the parameters that can be configured using the `values.yaml` file. +The [configuration](../../installation/observability/deployment#configuration) section lists all the parameters that can be configured using the `values.yaml` file. ## Online Installer Upgrade -CSM for Observability online installer upgrade can be used if the initial deployment was performed using the [Online Installer](../deployment/online) or [Helm](../deployment/helm). +CSM for Observability online installer upgrade can be used if the initial deployment was performed using the [Online Installer](../../installation/observability/installer) or [Helm](../../installation/observability/deployment). 1. Change to the installer directory: ```bash cd karavi-observability/installer ``` -2. Update `values.yaml` file as needed. Configuration options are outlined in the [Helm chart deployment section](../deployment/helm#configuration). +2. Update `values.yaml` file as needed. Configuration options are outlined in the [Helm chart deployment section](../../installation/observability/deployment#configuration). 3. Execute the `./karavi-observability-install.sh` script: ```bash @@ -94,10 +94,10 @@ Assuming that you have already installed the Karavi Observability Helm Chart by These instructions can be followed when a Helm chart was installed and will be upgraded in an environment that does not have an Internet connection and will be unable to download the Helm chart and related Docker images. 1. Build the Offline Bundle - Follow [Offline Karavi Observability Helm Chart Installer](../deployment/offline) to build the latest bundle. + Follow [Offline Karavi Observability Helm Chart Installer](../../../../offline/modules) to build the latest bundle. 2. Unpack the Offline Bundle - Follow [Offline Karavi Observability Helm Chart Installer](../deployment/offline), copy and unpack the Offline Bundle to another Linux system, and push Docker images to the internal Docker registry. + Follow [Offline Karavi Observability Helm Chart Installer](../../../../offline/modules), copy and unpack the Offline Bundle to another Linux system, and push Docker images to the internal Docker registry. 3. Perform Helm upgrade 1. Change directory to `helm` which contains the updated Helm chart directory: @@ -110,13 +110,13 @@ These instructions can be followed when a Helm chart was installed and will be u kubectl apply --validate=false -f cert-manager.crds.yaml ``` 3. (Optional) Enable Karavi Observability for PowerFlex/PowerScale to use an existing instance of Karavi Authorization for accessing the REST API for the given storage systems. - **Note**: Assuming that if the Karavi Observability's Authorization has been enabled in the phase of [Offline Karavi Observability Helm Chart Installer](../deployment/offline), the Authorization Secrets/Configmap have been copied to the Karavi Observability namespace. + **Note**: Assuming that if the Karavi Observability's Authorization has been enabled in the phase of [Offline Karavi Observability Helm Chart Installer](../../../../offline/modules), the Authorization Secrets/Configmap have been copied to the Karavi Observability namespace. A sample configuration values.yaml file is located [here](https://github.com/dell/helm-charts/blob/main/charts/karavi-observability/values.yaml). In your own configuration values.yaml, you need to enable PowerFlex/PowerScale Authorization, and provide the location of the sidecar-proxy Docker image and URL of the Karavi Authorization proxyHost address. 4. After the images have been made available and the Helm chart configuration is updated, follow the instructions within the Helm chart's repository to complete the installation. - **Note**: Assuming that Your Secrets from CSI Drivers have been copied to the Karavi Observability namespace during the steps of [Offline Karavi Observability Helm Chart Installer](../deployment/offline) - Optionally, you could provide your own [configurations](../deployment/helm/#configuration). A sample values.yaml file is located [here](https://github.com/dell/helm-charts/blob/main/charts/karavi-observability/values.yaml). + **Note**: Assuming that Your Secrets from CSI Drivers have been copied to the Karavi Observability namespace during the steps of [Offline Karavi Observability Helm Chart Installer](../../../../offline/modules) + Optionally, you could provide your own [configurations](../../installation/observability/#configuration). A sample values.yaml file is located [here](https://github.com/dell/helm-charts/blob/main/charts/karavi-observability/values.yaml). ```bash helm upgrade -n install-namespace app-name karavi-observability diff --git a/content/v3/replication/upgrade.md b/content/v3/deployment/helm/modules/upgrade/replication.md similarity index 95% rename from content/v3/replication/upgrade.md rename to content/v3/deployment/helm/modules/upgrade/replication.md index 4e3d496a34..75c7a8f365 100644 --- a/content/v3/replication/upgrade.md +++ b/content/v3/deployment/helm/modules/upgrade/replication.md @@ -1,6 +1,6 @@ --- -title: Upgrade -linktitle: Upgrade +title: Replication +linktitle: Replication weight: 9 description: > Upgrade guide @@ -30,7 +30,7 @@ To upgrade the CSM Replication sidecar that is installed along with the driver, ``` 3. Run the same command on the second Kubernetes cluster if you use multi-cluster replication topology ->For more information on upgrading the CSI driver, please visit the [CSI driver upgrade page](../../csidriver/upgradation). +>For more information on upgrading the CSI driver, please visit the [CSI driver upgrade page](../../../drivers/upgrade). ### PowerScale @@ -45,7 +45,7 @@ On PowerScale systems, an additional step is needed when upgrading to CSM Replic Make sure the appropriate release branch is available on the machine performing the upgrade by running: ```bash -git clone -b v1.7.1 https://github.com/dell/csm-replication.git +git clone -b v1.8.0 https://github.com/dell/csm-replication.git ``` ### Upgrading with Helm @@ -71,7 +71,7 @@ This option will only work if you have previously installed replication via Helm ### Upgrading with repctl -> _**Note**_: These steps assume that you already have `repctl` configured to use correct clusters, if you don't know how to do that please refer to [installing with repctl](../deployment/install-repctl) +> _**Note**_: These steps assume that you already have `repctl` configured to use correct clusters, if you don't know how to do that please refer to [installing with repctl](../../installation/replication/install-repctl) **Steps** 1. Find a new version of deployment manifest that can be found in `deploy/controller.yaml`, with newer `image` pointing to the version of CSM Replication controller you want to upgrade to. diff --git a/content/v3/resiliency/upgrade.md b/content/v3/deployment/helm/modules/upgrade/resiliency.md similarity index 78% rename from content/v3/resiliency/upgrade.md rename to content/v3/deployment/helm/modules/upgrade/resiliency.md index ed7c9ca9cd..9affb9f55c 100644 --- a/content/v3/resiliency/upgrade.md +++ b/content/v3/deployment/helm/modules/upgrade/resiliency.md @@ -1,6 +1,6 @@ --- -title: Upgrade -linktitle: Upgrade +title: Resiliency +linktitle: Resiliency weight: 3 description: > Dell Container Storage Modules (CSM) for Resiliency upgrade @@ -8,13 +8,13 @@ description: > CSM for Resiliency can be upgraded as part of the Dell CSI driver upgrade process. The drivers can be upgraded either by a _helm chart_ or by the _Dell CSM Operator_. Currently, only _Helm chart_ upgrade is supported for CSM for Resiliency. -For information on the PowerFlex CSI driver upgrade process, see [PowerFlex CSI Driver](../../csidriver/upgradation/drivers/powerflex). +For information on the PowerFlex CSI driver upgrade process, see [PowerFlex CSI Driver](../../../drivers/upgrade/powerflex). -For information on the Unity XT CSI driver upgrade process, see [Unity XT CSI Driver](../../csidriver/upgradation/drivers/unity). +For information on the Unity XT CSI driver upgrade process, see [Unity XT CSI Driver](../../../drivers/upgrade/unity). -For information on the PowerScale CSI driver upgrade process, see [PowerScale CSI Driver](../../csidriver/upgradation/drivers/isilon). +For information on the PowerScale CSI driver upgrade process, see [PowerScale CSI Driver](../../../drivers/upgrade/isilon). -For information on the PowerStore CSI driver upgrade process, see [PowerStore CSI Driver](../../csidriver/upgradation/drivers/powerstore). +For information on the PowerStore CSI driver upgrade process, see [PowerStore CSI Driver](../../../drivers/upgrade/powerstore). ## Helm Chart Upgrade diff --git a/content/v3/deployment/offline/_index.md b/content/v3/deployment/offline/_index.md new file mode 100644 index 0000000000..451bfdfe6c --- /dev/null +++ b/content/v3/deployment/offline/_index.md @@ -0,0 +1,8 @@ +--- +title: "Offline" +linkTitle: "Offline" +description: Offline Deployment of Container Storage Modules +weight: 4 +--- + +Offline Deployment of CSM \ No newline at end of file diff --git a/content/v3/csidriver/installation/offline/_index.md b/content/v3/deployment/offline/drivers/_index.md similarity index 93% rename from content/v3/csidriver/installation/offline/_index.md rename to content/v3/deployment/offline/drivers/_index.md index 11aded4047..0c262d3e4b 100644 --- a/content/v3/csidriver/installation/offline/_index.md +++ b/content/v3/deployment/offline/drivers/_index.md @@ -65,7 +65,7 @@ The resulting offline bundle file can be copied to another machine, if necessary For example, here is the output of a request to build an offline bundle for the Dell CSM Operator: ```bash -git clone -b v1.4.4 https://github.com/dell/csm-operator.git +git clone -b v1.5.1 https://github.com/dell/csm-operator.git ``` ```bash cd csm-operator @@ -83,21 +83,21 @@ bash scripts/csm-offline-bundle.sh -c * * Pulling and saving container images - dellemc/csi-isilon:v2.9.1 - dellemc/csi-metadata-retriever:v1.6.1 - dellemc/csipowermax-reverseproxy:v2.8.1 - dellemc/csi-powermax:v2.9.1 - dellemc/csi-powerstore:v2.9.1 - dellemc/csi-unity:v2.8.1 - dellemc/csi-vxflexos:v2.9.2 - dellemc/csm-authorization-sidecar:v1.9.1 + dellemc/csi-isilon:v2.10.1 + dellemc/csi-metadata-retriever:v1.6.0 + dellemc/csipowermax-reverseproxy:v2.6.0 + dellemc/csi-powermax:v2.10.1 + dellemc/csi-powerstore:v2.10.1 + dellemc/csi-unity:v2.10.1 + dellemc/csi-vxflexos:v2.10.1 + dellemc/csm-authorization-sidecar:v1.10.0 dellemc/csm-metrics-powerflex:v1.5.0 dellemc/csm-metrics-powerscale:v1.2.0 dellemc/csm-topology:v1.5.0 - dellemc/dell-csi-replicator:v1.7.1 - dellemc/dell-replication-controller:v1.7.0 + dellemc/dell-csi-replicator:v1.8.0 + dellemc/dell-replication-controller:v1.8.0 dellemc/sdc:4.5 - docker.io/dellemc/dell-csm-operator:v1.4.3 + docker.io/dellemc/dell-csm-operator:v1.5.1 gcr.io/kubebuilder/kube-rbac-proxy:v0.8.0 nginxinc/nginx-unprivileged:1.20 otel/opentelemetry-collector:0.42.0 @@ -186,8 +186,8 @@ Preparing a offline bundle for installation * * Loading docker images -Loaded image: docker.io/dellemc/csi-powerstore:v2.9.1 -Loaded image: docker.io/dellemc/csi-isilon:v2.9.1 +Loaded image: docker.io/dellemc/csi-powerstore:v2.10.1 +Loaded image: docker.io/dellemc/csi-isilon:v2.10.1 ... ... Loaded image: registry.k8s.io/sig-storage/csi-resizer:v1.8.0 @@ -220,7 +220,7 @@ Loaded image: registry.k8s.io/sig-storage/csi-snapshotter:v6.2.2 ### Perform either a Helm installation or Operator installation -Now that the required images are available and the Helm Charts/Operator configuration updated, you can proceed by following the usual installation procedure as documented either via [Helm](../helm) or [Operator](../../../deployment/csmoperator/#installation). +Now that the required images are available and the Helm Charts/Operator configuration updated, you can proceed by following the usual installation procedure as documented either via [Helm](../../../deployment/helm/drivers/installation) or [Operator](../../../deployment/csmoperator/#installation). *NOTES:* 1. Offline bundle installation is only supported with manual installs i.e. without using Operator Lifecycle Manager. diff --git a/content/v3/observability/deployment/offline.md b/content/v3/deployment/offline/modules/_index.md similarity index 92% rename from content/v3/observability/deployment/offline.md rename to content/v3/deployment/offline/modules/_index.md index c3991c7d3a..0d42270d26 100644 --- a/content/v3/observability/deployment/offline.md +++ b/content/v3/deployment/offline/modules/_index.md @@ -1,6 +1,6 @@ --- -title: Offline Installer -linktitle: Offline Installer +title: Offline Installer for Observability +linktitle: Observability weight: 3 description: > Dell Container Storage Modules (CSM) for Observability Offline Installer @@ -11,7 +11,7 @@ The following instructions can be followed when a Helm chart will be installed i ## Prerequisites - Helm 3.x -- The deployment of one or more [supported](../#supported-csi-drivers) Dell CSI drivers +- The deployment of one or more Dell CSI drivers ### Dependencies @@ -148,7 +148,7 @@ To perform an offline installation of a Helm chart, the following steps should b kubectl get secret [VXFLEXOS-CONFIG] -n [CSI_DRIVER_NAMESPACE] -o yaml | sed 's/name: [VXFLEXOS-CONFIG]/name: vxflexos-config/' | sed 's/namespace: [CSI_DRIVER_NAMESPACE]/namespace: [CSM_NAMESPACE]/' | kubectl create -f - ``` - If [CSM for Authorization is enabled](../../../authorization/deployment/#configuring-a-dell-csi-driver-with-csm-for-authorization) for CSI PowerFlex, perform these steps: + If [CSM for Authorization is enabled](../../../deployment/helm/modules/installation/authorization#configuring-a-dell-csi-driver-with-csm-for-authorization) for CSI PowerFlex, perform these steps: ```bash @@ -191,7 +191,7 @@ To perform an offline installation of a Helm chart, the following steps should b kubectl get secret [ISILON-CREDS] -n [CSI_DRIVER_NAMESPACE] -o yaml | sed 's/name: [ISILON-CREDS]/name: isilon-creds/' | sed 's/namespace: [CSI_DRIVER_NAMESPACE]/namespace: [CSM_NAMESPACE]/' | kubectl create -f - ``` - If [CSM for Authorization is enabled](../../../authorization/deployment/#configuring-a-dell-csi-driver-with-csm-for-authorization) for CSI PowerScale, perform these steps: + If [CSM for Authorization is enabled](../../../deployment/helm/modules/installation/authorization#configuring-a-dell-csi-driver-with-csm-for-authorization) for CSI PowerScale, perform these steps: ```bash @@ -213,7 +213,6 @@ To perform an offline installation of a Helm chart, the following steps should b __CSI Driver for PowerMax:__ Copy the configmap from the CSI Driver for Dell PowerMax namespace to the CSM namespace. - __Note:__ Observability for PowerMax works only with [CSI PowerMax driver with Proxy in StandAlone mode](../../../csidriver/installation/helm/powermax/#csi-powermax-driver-with-proxy-in-standalone-mode). ```bash kubectl get configmap powermax-reverseproxy-config -n [CSI_DRIVER_NAMESPACE] -o yaml | sed 's/namespace: [CSI_DRIVER_NAMESPACE]/namespace: [CSM_NAMESPACE]/' | kubectl create -f - @@ -243,7 +242,7 @@ To perform an offline installation of a Helm chart, the following steps should b done ``` - If [CSM for Authorization is enabled](../../../authorization/deployment/#configuring-a-dell-csi-driver-with-csm-for-authorization) for CSI PowerMax, perform these steps: + If [CSM for Authorization is enabled](../../../deployment/helm/modules/installation/authorization#configuring-a-dell-csi-driver-with-csm-for-authorization) for CSI PowerMax, perform these steps: ```bash @@ -265,7 +264,7 @@ To perform an offline installation of a Helm chart, the following steps should b 4. After the images have been made available and the Helm chart configuration is updated, follow the instructions within the Helm chart's repository to complete the installation. **Note:** - - Optionally, you could provide your own [configurations](../helm/#configuration). A sample values.yaml file is located [here](https://github.com/dell/helm-charts/blob/main/charts/karavi-observability/values.yaml). + - Optionally, you could provide your own configurations. A sample values.yaml file is located [here](https://github.com/dell/helm-charts/blob/main/charts/karavi-observability/values.yaml). - The default `values.yaml` is configured to deploy the CSM for Observability Topology service on install. - If CSM for Authorization is enabled for CSI PowerFlex, the `karaviMetricsPowerflex.authorization` parameters must be properly configured. - If CSM for Authorization is enabled for CSI PowerScale, the `karaviMetricsPowerscale.authorization` parameters must be properly configured. diff --git a/content/v3/csidriver/upgradation/drivers/offline.md b/content/v3/deployment/offline/upgrade/_index.md similarity index 60% rename from content/v3/csidriver/upgradation/drivers/offline.md rename to content/v3/deployment/offline/upgrade/_index.md index 752de08e0f..b3c9dfb90d 100644 --- a/content/v3/csidriver/upgradation/drivers/offline.md +++ b/content/v3/deployment/offline/upgrade/_index.md @@ -4,6 +4,6 @@ linktitle: Offline Upgrade description: Offline Upgrade of Dell CSI Storage Providers --- -1. To perform offline upgrade of the driver, please create an offline bundle as mentioned [here](./../../../installation/offline#building-an-offline-bundle). -2. Once the bundle is created, please unpack the bundle by following the steps mentioned [here](./../../../installation/offline#unpacking-the-offline-bundle-and-preparing-for-installation). +1. To perform offline upgrade of the driver, please create an offline bundle as mentioned [here](../drivers#building-an-offline-bundle). +2. Once the bundle is created, please unpack the bundle by following the steps mentioned [here](../drivers#unpacking-the-offline-bundle-and-preparing-for-installation). 3. Please use the driver specific upgrade steps to upgrade. \ No newline at end of file diff --git a/content/v3/deployment/rpm/_index.md b/content/v3/deployment/rpm/_index.md new file mode 100644 index 0000000000..4fbf59604c --- /dev/null +++ b/content/v3/deployment/rpm/_index.md @@ -0,0 +1,8 @@ +--- +title: "RPM" +linkTitle: "RPM" +description: RPM Deployment of Container Storage Modules +weight: 5 +--- + +RPM Deployment of Container Storage Modules \ No newline at end of file diff --git a/content/v3/deployment/rpm/modules/_index.md b/content/v3/deployment/rpm/modules/_index.md new file mode 100644 index 0000000000..0b44d7d9db --- /dev/null +++ b/content/v3/deployment/rpm/modules/_index.md @@ -0,0 +1,6 @@ +--- +title: "CSM Modules" +linkTitle: "CSM Modules" +description: Deployment of Dell CSM Modules using RPM +weight: 1 +--- \ No newline at end of file diff --git a/content/v3/deployment/rpm/modules/installation/_index.md b/content/v3/deployment/rpm/modules/installation/_index.md new file mode 100644 index 0000000000..a0a63d2a78 --- /dev/null +++ b/content/v3/deployment/rpm/modules/installation/_index.md @@ -0,0 +1,6 @@ +--- +title: "Installation" +linkTitle: "Installation" +description: Deployment of Dell CSM Modules using RPM +weight: 1 +--- diff --git a/content/v1/deployment/rpm/modules/installation/authorization/authorization.md b/content/v3/deployment/rpm/modules/installation/authorization/authorization.md similarity index 93% rename from content/v1/deployment/rpm/modules/installation/authorization/authorization.md rename to content/v3/deployment/rpm/modules/installation/authorization/authorization.md index b20ee12ed8..81b48c54ec 100644 --- a/content/v1/deployment/rpm/modules/installation/authorization/authorization.md +++ b/content/v3/deployment/rpm/modules/installation/authorization/authorization.md @@ -6,7 +6,7 @@ description: > --- {{% pageinfo color="primary" %}} -The CSM Authorization RPM will be deprecated in a future release. It is highly recommended that you use CSM Authorization Helm deployment or CSM Operator going forward. +The CSM Authorization RPM is no longer actively maintained or supported. It will be deprecated in a future release. It is highly recommended that you use CSM Authorization Helm deployment or CSM Operator going forward. {{% /pageinfo %}} This section outlines the deployment steps for Container Storage Modules (CSM) for Authorization. The deployment of CSM for Authorization is handled in 2 parts: @@ -121,19 +121,19 @@ A Storage Administrator can execute the shell script, install_karavi_auth.sh as 5. After installation, application data will be stored on the system under `/var/lib/rancher/k3s/storage/`. -If errors occur during installation, review the [Troubleshooting](../../../../../../authorization/v1.x-ga/troubleshooting) section. +If errors occur during installation, review the [Troubleshooting](../../../../../../authorization/troubleshooting) section. ## Configuring the CSM for Authorization Proxy Server The first part of CSM for Authorization deployment is to configure the proxy server. This is controlled by the Storage Administrator. -Please follow the steps outlined in the [proxy server](../../../../../../authorization/v1.x-ga/configuration/proxy-server) configuration. +Please follow the steps outlined in the [proxy server](../../../../../../authorization/configuration/proxy-server) configuration. ## Configuring a Dell CSI Driver with CSM for Authorization The second part of CSM for Authorization deployment is to configure one or more of the [supported](../../../../../../prerequisites/#supported-csm-modules) CSI drivers. This is controlled by the Kubernetes tenant administrator. -Please follow the steps outlined in [PowerFlex](../../../../../../authorization/v1.x-ga/configuration/powerflex), [PowerMax](../../../../../../authorization/v1.x-ga/configuration/powermax), or [PowerScale](../../../../../../authorization/v1.x-ga/configuration/powerscale) to configure the CSI Driver to work with the Authorization sidecar. +Please follow the steps outlined in [PowerFlex](../../../../../../authorization/configuration/powerflex), [PowerMax](../../../../../../authorization/configuration/powermax), or [PowerScale](../../../../../../authorization/configuration/powerscale) to configure the CSI Driver to work with the Authorization sidecar. ## Updating CSM for Authorization Proxy Server Configuration diff --git a/content/v3/deployment/rpm/modules/uninstall/_index.md b/content/v3/deployment/rpm/modules/uninstall/_index.md new file mode 100644 index 0000000000..914120aa2c --- /dev/null +++ b/content/v3/deployment/rpm/modules/uninstall/_index.md @@ -0,0 +1,7 @@ +--- +title: "Uninstallation" +linkTitle: "Uninstallation" +description: Uninstallation of Dell CSM Modules using RPM +weight: 1 +--- + diff --git a/content/v3/authorization/uninstallation.md b/content/v3/deployment/rpm/modules/uninstall/authorization.md similarity index 81% rename from content/v3/authorization/uninstallation.md rename to content/v3/deployment/rpm/modules/uninstall/authorization.md index 0200e9d51d..253817347e 100644 --- a/content/v3/authorization/uninstallation.md +++ b/content/v3/deployment/rpm/modules/uninstall/authorization.md @@ -1,6 +1,6 @@ --- -title: Uninstallation -linktitle: Uninstallation +title: Authorization +linktitle: Authorization weight: 2 description: > Dell Technologies (Dell) Container Storage Modules (CSM) for Authorization Uninstallation @@ -28,4 +28,4 @@ rpm -e ## Uninstalling the sidecar-proxy in the CSI Driver -To uninstall the sidecar-proxy in the CSI Driver, [uninstall](../../csidriver/uninstall) the driver and [reinstall](../../deployment) the driver using the original configuration secret. +To uninstall the sidecar-proxy in the CSI Driver, [uninstall](../../../../helm/drivers/uninstall) the driver and [reinstall](../../../../helm/drivers/installation) the driver using the original configuration secret. diff --git a/content/v3/deployment/rpm/modules/upgrade/_index.md b/content/v3/deployment/rpm/modules/upgrade/_index.md new file mode 100644 index 0000000000..53c6a58240 --- /dev/null +++ b/content/v3/deployment/rpm/modules/upgrade/_index.md @@ -0,0 +1,7 @@ +--- +title: "Upgrade" +tags: + - upgrade +weight: 3 +Description: Upgrade of Dell CSM Modules using RPM +--- diff --git a/content/v3/authorization/upgrade.md b/content/v3/deployment/rpm/modules/upgrade/authorization.md similarity index 75% rename from content/v3/authorization/upgrade.md rename to content/v3/deployment/rpm/modules/upgrade/authorization.md index a585c16933..af14f3404b 100644 --- a/content/v3/authorization/upgrade.md +++ b/content/v3/deployment/rpm/modules/upgrade/authorization.md @@ -1,22 +1,22 @@ --- -title: Upgrade -linktitle: Upgrade +title: Authorization +linktitle: Authorization weight: 3 description: > - Upgrade Dell Technologies (Dell) Container Storage Modules (CSM) for Authorization + Dell Technologies (Dell) Container Storage Modules (CSM) for Authorization Upgrade --- {{% pageinfo color="primary" %}} The CSM Authorization RPM will be deprecated in a future release. It is highly recommended that you use CSM Authorization Helm deployment or CSM Operator going forward. {{% /pageinfo %}} -This section outlines the upgrade steps for Container Storage Modules (CSM) for Authorization. The upgrade of CSM for Authorization is handled in 2 parts: +This section outlines the upgrade steps for Container Storage Modules (CSM) for Authorization. The upgrade of CSM for Authorization RPM is handled in 2 parts: - Upgrading the CSM for Authorization proxy server - Upgrading the Dell CSI drivers with CSM for Authorization enabled -### Upgrading CSM for Authorization proxy server +## Upgrading CSM for Authorization proxy server -Obtain the latest single binary installer RPM by following one of our two options [here](../deployment/#single-binary-installer). +Obtain the latest single binary installer RPM by following one of our two options [here](../../installation/authorization/authorization#single-binary-installer). To update the rpm package on the system, run the below command from within the extracted folder: @@ -45,13 +45,13 @@ k3s kubectl version >__Note__: The above steps manage install and upgrade of all dependencies that are required by the CSM for Authorization proxy server. -### Upgrading Dell CSI Driver(s) with CSM for Authorization enabled +## Upgrading Dell CSI Driver(s) with CSM for Authorization enabled Given a setup where the CSM for Authorization proxy server is already upgraded to the latest version, follow the upgrade instructions for the applicable CSI Driver(s) to upgrade the driver and the CSM for Authorization sidecar -- [Upgrade PowerFlex CSI driver](../../csidriver/upgradation/drivers/powerflex/) -- [Upgrade PowerMax CSI driver](../../csidriver/upgradation/drivers/powermax/) -- [Upgrade PowerScale CSI driver](../../csidriver/upgradation/drivers/isilon/) +- [Upgrade PowerFlex CSI driver](../../../../helm/drivers/upgrade/powerflex/) +- [Upgrade PowerMax CSI driver](../../../../helm/drivers/upgrade/powermax/) +- [Upgrade PowerScale CSI driver](../../../../helm/drivers/upgrade/isilon/) ## Rollback diff --git a/content/v3/interactive-tutorials/_index.md b/content/v3/interactive-tutorials/_index.md index d99edcbd97..51eca852bf 100644 --- a/content/v3/interactive-tutorials/_index.md +++ b/content/v3/interactive-tutorials/_index.md @@ -9,7 +9,15 @@ Welcome to Dell CSM's interactive tutorials section! Try the different modules w Our interactive tutorials provide step-by-step guidance on how to use our CSM products in the context of PowerFlex Software-Defined-Storage. - +{{< cardpane >}} + {{< card header="[**CSM Quickstart**](csm-quickstart/)">}} + If you are new to Dell CSM, start here and use the different modules interactively. + {{< /card >}} +{{< /cardpane >}} -> NOTE: It takes about 15 minutes for the lab to be ready to use. +{{< cardpane >}} + {{< card header="[**CSM Operator**](csm-operator/)">}} + In this tutorial, you will learn how to install and use the CSM Operator. + {{< /card >}} +{{< /cardpane >}} diff --git a/content/v1/interactive-tutorials/csm-operator/_index.md b/content/v3/interactive-tutorials/csm-operator/_index.md similarity index 100% rename from content/v1/interactive-tutorials/csm-operator/_index.md rename to content/v3/interactive-tutorials/csm-operator/_index.md diff --git a/content/v1/interactive-tutorials/csm-quickstart/_index.md b/content/v3/interactive-tutorials/csm-quickstart/_index.md similarity index 100% rename from content/v1/interactive-tutorials/csm-quickstart/_index.md rename to content/v3/interactive-tutorials/csm-quickstart/_index.md diff --git a/content/v3/observability/_index.md b/content/v3/observability/_index.md index 2eb49c6898..d7ff9b4920 100644 --- a/content/v3/observability/_index.md +++ b/content/v3/observability/_index.md @@ -14,7 +14,7 @@ Description: > Metrics data is collected and pushed to the [OpenTelemetry Collector](https://github.com/open-telemetry/opentelemetry-collector), so it can be processed, and exported in a format consumable by Prometheus. SSL certificates for TLS between nodes are handled by [cert-manager](https://github.com/jetstack/cert-manager). -CSM for Observability is composed of several services, each residing in its own GitHub repository, that can be installed following one of the four deployments we support [here](deployment). Contributions can be made to this repository or any of the CSM for Observability repositories listed below. +CSM for Observability is composed of several services, each residing in its own GitHub repository, that can be installed following one of the four deployments we support [here](../deployment/helm/modules/installation/observability/). Contributions can be made to this repository or any of the CSM for Observability repositories listed below. {{}} | Name | Repository | Description | @@ -43,36 +43,6 @@ CSM for Observability provides the following capabilities: | Grafana Dashboards for displaying metrics and topology data | yes | yes | no | yes | yes | {{
    }} -## Supported Operating Systems/Container Orchestrator Platforms - -{{}} -| COP/OS | Supported Versions | -|-|-| -| Kubernetes | 1.26, 1.27, 1.28 | -| Red Hat OpenShift | 4.13, 4.14 | -| Rancher Kubernetes Engine | yes | -{{
    }} - -## Supported Storage Platforms - -{{}} -| | PowerFlex | PowerStore | PowerScale | PowerMax | -|---------------|:-------------------:|:----------------:|:----------------:|:----------------:| -| Storage Array | 3.6.x, 4.0.x, 4.5 | 3.0, 3.2, 3.5 | OneFS 9.3, 9.4, 9.5.0.x (x >= 5) | PowerMax 2000/8000
    PowerMax 2500/8500 PowerMaxOS 10 (6079) , PowerMaxOS 10.0.1 (6079) , PowerMaxOS 10.1 (6079)
    PowerMax 2000/8000 - 5978.711.xxx, 5978.479.xxx
    Unisphere 10.0, 10.0.1, 10.1 | -{{
    }} - -## Supported CSI Drivers - -CSM for Observability supports the following CSI drivers and versions. -{{}} -| Storage Array | CSI Driver | Supported Versions | -| ------------- | ---------- | ------------------ | -| CSI Driver for Dell PowerFlex | [csi-powerflex](https://github.com/dell/csi-powerflex) | v2.0 + | -| CSI Driver for Dell PowerStore | [csi-powerstore](https://github.com/dell/csi-powerstore) | v2.0 + | -| CSI Driver for Dell PowerScale | [csi-powerscale](https://github.com/dell/csi-powerscale) | v2.0 + | -| CSI Driver for Dell PowerMax | [csi-powermax](https://github.com/dell/csi-powermax) | v2.5 + | -{{
    }} - ## Topology Data CSM for Observability provides Kubernetes administrators with the topology data related to containerized storage. This topology data is visualized using Grafana: @@ -94,7 +64,7 @@ CSM for Observability provides Kubernetes administrators with the topology data ## TLS Encryption -CSM for Observability deployment relies on [cert-manager](https://github.com/jetstack/cert-manager) to manage SSL certificates that are used to encrypt communication between various components. When [deploying CSM for Observability](./deployment), cert-manager is installed and configured automatically. The cert-manager components listed below will be installed alongside CSM for Observability. +CSM for Observability deployment relies on [cert-manager](https://github.com/jetstack/cert-manager) to manage SSL certificates that are used to encrypt communication between various components. When [deploying CSM for Observability](../deployment/helm/modules/installation/observability), cert-manager is installed and configured automatically. The cert-manager components listed below will be installed alongside CSM for Observability. {{}} | Component | diff --git a/content/v3/observability/deployment/operator.md b/content/v3/observability/deployment/operator.md deleted file mode 100644 index 15ef496192..0000000000 --- a/content/v3/observability/deployment/operator.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: Operator -linktitle: Operator -description: > - Dell Technologies (Dell) Container Storage Modules (CSM) for Observability Operator deployment ---- - -The CSM Observability module for supported Dell CSI Drivers can be installed via the Dell CSM Operator. -To deploy the Operator, follow the instructions available [here](../../../deployment/csmoperator/#installation). - -To install CSM Observability via the Dell CSM Operator, follow the instructions [here](../../../deployment/csmoperator/modules/observability). \ No newline at end of file diff --git a/content/v3/observability/release/_index.md b/content/v3/observability/release/_index.md index e51b6e51ad..b214e23918 100644 --- a/content/v3/observability/release/_index.md +++ b/content/v3/observability/release/_index.md @@ -6,7 +6,10 @@ Description: > Dell Container Storage Modules (CSM) release notes for observability --- -## Release Notes - CSM Observability 1.7.0 +## Release Notes - CSM Observability 1.8.1 + + + @@ -17,14 +20,11 @@ Description: > ### New Features/Changes -- [#947 - [FEATURE]: Support for Kubernetes 1.28](https://github.com/dell/csm/issues/947) -- [#1066 - [FEATURE]: Support for Openshift 4.14](https://github.com/dell/csm/issues/1066) -- [#996 - [FEATURE]: Dell CSI to Dell CSM Operator Migration Process](https://github.com/dell/csm/issues/996) -- [#1031 - [FEATURE]: Update to the latest UBI Micro image for CSM](https://github.com/dell/csm/issues/1031) -- [#1062 - [FEATURE]: CSM PowerMax: Support PowerMax v10.1 ](https://github.com/dell/csm/issues/1062) +- [#1284 - [FEATURE]: Support for Openshift 4.15](https://github.com/dell/csm/issues/1284) +- [#1285 - [FEATURE]: Remove checks in code for non-supported installs of CSM](https://github.com/dell/csm/issues/1285) +- [#926 - [FEATURE]: Fixing the linting, formatting and vetting issues](https://github.com/dell/csm/issues/926) ### Fixed Issues -- [#1019 - [BUG]: karavi-metrics-powerscale pod gets an segmentation violation error during start](https://github.com/dell/csm/issues/1019) ### Known Issues diff --git a/content/v3/observability/troubleshooting/_index.md b/content/v3/observability/troubleshooting/_index.md index 5d1313c6a8..be4245fff8 100644 --- a/content/v3/observability/troubleshooting/_index.md +++ b/content/v3/observability/troubleshooting/_index.md @@ -112,7 +112,7 @@ A workaround on most browsers is to accept the `karavi-topology` certificate by
    Deploy certificate with new Grafana instance - Please follow the steps in Sample Grafana Deployment but attach the certificate to your `grafana-values.yaml` before deploying. The file should look like: + Please follow the steps in Sample Grafana Deployment but attach the certificate to your `grafana-values.yaml` before deploying. The file should look like: ```yaml # grafana-values.yaml @@ -222,7 +222,7 @@ More information for viewing logs can be found [here](../#viewing-logs). ### How can I create a ServiceMonitor object for Prometheus if I'm using Rancher monitoring stack? -The ServiceMonitor allows us to define how a set of services should be monitored by Prometheus. Please see our [prometheus](../deployment#prometheus) documentation for creating a ServiceMonitor. +The ServiceMonitor allows us to define how a set of services should be monitored by Prometheus. Please see our [prometheus](../../deployment/helm/modules/installation/observability#prometheus) documentation for creating a ServiceMonitor. ### How can I debug and troubleshoot issues with Kubernetes? @@ -232,7 +232,7 @@ The ServiceMonitor allows us to define how a set of services should be monitored ### How can I troubleshoot latency problems with CSM for Observability? -CSM for Observability is instrumented to report trace data to [Zipkin](https://zipkin.io/). Please see [Tracing](../deployment/#tracing) for more information on enabling tracing for CSM for Observability. +CSM for Observability is instrumented to report trace data to [Zipkin](https://zipkin.io/). Please see [Tracing](../../deployment/helm/modules/installation/observability#tracing) for more information on enabling tracing for CSM for Observability. ### Why does the Observability installation timeout with pods stuck in 'ContainerCreating'/'CrashLoopBackOff'/'Error' stage? diff --git a/content/v3/prerequisites/_index.md b/content/v3/prerequisites/_index.md new file mode 100644 index 0000000000..8ad5604af8 --- /dev/null +++ b/content/v3/prerequisites/_index.md @@ -0,0 +1,93 @@ +--- +title: "Prerequisites" +linkTitle: "Prerequisites" +description: Prerequisites for CSM +weight: 1 +--- + +## Supported Storage Platforms + +{{
    }} +| Platform | Version | OS Dependencies | +|---------------|:-------------------:|:------------------------:| +| PowerMax | PowerMax 2500/8500 PowerMaxOS 10 (6079)
    PowerMaxOS 10.0.1 (6079)
    PowerMaxOS 10.1 (6079)
    PowerMax 2000/8000 - 5978.711.711, 5978.714.714
    5978.479.479
    Unisphere 10.0,10.0.1,10.1 | iscsi-initiator-utils
    multipathd or powerpath
    nvme-cli
    nfs-utils | +| PowerFlex | 3.6.x, 4.5.x | [SDC](https://www.dell.com/support/home/en-us/product-support/product/scaleio/drivers)| +| Unity XT | 5.2.x, 5.3.x | iscsi-initiator-utils
    multipathd
    nfs-utils | +| PowerScale | OneFS 9.3, 9.4, 9.5.0.x (x >= 5) | nfs-utils | +| PowerStore | 3.0, 3.2, 3.5, 3.6 | iscsi-initiator-utils
    multipathd
    nvme-cli
    nfs-utils | +| ObjectScale | 1.2.x | - | +{{
    }} + +> Notes: +> * The required OS dependencies are only for the protocol needed (e.g. if NVMe isn't the storage access protocol then nvme-cli is not required).. +> * It is important to note that any operations performed outside of the CSM and Kubernetes ecosystem, such as modifying storage configurations directly using GUI or CLI tools provided by the storage array, may not be supported or automatically picked up by the CSM. As a result, metadata and state information within Kubernetes, including Persistent Volume (PV) metadata, may not reflect changes made outside of the driver. For consistent and accurate management of storage resources, it is recommended to perform all operations through the CSM and Kubernetes API. If external modifications are necessary, corresponding updates should be manually synchronized with the Kubernetes cluster to ensure accurate metadata and functionality. + +## Supported Container Orchestrator Platforms + +{{}} +| Platform | Version | +|----------------------------|:----------------:| +| Kubernetes | 1.27, 1.28, 1.29 | +| Red Hat OpenShift | 4.14, 4.15 | +| Mirantis Kubernetes Engine | 3.7.x | +| Google Anthos | 1.15 | +| Rancher Kubernetes Engine | 1.4.x | +| VMware Tanzu | 7.0 | +{{
    }} + +> Notes: +> * Any orchestrator platform or version that's not mentioned here must be self-certified using [Cert-CSI](../support/cert-csi/) in order to be supported. Although not mandatory, we recommend users to use orchestrator platforms and versions that have not met their end of life. +> * CSM Authorization is not supported on Red Hat OpenShift. + +## Tested Host Operating Systems + +Container Storage Modules (CSM) does not officially support specific operating systems. However, the following operating systems are known to work: +- RedHat CoreOS (RHCOS) versions as supported by OpenShift Container Platform +- RHEL 8+ +- SLES 15SP5 +- Ubuntu 22.04 + +> Notes: +> * The host operating system/version being used must align with what each Dell Storage platform supports. Please visit [E-Lab Navigator](https://elabnavigator.dell.com/eln/modernHomeSSM) for specific Dell Storage platform host operating system level support matrices. +> * Any operating system or version that's not mentioned here must be self-certified using [Cert-CSI](../support/cert-csi/) in order to be supported. Although not mandatory, we recommend users to use operating systems and versions that have not met their end of life. + +## Supported CSM Modules + +{{}} +| CSM Module | PowerMax | PowerFlex | Unity XT | PowerScale | PowerStore | +|----------------------------------------|:--------:|:---------:|:--------:|:----------:|:----------:| +| [CSM Authorization](../authorization/) | Yes | Yes | No | Yes | No | +| [CSM Observability](../observability/) | Yes | Yes | No | Yes | Yes | +| [CSM Replication](../replication/) | Yes | Yes | No | Yes | Yes | +| [CSM Resiliency](../resiliency/) | No | Yes | Yes | Yes | Yes | +| [CSM Encryption](../secure/encryption/)| No | No | No | Yes | No | +| [CSM Application Mobility](../applicationmobility/) | Yes | Yes | Yes | Yes | Yes | +| [Volume Group Snapshot](../snapshots/volume-group-snapshots/) | No | Yes | No | No | Yes | + +{{
    }} + +> Notes: +> * Encryption and Application Mobility are available as a Technical Preview only and are not officially supported. + +## CSM Operator compatibility matrix + +The table below lists the driver and modules versions installable with the CSM Operator: +{{}} +| CSI Driver | Version | CSM Authorization | CSM Replication | CSM Observability | CSM Resiliency | +| ------------------ |---------|-------------------|-----------------|-------------------|----------------| +| CSI PowerScale | 2.10.1 | ✔ 1.10.1 | ✔ 1.8.1 | ✔ 1.8.1 | ✔ 1.9.1 | +| CSI PowerScale | 2.9.0 | ✔ 1.9.0 | ✔ 1.7.0 | ✔ 1.7.0 | ✔ 1.8.0 | +| CSI PowerScale | 2.8.0 | ✔ 1.8.0 | ✔ 1.6.0 | ✔ 1.6.0 | ✔ 1.7.0 | +| CSI PowerFlex | 2.10.1 | ✔ 1.10.1 | ✔ 1.8.1 | ✔ 1.8.1 | ✔ 1.9.1 | +| CSI PowerFlex | 2.9.0 | ✔ 1.9.0 | ✔ 1.7.0 | ✔ 1.7.0 | ✔ 1.8.0 | +| CSI PowerFlex | 2.8.0 | ✔ 1.8.0 | ✔ 1.6.0 | ✔ 1.6.0 | ✔ 1.7.0 | +| CSI PowerStore | 2.10.1 | ❌ | ❌ | ❌ | ✔ 1.9.1 | +| CSI PowerStore | 2.9.0 | ❌ | ❌ | ❌ | ✔ 1.8.0 | +| CSI PowerStore | 2.8.0 | ❌ | ❌ | ❌ | ✔ 1.7.0 | +| CSI PowerMax | 2.10.1 | ✔ 1.10.1 | ✔ 1.8.1 | ✔ 1.8.1 | ❌ | +| CSI PowerMax | 2.9.0 | ✔ 1.9.0 | ✔ 1.7.0 | ✔ 1.7.0 | ❌ | +| CSI PowerMax | 2.8.0 | ✔ 1.8.0 | ✔ 1.6.0 | ✔ 1.6.0 | ❌ | +| CSI Unity XT | 2.10.1 | ❌ | ❌ | ❌ | ❌ | +| CSI Unity XT | 2.9.0 | ❌ | ❌ | ❌ | ❌ | +| CSI Unity XT | 2.8.0 | ❌ | ❌ | ❌ | ❌ | +{{
    }} diff --git a/content/v3/references/FAQ/_index.md b/content/v3/references/FAQ/_index.md deleted file mode 100644 index 4d2eba1713..0000000000 --- a/content/v3/references/FAQ/_index.md +++ /dev/null @@ -1,112 +0,0 @@ ---- -title: "CSM FAQ" -linktitle: "FAQ" -description: Frequently asked questions of Dell Technologies (Dell) Container Storage Modules -weight: 1 ---- - -- [What are Dell Container Storage Modules (CSM)? How different is it from a CSI driver?](#what-are-dell-container-storage-modules-csm-how-different-is-it-from-a-csi-driver) -- [Where do I start with Dell Container Storage Modules (CSM)?](#where-do-i-start-with-dell-container-storage-modules-csm) -- [What are the prerequisites for deploying Container Storage Modules?](#what-are-the-prerequisites-for-deploying-container-storage-modules) -- [How do I uninstall or disable a module?](#how-do-i-uninstall-or-disable-a-module) -- [How do I troubleshoot Container Storage Modules?](#how-do-i-troubleshoot-container-storage-modules) -- [Can I use the CSM functionality like Prometheus collection or Authorization quotas for my non-Kubernetes storage clients?](#can-i-use-the-csm-functionality-like-prometheus-collection-or-authorization-quotas-for-my-non-kubernetes-storage-clients) -- [Should I install the module in the same namespace as the driver or another?](#should-i-install-the-module-in-the-same-namespace-as-the-driver-or-another) -- [Which Kubernetes distributions are supported?](#which-kubernetes-distributions-are-supported) -- [How do I get a list of Container Storage Modules deployed in my cluster with their versions?](#how-do-i-get-a-list-of-container-storage-modules-deployed-in-my-cluster-with-their-versions) -- [Do all Container Storage Modules need to be the same version, or can I mix and match?](#do-all-container-storage-modules-need-to-be-the-same-version-or-can-i-mix-and-match) -- [Can I run Container Storage Modules in a production environment?](#can-i-run-container-storage-modules-in-a-production-environment) -- [Is Dell Container Storage Modules (CSM) supported by Dell Technologies?](#is-dell-container-storage-modules-csm-supported-by-dell-technologies) -- [Can I modify a module or contribute to the project?](#can-i-modify-a-module-or-contribute-to-the-project) -- [What is coming next?](#what-is-coming-next) - -### What are Dell Container Storage Modules (CSM)? How different is it from a CSI driver? -Dell **C**ontainer **S**torage **M**odules are a set of modules that aim to extend features beyond what is available in the [CSI specification](https://kubernetes-csi.github.io/docs/). - -The main goal with CSM modules is to expose storage array enterprise features directly within Kubernetes so developers are empowered to leverage them for their deployment in a seamless way. - -### Where do I start with Dell Container Storage Modules (CSM)? -The umbrella repository for every Dell Container Storage Module is: [https://github.com/dell/csm](https://github.com/dell/csm). - -### What are the prerequisites for deploying Container Storage Modules? -Prerequisites can be found on the respective module deployment pages: -- [Dell Container Storage Module for Observability Deployment](../../observability/deployment/#prerequisites) -- [Dell Container Storage Module for Authorization Deployment](../../authorization/deployment/#prerequisites) -- [Dell Container Storage Module for Resiliency Deployment](../../resiliency/deployment/) -- [Dell Container Storage Module for Replication Deployment](../../replication/deployment/installation/#before-you-begin) -- [Dell Container Storage Module for Application Mobility Deployment](../..//applicationmobility/deployment/#pre-requisites) -- [Dell Container Storage Module for Encryption Deployment](../../secure/encryption/deployment/#vault-server) - -Prerequisites for deploying the Dell CSI drivers can be found here: -- [Dell CSI Drivers Deployment](../../csidriver/installation/) - -### How do I uninstall or disable a module? -- [Dell Container Storage Module for Authorization](../../authorization/uninstallation/) -- [Dell Container Storage Module for Observability](../../observability/uninstall/) -- [Dell Container Storage Module for Resiliency](../../resiliency/uninstallation/) -- [Dell Container Storage Module for Replication](../../replication/uninstall/) -- [Dell Container Storage Module for Application Mobility](../../applicationmobility/uninstallation/) -- [Dell Container Storage Module for Encryption](../../secure/encryption/uninstallation/) - -### How do I troubleshoot Container Storage Modules? -- [Dell CSI Drivers](../../csidriver/troubleshooting/) -- [Dell Container Storage Module for Authorization](../../authorization/troubleshooting/) -- [Dell Container Storage Module for Observability](../../observability/troubleshooting/) -- [Dell Container Storage Module for Replication](../../replication/troubleshooting/) -- [Dell Container Storage Module for Resiliency](../../resiliency/troubleshooting/) -- [Dell Container Storage Module for Application Mobility](../../applicationmobility/troubleshooting/) -- [Dell Container Storage Module for Encryption](../../secure/encryption/troubleshooting/) - -### Can I use the CSM functionality like Prometheus collection or Authorization quotas for my non-Kubernetes storage clients? -No, all the modules have been designed to work inside Kubernetes with Dell CSI drivers. - -### Should I install the module in the same namespace as the driver or another? -It is recommended to install CSM for Observability in a namespace separate from the Dell CSI drivers because it works across multiple drivers. All other modules either run as standalone or with the Dell CSI driver as a sidecar. - -### Which Kubernetes distributions are supported? -The supported Kubernetes distributions for Container Storage Modules are documented: -- [Dell Container Storage Module for Authorization](../../authorization/#supported-operating-systemscontainer-orchestrator-platforms) -- [Dell Container Storage Module for Observability](../../observability/#supported-operating-systemscontainer-orchestrator-platforms) -- [Dell Container Storage Module for Replication](../../replication/#supported-operating-systemscontainer-orchestrator-platforms) -- [Dell Container Storage Module for Resiliency](../../resiliency/#supported-operating-systemscontainer-orchestrator-platforms) -- [Dell Container Storage Module for Application Mobility](../../applicationmobility/#supported-operating-systemscontainer-orchestrator-platforms) -- [Dell Container Storage Module for Encryption](../../secure/encryption/#supported-operating-systemscontainer-orchestrator-platforms) - -The supported distros for the Dell CSI Drivers are located [here](../../csidriver/#supported-operating-systemscontainer-orchestrator-platforms). - -### How do I get a list of Container Storage Modules deployed in my cluster with their versions? -The easiest way to find the module version is to check the image tag for the module. For all the namespaces you can execute the following: -``` -kubectl get pods -A -o jsonpath="{..image}" | tr -s '[[:space:]]' '\n' | grep 'csm\|karavi' | sort | uniq -c -``` -Or if you know the namespace: -``` -kubectl get deployment,daemonset -o wide -n {{namespace}} -``` - -### Do all Container Storage Modules need to be the same version, or can I mix and match? -It is advised to comply with the support matrices (links below) and not deviate from it with mixed versions. -- [Dell Container Storage Module for Authorization](../../authorization/#supported-operating-systemscontainer-orchestrator-platforms) -- [Dell Container Storage Module for Observability](../../observability/#supported-operating-systemscontainer-orchestrator-platforms) -- [Dell Container Storage Module for Replication](../../replication/#supported-operating-systemscontainer-orchestrator-platforms) -- [Dell Container Storage Module for Resiliency](../../resiliency/#supported-operating-systemscontainer-orchestrator-platforms) -- [Dell Container Storage Module for Application Mobility](../../applicationmobility/#supported-operating-systemscontainer-orchestrator-platforms) -- [Dell Container Storage Module for Encryption](../../secure/encryption/#supported-operating-systemscontainer-orchestrator-platforms) -- [Dell CSI Drivers](../../csidriver/#supported-operating-systemscontainer-orchestrator-platforms). - -### Can I run Container Storage Modules in a production environment? - -Currently, the Container Storage Modules Authorization, Observability, Replication, and Resiliency are GA and ready for production systems. The modules Encryption and Application Mobility are launched for Tech Preview Release and it is not intended to use in the Production systems. - -### Is Dell Container Storage Modules (CSM) supported by Dell Technologies? -Yes! - -If you find an issue, please follow our [support process](../../support/) - -### Can I modify a module or contribute to the project? -Yes! - -All Container Storage Modules are released as open-source projects under Apache-2.0 License. You are free to contribute directly following the [contribution guidelines](https://github.com/dell/csm/blob/main/docs/CONTRIBUTING.md), fork the projects, modify them, and of course share feedback or open tickets ;-) - -### What is coming next? -This is just the beginning of the journey for Dell Container Storage Modules, and there is a full roadmap with more to come, which you can check under the [GitHub Milestones](https://github.com/dell/csm/milestones) page. diff --git a/content/v3/references/_index.md b/content/v3/references/_index.md deleted file mode 100644 index ce3be78438..0000000000 --- a/content/v3/references/_index.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: "References" -linkTitle: "References" -weight: 14 -Description: > - Dell Technologies (Dell) Container Storage Modules (CSM) References ---- diff --git a/content/v3/references/policies/_index.md b/content/v3/references/policies/_index.md deleted file mode 100644 index a5e2875d16..0000000000 --- a/content/v3/references/policies/_index.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: "Policies" -linkTitle: "Policies" -weight: 4 -Description: > - Dell Technologies (Dell) Container Storage Modules (CSM) Policies ---- diff --git a/content/v3/release/_index.md b/content/v3/release/_index.md deleted file mode 100644 index 248ba5ebae..0000000000 --- a/content/v3/release/_index.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: "Release notes" -linkTitle: "Release notes" -weight: 12 -Description: > - Dell Container Storage Modules (CSM) release notes ---- - -Release notes for Container Storage Modules: - -[CSI Drivers](../csidriver/release) - -[CSM for Authorization](../authorization/release) - -[CSM for Observability](../observability/release) - -[CSM for Replication](../replication/release) - -[CSM for Resiliency](../resiliency/release) - -[CSM for Encryption](../secure/encryption/release) - -[CSM for Application Mobility](../applicationmobility/release) - -[CSM Operator](../deployment/csmoperator/release) - -[CSM Installation Wizard](../deployment/csminstallationwizard/release) diff --git a/content/v3/replication/_index.md b/content/v3/replication/_index.md index 28a57c3041..d6f8b23558 100644 --- a/content/v3/replication/_index.md +++ b/content/v3/replication/_index.md @@ -32,25 +32,6 @@ CSM for Replication provides the following capabilities: | Provides a command line utility - [repctl](tools) for configuring & managing replication related resources across multiple clusters | yes | yes | yes | yes | no | {{}} -## Supported Operating Systems/Container Orchestrator Platforms - -{{}} -| COP/OS | PowerMax | PowerStore | PowerScale | PowerFlex | -| ----------------- | ---------------- | ---------------- | ---------------- | ---------------- | -| Kubernetes | 1.26, 1.27, 1.28 | 1.26, 1.27, 1.28 | 1.26, 1.27, 1.28 | 1.26, 1.27, 1.28 | -| Red Hat OpenShift | 4.13, 4.14 | 4.13, 4.14 | 4.13, 4.14 | 4.13, 4.14 | -{{
    }} - -## Supported Storage Platforms - -{{}} -| | PowerMax | PowerStore | PowerScale | PowerFlex | -| ------------- | :------------------------------------------------------------------------------------------------------: | :------------------------------------------: | :------------------------------------------: | :-------: | -| Storage Array | PowerMax 2500/8500 PowerMaxOS 10 (6079) , PowerMaxOS 10.0.1 (6079) , PowerMaxOS 10.1 (6079)
    PowerMax 2000/8000 - 5978.711.xxx, 5978.479.xxx
    Unisphere 10.0,10.0.1,10.1 | 3.0, 3.2, 3.5 | OneFS 9.3, 9.4, 9.5.0.x (x >= 5) | 3.6.x, 4.0.x, 4.5 | -{{
    }} - ->Note: File Replication for PowerMax is currently not supported - ## Details As on the storage arrays, all replication related Kubernetes entities are required/created in pairs - diff --git a/content/v3/replication/cluster-topologies.md b/content/v3/replication/cluster-topologies.md index ce40558c54..95ecb79a5c 100644 --- a/content/v3/replication/cluster-topologies.md +++ b/content/v3/replication/cluster-topologies.md @@ -38,7 +38,7 @@ Note that the `targets` parameter is left empty since we don't require any targe This also means that you don't need to create any Secrets that contain connection information to such clusters, since in this use case, we are limited to a single cluster. -You can find more info about configs and secrets for cluster communication in [configmaps-secrets](../deployment/configmap-secrets/). +You can find more info about configs and secrets for cluster communication in [configmaps-secrets](../../deployment/helm/modules/installation/replication/configmap-secrets/). #### Storage Class Configuration @@ -48,7 +48,7 @@ be set to `self` to indicate that we want to replicate the volume inside the cur Also, you would need to create another storage class in the same cluster that would serve as a `target` storage class. This means that all replicated volumes would be derived from it. Its `replication.storage.dell.com/remoteClusterID` parameter should be also set to `self`. -You can find out more about replication StorageClasses and replication specific parameters in [storageclasses](../deployment/storageclasses). +You can find out more about replication StorageClasses and replication specific parameters in [storageclasses](../../deployment/helm/modules/installation/replication/storageclasses). #### Replicated Resources @@ -95,7 +95,7 @@ metadata: ``` Note that target cluster information contains a field called `secretRef`. This field points to a secret available in the current cluster that contains connection information of `cluster-B` in the form of a kubeconfig file. -You can find more information about how to create such secrets in [configmaps-secrets](../deployment/configmap-secrets/#communication-between-clusters). +You can find more information about how to create such secrets in [configmaps-secrets](../../deployment/helm/modules/installation/replication/configmap-secrets/#communication-between-clusters). #### Storage Class Configuration @@ -106,7 +106,7 @@ want to replicate your volumes. For multi-cluster replication, we can choose one of the target cluster ids we specified in ConfigMap. In our example replication parameter, the target cluster id should be equal to `cluster-B`. -You can find more information about other replication parameters available in storage classes [here](../deployment/storageclasses/#common-parameters). +You can find more information about other replication parameters available in storage classes [here](../../deployment/helm/modules/installation/replication/storageclasses#common-parameters). #### Replicated Resources diff --git a/content/v3/replication/deployment/install-operator.md b/content/v3/replication/deployment/install-operator.md deleted file mode 100644 index 62c711db85..0000000000 --- a/content/v3/replication/deployment/install-operator.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: Installation using Operator -linktitle: Installation using Operator -description: > - Dell Technologies (Dell) Container Storage Modules (CSM) for Replication Operator deployment ---- - -The CSM Replication module for supported Dell CSI Drivers can be installed via the Dell CSM Operator. -To deploy the Operator, follow the instructions available [here](../../../deployment/csmoperator/#installation). - -To install CSM Replication via the Dell CSM Operator, follow the instructions [here](../../../deployment/csmoperator/modules/replication). \ No newline at end of file diff --git a/content/v3/replication/high-availability.md b/content/v3/replication/high-availability.md index 15210a538f..315f8d888a 100644 --- a/content/v3/replication/high-availability.md +++ b/content/v3/replication/high-availability.md @@ -17,8 +17,8 @@ In SRDF metro configurations: * R2 devices assume the same external device identity(geometry, device WWN) as the R1 devices. All the above characteristic makes SRDF metro best suited for the scenarios in which high availability of data is desired. -With respect to Kubernetes, the SRDF metro mode works in single cluster scenarios. In the metro, both the arrays—[arrays with SRDF metro link setup between them](../deployment/powermax/#on-storage-array)—involved in the replication are managed by the same `csi-powermax` driver. The replication is triggered by creating a volume using a `StorageClass` with metro-related parameters. -The driver on receiving the metro-related parameters in the `CreateVolume` call creates a metro replicated volume and the details about both the volumes are returned in the volume context to the Kubernetes cluster. So, the `PV` created in the process represents a pair of metro replicated volumes. When a `PV`, representing a pair of metro replicated volumes, is claimed by a pod, the host treats each of the volumes represented by the single `PV` as a separate data path. The switching between the paths, to read and write the data, is managed by the multipath driver. The switching happens automatically, as configured by the user—in round-robin fashion or otherwise—or it can happen if one of the paths goes down. For details on Linux multipath driver setup, [click here](../../csidriver/installation/helm/powermax/#linux-multipathing-requirements). +With respect to Kubernetes, the SRDF metro mode works in single cluster scenarios. In the metro, both the arrays—[arrays with SRDF metro link setup between them](../../deployment/helm/modules/installation/replication/powermax/#on-storage-array)—involved in the replication are managed by the same `csi-powermax` driver. The replication is triggered by creating a volume using a `StorageClass` with metro-related parameters. +The driver on receiving the metro-related parameters in the `CreateVolume` call creates a metro replicated volume and the details about both the volumes are returned in the volume context to the Kubernetes cluster. So, the `PV` created in the process represents a pair of metro replicated volumes. When a `PV`, representing a pair of metro replicated volumes, is claimed by a pod, the host treats each of the volumes represented by the single `PV` as a separate data path. The switching between the paths, to read and write the data, is managed by the multipath driver. The switching happens automatically, as configured by the user—in round-robin fashion or otherwise—or it can happen if one of the paths goes down. For details on Linux multipath driver setup, [click here](../../deployment/helm/drivers/installation/powermax#linux-multipathing-requirements). The creation of volumes in SRDF metro mode doesn't involve the replication sidecar or the common controller, nor does it cause the creation of any replication related custom resources; it just needs a `csi-powermax` driver that implements the `CreateVolume` gRPC endpoint with SRDF metro capability for it to work. diff --git a/content/v3/replication/migration/migrating-volumes-diff-array.md b/content/v3/replication/migration/migrating-volumes-diff-array.md index cf32d1eb9e..50d343997b 100644 --- a/content/v3/replication/migration/migrating-volumes-diff-array.md +++ b/content/v3/replication/migration/migrating-volumes-diff-array.md @@ -61,7 +61,7 @@ migration: migrationPrefix: "migration.storage.dell.com" ``` -Target array configuration and endpoint needs to be updated in the driver's [myvalues.yaml](../../../csidriver/installation/helm/powermax/#csi-powermax-driver-with-proxy-in-standalone-mode) file as shown below: +Target array configuration and endpoint needs to be updated in the driver's [myvalues.yaml](../../../deployment/helm/drivers/installation/powermax#csi-powermax-driver-with-proxy-in-standalone-mode) file as shown below: ```yaml ########################## diff --git a/content/v3/replication/release/_index.md b/content/v3/replication/release/_index.md index bbfe6dafad..6049d69e24 100644 --- a/content/v3/replication/release/_index.md +++ b/content/v3/replication/release/_index.md @@ -6,7 +6,10 @@ Description: > Dell Container Storage Modules (CSM) release notes for replication --- -## Release Notes - CSM Replication 1.7.1 +## Release Notes - CSM Replication 1.8.1 + + + @@ -17,15 +20,10 @@ Description: > ### New Features/Changes -- [#947 - [FEATURE]: Support for Kubernetes 1.28](https://github.com/dell/csm/issues/947) -- [#1066 - [FEATURE]: Support for Openshift 4.14](https://github.com/dell/csm/issues/1066) -- [#996 - [FEATURE]: Dell CSI to Dell CSM Operator Migration Process](https://github.com/dell/csm/issues/996) -- [#1031 - [FEATURE]: Update to the latest UBI Micro image for CSM](https://github.com/dell/csm/issues/1031) -- [#1062 - [FEATURE]: CSM PowerMax: Support PowerMax v10.1 ](https://github.com/dell/csm/issues/1062) +- [#1284 - [FEATURE]: Support for Openshift 4.15](https://github.com/dell/csm/issues/1284) +- [#926 - [FEATURE]: Fixing the linting, formatting and vetting issues](https://github.com/dell/csm/issues/926) ### Fixed Issues -- [#988 - [BUG]: CSM Operator fails to install CSM Replication on the remote cluster](https://github.com/dell/csm/issues/988) -- [#1002 - [BUG]: CSM Replication - secret file requirement for both sites not documented ](https://github.com/dell/csm/issues/1002) ### Known Issues diff --git a/content/v3/resiliency/_index.md b/content/v3/resiliency/_index.md index 52711c75c6..78fa586121 100644 --- a/content/v3/resiliency/_index.md +++ b/content/v3/resiliency/_index.md @@ -50,7 +50,7 @@ CSM for Resiliency provides the following capabilities: {{}} | | PowerFlex | Unity XT | PowerScale | PowerStore | | ------------- | :----------: | :-------------------------------: | :-------------------------------------: | :---------------------------: | -| Storage Array | 3.6.x, 4.0.x, 4.5 | 5.1.x, 5.2.x, 5.3.0 | OneFS 9.3, 9.4, 9.5.0.x (x >= 5) | 3.0, 3.2, 3.5 | +| Storage Array | 3.6.x, 4.0.x, 4.5 | 5.1.x, 5.2.x, 5.3.0 | OneFS 9.3, 9.4, 9.5.0.x (x >= 5) | 3.0, 3.2, 3.5, 3.6 | {{
    }} ## Supported CSI Drivers @@ -104,7 +104,7 @@ PowerStore is a highly scalable array that is very well suited to Kubernetes dep ## Limitations and Exclusions -This file contains information on Limitations and Exclusions that users should be aware of. Additionally, there are driver specific limitations and exclusions that may be called out in the [Deploying CSM for Resiliency](deployment) page. +This file contains information on Limitations and Exclusions that users should be aware of. Additionally, there are driver specific limitations and exclusions that may be called out in the [Deploying CSM for Resiliency](../deployment/helm/modules/installation/resiliency/) page. ### Supported and Tested Operating Modes diff --git a/content/v3/resiliency/deployment/_index.md b/content/v3/resiliency/deployment/_index.md deleted file mode 100644 index 54a2e85459..0000000000 --- a/content/v3/resiliency/deployment/_index.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: "Deployment" -linkTitle: "Deployment" -weight: 1 -Description: > - Installation for Dell Container Storage Module (CSM) for Resiliency ---- diff --git a/content/v3/resiliency/deployment/operator.md b/content/v3/resiliency/deployment/operator.md deleted file mode 100644 index 55fa6d2e59..0000000000 --- a/content/v3/resiliency/deployment/operator.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: Operator -linktitle: Operator -description: > - Dell Technologies (Dell) Container Storage Modules (CSM) for Resiliency Operator deployment ---- - -The CSM Resiliency module for supported Dell CSI Drivers can be installed via the Dell CSM Operator. -To deploy the Operator, follow the instructions available [here](../../../deployment/csmoperator/#installation). - -To install CSM Resiliency via the Dell CSM Operator, follow the instructions [here](../../../deployment/csmoperator/modules/resiliency). \ No newline at end of file diff --git a/content/v3/resiliency/release/_index.md b/content/v3/resiliency/release/_index.md index f85176810c..bf3b626812 100644 --- a/content/v3/resiliency/release/_index.md +++ b/content/v3/resiliency/release/_index.md @@ -6,7 +6,10 @@ Description: > Dell Container Storage Modules (CSM) release notes for resiliency --- -## Release Notes - CSM Resiliency 1.8.1 +## Release Notes - CSM Resiliency 1.9.1 + + + @@ -17,10 +20,8 @@ Description: > ### New Features/Changes -- [#947 - [FEATURE]: Support for Kubernetes 1.28](https://github.com/dell/csm/issues/947) -- [#1066 - [FEATURE]: Support for Openshift 4.14](https://github.com/dell/csm/issues/1066) -- [#996 - [FEATURE]: Dell CSI to Dell CSM Operator Migration Process](https://github.com/dell/csm/issues/996) -- [#1031 - [FEATURE]: Update to the latest UBI Micro image for CSM](https://github.com/dell/csm/issues/1031) +- [#1284 - [FEATURE]: Support for Openshift 4.15](https://github.com/dell/csm/issues/1284) +- [#926 - [FEATURE]: Fixing the linting, formatting and vetting issues](https://github.com/dell/csm/issues/926) ### Fixed Issues diff --git a/content/v3/resiliency/uninstallation.md b/content/v3/resiliency/uninstallation.md deleted file mode 100644 index 57f2905e40..0000000000 --- a/content/v3/resiliency/uninstallation.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: Uninstallation -linktitle: Uninstallation -weight: 2 -description: > - Dell Container Storage Modules (CSM) for Resiliency Uninstallation ---- - -This section outlines the uninstallation steps for Container Storage Modules (CSM) for Resiliency. - -## Uninstalling the sidecar in the CSI Driver - -To uninstall the sidecar in the CSI Driver, [uninstall](../../csidriver/uninstall) the driver and [reinstall](../../deployment) the driver with the `podmon` feature disabled. \ No newline at end of file diff --git a/content/v3/secure/encryption/_index.md b/content/v3/secure/encryption/_index.md index 08b70aec88..557b9229cb 100644 --- a/content/v3/secure/encryption/_index.md +++ b/content/v3/secure/encryption/_index.md @@ -6,13 +6,15 @@ Description: > CSI Volumes Encryption --- -**NOTE:** Encryption is not supported for CSM 1.9.x release. Please refer to the [release notes](./release/) for more details. +**NOTE:** Encryption is not supported for CSM 1.10.x release. Please refer to the [release notes](./release/) for more details. Encryption provides the capability to encrypt user data residing on volumes created by Dell CSI Drivers. + + > **NOTE:** This tech-preview release is not intended for use in production environment. -> **NOTE:** Encryption requires a time-based license to create new encrypted volumes. Request a [trial license](../../license) prior to deployment. +> **NOTE:** Encryption requires a time-based license to create new encrypted volumes. Request a [trial license](../../support/license) prior to deployment. > > After the license expiration, existing encrypted volume can still be unlocked and used, but no new encrypted volumes can be created. @@ -35,7 +37,7 @@ This provisioner belongs to the storage driver and does not depend on the Encryp **Provisioner for encrypted volumes** -This provisioner belongs to Encryption and registers with the name [`encryption.pluginName`](deployment/#helm-chart-values) when Encryption is enabled. Use a storage class with this provisioner to create encrypted volumes. +This provisioner belongs to Encryption and registers with the name [`encryption.pluginName`](../../deployment/helm/modules/installation/encryption/#helm-chart-values) when Encryption is enabled. Use a storage class with this provisioner to create encrypted volumes. ## Capabilities @@ -116,7 +118,7 @@ Please refer to the Hashicorp Vault documentation regarding recommended deployme > **CAUTION:** Destroyed Vault storage back-end or the encryption key stored in it, will make it impossible to unlock the volume encrypted with Encryption. Access to the data will be lost for ever. -Refer to [Vault Configuration section](vault) for minimal configuration steps required to support Encryption and other configuration considerations. +Refer to [Vault Configuration section](../../deployment/helm/modules/installation/encryption/vault) for minimal configuration steps required to support Encryption and other configuration considerations. ## Key Rotation (rekey) This preview of Encryption includes the ability to change the KEK (Key Encryption Key) of an encrypted volume, an operation commonly known as Shallow Rekey, or diff --git a/content/v3/secure/encryption/deployment.md b/content/v3/secure/encryption/deployment.md deleted file mode 100644 index db6b188cb6..0000000000 --- a/content/v3/secure/encryption/deployment.md +++ /dev/null @@ -1,186 +0,0 @@ ---- -title: "Deployment" -linkTitle: "Deployment" -weight: 1 -Description: > - Deployment ---- -Encryption for Dell Container Storage Modules is enabled via the Dell CSI driver installation. The drivers can be installed either by a Helm chart or by the Dell CSM Operator. -In the tech preview release, Encryption can only be enabled via Helm chart installation. - -Except for additional Encryption related configuration outlined on this page, -the rest of the deployment process is described in the correspondent [CSI driver documentation](../../../csidriver/installation/helm). - -## Vault Server - -Hashicorp Vault must be [pre-configured](../vault) to support Encryption. The Vault server's IP address and port must be accessible -from the Kubernetes cluster where the CSI driver is to be deployed. - -## Rekey Controller - -The Encryption Rekey CRD Controller is an optional component that, if installed, allows encrypted volumes rekeying in a -Kubernetes cluster. Please refer to [Rekey Configuration](../rekey) for the Rekey Controller installation details. - -## Helm Chart Values - -The drivers that support Encryption via Helm chart have an `encryption` block in their *values.yaml* file that looks like this: - -```yaml -encryption: - # enabled: Enable/disable volume encryption feature. - enabled: false - - # pluginName: The name of the provisioner to use for encrypted volumes. - pluginName: "sec-isilon.dellemc.com" - - # logLevel: Log level of the encryption driver. - # Allowed values: "error", "warning", "info", "debug", "trace". - logLevel: "error" - - # apiPort: TCP port number used by the REST API server. - apiPort: 3838 - - # logLevel: Log level of the encryption driver. - # Allowed values: "error", "warning", "info", "debug", "trace". - logLevel: "debug" - - # livenessPort: HTTP liveness probe port number. - # Leave empty to disable the liveness probe. - # Example: 8080 - livenessPort: - - # ocp: Enable when running on OpenShift Container Platform with CoreOS worker nodes. - ocp: false - - # ocpCoreID: User ID and group ID of user core on CoreOS worker nodes. - # Ignored when ocp is set to false. - ocpCoreID: "1000:1000" - - # extraArgs: Extra command line parameters to pass to the encryption driver. - # Allowed values: - # --sharedStorage - may be required by some applications to work properly. - # When set, performance is reduced and hard links cannot be created. - # See the gocryptfs documentation for more details. - extraArgs: [] -``` - -| Parameter | Description | Required | Default | -| --------- | ----------- | -------- | ------- | -| enabled | Enable/disable volume encryption feature. | No | false | -| pluginName | The name of the provisioner to use for encrypted volumes. | No | "sec-isilon.dellemc.com" | -| image | Encryption driver image name. | No | "dellemc/csm-encryption:v0.3.0" | -| logLevel | Log level of the encryption driver.
    Allowed values: "error", "warning", "info", "debug", "trace". | No | "error" | -| apiPort | TCP Port number used by the REST API Server. | No | 3838 | -| livenessPort | HTTP liveness probe port number. Leave empty to disable the liveness probe. | No | | -| ocp | Enable when running an OCP Platform with CoreOS worker nodes. | No | false | -| ocpCoreID | User ID and group ID of user core on CoreOS worker nodes. Ignored when ocp is set to false. | No | "1000:1000" | -| extraArgs | Extra command line parameters to pass to the encryption driver.
    Allowed values:
    "\-\-sharedStorage" - may be required by some applications to work properly.
    When set, performance is reduced and hard links cannot be created.
    See the [gocryptfs documentation](https://github.com/rfjakob/gocryptfs/blob/v2.2.1/Documentation/MANPAGE.md#-sharedstorage) for more details. | No | [] | - -## Secrets and Config Maps - -Apart from any secrets and config maps described in the CSI driver documentation, these resources should be created for Encryption: - -### Secret *encryption-license* - -Request a trial license following instructions on the [License page](../../../license). You will be provided with a YAML file similar to: - -```yaml -apiVersion: v1 -data: - license: k1FXzMDZodGNnK4I12Alo4UvuhLd+ithRhuLz2eoIxlcMSfW0xJYWnBiNMvTUl8VdGmR5fsvs2L6KqPfpIJk4wOzCxQ9wfDIJuYqrwV0wi2F2lzb1Hkk7O7/4r8cblPdCRJWfbg8QFc2BVtl4PZ/pFkHZoZVCbhGDD1MsbI1CiKqva9r9TBfswSFnqv7p3QXgbqQov8/q/j2+sHcvFF3j4kx+q1PzXoRNxwuTQaP4VAvipsQNAU5yV2dos2hs4Y/Ltbtreu/vrRGUaxvPbass1vUtIOJnvKkfbp53j8PFJGGISMYvYylUiD7TpoamxT/1I6mkjgRds+tEciMvutqDpmKEtdyp3vBjt4Sgd07ptvsdBJlyRAYb8ZPX9vXr4Ws -kind: Secret -metadata: - name: edit_name - namespace: edit_namespace -``` - -Set `name` to `"encryption-license"` and `namespace` to your driver namespace and apply the file: - -```shell -kubectl apply -f -``` - -### Secret *vault-auth* - -A secret with the AppRole credentials used by Encryption to authenticate to the Vault server. - -> Set `role_id` and `secret_id` to the values provided by the Vault server administrator. - -> If a self-managed test Vault instance is used, generate role ID and secret ID following [these steps](../vault/#set-role-id-and-secret-id-to-the-role). - -```shell -cat >auth.json <", - "secret_id": "" -} -EOF - -kubectl create secret generic vault-auth -n --from-file=auth.json -o yaml --dry-run=client | kubectl apply -f - - -rm -f auth.json -``` -In this release, Encryption does not pick up modifications to this secret while the CSI driver is running, unless it needs to re-login which happens at: -- CSI Driver startup -- an authentication error from the Vault server -- client token expiration - -In all other cases, to apply new values in the secret (e.g., to use another role), the CSI driver must be restarted. - -### Secret *vault-cert* - -A secret with TLS certificates used by Encryption to communicate with the Vault server. - -> Files *server-ca.crt*, *client.crt* and *client.key* should be in PEM format. - -```shell -kubectl create secret generic vault-cert -n \ - --from-file=server-ca.crt --from-file=client.crt --from-file=client.key \ - -o yaml --dry-run=client | kubectl apply -f - -``` -In this release, Encryption does not pick up modifications to this secret while the CSI driver is running. -To apply new values in the secret (e.g., to update the client certificate), the CSI driver must be restarted. - -### ConfigMap *vault-client-conf* - -A config map with settings used by Encryption to communicate with the Vault server. - -> Populate *client.json* with your settings. - -```shell -cat >client.json <:8400", - "kv_engine_path": "/dea-keys", - "tls_config": - { - "client_crt": "/etc/dea/vault/client.crt", - "client_key": "/etc/dea/vault/client.key", - "server_ca": "/etc/dea/vault/server-ca.crt" - } -} -EOF - -kubectl create configmap vault-client-conf -n \ - --from-file=client.json -o yaml --dry-run=client | kubectl apply -f - - -rm -f client.json -``` - -These fields are available for use in *client.json*: - -| client.json field | Description | Required | Default | -| ----------------- | ----------- | -------- | ------- | -| auth_type | Authentication type used to authenticate to the Vault server. Currently, the only supported type is "approle". | Yes | | -| auth_conf_file | Set to "/etc/dea/vault/auth.json" | Yes | | -| auth_timeout | Defines in how many seconds key requests to the Vault server fail if there is no valid authentication token. | No | 5 | -| lease_duration_margin | Defines how many seconds in advance the authentication token lease will be renewed. This value should accommodate network and processing delays. | No | 15 | -| lease_increase | Defines the number of seconds used in the authentication token renew call. This value is advisory and may be disregarded by the server. | No | 3600 | -| vault_addr | URL to use for REST calls to the Vault server. It must start with "https". | Yes | | -| kv_engine_path | The path to which the Key/Value secret engine is mounted on the Vault server. | Yes | | -| tls_config.client_crt | Set to "/etc/dea/vault/client.crt" | Yes | | -| tls_config.client_key | Set to "/etc/dea/vault/client.key" | Yes | | -| tls_config.client_ca | Set to "/etc/dea/vault/server-ca.crt" | Yes | | - diff --git a/content/v3/secure/encryption/rekey.md b/content/v3/secure/encryption/rekey.md deleted file mode 100644 index 3b96440c59..0000000000 --- a/content/v3/secure/encryption/rekey.md +++ /dev/null @@ -1,144 +0,0 @@ ---- -title: "Rekey Configuration" -linkTitle: "Rekey Configuration" -weight: 4 -Description: > - Rekey Configuration and Usage ---- - -## Rekey Controller Installation - -The CSM Encryption Rekey CRD Controller is an optional component that, if installed, allows encrypted volumes rekeying in a -Kubernetes cluster. The Rekey Controller can be installed via the Dell Helm charts [repository](https://github.com/dell/helm-charts). - -Dell Helm charts can be added with the command `helm repo add dell https://dell.github.io/helm-charts`. - -### Kubeconfig Secret - -A secret with kubeconfig must be created with the name `cluster-kube-config`. Here is an example: - -```shell - - kubectl create secret generic cluster-kube-config --from-file=config=/root/.kube/config -``` - -### Helm Chart Values - -The Rekey Controller Helm chart defines these values: - -```yaml -# Rekey controller image name. -image: "dellemc/csm-encryption-rekey-controller:v0.2.0" - -# Rekey controller image pull policy. -# Allowed values: -# Always: Always pull the image. -# IfNotPresent: Only pull the image if it does not already exist on the node. -# Never: Never pull the image. -imagePullPolicy: IfNotPresent - -# logLevel: Log level of the rekey controller. -# Allowed values: "error", "warning", "info", "debug", "trace". -logLevel: "info" - -# This value is required and must match encryption.pluginName value -# of the corresponding Dell CSI driver. -provisioner: - -# This value is required and must match encryption.apiPort value -# of the corresponding Dell CSI driver. -port: -``` - -| Parameter | Description | Required | Default | -| --------- | ----------- | -------- | ------- | -| image | Rekey controller image name. | No | "dellemc/csm-encryption-rekey-controller:v0.2.0" | -| imagePullPolicy | Rekey controller image pull policy. | No | "IfNotPresent" | -| logLevel | Log level of the rekey controller. | No | "info" | -| provisioner | This value is required and must match `encryption.pluginName` value of the corresponding Dell CSI driver. | Yes | | -| port | This value is required and must match `encryption.apiPort` value of the corresponding Dell CSI driver. | Yes | | - -### Deployment - -Copy the chart's values.yaml to a local file and adjust the values in the local file for the current cluster. -Deploy the controller using a command similar to this: - -```shell - -helm install --values local-values.yaml rekey-controller dell/csm-encryption-rekey-controller -``` - -A rekey-controller pod should now be up and running. - -## Rekey Usage - -Rekeying is initiated and monitored via Kubernetes custom resources of type `rekeys.encryption.storage.dell.com`. -This can be done directly [using kubectl](#rekey-with-kubectl) or in a more user-friendly way [using dellctl](#rekey-with-dellctl). -Creation of a rekey resource for a PV will kick off a rekey process on this PV. The rekey resource will contain the result -of the operation. Refer to [Rekey Status](#rekey-status) for possible status values. - -### Rekey with dellctl - -If `dellctl` CLI is installed, rekeying an encrypted volume is simple. -For example, to rekey a PV with the name `k8s-112a5d41bc` use a command like this: - -```shell - -dellctl encryption rekey myrekey k8s-112a5d41bc -``` -``` -INFO rekey request "myrekey" submitted successfully for persistent volume "k8s-112a5d41bc". -INFO Run 'dellctl encryption rekey-status myrekey' for more details. -``` - -Then to check the status of the newly created rekey with the name `myrekey` use this command: - -```shell -dellctl encryption rekey-status myrekey -``` -``` -INFO Status of rekey request myrekey = completed -``` - -### Rekey with kubectl - -Create a cluster-scoped rekey resource to rekey an encrypted volume. -For example, to rekey a PV with the name `k8s-09a76734f` use a command like this: - -```shell -kubectl create -f - < logs Each pod has containers called `driver` which is the storage driver container and `driver-sec` which is the Encryption driver container. These container's logs tend to provide the most important information, but other containers may give a hint too. View the logs of `driver-sec` in `isi-node-4gtwf` with `kubectl -n logs isi-node-4gtwf driver-sec`. -The log level of this container can be changed by setting value [encryption.logLevel](../deployment#helm-chart-values) and restarting the driver. +The log level of this container can be changed by setting value [encryption.logLevel](../../../deployment/helm/modules/installation/encryption#helm-chart-values) and restarting the driver. Often it is necessary to see the logs produced on a specific Kubernetes worker host. To find which *node* pod is running on which worker host, use `kubectl -n get pods -o wide`. @@ -39,25 +39,25 @@ Some errors may be logged to the related resource events that can be viewed with ### Vault Server Logs Some errors related to communication with the Vault server and key requests may be logged on the Vault server side. -If you run a [test instance of the server in a Docker container](../vault#vault-server-installation) you can view the logs with `docker logs vault-server`. +If you run a [test instance of the server in a Docker container](../../../deployment/helm/modules/installation/encryption/vault#vault-server-installation) you can view the logs with `docker logs vault-server`. ## Typical Failure Reasons ### Incorrect Vault related configuration - check [logs](#logs-and-events) -- check [vault-auth secret](../deployment#secret-vault-auth) -- check [vault-cert secret](../deployment#secret-vault-cert) -- check [vault-client-conf config map](../deployment#configmap-vault-client-conf) +- check [vault-auth secret](../../../deployment/helm/modules/installation/encryption#secret-vault-auth) +- check [vault-cert secret](../../../deployment/helm/modules/installation/encryption#secret-vault-cert) +- check [vault-client-conf config map](../../../deployment/helm/modules/installation/encryption/#configmap-vault-client-conf) ### Incorrect Vault server-side configuration - check [logs](#logs-and-events) -- check [Vault server configuration](../vault#minimum-server-configuration) +- check [Vault server configuration](../../../deployment/helm/modules/installation/encryption/vault#minimum-server-configuration) ### Expired AppRole secret ID -- [reset the role secret ID](../vault#set-role-id-and-secret-id-to-the-role) +- [reset the role secret ID](../../../deployment/helm/modules/installation/encryption/vault#set-role-id-and-secret-id-to-the-role) ### Incorrect CSI driver configuration @@ -81,9 +81,9 @@ This may manifest in: - failure to create a new encrypted volume Resolution: -- obtain a [new valid license](../../../license) +- obtain a [new valid license](../../../support/license) - check the license is for the cluster on which the encrypted volumes are created -- check [encryption-license secret](../deployment#secret-encryption-license) +- check [encryption-license secret](../../../deployment/helm/modules/installation/encryption#secret-encryption-license) ## Typical Rekey Failure reasons If all rekeys in the cluster are failing diff --git a/content/v3/secure/encryption/uninstallation.md b/content/v3/secure/encryption/uninstallation.md deleted file mode 100644 index 9d0997b42e..0000000000 --- a/content/v3/secure/encryption/uninstallation.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -title: "Uninstallation" -linkTitle: "Uninstallation" -weight: 2 -Description: > - Uninstallation ---- - -## Cleanup Kubernetes Worker Hosts - -Login to each worker host and perform these steps: - -__Remove directory */root/.driver-sec*__ - -This directory was created when a CSI driver with Encryption first ran on the host. - -__Remove entry from */root/.ssh/authorized_keys*__ - -This is an entry added when a CSI driver with Encryption first ran on the host. -It ends with `driver-sec`, similarly to: - -``` -ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDGvSWmTL7NORRDPAvtbMbvoHUBLnen9bRtJePbGk1boJ4XK39Qdvo2zFHZ/6t2+dSL7xKo2kcxX3ovj3RyOPuqNCob -5CLYyuIqduooy+eSP8S1i0FbiDHvH/52yHglnGkBb8g8fmoMolYGW7k35mKOEItKlXruP5/hpP0rBDfBfrxe/K4aHicxv6GylP+uTSBjdj7bZrdgRAIlmDyIdvU4oU6L -K9PDW5rufArlrZHaToHXLMbXbqswD08rgFt3tLiXjj2GgvU8ifWYYAeuijMp+hwwE0dYv45EgUNTlXUa7x2STFZrVn8MFkLKjtZ60Qjbb4JoijRpBQ5XEUkW9UoeGbV2 -s+lCpZ2bMkmdda/0UC1ckvyrLkD0yQotb8gafizdX+WrQRE+iqUv/NQ2mrSEHtLgvuvgZ3myFU5chRv498YxglYZsAZUdCQI2hQt+7smjYMaM0V200UT741U9lIlYxza -ocI5t+n01dWeVOCSOH/Q3uXxHKnFvWVZh7m6583R9LfdGfwshsnx4CNz22kp69hzwBPxehR+U/VXkDUWnoQgI8NSPc0fFyU58yLHnl91XT9alz8qrkFK7oggKy5RRX7c -VQrpjsCPCu3fpVjvvwfspVOftbn/sNgY1J3lz0pdgvJ3yQs6pa+DODQyin5Rt//19rIGifPxi/Hk/k49Vw== driver-sec -``` - -It can be removed with `sed -i '/^ssh-rsa .* driver-sec$/d' /root/.ssh/authorized_keys`. - -## Remove Kubernetes Resources - -Remove [the resources](../deployment#secrets-and-config-maps) created in Kubernetes cluster for Encryption. - -## Remove Vault Server Configuration - -Remove [the configuration](../vault#minimum-server-configuration) created in the Vault server for Encryption. - -## Remove Rekey Controller - -Remove [the resources](../rekey#rekey-controller-installation) created during the installation of the Rekey Controller. diff --git a/content/v3/secure/encryption/vault.md b/content/v3/secure/encryption/vault.md deleted file mode 100644 index 362b959dcf..0000000000 --- a/content/v3/secure/encryption/vault.md +++ /dev/null @@ -1,244 +0,0 @@ ---- -title: "Vault Configuration" -linkTitle: "Vault Configuration" -weight: 3 -Description: > - Configuration requirements for Vault server ---- - -## Vault Server Installation - -If there is already a Vault server available, skip to [Minimum Server Configuration](#minimum-server-configuration). - -If there is no Vault server available to use with Encryption, it can be installed in many ways following [Hashicorp Vault documentation](https://www.vaultproject.io/docs). - -For testing environment, however, a simple deployment suggested in this section may suffice. -It creates a standalone server with in-memory (non-persistent) storage, running in a Docker container. - -> **NOTE**: With in-memory storage, the encryption keys are permanently destroyed upon the server termination. - -### Generate TLS certificates for server and client - -Create server CA private key and certificate: - -```shell -openssl req -x509 -sha256 -days 365 -newkey rsa:2048 -nodes \ - -subj "/CN=Vault Root CA" \ - -keyout server-ca.key \ - -out server-ca.crt -``` - -Create server private key and CSR: - -```shell -openssl req -newkey rsa:2048 -nodes \ - -subj "/CN=vault-demo-server" \ - -keyout server.key \ - -out server.csr -``` - -Create server certificate signed by the CA: - -> Replace `` with an IP address by which Encryption can reach the Vault server. -This may be the address of the Docker host where the Vault server will be running. -The same address should be used for `vault_addr` in [vault-client-conf](../deployment#configmap-vault-client-conf). - -```shell -cat > cert.ext < -EOF - -openssl x509 -req \ - -CA server-ca.crt -CAkey server-ca.key \ - -in server.csr \ - -out server.crt \ - -days 365 \ - -extfile cert.ext \ - -CAcreateserial - -cat server-ca.crt >> server.crt -``` - -Create client CA private key and certificate: - -```shell -openssl req -x509 -sha256 -days 365 -newkey rsa:2048 -nodes \ - -subj "/CN=Client Root CA" \ - -keyout client-ca.key \ - -out client-ca.crt -``` - -Create client private key and CSR: - -```shell -openssl req -newkey rsa:2048 -nodes \ - -subj "/CN=vault-client" \ - -keyout client.key \ - -out client.csr -``` - -Create client certificate signed by the CA: - -```shell -cat > cert.ext <> client.crt -``` - -### Create server hcl file - -```shell -cat >server.hcl < Variable `CONF_DIR` below refers to the directory containing files *server.crt*, *server.key*, *client-ca.crt* and *server.hcl*. -```shell -VOL_DIR="$CONF_DIR" -VOL_DIR_D="/var/vault" -ROOT_TOKEN="DemoRootToken" -VAULT_IMG="vault:1.9.3" - -docker run --rm -d \ - --name="vault-server" \ - -p 8200:8200 -p 8400:8400 \ - -v $VOL_DIR:$VOL_DIR_D -w $VOL_DIR_D \ - -e VAULT_DEV_ROOT_TOKEN_ID=$ROOT_TOKEN \ - -e VAULT_ADDR="http://127.0.0.1:8200" \ - -e VAULT_TOKEN=$ROOT_TOKEN \ - $VAULT_IMG \ - sh -c 'vault server -dev -dev-listen-address 0.0.0.0:8200 -config=server.hcl' -``` - -## Minimum Server Configuration - -> **NOTE:** this configuration is a bare minimum to support Encryption and is not intended for use in production environment. -Refer to the [Hashicorp Vault documentation](https://www.vaultproject.io/docs) for recommended configuration options. - -> If a [test instance of Vault](#vault-server-installation) is used, the `vault` commands below can be executed in the Vault server container shell. -> To enter the shell, run `docker exec -it vault-server sh`. After completing the configuration process, exit the shell by typing `exit`. -> -> Alternatively, you can [download the vault binary](https://www.vaultproject.io/downloads) and run it anywhere. -> It will require two environment variables to communicate with the Vault server: -> - `VAULT_ADDR` - URL similar to `http://127.0.0.1:8200`. You may need to change the address in the URL to the address of -the Docker host where the server is running. -> - `VAULT_TOKEN` - Authentication token, e.g. the root token `DemoRootToken` used in the [test instance of Vault](#vault-server-installation). - -### Enable Key/Value secret engine - -```shell -vault secrets enable -version=2 -path=dea-keys/ kv -vault write /dea-keys/config cas_required=true max_versions=1 -``` - -Key/Value secret engine is used to store encryption keys. Each encryption key is represented by a key-value entry. - -### Enable AppRole authentication - -```shell -vault auth enable approle -``` - -### Create a role - -```shell -vault write auth/approle/role/dea-role \ - secret_id_ttl=28d \ - token_num_uses=0 \ - token_ttl=1h \ - token_max_ttl=1h \ - token_explicit_max_ttl=10d \ - secret_id_num_uses=0 -``` - -TTL values here are chosen arbitrarily and can be changed to desired values. - -### Create and assign a token policy to the role - -```shell -vault policy write dea-policy - < Secret ID has an expiration time after which it becomes invalid resulting in [authorization failure](../troubleshooting#expired-approle-secret-id). -> The expiration time for new secret IDs can be set in `secret_id_ttl` parameter when [the role is created](#create-a-role) or later on using -> `vault write auth/approle/role/dea-role/secret-id-ttl secret_id_ttl=24h`. - -## Token TTL Considerations - -Effective client token TTL is determined by the Vault server based on multiple factors which are described in the [Vault documentation](https://www.vaultproject.io/docs/concepts/tokens#token-time-to-live-periodic-tokens-and-explicit-max-ttls). - -With the default server settings, role level values control TTL in this way: - -`token_explicit_max_ttl=2h` - limits the client token TTL to 2 hours since it was originally issues as a result of login. This is a hard limit. - -`token_ttl=30m` - sets the default client token TTL to 30 minutes. 30 minutes are counted from the login time and from any following token renewal. -The client token will only be able to renew 3 times before reaching it total allowed TTL of 2 hours. - -Existing role values can be changed using `vault write auth/approle/role/dea-role token_ttl=30m token_explicit_max_ttl=2h`. - -> Selecting too short TTL values will result in excessive overhead in Encryption to remain authenticated to the Vault server. diff --git a/content/v3/securitypolicy/_index.md b/content/v3/securitypolicy/_index.md deleted file mode 100644 index 06223eb64f..0000000000 --- a/content/v3/securitypolicy/_index.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: "Security Policy" -linkTitle: "Security Policy" -weight: 13 -Description: > - Dell Container Storage Modules (CSM) Security Policy ---- - -# Reporting Security Issues/Vulnerabilities - -The Dell Container Storage Modules team and community take security bugs seriously. We sincerely appreciate all your efforts and responsibility to disclose your findings. - -To report a security issue, please submit the security advisory form ["Report a Vulnerability"](https://github.com/dell/csm/security/advisories/new). - ->CSM recommends staying on the [latest release](https://github.com/dell/csm/releases/latest) of Dell Container Storage Modules to take advantage of new features, enhancements, bug fixes, and security fixes. diff --git a/content/v3/support/_index.md b/content/v3/support/_index.md index 54535f32f8..1cea4e05c9 100644 --- a/content/v3/support/_index.md +++ b/content/v3/support/_index.md @@ -5,7 +5,19 @@ weight: 13 Description: > Dell Container Storage Modules (CSM) support --- - +### Where can I get support ? For all your support needs or to follow the latest ongoing discussions and updates, join our Slack group. Click [Here](http://del.ly/Slack_request) to request your invite. -You can also interact with us on [GitHub](https://github.com/dell/csm) by creating a [GitHub Issue](https://github.com/dell/csm/issues). \ No newline at end of file +You can also interact with us on [GitHub](https://github.com/dell/csm) by creating a [GitHub Issue](https://github.com/dell/csm/issues). + +If you have a support contract for a Dell Storage Backend that has a CSI Driver you can open a service request on [https://dell.com/support](https://dell.com/support) and select the **CSI Driver** product. + + +### How to report Security Issues or Vulnerabilities ? + +The Dell Container Storage Modules team and community take security bugs seriously. We sincerely appreciate all your efforts and responsibility to disclose your findings. + +To report a security issue, please submit the security advisory form ["Report a Vulnerability"](https://github.com/dell/csm/security/advisories/new). + +>CSM recommends staying on the [latest release](https://github.com/dell/csm/releases/latest) of Dell Container Storage Modules to take advantage of new features, enhancements, bug fixes, and security fixes. + diff --git a/content/v3/csidriver/installation/test/certcsi.md b/content/v3/support/cert-csi/_index.md similarity index 86% rename from content/v3/csidriver/installation/test/certcsi.md rename to content/v3/support/cert-csi/_index.md index f50dd2c52b..6479d95a06 100644 --- a/content/v3/csidriver/installation/test/certcsi.md +++ b/content/v3/support/cert-csi/_index.md @@ -1,10 +1,19 @@ --- title: Cert-CSI linktitle: Cert-CSI +weight: 3 description: Tool to validate Dell CSI Drivers --- -Cert-CSI is a tool to validate Dell CSI Drivers. It contains various test suites to validate the drivers. +Dell's Cert-CSI is a tool to validate Dell CSI Drivers. It contains various test suites to validate the drivers and addresses the complexity involved with certifiying Dell CSI drivers in different customer environments. + +Any orchestrator platform, operating system or version that is not mentioned in the support matrix but self-certified by the customer using cert-csi is supported for customer use. + +## Qualify and Submit Test Results + +You may qualify your environment for Dell CSI Drivers by executing the [Run All Test Suites](#run-all-test-suites) workflow. + +Please submit your test results for our review [here](https://github.com/dell/csm/issues/new?assignees=&labels=type%2Fqualification&projects=&template=community_qualification.yml&title=%5BQualification%5D%3A+). If the results are a success, the orchestrator platform and version will be published under Community Qualified Configurations. ## Installation @@ -22,7 +31,7 @@ There are three methods of installing `cert-csi`. 1. Download the latest release of the cert-csi zip file. ```bash -wget https://github.com/dell/cert-csi/releases/download/v1.3.1/cert-csi-linux-amd64 +wget https://github.com/dell/cert-csi/releases/download/v1.4.1/cert-csi-linux-amd64 ``` 2. Set the execute permission before running it. @@ -49,17 +58,17 @@ mv ./cert-csi-linux-amd64 ~/.local/bin/cert-csi ### Pull The Container Image {{< tabpane name="pulling-cert-csi-image" lang="bash">}} - {{< tab header="Docker" >}} + {{}} - docker pull dellemc/cert-csi:v1.3.1 + docker pull dellemc/cert-csi:v1.4.1 - {{< /tab >}} - {{< tab header="Podman" >}} + {{}} + {{}} - podman pull dellemc/cert-csi:v1.3.1 - - {{< /tab >}} - {{< /tabpane >}} + podman pull dellemc/cert-csi:v1.4.1 + + {{}} + {{< /tabpane>}} ### Building Locally #### Prerequisites @@ -70,24 +79,24 @@ mv ./cert-csi-linux-amd64 ~/.local/bin/cert-csi 1. Clone the repository ```bash -git clone -b "v1.3.1" https://github.com/dell/cert-csi.git && cd cert-csi +git clone -b "v1.4.1" https://github.com/dell/cert-csi.git && cd cert-csi ``` 2. Build cert-csi {{< tabpane name="build-cert-csi" lang="bash">}} -{{< tab header="Executable" >}} +{{}} make build # the cert-csi executable will be in the working directory chmod +x ./cert-csi # if building on *nix machine -{{< /tab >}} -{{< tab header="Container Image" >}} +{{}} +{{}} # uses podman if available, otherwise uses docker. The resulting image is tagged cert-csi:latest make docker -{{< /tab >}} +{{}} {{< /tabpane >}} ### Optional @@ -101,16 +110,22 @@ make install-ms ## Running Cert-CSI {{< tabpane name="running-cert-csi" lang="bash">}} -{{< tab header="Executable" >}} +{{}} + cert-csi --help -{{< /tab >}} -{{< tab header="Docker" >}} - docker run --rm -it -v ~/.kube/config:/root/.kube/config dellemc/cert-csi:v1.3.1 --help -{{< /tab >}} -{{< tab header="Podman" >}} - podman run --rm -it -v ~/.kube/config:/root/.kube/config dellemc/cert-csi:v1.3.1 --help - -{{< /tab >}} + +{{}} +{{}} + + docker run --rm -it -v ~/.kube/config:/root/.kube/config dellemc/cert-csi:v1.4.1 --help + +{{}} +{{}} + + podman run --rm -it -v ~/.kube/config:/root/.kube/config dellemc/cert-csi:v1.4.1 --help + + +{{}} {{< /tabpane >}} > The following sections showing how to execute the various test suites use the executable for brevity. For executions requiring special behavior, such as mounting file arguments into the container image, it will be noted for the relevant command. @@ -126,7 +141,7 @@ make install-ms You can use cert-csi to launch a test run against multiple storage classes to check if the driver adheres to advertised capabilities. -### Preparing Config +#### Preparing Config To run the test suites you need to provide `.yaml` config with storage classes and their capabilities. You can use `example-certify-config.yaml` as an example. @@ -151,7 +166,7 @@ storageClasses: volumeAttributes: # volume attrs for EphemeralVolumeSuite. attr1: # volume attr for EphemeralVolumeSuite attr2: # volume attr for EphemeralVolumeSuite - capacityTracking: # capacityTracking test requires the storage class to have volume binding mode as 'WaitForFirstConsumer' + capacityTracking: driverNamespace: # namepsace where driver is installed pollInterval: # duration to poll capacity (e.g., 2m) ``` @@ -159,7 +174,7 @@ storageClasses: Driver specific examples: {{< tabpane name="cerity-config-examples" lang="yaml">}} - {{< tab header="CSI PowerFlex" >}} + {{}} storageClasses: - name: vxflexos @@ -197,8 +212,9 @@ storageClasses: driverNamespace: powerstore pollInterval: 2m - {{< /tab >}} - {{< tab header="CSI PowerScale" >}} + {{}} + {{}} + storageClasses: - name: isilon @@ -218,11 +234,10 @@ storageClasses: IsiPath: "/ifs/data/sample" IsiVolumePathPermissions: "0777" AzServiceIP: "192.168.2.1" - capacityTracking: - driverNamespace: isilon - pollInterval: 2m - {{< /tab >}} - {{< tab header="CSI PowerMax" >}} + + + {{}} + {{}} storageClasses: - name: powermax-iscsi @@ -246,9 +261,10 @@ storageClasses: driverNamespace: powerstore pollInterval: 2m - {{< /tab >}} - {{< tab header="CSI PowerStore" >}} + {{}} + + {{}} storageClasses: - name: powerstore @@ -285,8 +301,9 @@ storageClasses: driverNamespace: powerstore pollInterval: 2m - {{< /tab >}} - {{< tab header="CSI Unity" >}} + + {{}} + {{}} storageClasses: - name: unity-iscsi @@ -326,10 +343,10 @@ storageClasses: driverNamespace: unity pollInterval: 2m - {{< /tab >}} + {{}} {{< /tabpane >}} -### Launching Test Run +#### Launching Test Run 1. Executes the [VolumeIO](#volume-io) suite. 2. Executes the [Scaling](#scalability) suite. 3. If `storageClasses.clone` is `true`, executes the [Volume Cloning](#volume-cloning) suite. @@ -346,7 +363,7 @@ storageClasses: > NOTE: For testing/debugging purposes, it can be useful to use the `--no-cleanup` so resources do not get deleted. -> NOTE: If you are using CSI PowerScale with [SmartQuotas](../../../features/powerscale/#usage-of-smartquotas-to-limit-storage-consumption) disabled, the `Volume Expansion` suite is expected to timeout due to the way PowerScale provisions storage. Set `storageClasses.expansion` to `false` to skip this suite. +> NOTE: If you are using CSI PowerScale with [SmartQuotas](../../csidriver/features/powerscale/#usage-of-smartquotas-to-limit-storage-consumption) disabled, the `Volume Expansion` suite is expected to timeout due to the way PowerScale provisions storage. Set `storageClasses.expansion` to `false` to skip this suite. ```bash cert-csi certify --cert-config --vsc @@ -365,16 +382,19 @@ Run `cert-csi certify -h` for more options. If you are using the container image, the `cert-config` file must be mounted into the container. Assuming your `cert-config` file is `/home/user/example-certify-config.yaml`, here are examples of how to exeucte this suite with the container image. {{< tabpane name="running-container-certify" lang="bash">}} -{{< tab header="Docker" >}} - docker run --rm -it -v ~/.kube/config:/root/.kube/config -v /home/user/example-certify-config.yaml:/example-certify-config.yaml dellemc/cert-csi:v1.3.1 certify --cert-config /example-certify-config.yaml --vsc -{{< /tab >}} -{{< tab header="Podman" >}} - podman run --rm -it -v ~/.kube/config:/root/.kube/config -v /home/user/example-certify-config.yaml:/example-certify-config.yaml dellemc/cert-csi:v1.3.1 certify --cert-config /example-certify-config.yaml --vsc +{{}} + + docker run --rm -it -v ~/.kube/config:/root/.kube/config -v /home/user/example-certify-config.yaml:/example-certify-config.yaml dellemc/cert-csi:v1.4.1 certify --cert-config /example-certify-config.yaml --vsc +{{}} +{{}} -{{< /tab >}} + podman run --rm -it -v ~/.kube/config:/root/.kube/config -v /home/user/example-certify-config.yaml:/example-certify-config.yaml dellemc/cert-csi:v1.4.1 certify --cert-config /example-certify-config.yaml --vsc + + +{{}} {{< /tabpane >}} -### Running Invidual Test Suites +## Running Individual Test Suites > NOTE: For testing/debugging purposes, it can useful to use the `--no-cleanup` flag so resources do not get deleted. @@ -499,7 +519,7 @@ Run `cert-csi test clone-volume -h` for more options. > Raw block volumes cannot be verified since there is no filesystem. -> If you are using CSI PowerScale with [SmartQuotas](../../../features/powerscale/#usage-of-smartquotas-to-limit-storage-consumption) disabled, the `Volume Expansion` suite is expected to timeout due to the way PowerScale provisions storage. +> If you are using CSI PowerScale with [SmartQuotas](../../csidriver/features/powerscale/#usage-of-smartquotas-to-limit-storage-consumption) disabled, the `Volume Expansion` suite is expected to timeout due to the way PowerScale provisions storage. ```bash cert-csi test expansion --sc @@ -559,58 +579,57 @@ Run `cert-csi test ephemeral-volume -h` for more options. If you are using the container image, the `attr` file must be mounted into the container. Assuming your `attr` file is `/home/user/ephemeral-config.properties`, here are examples of how to exeucte this suite with the container image. {{< tabpane name="running-container-ephemeral-volume" lang="bash">}} -{{< tab header="Docker" >}} - docker run --rm -it -v ~/.kube/config:/root/.kube/config -v /home/user/ephemeral-config.properties:/ephemeral-config.properties dellemc/cert-csi:v1.3.1 test ephemeral-volume --driver --attr /ephemeral-config.properties -{{< /tab >}} -{{< tab header="Podman" >}} - podman run --rm -it -v ~/.kube/config:/root/.kube/config -v /home/user/ephemeral-config.properties:/ephemeral-config.properties dellemc/cert-csi:v1.3.1 test ephemeral-volume --driver --attr /ephemeral-config.properties +{{}} + docker run --rm -it -v ~/.kube/config:/root/.kube/config -v /home/user/ephemeral-config.properties:/ephemeral-config.properties dellemc/cert-csi:v1.4.1 test ephemeral-volume --driver --attr /ephemeral-config.properties +{{}} +{{}} + podman run --rm -it -v ~/.kube/config:/root/.kube/config -v /home/user/ephemeral-config.properties:/ephemeral-config.properties dellemc/cert-csi:v1.4.1 test ephemeral-volume --driver --attr /ephemeral-config.properties -{{< /tab >}} +{{}} {{< /tabpane >}} Sample ephemeral-config.properties (key/value pair) {{< tabpane name="volume-attributes-examples" lang="yaml">}} - {{< tab header="CSI PowerFlex" >}} - - volumeName=my-ephemeral-vol - size=10Gi - storagepool=sample - systemID=sample - - {{< /tab >}} - {{< tab header="CSI PowerScale" >}} - - size=10Gi - ClusterName=sample - AccessZone=sample - IsiPath=/ifs/data/sample - IsiVolumePathPermissions=0777 - AzServiceIP=192.168.2.1 - - {{< /tab >}} - {{< tab header="CSI PowerStore" >}} - - size=10Gi - arrayID=sample - nasName=sample - nfsAcls=0777 - - {{< /tab >}} - {{< tab header="CSI Unity" >}} - - size=10Gi - arrayId=sample - protocol=iSCSI - thinProvisioned=true - isDataReductionEnabled=false - tieringPolicy=1 - storagePool=pool_2 - nasName=sample - - {{< /tab >}} + {{}} + + volumeName: "my-ephemeral-vol" + size: "10Gi" + storagepool: "sample" + systemID: "sample" + + {{}} + {{}} + + size: "10Gi" + ClusterName: "sample" + AccessZone: "sample" + IsiPath: "/ifs/data/sample" + IsiVolumePathPermissions: "0777" + AzServiceIP: "192.168.2.1" + + {{}} + {{}} + + size: "10Gi" + arrayID: "sample" + nasName: "sample" + nfsAcls: "0777" + + {{}} + {{}} + + size: "10Gi" + arrayID: "sample" + protocol: iSCSI + thinProvisioned: "true" + isDataReductionEnabled: "false" + tieringPolicy: "1" + storagePool: pool_2 + nasName: "sample" + + {{}} {{< /tabpane >}} - #### Storage Capacity Tracking 1. Creates namespace `functional-test` where resources will be created. 2. Creates a duplicate of the provided storge class using prefix `capacity-tracking`. @@ -766,41 +785,41 @@ cert-csi test --sc <...> --sh ./hooks/start.sh --rh ### Running provisioning test -![img1](../img/unifiedTest.png) +![img1](./img/unifiedTest.png) You can interrupt the application by sending an interruption signal (for example pressing Ctrl + C). It will stop polling and try to cleanup resources. -![img2](../img/interruptTest.png) +![img2](./img/interruptTest.png) ### Running scaling test -![img3](../img/scaling.PNG) +![img3](./img/scaling.PNG) ### Listing available test runs -![img4](../img/listRuns.png) +![img4](./img/listRuns.png) ### Running longevity mode -![img5](../img/longevity.png) +![img5](./img/longevity.png) ### Multi DB Tabular report example -![img6](../img/multiDBTabularReport.png) +![img6](./img/multiDBTabularReport.png) Text report example -![img7](../img/textReport.png) +![img7](./img/textReport.png) Tabular Report example -![img9](../img/tabularReport.png) +![img9](./img/tabularReport.png) ### HTML report example -![img8](../img/HTMLReport.png) +![img8](./img/HTMLReport.png) ### Resource usage example chart -![img9](../img/resourceUsage.png) +![img9](./img/resourceUsage.png) diff --git a/content/v3/csidriver/installation/test/img/HTMLReport.png b/content/v3/support/cert-csi/img/HTMLReport.png similarity index 100% rename from content/v3/csidriver/installation/test/img/HTMLReport.png rename to content/v3/support/cert-csi/img/HTMLReport.png diff --git a/content/v3/csidriver/installation/test/img/interruptTest.png b/content/v3/support/cert-csi/img/interruptTest.png similarity index 100% rename from content/v3/csidriver/installation/test/img/interruptTest.png rename to content/v3/support/cert-csi/img/interruptTest.png diff --git a/content/v3/csidriver/installation/test/img/listRuns.png b/content/v3/support/cert-csi/img/listRuns.png similarity index 100% rename from content/v3/csidriver/installation/test/img/listRuns.png rename to content/v3/support/cert-csi/img/listRuns.png diff --git a/content/v3/csidriver/installation/test/img/longevity.png b/content/v3/support/cert-csi/img/longevity.png similarity index 100% rename from content/v3/csidriver/installation/test/img/longevity.png rename to content/v3/support/cert-csi/img/longevity.png diff --git a/content/v3/csidriver/installation/test/img/multiDBTabularReport.png b/content/v3/support/cert-csi/img/multiDBTabularReport.png similarity index 100% rename from content/v3/csidriver/installation/test/img/multiDBTabularReport.png rename to content/v3/support/cert-csi/img/multiDBTabularReport.png diff --git a/content/v3/csidriver/installation/test/img/resourceUsage.png b/content/v3/support/cert-csi/img/resourceUsage.png similarity index 100% rename from content/v3/csidriver/installation/test/img/resourceUsage.png rename to content/v3/support/cert-csi/img/resourceUsage.png diff --git a/content/v3/csidriver/installation/test/img/scaling.PNG b/content/v3/support/cert-csi/img/scaling.PNG similarity index 100% rename from content/v3/csidriver/installation/test/img/scaling.PNG rename to content/v3/support/cert-csi/img/scaling.PNG diff --git a/content/v3/csidriver/installation/test/img/tabularReport.png b/content/v3/support/cert-csi/img/tabularReport.png similarity index 100% rename from content/v3/csidriver/installation/test/img/tabularReport.png rename to content/v3/support/cert-csi/img/tabularReport.png diff --git a/content/v3/csidriver/installation/test/img/textReport.png b/content/v3/support/cert-csi/img/textReport.png similarity index 100% rename from content/v3/csidriver/installation/test/img/textReport.png rename to content/v3/support/cert-csi/img/textReport.png diff --git a/content/v3/csidriver/installation/test/img/unifiedTest.png b/content/v3/support/cert-csi/img/unifiedTest.png similarity index 100% rename from content/v3/csidriver/installation/test/img/unifiedTest.png rename to content/v3/support/cert-csi/img/unifiedTest.png diff --git a/content/v3/support/cert-csi/qualified.md b/content/v3/support/cert-csi/qualified.md new file mode 100644 index 0000000000..48b50e526d --- /dev/null +++ b/content/v3/support/cert-csi/qualified.md @@ -0,0 +1,14 @@ +--- +title: Community Qualified Configurations +linktitle: Community Qualified Configurations +description: Community Qualified Configurations +--- + +{{}} +| cert-csi results | OS | CO | Storage Platform | Protocol | CSM | +|--------------------------------------------------------|:----------:|:----------------:|:-----------------------:|:---------:|:----------:| +| [Ticket 1079](https://github.com/dell/csm/issues/1079) | Debian 10 | K3s v1.24.7+k3s1 | Unity VSA 5.3.1.0.5.008 | iSCSI | CSI v2.8.0 | +| [Ticket 1177](https://github.com/dell/csm/issues/1177) | Ubuntu OS 22.04 | Amazon EKS (K8s 1.29) | PowerFlex | SCINI | CSI v2.9.2 | +| [Ticket 1361](https://github.com/dell/csm/issues/1361) | RHCOS 4.12 | OpenShift 4.12 | PowerStore | iSCSI| CSI v2.8.0 | +| [Ticket 1362](https://github.com/dell/csm/issues/1362) | RHCOS 4.12 | OpenShift 4.12 | PowerScale | NFS | CSI v2.8.0 | +{{
    }} diff --git a/content/v3/references/cli/_index.md b/content/v3/support/cli/_index.md similarity index 99% rename from content/v3/references/cli/_index.md rename to content/v3/support/cli/_index.md index f27b4925cf..d2dc3763e0 100644 --- a/content/v3/references/cli/_index.md +++ b/content/v3/support/cli/_index.md @@ -1,7 +1,7 @@ --- title: "CLI" linkTitle: "CLI" -weight: 1 +weight: 4 Description: > CLI for Dell Container Storage Modules (CSM) --- diff --git a/content/v3/references/contributionguidelines/_index.md b/content/v3/support/contributionguidelines/_index.md similarity index 99% rename from content/v3/references/contributionguidelines/_index.md rename to content/v3/support/contributionguidelines/_index.md index 427bd231af..633c8c6977 100644 --- a/content/v3/references/contributionguidelines/_index.md +++ b/content/v3/support/contributionguidelines/_index.md @@ -1,7 +1,7 @@ --- title: "Contribution Guidelines" linkTitle: "Contribution Guidelines" -weight: 3 +weight: 5 Description: > Dell Technologies (Dell) Container Storage Modules (CSM) docs Contribution Guidelines --- diff --git a/content/v3/references/policies/deprecationpolicy/_index.md b/content/v3/support/deprecationpolicy/_index.md similarity index 99% rename from content/v3/references/policies/deprecationpolicy/_index.md rename to content/v3/support/deprecationpolicy/_index.md index 19a4783ba1..c21a1d5fab 100644 --- a/content/v3/references/policies/deprecationpolicy/_index.md +++ b/content/v3/support/deprecationpolicy/_index.md @@ -1,7 +1,7 @@ --- title: "Deprecation Policy" linkTitle: "Deprecation Policy" -weight: 1 +weight: 4 Description: > Dell Technologies (Dell) Container Storage Modules (CSM) Deprecation Policy --- diff --git a/content/v3/references/learn/_index.md b/content/v3/support/learn/_index.md similarity index 95% rename from content/v3/references/learn/_index.md rename to content/v3/support/learn/_index.md index 51dcf458c4..482e079410 100644 --- a/content/v3/references/learn/_index.md +++ b/content/v3/support/learn/_index.md @@ -1,7 +1,7 @@ --- -title: Learn +title: Learn more about CSM Description: Blogs and Youtube videos for CSM -weight: 2 +weight: 7 --- You can learn more and engage with the CSM community over different channels by: * Reading the official [blogs](https://infohub.delltechnologies.com/t/blogs-99/) and [white paper](https://infohub.delltechnologies.com/t/persistent-storage-for-containerized-applications-on-kubernetes-with-powermax-san-storage-13/) are on [https://infohub.delltechnologies.com/](https://infohub.delltechnologies.com/) diff --git a/content/v3/license/_index.md b/content/v3/support/license/_index.md similarity index 78% rename from content/v3/license/_index.md rename to content/v3/support/license/_index.md index ec7bd9d734..ff7f42c290 100644 --- a/content/v3/license/_index.md +++ b/content/v3/support/license/_index.md @@ -1,11 +1,15 @@ --- title: "License" linkTitle: "License" -weight: 12 +weight: 6 Description: > - Dell Container Storage Modules (CSM) License + Obtain trial License for Tech-preview of Dell Container Storage Modules (CSM) --- +{{% pageinfo color="primary" %}} +Application Mobility is available with [APEX Navigator for Kubernetes](https://www.dell.com/en-ca/dt/apex/storage/public-cloud/navigator.htm#kubernetes) for US-based customers. Trial licenses for Application Mobility will not be issued for US-based customers. +{{% /pageinfo %}} + The tech-preview releases of [Container Storage Modules](https://github.com/dell/csm) for Application Mobility and Encryption require a license. This section details how to request a license. ## Requesting a License diff --git a/content/v3/support/release/_index.md b/content/v3/support/release/_index.md new file mode 100644 index 0000000000..e17a6c86f0 --- /dev/null +++ b/content/v3/support/release/_index.md @@ -0,0 +1,27 @@ +--- +title: "Release notes" +linkTitle: "Release notes" +weight: 1 +Description: > + Dell Container Storage Modules (CSM) release notes +--- + +Release notes for Container Storage Modules: + +[CSI Drivers](../../csidriver/release) + +[CSM for Authorization](../../authorization/release) + +[CSM for Observability](../../observability/release) + +[CSM for Replication](../../replication/release) + +[CSM for Resiliency](../../resiliency/release) + +[CSM for Encryption](../../secure/encryption/release) + +[CSM for Application Mobility](../../applicationmobility/release) + +[CSM Operator](../../deployment/csmoperator/release) + +[CSM Installation Wizard](../../deployment/csminstallationwizard/release) diff --git a/content/v3/support/troubleshooting/_index.md b/content/v3/support/troubleshooting/_index.md new file mode 100644 index 0000000000..c987433b32 --- /dev/null +++ b/content/v3/support/troubleshooting/_index.md @@ -0,0 +1,25 @@ +--- +title: "Troubleshooting" +linkTitle: "Troubleshooting" +weight: 2 +Description: > + Dell Container Storage Modules (CSM) troubleshooting information +--- + +Troubleshooting links for Container Storage Modules: + +[CSI Drivers](../../csidriver/troubleshooting) + +[CSM for Authorization](../../authorization/troubleshooting) + +[CSM for Observability](../../observability/troubleshooting) + +[CSM for Replication](../../replication/troubleshooting) + +[CSM for Resiliency](../../resiliency/troubleshooting) + +[CSM for Encryption](../../secure/encryption/troubleshooting) + +[CSM for Application Mobility](../../applicationmobility/troubleshooting) + +[CSM Operator](../../deployment/csmoperator/troubleshooting) \ No newline at end of file diff --git a/content/v3/troubleshooting/_index.md b/content/v3/troubleshooting/_index.md deleted file mode 100644 index 07e9260af6..0000000000 --- a/content/v3/troubleshooting/_index.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: "Troubleshooting" -linkTitle: "Troubleshooting" -weight: 11 -Description: > - Dell Container Storage Modules (CSM) troubleshooting information ---- - -Troubleshooting links for Container Storage Modules: - -[CSI Drivers](../csidriver/troubleshooting) - -[CSM for Authorization](../authorization/troubleshooting) - -[CSM for Observability](../observability/troubleshooting) - -[CSM for Replication](../replication/troubleshooting) - -[CSM for Resiliency](../resiliency/troubleshooting) - -[CSM for Encryption](../secure/encryption/troubleshooting) - -[CSM for Application Mobility](../applicationmobility/troubleshooting) - -[CSM Operator](../deployment/csmoperator/troubleshooting) \ No newline at end of file From 66365823ca4cdf6fd3fcd4cdb6e6fdc65b75155a Mon Sep 17 00:00:00 2001 From: Anand Raja Kesavamoorthy Date: Fri, 15 Nov 2024 18:21:55 +0000 Subject: [PATCH 2/3] Updated hugo setup file --- hugo.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/hugo.toml b/hugo.toml index 1b8a0c0d38..15dfa01896 100644 --- a/hugo.toml +++ b/hugo.toml @@ -176,19 +176,19 @@ algolia_docsearch = false # icon = "fa fa-envelope" # desc = "Discuss development issues around the project" [[params.versions]] - version = "Current(v1.12.0)" + version = "Current(v1.13.0)" url = "https://dell.github.io/csm-docs/docs/" [[params.versions]] - version = "v1.11.1" + version = "v1.12.0" url = "https://dell.github.io/csm-docs/v1" [[params.versions]] - version = "v1.10.2" + version = "v1.11.1" url = "https://dell.github.io/csm-docs/v2" [[params.versions]] - version = "v1.9.4" + version = "v1.10.2" url = "https://dell.github.io/csm-docs/v3" [[menu.main]] From 4f8c5d17b3d070beed55a2dd3aa068bd091af350 Mon Sep 17 00:00:00 2001 From: Anand Raja Kesavamoorthy Date: Fri, 15 Nov 2024 18:40:46 +0000 Subject: [PATCH 3/3] Cherry picked PR 1364, 1365, 1358 --- content/v1/deployment/csmoperator/drivers/powermax.md | 1 - .../v1/deployment/helm/drivers/installation/powerflex.md | 2 +- content/v1/support/cert-csi/_index.md | 6 ++++-- content/v2/deployment/csmoperator/drivers/powermax.md | 1 - .../v2/deployment/helm/drivers/installation/powerflex.md | 2 +- content/v2/support/cert-csi/_index.md | 6 ++++-- content/v3/deployment/csmoperator/drivers/powermax.md | 1 - .../v3/deployment/helm/drivers/installation/powerflex.md | 2 +- content/v3/support/cert-csi/_index.md | 6 ++++-- 9 files changed, 15 insertions(+), 12 deletions(-) diff --git a/content/v1/deployment/csmoperator/drivers/powermax.md b/content/v1/deployment/csmoperator/drivers/powermax.md index f82afe862e..147852bfbe 100644 --- a/content/v1/deployment/csmoperator/drivers/powermax.md +++ b/content/v1/deployment/csmoperator/drivers/powermax.md @@ -50,7 +50,6 @@ Use a tool such as `openssl` to generate this secret using the example below: ```bash openssl genrsa -out tls.key 2048 openssl req -new -x509 -sha256 -key tls.key -out tls.crt -days 3650 -kubectl create secret -n tls revproxy-certs --cert=tls.crt --key=tls.key kubectl create secret -n tls csirevproxy-tls-secret --cert=tls.crt --key=tls.key ``` diff --git a/content/v1/deployment/helm/drivers/installation/powerflex.md b/content/v1/deployment/helm/drivers/installation/powerflex.md index 269851b0a7..193a9342f0 100644 --- a/content/v1/deployment/helm/drivers/installation/powerflex.md +++ b/content/v1/deployment/helm/drivers/installation/powerflex.md @@ -96,7 +96,7 @@ Note that the namespace can be any user-defined name that follows the convention | skipCertificateValidation | Determines if the driver is going to validate certs while connecting to PowerFlex REST API interface. | true | true | | isDefault | An array having isDefault=true is for backward compatibility. This parameter should occur once in the list. | false | false | | mdm | mdm defines the MDM(s) that SDC should register with on start. This should be a list of MDM IP addresses or hostnames separated by comma. | true | - | - | nasName | nasName defines what NAS should be used for NFS volumes. NFS volumes are supported on arrays version >=4.0.x | false | "" | + | nasName | nasName defines what NAS should be used for NFS volumes. NFS volumes are supported on arrays version >=4.0.x | true | "" | Example: `samples/secret.yaml` diff --git a/content/v1/support/cert-csi/_index.md b/content/v1/support/cert-csi/_index.md index f8dc760a52..c0ce114ad8 100644 --- a/content/v1/support/cert-csi/_index.md +++ b/content/v1/support/cert-csi/_index.md @@ -155,7 +155,7 @@ storageClasses: volumeAttributes: # volume attrs for EphemeralVolumeSuite. attr1: # volume attr for EphemeralVolumeSuite attr2: # volume attr for EphemeralVolumeSuite - capacityTracking: + capacityTracking: # capacityTracking test requires the storage class to have volume binding mode as 'WaitForFirstConsumer' driverNamespace: # namepsace where driver is installed pollInterval: # duration to poll capacity (e.g., 2m) ``` @@ -223,7 +223,9 @@ storageClasses: IsiPath: "/ifs/data/sample" IsiVolumePathPermissions: "0777" AzServiceIP: "192.168.2.1" - + capacityTracking: + driverNamespace: isilon + pollInterval: 2m {{}} {{}} diff --git a/content/v2/deployment/csmoperator/drivers/powermax.md b/content/v2/deployment/csmoperator/drivers/powermax.md index b58c84cee5..d840670ccc 100644 --- a/content/v2/deployment/csmoperator/drivers/powermax.md +++ b/content/v2/deployment/csmoperator/drivers/powermax.md @@ -219,7 +219,6 @@ Use a tool such as `openssl` to generate this secret using the example below: ```bash openssl genrsa -out tls.key 2048 openssl req -new -x509 -sha256 -key tls.key -out tls.crt -days 3650 -kubectl create secret -n tls revproxy-certs --cert=tls.crt --key=tls.key kubectl create secret -n tls csirevproxy-tls-secret --cert=tls.crt --key=tls.key ``` diff --git a/content/v2/deployment/helm/drivers/installation/powerflex.md b/content/v2/deployment/helm/drivers/installation/powerflex.md index 7113d19ddd..af3bb57340 100644 --- a/content/v2/deployment/helm/drivers/installation/powerflex.md +++ b/content/v2/deployment/helm/drivers/installation/powerflex.md @@ -93,7 +93,7 @@ Note that the namespace can be any user-defined name that follows the convention | skipCertificateValidation | Determines if the driver is going to validate certs while connecting to PowerFlex REST API interface. | true | true | | isDefault | An array having isDefault=true is for backward compatibility. This parameter should occur once in the list. | false | false | | mdm | mdm defines the MDM(s) that SDC should register with on start. This should be a list of MDM IP addresses or hostnames separated by comma. | true | - | - | nasName | nasName defines what NAS should be used for NFS volumes. NFS volumes are supported on arrays version >=4.0.x | false | "" | + | nasName | nasName defines what NAS should be used for NFS volumes. NFS volumes are supported on arrays version >=4.0.x | true | "" | Example: `samples/secret.yaml` diff --git a/content/v2/support/cert-csi/_index.md b/content/v2/support/cert-csi/_index.md index ed856c5815..7ed95db101 100644 --- a/content/v2/support/cert-csi/_index.md +++ b/content/v2/support/cert-csi/_index.md @@ -159,7 +159,7 @@ storageClasses: volumeAttributes: # volume attrs for EphemeralVolumeSuite. attr1: # volume attr for EphemeralVolumeSuite attr2: # volume attr for EphemeralVolumeSuite - capacityTracking: + capacityTracking: # capacityTracking test requires the storage class to have volume binding mode as 'WaitForFirstConsumer' driverNamespace: # namepsace where driver is installed pollInterval: # duration to poll capacity (e.g., 2m) ``` @@ -227,7 +227,9 @@ storageClasses: IsiPath: "/ifs/data/sample" IsiVolumePathPermissions: "0777" AzServiceIP: "192.168.2.1" - + capacityTracking: + driverNamespace: isilon + pollInterval: 2m {{}} {{}} diff --git a/content/v3/deployment/csmoperator/drivers/powermax.md b/content/v3/deployment/csmoperator/drivers/powermax.md index c8afbabfcc..ae999717d9 100644 --- a/content/v3/deployment/csmoperator/drivers/powermax.md +++ b/content/v3/deployment/csmoperator/drivers/powermax.md @@ -197,7 +197,6 @@ Use a tool such as `openssl` to generate this secret using the example below: ```bash openssl genrsa -out tls.key 2048 openssl req -new -x509 -sha256 -key tls.key -out tls.crt -days 3650 -kubectl create secret -n tls revproxy-certs --cert=tls.crt --key=tls.key kubectl create secret -n tls csirevproxy-tls-secret --cert=tls.crt --key=tls.key ``` diff --git a/content/v3/deployment/helm/drivers/installation/powerflex.md b/content/v3/deployment/helm/drivers/installation/powerflex.md index ddad908371..6d410649b1 100644 --- a/content/v3/deployment/helm/drivers/installation/powerflex.md +++ b/content/v3/deployment/helm/drivers/installation/powerflex.md @@ -93,7 +93,7 @@ Note that the namespace can be any user-defined name that follows the convention | skipCertificateValidation | Determines if the driver is going to validate certs while connecting to PowerFlex REST API interface. | true | true | | isDefault | An array having isDefault=true is for backward compatibility. This parameter should occur once in the list. | false | false | | mdm | mdm defines the MDM(s) that SDC should register with on start. This should be a list of MDM IP addresses or hostnames separated by comma. | true | - | - | nasName | nasName defines what NAS should be used for NFS volumes. NFS volumes are supported on arrays version >=4.0.x | false | "" | + | nasName | nasName defines what NAS should be used for NFS volumes. NFS volumes are supported on arrays version >=4.0.x | true | "" | Example: `samples/secret.yaml` diff --git a/content/v3/support/cert-csi/_index.md b/content/v3/support/cert-csi/_index.md index 6479d95a06..c4d89338c6 100644 --- a/content/v3/support/cert-csi/_index.md +++ b/content/v3/support/cert-csi/_index.md @@ -166,7 +166,7 @@ storageClasses: volumeAttributes: # volume attrs for EphemeralVolumeSuite. attr1: # volume attr for EphemeralVolumeSuite attr2: # volume attr for EphemeralVolumeSuite - capacityTracking: + capacityTracking: # capacityTracking test requires the storage class to have volume binding mode as 'WaitForFirstConsumer' driverNamespace: # namepsace where driver is installed pollInterval: # duration to poll capacity (e.g., 2m) ``` @@ -234,7 +234,9 @@ storageClasses: IsiPath: "/ifs/data/sample" IsiVolumePathPermissions: "0777" AzServiceIP: "192.168.2.1" - + capacityTracking: + driverNamespace: isilon + pollInterval: 2m {{}} {{}}