Repository: rook/rook
Pull request #13670 (2024-02-01 17:12:35)

ci: check for gofmt usage in golangci-lint
This is needed because not all contributors may be using gomft to format source code, and this could result in inconsistent usage over time.

<!-- Thank you for contributing to Rook! -->

<!-- STEPS TO FOLLOW:
  1. Add a description of the changes (frequently the same as the commit description)
  2. Enter the issue number next to "Resolves #" below (if there is no tracking issue resolved, **remove that section**)
  3. Review our Contributing documentation at https://rook.io/docs/rook/latest/Contributing/development-flow/
  4. Follow the steps in the checklist below, starting with the **Commit Message Formatting**.
-->

<!-- Uncomment this section with the issue number if an issue is being resolved
**Issue resolved by this Pull Request:**
Resolves #
--->

**Checklist:**

- [ ] **Commit Message Formatting**: Commit titles and messages follow guidelines in the [developer guide](https://rook.io/docs/rook/latest/Contributing/development-flow/#commit-structure).
- [ ] Reviewed the developer guide on [Submitting a Pull Request](https://rook.io/docs/rook/latest/Contributing/development-flow/#submitting-a-pull-request)
- [ ] [Pending release notes](https://github.com/rook/rook/blob/master/PendingReleaseNotes.md) updated with breaking and/or notable changes for the next minor release.
- [ ] Documentation has been updated, if necessary.
- [ ] Unit tests have been added, if necessary.
- [ ] Integration tests have been added, if necessary.



Patch:
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index 305df966b..f733ea842 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -7,10 +7,8 @@
   4. Follow the steps in the checklist below, starting with the **Commit Message Formatting**.
 -->
 
-<!-- Uncomment this section with the issue number if an issue is being resolved
-**Issue resolved by this Pull Request:**
+**Which issue is resolved by this Pull Request:**
 Resolves #
---->
 
 **Checklist:**
 
diff --git a/.github/workflows/encryption-pvc-kms-ibm-kp/action.yml b/.github/workflows/encryption-pvc-kms-ibm-kp/action.yml
index 33ae0ceba..5c842014f 100644
--- a/.github/workflows/encryption-pvc-kms-ibm-kp/action.yml
+++ b/.github/workflows/encryption-pvc-kms-ibm-kp/action.yml
@@ -7,6 +7,9 @@ inputs:
   ibm-service-api-key:
     description: IBM_KP_SERVICE_API_KEY from the calling workflow
     required: true
+  github-token:
+    description: GITHUB_TOKEN from the calling workflow
+    required: true
 
 runs:
   using: "composite"
@@ -21,10 +24,8 @@ runs:
 
     - name: setup cluster resources
       uses: ./.github/workflows/canary-test-config
-
-    - name: set Ceph version in CephCluster manifest
-      shell: bash --noprofile --norc -eo pipefail -x {0}
-      run: tests/scripts/github-action-helper.sh replace_ceph_image  "deploy/examples/cluster-test.yaml" "${{ github.event.inputs.ceph-image }}"
+      with:
+        github-token: ${{ inputs.github-token }}
 
     - name: use local disk and create partitions for osds
       shell: bash --noprofile --norc -eo pipefail -x {0}
diff --git a/.github/workflows/golangci-lint.yaml b/.github/workflows/golangci-lint.yaml
index 706d95ba2..73dab46ef 100644
--- a/.github/workflows/golangci-lint.yaml
+++ b/.github/workflows/golangci-lint.yaml
@@ -40,7 +40,10 @@ jobs:
           # working-directory: somedir
 
           # Optional: golangci-lint command line arguments.
-          args: -E gosec --timeout=10m
+          args: -E gosec -E gofmt --timeout=10m
+
+          # actions/setup-go already handles caching
+          skip-cache: true
 
           # Optional: show only new issues if it's a pull request. The default value is `false`.
           # only-new-issues: true
diff --git a/CODE-OWNERS b/CODE-OWNERS
index 80f23271b..e108711a9 100644
--- a/CODE-OWNERS
+++ b/CODE-OWNERS
@@ -10,7 +10,7 @@ approvers:
 - leseb
 - satoru-takeuchi
 - subhamkrai
-- sp98
 reviewers:
 - Madhu-1
+- sp98
 - parth-gr
diff --git a/Documentation/CRDs/Cluster/ceph-cluster-crd.md b/Documentation/CRDs/Cluster/ceph-cluster-crd.md
index 865c9278b..f53a20fd4 100755
--- a/Documentation/CRDs/Cluster/ceph-cluster-crd.md
+++ b/Documentation/CRDs/Cluster/ceph-cluster-crd.md
@@ -61,7 +61,7 @@ For more details on the mons and when to choose a number other than `3`, see the
 	updates the label `mgr_role` on the mgr pods to be either `active` or `standby`. Therefore, services need just to add the label
     `mgr_role=active` to their selector to point to the active mgr. This applies to all services that rely on the ceph mgr such as
 	the dashboard or the prometheus metrics collector.
-    * `modules`: A list of Ceph manager modules to enable or disable. Note the "dashboard" and "monitoring" modules are already configured by other settings.
+    * `modules`: is the list of Ceph manager modules to enable
 * `crashCollector`: The settings for crash collector daemon(s).
     * `disable`: is set to `true`, the crash collector will not run on any node where a Ceph daemon runs
     * `daysToRetain`: specifies the number of days to keep crash entries in the Ceph cluster. By default the entries are kept indefinitely.
diff --git a/Documentation/Getting-Started/Prerequisites/prerequisites.md b/Documentation/Getting-Started/Prerequisites/prerequisites.md
index 8f21c0d5e..aaa7e0f0c 100644
--- a/Documentation/Getting-Started/Prerequisites/prerequisites.md
+++ b/Documentation/Getting-Started/Prerequisites/prerequisites.md
@@ -5,9 +5,9 @@ title: Prerequisites
 Rook can be installed on any existing Kubernetes cluster as long as it meets the minimum version
 and Rook is granted the required privileges (see below for more information).
 
-## Kubernetes Version
+## Minimum Version
 
-Kubernetes versions **v1.23** through **v1.29** are supported.
+Kubernetes **v1.22** or higher is supported.
 
 ## CPU Architecture
 
diff --git a/Documentation/Getting-Started/quickstart.md b/Documentation/Getting-Started/quickstart.md
index 2e4bdd610..e598c41e6 100644
--- a/Documentation/Getting-Started/quickstart.md
+++ b/Documentation/Getting-Started/quickstart.md
@@ -10,9 +10,9 @@ This guide will walk through the basic setup of a Ceph cluster and enable K8s ap
 
 **Always use a virtual machine when testing Rook. Never use a host system where local devices may mistakenly be consumed.**
 
-## Kubernetes Version
+## Minimum Version
 
-Kubernetes versions **v1.23** through **v1.29** are supported.
+Kubernetes **v1.22** or higher is supported by Rook.
 
 ## CPU Architecture
 
diff --git a/Documentation/Helm-Charts/ceph-cluster-chart.md b/Documentation/Helm-Charts/ceph-cluster-chart.md
index 0f17dbd81..3d7e323f7 100644
--- a/Documentation/Helm-Charts/ceph-cluster-chart.md
+++ b/Documentation/Helm-Charts/ceph-cluster-chart.md
@@ -69,7 +69,6 @@ The following table lists the configurable parameters of the rook-operator chart
 | `cephObjectStores` | A list of CephObjectStore configurations to deploy | See [below](#ceph-object-stores) |
 | `clusterName` | The metadata.name of the CephCluster CR | The same as the namespace |
 | `configOverride` | Cluster ceph.conf override | `nil` |
-| `csiDriverNamePrefix` | CSI driver name prefix for cephfs, rbd and nfs. | `namespace name where rook-ceph operator is deployed` |
 | `ingress.dashboard` | Enable an ingress for the ceph-dashboard | `{}` |
 | `kubeVersion` | Optional override of the target kubernetes version | `nil` |
 | `monitoring.createPrometheusRules` | Whether to create the Prometheus rules for Ceph alerts | `false` |
diff --git a/Documentation/Helm-Charts/operator-chart.md b/Documentation/Helm-Charts/operator-chart.md
index c9f9439f8..ec825d8dd 100644
--- a/Documentation/Helm-Charts/operator-chart.md
+++ b/Documentation/Helm-Charts/operator-chart.md
@@ -70,10 +70,6 @@ The following table lists the configurable parameters of the rook-operator chart
 | `csi.csiCephFSPluginVolume` | The volume of the CephCSI CephFS plugin DaemonSet | `nil` |
 | `csi.csiCephFSPluginVolumeMount` | The volume mounts of the CephCSI CephFS plugin DaemonSet | `nil` |
 | `csi.csiCephFSProvisionerResource` | CEPH CSI CephFS provisioner resource requirement list | see values.yaml |
-| `csi.csiDriverNamePrefix` | CSI driver name prefix for cephfs, rbd and nfs. | `namespace name where rook-ceph operator is deployed` |
-| `csi.csiLeaderElectionLeaseDuration` | Duration in seconds that non-leader candidates will wait to force acquire leadership. | `137s` |
-| `csi.csiLeaderElectionRenewDeadline` | Deadline in seconds that the acting leader will retry refreshing leadership before giving up. | `107s` |
-| `csi.csiLeaderElectionRetryPeriod` | Retry period in seconds the LeaderElector clients should wait between tries of actions. | `26s` |
 | `csi.csiNFSPluginResource` | CEPH CSI NFS plugin resource requirement list | see values.yaml |
 | `csi.csiNFSProvisionerResource` | CEPH CSI NFS provisioner resource requirement list | see values.yaml |
 | `csi.csiRBDPluginResource` | CEPH CSI RBD plugin resource requirement list | see values.yaml |
@@ -104,7 +100,7 @@ The following table lists the configurable parameters of the rook-operator chart
 | `csi.pluginNodeAffinity` | The node labels for affinity of the CephCSI RBD plugin DaemonSet [^1] | `nil` |
 | `csi.pluginPriorityClassName` | PriorityClassName to be set on csi driver plugin pods | `"system-node-critical"` |
 | `csi.pluginTolerations` | Array of tolerations in YAML format which will be added to CephCSI plugin DaemonSet | `nil` |
-| `csi.provisioner.image` | Kubernetes CSI provisioner image | `registry.k8s.io/sig-storage/csi-provisioner:v3.6.3` |
+| `csi.provisioner.image` | Kubernetes CSI provisioner image | `registry.k8s.io/sig-storage/csi-provisioner:v3.6.2` |
 | `csi.provisionerNodeAffinity` | The node labels for affinity of the CSI provisioner deployment [^1] | `nil` |
 | `csi.provisionerPriorityClassName` | PriorityClassName to be set on csi driver provisioner pods | `"system-cluster-critical"` |
 | `csi.provisionerReplicas` | Set replicas for csi provisioner deployment | `2` |
@@ -151,7 +147,7 @@ The following table lists the configurable parameters of the rook-operator chart
 | `pspEnable` | If true, create & use PSP resources | `false` |
 | `rbacAggregate.enableOBCs` | If true, create a ClusterRole aggregated to [user facing roles](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#user-facing-roles) for objectbucketclaims | `false` |
 | `rbacEnable` | If true, create & use RBAC resources | `true` |
-| `resources` | Pod resource requests & limits | `{"limits":{"cpu":"1500m","memory":"512Mi"},"requests":{"cpu":"200m","memory":"128Mi"}}` |
+| `resources` | Pod resource requests & limits | `{"limits":{"cpu":"500m","memory":"512Mi"},"requests":{"cpu":"100m","memory":"128Mi"}}` |
 | `scaleDownOperator` | If true, scale down the rook operator. This is useful for administrative actions where the rook operator must be scaled down, while using gitops style tooling to deploy your helm charts. | `false` |
 | `tolerations` | List of Kubernetes [`tolerations`](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/) to add to the Deployment. | `[]` |
 | `unreachableNodeTolerationSeconds` | Delay to use for the `node.kubernetes.io/unreachable` pod failure toleration to override the Kubernetes default of 5 minutes | `5` |
diff --git a/Documentation/Storage-Configuration/Advanced/ceph-configuration.md b/Documentation/Storage-Configuration/Advanced/ceph-configuration.md
index 86a0d4048..92a0db0a2 100644
--- a/Documentation/Storage-Configuration/Advanced/ceph-configuration.md
+++ b/Documentation/Storage-Configuration/Advanced/ceph-configuration.md
@@ -45,6 +45,7 @@ sed -i.bak \
     -e "s/\(.*\):.*# namespace:cluster/\1: $ROOK_CLUSTER_NAMESPACE # namespace:cluster/g" \
     -e "s/\(.*serviceaccount\):.*:\(.*\) # serviceaccount:namespace:operator/\1:$ROOK_OPERATOR_NAMESPACE:\2 # serviceaccount:namespace:operator/g" \
     -e "s/\(.*serviceaccount\):.*:\(.*\) # serviceaccount:namespace:cluster/\1:$ROOK_CLUSTER_NAMESPACE:\2 # serviceaccount:namespace:cluster/g" \
+    -e "s/\(.*\): [-_A-Za-z0-9]*\.\(.*\) # driver:namespace:operator/\1: $ROOK_OPERATOR_NAMESPACE.\2 # driver:namespace:operator/g" \
     -e "s/\(.*\): [-_A-Za-z0-9]*\.\(.*\) # driver:namespace:cluster/\1: $ROOK_CLUSTER_NAMESPACE.\2 # driver:namespace:cluster/g" \
   common.yaml operator.yaml cluster.yaml # add other files or change these as desired for your config
 
@@ -52,10 +53,6 @@ sed -i.bak \
 kubectl apply -f common.yaml -f operator.yaml -f cluster.yaml # add other files as desired for yourconfig
 ```
 
-Also see the CSI driver
-[documentation](../Ceph-CSI/ceph-csi-drivers.md#Configure-CSI-Drivers-in-non-default-namespace)
-to update the csi provisioner names in the storageclass and volumesnapshotclass.
-
 ## Deploying a second cluster
 
 If you wish to create a new CephCluster in a separate namespace, you can easily do so
diff --git a/Documentation/Storage-Configuration/Ceph-CSI/ceph-csi-drivers.md b/Documentation/Storage-Configuration/Ceph-CSI/ceph-csi-drivers.md
index 89b24a4bd..fd8a79f25 100644
--- a/Documentation/Storage-Configuration/Ceph-CSI/ceph-csi-drivers.md
+++ b/Documentation/Storage-Configuration/Ceph-CSI/ceph-csi-drivers.md
@@ -35,59 +35,6 @@ example, if the Rook operator is running in the namespace `my-namespace` the
 provisioner value should be `my-namespace.rbd.csi.ceph.com`. The same provisioner
 name must be set in both the storageclass and snapshotclass.
 
-To find the provisioner name in the example storageclasses and
-volumesnapshotclass, search for: `# csi-provisioner-name`
-
-### Configure custom Driver name prefix for CSI Drivers
-
-To use a custom prefix for the CSI drivers instead of the namespace prefix, set
-the `CSI_DRIVER_NAME_PREFIX` environment variable in the operator configmap.
-For instance, to use the prefix `my-prefix` for the CSI drivers, set
-the following in the operator configmap:
-
-```console
-kubectl patch cm rook-ceph-operator-config -n rook-ceph -p $'data:\n "CSI_DRIVER_NAME_PREFIX": "my-prefix"'
-```
-
-Once the configmap is updated, the CSI drivers will be deployed with the
-`my-prefix` prefix. The same prefix must be set in both the storageclass and
-snapshotclass. For example, to use the prefix `my-prefix` for the
-CSI drivers, update the provisioner in the storageclass:
-
-```yaml
-apiVersion: storage.k8s.io/v1
-kind: StorageClass
-metadata:
-  name: rook-ceph-block-sc
-provisioner: my-prefix.rbd.csi.ceph.com
-...
-```
-
-The same prefix must be set in the volumesnapshotclass as well:
-
-```yaml
-apiVersion: snapshot.storage.k8s.io/v1
-kind: VolumeSnapshotClass
-metadata:
-  name: rook-ceph-block-vsc
-driver: my-prefix.rbd.csi.ceph.com
-...
-```
-
-When the prefix is set, the driver names will be:
-
-* RBD: `my-prefix.rbd.csi.ceph.com`
-* CephFS: `my-prefix.cephfs.csi.ceph.com`
-* NFS: `my-prefix.nfs.csi.ceph.com`
-
-!!! note
-    Please be careful when setting the `CSI_DRIVER_NAME_PREFIX`
-    environment variable. It should be done only in fresh deployments because
-    changing the prefix in an existing cluster will result in unexpected behavior.
-
-To find the provisioner name in the example storageclasses and
-volumesnapshotclass, search for: `# csi-provisioner-name`
-
 ## Liveness Sidecar
 
 All CSI pods are deployed with a sidecar container that provides a Prometheus
@@ -169,6 +116,7 @@ Refer to the [ephemeral-doc](https://kubernetes.io/docs/concepts/storage/ephemer
 See example manifests for an [RBD ephemeral volume](https://github.com/rook/rook/tree/master/deploy/examples/csi/rbd/pod-ephemeral.yaml)
 and a [CephFS ephemeral volume](https://github.com/rook/rook/tree/master/deploy/examples/csi/cephfs/pod-ephemeral.yaml).
 
+
 ## CSI-Addons Controller
 
 The CSI-Addons Controller handles requests from users. Users create a CR
diff --git a/Documentation/Storage-Configuration/Ceph-CSI/custom-images.md b/Documentation/Storage-Configuration/Ceph-CSI/custom-images.md
index 67bc50084..cf805fe30 100644
--- a/Documentation/Storage-Configuration/Ceph-CSI/custom-images.md
+++ b/Documentation/Storage-Configuration/Ceph-CSI/custom-images.md
@@ -20,7 +20,7 @@ The default upstream images are included below, which you can change to your des
 ```yaml
 ROOK_CSI_CEPH_IMAGE: "quay.io/cephcsi/cephcsi:v3.10.1"
 ROOK_CSI_REGISTRAR_IMAGE: "registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.9.1"
-ROOK_CSI_PROVISIONER_IMAGE: "registry.k8s.io/sig-storage/csi-provisioner:v3.6.3"
+ROOK_CSI_PROVISIONER_IMAGE: "registry.k8s.io/sig-storage/csi-provisioner:v3.6.2"
 ROOK_CSI_ATTACHER_IMAGE: "registry.k8s.io/sig-storage/csi-attacher:v4.4.2"
 ROOK_CSI_RESIZER_IMAGE: "registry.k8s.io/sig-storage/csi-resizer:v1.9.2"
 ROOK_CSI_SNAPSHOTTER_IMAGE: "registry.k8s.io/sig-storage/csi-snapshotter:v6.3.2"
diff --git a/OWNERS.md b/OWNERS.md
index 6f73e73a1..518fe44e7 100644
--- a/OWNERS.md
+++ b/OWNERS.md
@@ -25,7 +25,6 @@ Maintainers will be added according to the [process for adding a maintainer](GOV
 * Blaine Gardner <blaine.gardner@redhat.com> ([BlaineEXE](https://github.com/BlaineEXE))
 * Satoru Takeuchi <satoru.takeuchi@gmail.com> ([satoru-takeuchi](https://github.com/satoru-takeuchi))
 * Subham Rai <srai@redhat.com> ([subhamkrai](https://github.com/subhamkrai))
-* Santosh Pillai <sapillai@redhat.com> ([sp98](https://github.com/sp98))
 
 ## Emeritus maintainers
 
diff --git a/build/release/Makefile b/build/release/Makefile
index 667d94569..6c9011d63 100644
--- a/build/release/Makefile
+++ b/build/release/Makefile
@@ -216,7 +216,7 @@ help:
 	@echo ''
 	@echo 'Options:'
 	@echo '    VERSION      Sets the release version.'
-	@echo '    BRANCH_NAME  Name of the branch we are releasing from.'
+	@echo '    BRANCH_NAME  Name of the branch we're releasing from.'
 	@echo '    CHANNEL      Sets the release channel. Can be set to master,'
 	@echo '                 or release. Default is not set.'
 	@echo '    PLATFORMS    The supported platforms to build when running.'
diff --git a/deploy/charts/library/templates/_cluster-role.tpl b/deploy/charts/library/templates/_cluster-role.tpl
index fd79b7ce9..9b55da79a 100644
--- a/deploy/charts/library/templates/_cluster-role.tpl
+++ b/deploy/charts/library/templates/_cluster-role.tpl
@@ -12,7 +12,7 @@ rules:
   # validating the connection details and for key rotation operations.
   - apiGroups: [""]
     resources: ["secrets"]
-    verbs: ["get", "update"]
+    verbs: ["get","update"]
   - apiGroups: [""]
     resources: ["configmaps"]
     verbs: ["get", "list", "watch", "create", "update", "delete"]
@@ -141,10 +141,10 @@ rules:
     verbs: ["get"]
   - apiGroups: ["apps"]
     resources: ["deployments"]
-    verbs: ["get", "delete"]
+    verbs: ["get", "delete" ]
   - apiGroups: ["batch"]
     resources: ["jobs"]
-    verbs: ["get", "list", "delete"]
+    verbs: ["get", "list", "delete" ]
   - apiGroups: [""]
     resources: ["persistentvolumeclaims"]
     verbs: ["get", "update", "delete", "list"]
diff --git a/deploy/charts/rook-ceph-cluster/templates/cephblockpool.yaml b/deploy/charts/rook-ceph-cluster/templates/cephblockpool.yaml
index 23008111d..0efb69cdf 100644
--- a/deploy/charts/rook-ceph-cluster/templates/cephblockpool.yaml
+++ b/deploy/charts/rook-ceph-cluster/templates/cephblockpool.yaml
@@ -16,11 +16,7 @@ metadata:
   name: {{ $blockpool.storageClass.name }}
   annotations:
     storageclass.kubernetes.io/is-default-class: "{{ if default false $blockpool.storageClass.isDefault }}true{{ else }}false{{ end }}"
-{{- if $root.Values.csiDriverNamePrefix }}
-provisioner: {{ $root.Values.csiDriverNamePrefix }}.rbd.csi.ceph.com
-{{- else }}
 provisioner: {{ $root.Values.operatorNamespace }}.rbd.csi.ceph.com
-{{- end }}
 parameters:
   pool: {{ $blockpool.name }}
   clusterID: {{ $root.Release.Namespace }}
diff --git a/deploy/charts/rook-ceph-cluster/templates/cephecblockpool.yaml b/deploy/charts/rook-ceph-cluster/templates/cephecblockpool.yaml
index 85581f5cd..97ae8d1d4 100644
--- a/deploy/charts/rook-ceph-cluster/templates/cephecblockpool.yaml
+++ b/deploy/charts/rook-ceph-cluster/templates/cephecblockpool.yaml
@@ -16,11 +16,7 @@ apiVersion: storage.k8s.io/v1
 kind: StorageClass
 metadata:
   name: {{ $cephEcStorage.name }}
-{{- if $root.Values.csiDriverNamePrefix }}
-provisioner: {{ $root.Values.csiDriverNamePrefix }}.rbd.csi.ceph.com
-{{- else }}
-provisioner: {{ $root.Values.operatorNamespace }}.rbd.csi.ceph.com
-{{- end }}
+provisioner: {{ $cephEcStorage.provisioner }}
 parameters:
   clusterID: {{ $cephEcStorage.parameters.clusterID }}
   dataPool: {{ $cephEcStorage.parameters.dataPool }}
diff --git a/deploy/charts/rook-ceph-cluster/templates/cephfilesystem.yaml b/deploy/charts/rook-ceph-cluster/templates/cephfilesystem.yaml
index 35c6e7200..adbf45dda 100644
--- a/deploy/charts/rook-ceph-cluster/templates/cephfilesystem.yaml
+++ b/deploy/charts/rook-ceph-cluster/templates/cephfilesystem.yaml
@@ -35,11 +35,7 @@ metadata:
   name: {{ $filesystem.storageClass.name }}
   annotations:
     storageclass.kubernetes.io/is-default-class: "{{ if default false $filesystem.storageClass.isDefault }}true{{ else }}false{{ end }}"
-{{- if $root.Values.csiDriverNamePrefix }}
-provisioner: {{ $root.Values.csiDriverNamePrefix }}.cephfs.csi.ceph.com
-{{- else }}
 provisioner: {{ $root.Values.operatorNamespace }}.cephfs.csi.ceph.com
-{{- end }}
 parameters:
   fsName: {{ $filesystem.name }}
   pool: {{ $filesystem.name }}-{{ default "data0" $filesystem.storageClass.pool }}
diff --git a/deploy/charts/rook-ceph-cluster/templates/deployment.yaml b/deploy/charts/rook-ceph-cluster/templates/deployment.yaml
index b785da650..2cf51157c 100644
--- a/deploy/charts/rook-ceph-cluster/templates/deployment.yaml
+++ b/deploy/charts/rook-ceph-cluster/templates/deployment.yaml
@@ -86,6 +86,7 @@ spec:
               # create the keyring file
               cat <<EOF > ${KEYRING_FILE}
               [${ROOK_CEPH_USERNAME}]
+              key = ${ROOK_CEPH_SECRET}
               key = ${ceph_secret}
               EOF
 
@@ -126,8 +127,8 @@ spec:
           configMap:
             name: rook-ceph-mon-endpoints
             items:
-            - key: data
-              path: mon-endpoints
+                - key: data
+                  path: mon-endpoints
         - name: ceph-config
           emptyDir: {}
       tolerations:
diff --git a/deploy/charts/rook-ceph-cluster/templates/volumesnapshotclass.yaml b/deploy/charts/rook-ceph-cluster/templates/volumesnapshotclass.yaml
index 45b1ba390..5f15c9400 100644
--- a/deploy/charts/rook-ceph-cluster/templates/volumesnapshotclass.yaml
+++ b/deploy/charts/rook-ceph-cluster/templates/volumesnapshotclass.yaml
@@ -1,4 +1,3 @@
-{{- $root := . -}}
 {{- $filesystemvsc := .Values.cephFileSystemVolumeSnapshotClass -}}
 {{- $blockpoolvsc := .Values.cephBlockPoolsVolumeSnapshotClass -}}
 
@@ -17,11 +16,7 @@ metadata:
 {{- if $filesystemvsc.annotations }}
 {{ toYaml $filesystemvsc.annotations | indent 4 }}
 {{- end }}
-{{- if $root.Values.csiDriverNamePrefix }}
-driver: {{ $root.Values.csiDriverNamePrefix }}.cephfs.csi.ceph.com
-{{- else }}
-driver: {{ $root.Values.operatorNamespace }}.cephfs.csi.ceph.com
-{{- end }}
+driver: {{ .Values.operatorNamespace }}.cephfs.csi.ceph.com
 parameters:
   clusterID: {{ .Release.Namespace }}
   csi.storage.k8s.io/snapshotter-secret-name: rook-csi-cephfs-provisioner
@@ -47,11 +42,7 @@ metadata:
 {{- if $blockpoolvsc.annotations }}
 {{ toYaml $blockpoolvsc.annotations | indent 4 }}
 {{- end }}
-{{- if $root.Values.csiDriverNamePrefix }}
-driver: {{ $root.Values.csiDriverNamePrefix }}.rbd.csi.ceph.com
-{{- else }}
-driver: {{ $root.Values.operatorNamespace }}.rbd.csi.ceph.com
-{{- end }}
+driver: {{ .Values.operatorNamespace }}.rbd.csi.ceph.com
 parameters:
   clusterID: {{ .Release.Namespace }}
   csi.storage.k8s.io/snapshotter-secret-name: rook-csi-rbd-provisioner
diff --git a/deploy/charts/rook-ceph-cluster/values.yaml b/deploy/charts/rook-ceph-cluster/values.yaml
index 3953b65b4..addf9ddb1 100644
--- a/deploy/charts/rook-ceph-cluster/values.yaml
+++ b/deploy/charts/rook-ceph-cluster/values.yaml
@@ -647,6 +647,8 @@ cephObjectStores:
 # if cephECBlockPools are uncommented you must remove the comments of cephEcStorageClass as well
 #cephECStorageClass:
 #  name: rook-ceph-block
+#  # Change "rook-ceph" provisioner prefix to match the operator namespace if needed
+#  provisioner: rook-ceph.rbd.csi.ceph.com # driver:namespace:operator
 #  parameters:
 #    # clusterID is the namespace where the rook cluster is running
 #    # If you change this namespace, also change the namespace below where the secret namespaces are defined
@@ -685,7 +687,3 @@ cephObjectStores:
 #    imageFeatures: layering
 #  allowVolumeExpansion: true
 #  reclaimPolicy: Delete
-
-# -- CSI driver name prefix for cephfs, rbd and nfs.
-# @default -- `namespace name where rook-ceph operator is deployed`
-csiDriverNamePrefix:
diff --git a/deploy/charts/rook-ceph/templates/clusterrole.yaml b/deploy/charts/rook-ceph/templates/clusterrole.yaml
index ebcb9ce36..58430cd9b 100644
--- a/deploy/charts/rook-ceph/templates/clusterrole.yaml
+++ b/deploy/charts/rook-ceph/templates/clusterrole.yaml
@@ -406,7 +406,7 @@ metadata:
 rules:
   - apiGroups: [""]
     resources: ["persistentvolumes"]
-    verbs: ["get", "list", "watch", "create", "update", "delete", "patch"]
+    verbs: ["get", "list", "watch", "create", "delete", "patch"]
   - apiGroups: [""]
     resources: ["persistentvolumeclaims"]
     verbs: ["get", "list", "watch", "patch", "update"]
@@ -479,7 +479,7 @@ rules:
     verbs: ["get", "list", "watch"]
   - apiGroups: [""]
     resources: ["persistentvolumes"]
-    verbs: ["get", "list", "watch", "create", "update", "delete", "patch"]
+    verbs: ["get", "list", "watch", "create", "delete", "patch"]
   - apiGroups: [""]
     resources: ["persistentvolumeclaims"]
     verbs: ["get", "list", "watch", "patch", "update"]
@@ -506,7 +506,7 @@ rules:
     verbs: ["get", "list", "watch"]
   - apiGroups: ["snapshot.storage.k8s.io"]
     resources: ["volumesnapshotcontents"]
-    verbs: ["get", "list", "watch", "patch", "update"]
+    verbs: [ "get", "list", "watch", "patch", "update"]
   - apiGroups: ["snapshot.storage.k8s.io"]
     resources: ["volumesnapshotcontents/status"]
     verbs: ["update", "patch"]
@@ -552,7 +552,7 @@ rules:
     verbs: ["get", "list", "watch"]
   - apiGroups: [""]
     resources: ["persistentvolumes"]
-    verbs: ["get", "list", "watch", "create", "update", "delete", "patch"]
+    verbs: ["get", "list", "watch", "create", "delete", "patch"]
   - apiGroups: [""]
     resources: ["persistentvolumeclaims"]
     verbs: ["get", "list", "watch", "update"]
@@ -585,7 +585,7 @@ rules:
     verbs: ["get", "list", "watch"]
   - apiGroups: ["snapshot.storage.k8s.io"]
     resources: ["volumesnapshotcontents"]
-    verbs: ["get", "list", "watch", "patch", "update"]
+    verbs: [ "get", "list", "watch", "patch", "update"]
   - apiGroups: ["snapshot.storage.k8s.io"]
     resources: ["volumesnapshotcontents/status"]
     verbs: ["update", "patch"]
diff --git a/deploy/charts/rook-ceph/templates/configmap.yaml b/deploy/charts/rook-ceph/templates/configmap.yaml
index ee7e48142..2e08a9463 100644
--- a/deploy/charts/rook-ceph/templates/configmap.yaml
+++ b/deploy/charts/rook-ceph/templates/configmap.yaml
@@ -25,9 +25,6 @@ data:
   CSI_ENABLE_OMAP_GENERATOR: {{ .Values.csi.enableOMAPGenerator | quote }}
   CSI_ENABLE_HOST_NETWORK: {{ .Values.csi.enableCSIHostNetwork | quote }}
   CSI_ENABLE_METADATA: {{ .Values.csi.enableMetadata | quote }}
-{{- if .Values.csi.csiDriverNamePrefix }}
-  CSI_DRIVER_NAME_PREFIX: {{ .Values.csi.csiDriverNamePrefix | quote }}
-{{- end }}
 {{- if .Values.csi.pluginPriorityClassName }}
   CSI_PLUGIN_PRIORITY_CLASSNAME: {{ .Values.csi.pluginPriorityClassName | quote }}
 {{- end }}
@@ -64,15 +61,6 @@ data:
 {{- if .Values.csi.kubeletDirPath }}
   ROOK_CSI_KUBELET_DIR_PATH: {{ .Values.csi.kubeletDirPath | quote }}
 {{- end }}
-{{- if .Values.csi.csiLeaderElectionLeaseDuration }}
-  CSI_LEADER_ELECTION_LEASE_DURATION: {{ .Values.csi.csiLeaderElectionLeaseDuration | quote }}
-{{- end }}
-{{- if .Values.csi.csiLeaderElectionRenewDeadline }}
-  CSI_LEADER_ELECTION_RENEW_DEADLINE: {{ .Values.csi.csiLeaderElectionRenewDeadline | quote }}
-{{- end }}
-{{- if .Values.csi.csiLeaderElectionRetryPeriod }}
-  CSI_LEADER_ELECTION_RETRY_PERIOD: {{ .Values.csi.csiLeaderElectionRetryPeriod | quote }}
-{{- end }}
 {{- if .Values.csi.cephcsi }}
 {{- if .Values.csi.cephcsi.image }}
   ROOK_CSI_CEPH_IMAGE: {{ .Values.csi.cephcsi.image | quote }}
@@ -119,7 +107,7 @@ data:
 {{- end }}
 {{- end }}
 {{- if .Values.csi.readAffinity }}
-  CSI_ENABLE_READ_AFFINITY: {{ .Values.csi.readAffinity.enabled | quote }}
+  CSI_ENABLE_READ_AFFINITY : {{ .Values.csi.readAffinity.enabled | quote }}
 {{- if .Values.csi.readAffinity.crushLocationLabels }}
   CSI_CRUSH_LOCATION_LABELS: {{ .Values.csi.readAffinity.crushLocationLabels | join "," }}
 {{- end }}
diff --git a/deploy/charts/rook-ceph/templates/resources.yaml b/deploy/charts/rook-ceph/templates/resources.yaml
index bc4fa1ba0..1d7923c52 100644
--- a/deploy/charts/rook-ceph/templates/resources.yaml
+++ b/deploy/charts/rook-ceph/templates/resources.yaml
@@ -7104,7 +7104,7 @@ spec:
                     activeCount:
                       description: The number of metadata servers that are active.
                       format: int32
-                      maximum: 50
+                      maximum: 10
                       minimum: 1
                       type: integer
                     activeStandby:
diff --git a/deploy/charts/rook-ceph/values.yaml b/deploy/charts/rook-ceph/values.yaml
index 4ca32198b..e06dcc4cd 100644
--- a/deploy/charts/rook-ceph/values.yaml
+++ b/deploy/charts/rook-ceph/values.yaml
@@ -23,10 +23,10 @@ crds:
 # -- Pod resource requests & limits
 resources:
   limits:
-    cpu: 1500m
+    cpu: 500m
     memory: 512Mi
   requests:
-    cpu: 200m
+    cpu: 100m
     memory: 128Mi
 
 # -- Kubernetes [`nodeSelector`](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector) to add to the Deployment.
@@ -147,10 +147,6 @@ csi:
   # @default -- `0`
   sidecarLogLevel:
 
-  # -- CSI driver name prefix for cephfs, rbd and nfs.
-  # @default -- `namespace name where rook-ceph operator is deployed`
-  csiDriverNamePrefix:
-
   # -- CSI RBD plugin daemonset update strategy, supported values are OnDelete and RollingUpdate
   # @default -- `RollingUpdate`
   rbdPluginUpdateStrategy:
@@ -481,18 +477,6 @@ csi:
   # @default -- `/var/lib/kubelet`
   kubeletDirPath:
 
-  # -- Duration in seconds that non-leader candidates will wait to force acquire leadership.
-  # @default -- `137s`
-  csiLeaderElectionLeaseDuration:
-
-  # -- Deadline in seconds that the acting leader will retry refreshing leadership before giving up.
-  # @default -- `107s`
-  csiLeaderElectionRenewDeadline:
-
-  # -- Retry period in seconds the LeaderElector clients should wait between tries of actions.
-  # @default -- `26s`
-  csiLeaderElectionRetryPeriod:
-
   cephcsi:
     # -- Ceph CSI image
     # @default -- `quay.io/cephcsi/cephcsi:v3.10.1`
@@ -505,7 +489,7 @@ csi:
 
   provisioner:
     # -- Kubernetes CSI provisioner image
-    # @default -- `registry.k8s.io/sig-storage/csi-provisioner:v3.6.3`
+    # @default -- `registry.k8s.io/sig-storage/csi-provisioner:v3.6.2`
     image:
 
   snapshotter:
diff --git a/deploy/examples/cluster-on-pvc-minikube.yaml b/deploy/examples/cluster-on-pvc-minikube.yaml
index 96ed9dc72..01bd3f049 100644
--- a/deploy/examples/cluster-on-pvc-minikube.yaml
+++ b/deploy/examples/cluster-on-pvc-minikube.yaml
@@ -1,19 +1,12 @@
 #################################################################################################################
 # Define the settings for the rook-ceph cluster with settings for a minikube cluster with a single node
-#
+
 # This example expects a single node minikube cluster with three extra disks: vdb, vdc and vdd. Please modify
 # it according to your environment. See the documentation for more details on storage settings available.
 
 # For example, to create the cluster:
 #   kubectl create -f crds.yaml -f common.yaml -f operator.yaml
 #   kubectl create -f cluster-on-pvc-minikube.yaml
-#
-# or by using the using the tests/scripts/create-dev-cluster.sh and the following minikube configuration:
-#
-#  --disk-size=20g --extra-disks=4
-#
-# Note: this spec was tested with kvm2 driver. Other minikube drivers could lead to a different device naming.
-#
 #################################################################################################################
 kind: StorageClass
 apiVersion: storage.k8s.io/v1
@@ -97,31 +90,6 @@ spec:
               values:
                 - minikube
 ---
-kind: PersistentVolume
-apiVersion: v1
-metadata:
-  name: local0-3
-spec:
-  storageClassName: local-storage
-  capacity:
-    storage: 20Gi
-  accessModes:
-    - ReadWriteOnce
-  persistentVolumeReclaimPolicy: Retain
-  # PV for mon must be a filesystem volume.
-  volumeMode: Block
-  local:
-    # To use dm devices like logical volume, please replace `/dev/sdb` with their device names like `/dev/vg-name/lv-name`.
-    path: /dev/vde
-  nodeAffinity:
-    required:
-      nodeSelectorTerms:
-        - matchExpressions:
-            - key: kubernetes.io/hostname
-              operator: In
-              values:
-                - minikube
----
 apiVersion: ceph.rook.io/v1
 kind: CephCluster
 metadata:
@@ -156,7 +124,7 @@ spec:
   storage:
     storageClassDeviceSets:
       - name: set1
-        count: 3
+        count: 2
         portable: false
         tuneDeviceClass: true
         tuneFastDeviceClass: false
@@ -188,18 +156,3 @@ spec:
     managePodBudgets: true
     osdMaintenanceTimeout: 30
     pgHealthCheckTimeout: 0
-  cephConfig:
-    global:
-      mon_warn_on_pool_no_redundancy: "false"
----
-apiVersion: ceph.rook.io/v1
-kind: CephBlockPool
-metadata:
-  name: builtin-mgr
-  namespace: rook-ceph # namespace:cluster
-spec:
-  name: .mgr
-  failureDomain: osd
-  replicated:
-    size: 1
-    requireSafeReplicaSize: false
diff --git a/deploy/examples/cluster.yaml b/deploy/examples/cluster.yaml
index 8671af942..f43f1276d 100644
--- a/deploy/examples/cluster.yaml
+++ b/deploy/examples/cluster.yaml
@@ -57,10 +57,10 @@ spec:
     count: 2
     allowMultiplePerNode: false
     modules:
-      # List of modules to optionally enable or disable.
-      # Note the "dashboard" and "monitoring" modules are already configured by other settings in the cluster CR.
-      # - name: rook
-      #   enabled: true
+      # Several modules should not need to be included in this list. The "dashboard" and "monitoring" modules
+      # are already enabled by other settings in the cluster CR.
+      - name: pg_autoscaler
+        enabled: true
   # enable the ceph dashboard for viewing cluster status
   dashboard:
     enabled: true
diff --git a/deploy/examples/common.yaml b/deploy/examples/common.yaml
index dcabb0eeb..565d6ce55 100644
--- a/deploy/examples/common.yaml
+++ b/deploy/examples/common.yaml
@@ -33,7 +33,7 @@ rules:
     verbs: ["get", "list", "watch"]
   - apiGroups: [""]
     resources: ["persistentvolumes"]
-    verbs: ["get", "list", "watch", "create", "update", "delete", "patch"]
+    verbs: ["get", "list", "watch", "create", "delete", "patch"]
   - apiGroups: [""]
     resources: ["persistentvolumeclaims"]
     verbs: ["get", "list", "watch", "patch", "update"]
@@ -125,7 +125,7 @@ rules:
     verbs: ["get", "list", "watch"]
   - apiGroups: [""]
     resources: ["persistentvolumes"]
-    verbs: ["get", "list", "watch", "create", "update", "delete", "patch"]
+    verbs: ["get", "list", "watch", "create", "delete", "patch"]
   - apiGroups: [""]
     resources: ["persistentvolumeclaims"]
     verbs: ["get", "list", "watch", "update"]
diff --git a/deploy/examples/crds.yaml b/deploy/examples/crds.yaml
index 8c0137506..e4297b9e3 100644
--- a/deploy/examples/crds.yaml
+++ b/deploy/examples/crds.yaml
@@ -7099,7 +7099,7 @@ spec:
                     activeCount:
                       description: The number of metadata servers that are active.
                       format: int32
-                      maximum: 50
+                      maximum: 10
                       minimum: 1
                       type: integer
                     activeStandby:
diff --git a/deploy/examples/create-external-cluster-resources.py b/deploy/examples/create-external-cluster-resources.py
index 5ffef28d3..43b1499be 100644
--- a/deploy/examples/create-external-cluster-resources.py
+++ b/deploy/examples/create-external-cluster-resources.py
@@ -99,22 +99,22 @@ class DummyRados(object):
         ) as json_file:
             ceph_status_str = json_file.read()
         self.cmd_names["fs ls"] = """{"format": "json", "prefix": "fs ls"}"""
-        self.cmd_names["quorum_status"] = (
-            """{"format": "json", "prefix": "quorum_status"}"""
-        )
-        self.cmd_names["mgr services"] = (
-            """{"format": "json", "prefix": "mgr services"}"""
-        )
+        self.cmd_names[
+            "quorum_status"
+        ] = """{"format": "json", "prefix": "quorum_status"}"""
+        self.cmd_names[
+            "mgr services"
+        ] = """{"format": "json", "prefix": "mgr services"}"""
         # all the commands and their output
-        self.cmd_output_map[self.cmd_names["fs ls"]] = (
-            """[{"name":"myfs","metadata_pool":"myfs-metadata","metadata_pool_id":2,"data_pool_ids":[3],"data_pools":["myfs-replicated"]}]"""
-        )
-        self.cmd_output_map[self.cmd_names["quorum_status"]] = (
-            """{"election_epoch":3,"quorum":[0],"quorum_names":["a"],"quorum_leader_name":"a","quorum_age":14385,"features":{"quorum_con":"4540138292836696063","quorum_mon":["kraken","luminous","mimic","osdmap-prune","nautilus","octopus"]},"monmap":{"epoch":1,"fsid":"af4e1673-0b72-402d-990a-22d2919d0f1c","modified":"2020-05-07T03:36:39.918035Z","created":"2020-05-07T03:36:39.918035Z","min_mon_release":15,"min_mon_release_name":"octopus","features":{"persistent":["kraken","luminous","mimic","osdmap-prune","nautilus","octopus"],"optional":[]},"mons":[{"rank":0,"name":"a","public_addrs":{"addrvec":[{"type":"v2","addr":"10.110.205.174:3300","nonce":0},{"type":"v1","addr":"10.110.205.174:6789","nonce":0}]},"addr":"10.110.205.174:6789/0","public_addr":"10.110.205.174:6789/0","priority":0,"weight":0}]}}"""
-        )
-        self.cmd_output_map[self.cmd_names["mgr services"]] = (
-            """{"dashboard":"https://ceph-dashboard:8443/","prometheus":"http://ceph-dashboard-db:9283/"}"""
-        )
+        self.cmd_output_map[
+            self.cmd_names["fs ls"]
+        ] = """[{"name":"myfs","metadata_pool":"myfs-metadata","metadata_pool_id":2,"data_pool_ids":[3],"data_pools":["myfs-replicated"]}]"""
+        self.cmd_output_map[
+            self.cmd_names["quorum_status"]
+        ] = """{"election_epoch":3,"quorum":[0],"quorum_names":["a"],"quorum_leader_name":"a","quorum_age":14385,"features":{"quorum_con":"4540138292836696063","quorum_mon":["kraken","luminous","mimic","osdmap-prune","nautilus","octopus"]},"monmap":{"epoch":1,"fsid":"af4e1673-0b72-402d-990a-22d2919d0f1c","modified":"2020-05-07T03:36:39.918035Z","created":"2020-05-07T03:36:39.918035Z","min_mon_release":15,"min_mon_release_name":"octopus","features":{"persistent":["kraken","luminous","mimic","osdmap-prune","nautilus","octopus"],"optional":[]},"mons":[{"rank":0,"name":"a","public_addrs":{"addrvec":[{"type":"v2","addr":"10.110.205.174:3300","nonce":0},{"type":"v1","addr":"10.110.205.174:6789","nonce":0}]},"addr":"10.110.205.174:6789/0","public_addr":"10.110.205.174:6789/0","priority":0,"weight":0}]}}"""
+        self.cmd_output_map[
+            self.cmd_names["mgr services"]
+        ] = """{"dashboard":"https://ceph-dashboard:8443/","prometheus":"http://ceph-dashboard-db:9283/"}"""
         self.cmd_output_map[
             """{"caps": ["mon", "allow r, allow command quorum_status", "osd", "profile rbd-read-only, allow rwx pool=default.rgw.meta, allow r pool=.rgw.root, allow rw pool=default.rgw.control, allow x pool=default.rgw.buckets.index"], "entity": "client.healthchecker", "format": "json", "prefix": "auth get-or-create"}"""
         ] = """[{"entity":"client.healthchecker","key":"AQDFkbNeft5bFRAATndLNUSEKruozxiZi3lrdA==","caps":{"mon":"allow r, allow command quorum_status","osd":"profile rbd-read-only, allow rwx pool=default.rgw.meta, allow r pool=.rgw.root, allow rw pool=default.rgw.control, allow x pool=default.rgw.buckets.index"}}]"""
@@ -142,9 +142,9 @@ class DummyRados(object):
         self.cmd_output_map[
             """{"caps": ["mon", "allow r, allow command quorum_status, allow command version", "mgr", "allow command config", "osd", "profile rbd-read-only, allow rwx pool=default.rgw.meta, allow r pool=.rgw.root, allow rw pool=default.rgw.control, allow rx pool=default.rgw.log, allow x pool=default.rgw.buckets.index"], "entity": "client.healthchecker", "format": "json", "prefix": "auth caps"}"""
         ] = """[{"entity":"client.healthchecker","key":"AQDFkbNeft5bFRAATndLNUSRKruozxiZi3lrdA==","caps":{"mon": "allow r, allow command quorum_status, allow command version", "mgr": "allow command config", "osd": "profile rbd-read-only, allow rwx pool=default.rgw.meta, allow r pool=.rgw.root, allow rw pool=default.rgw.control, allow rx pool=default.rgw.log, allow x pool=default.rgw.buckets.index"}}]"""
-        self.cmd_output_map["""{"format": "json", "prefix": "mgr services"}"""] = (
-            """{"dashboard": "http://rook-ceph-mgr-a-57cf9f84bc-f4jnl:7000/", "prometheus": "http://rook-ceph-mgr-a-57cf9f84bc-f4jnl:9283/"}"""
-        )
+        self.cmd_output_map[
+            """{"format": "json", "prefix": "mgr services"}"""
+        ] = """{"dashboard": "http://rook-ceph-mgr-a-57cf9f84bc-f4jnl:7000/", "prometheus": "http://rook-ceph-mgr-a-57cf9f84bc-f4jnl:9283/"}"""
         self.cmd_output_map[
             """{"entity": "client.healthchecker", "format": "json", "prefix": "auth get"}"""
         ] = """{"dashboard": "http://rook-ceph-mgr-a-57cf9f84bc-f4jnl:7000/", "prometheus": "http://rook-ceph-mgr-a-57cf9f84bc-f4jnl:9283/"}"""
@@ -218,6 +218,7 @@ class DummyRados(object):
 
 
 class S3Auth(AuthBase):
+
     """Attaches AWS Authentication to the given Request object."""
 
     service_base_url = "s3.amazonaws.com"
@@ -322,11 +323,6 @@ class RadosJSON:
             type=str,
             help="Provides a user name to check the cluster's health status, must be prefixed by 'client.'",
         )
-        common_group.add_argument(
-            "--cluster-name",
-            default="",
-            help="Kubernetes cluster name(legacy flag), Note: Either use this or --k8s-cluster-name",
-        )
         common_group.add_argument(
             "--k8s-cluster-name", default="", help="Kubernetes cluster name"
         )
@@ -958,9 +954,9 @@ class RadosJSON:
                 rados_namespace,
             )
             if rados_namespace != "":
-                caps["osd"] = (
-                    f"profile rbd pool={rbd_pool_name} namespace={rados_namespace}"
-                )
+                caps[
+                    "osd"
+                ] = f"profile rbd pool={rbd_pool_name} namespace={rados_namespace}"
             else:
                 caps["osd"] = f"profile rbd pool={rbd_pool_name}"
 
@@ -993,9 +989,9 @@ class RadosJSON:
                 rados_namespace,
             )
             if rados_namespace != "":
-                caps["osd"] = (
-                    f"profile rbd pool={rbd_pool_name} namespace={rados_namespace}"
-                )
+                caps[
+                    "osd"
+                ] = f"profile rbd pool={rbd_pool_name} namespace={rados_namespace}"
             else:
                 caps["osd"] = f"profile rbd pool={rbd_pool_name}"
 
@@ -1512,9 +1508,6 @@ class RadosJSON:
     def _gen_output_map(self):
         if self.out_map:
             return
-        # support legacy flag with upgrades
-        if self._arg_parser.cluster_name:
-            self._arg_parser.k8s_cluster_name = self._arg_parser.cluster_name
         self._arg_parser.k8s_cluster_name = (
             self._arg_parser.k8s_cluster_name.lower()
         )  # always convert cluster name to lowercase characters
@@ -1541,13 +1534,13 @@ class RadosJSON:
             self.out_map["CSI_RBD_PROVISIONER_SECRET_NAME"],
         ) = self.create_cephCSIKeyring_user("client.csi-rbd-provisioner")
         self.out_map["CEPHFS_POOL_NAME"] = self._arg_parser.cephfs_data_pool_name
-        self.out_map["CEPHFS_METADATA_POOL_NAME"] = (
-            self._arg_parser.cephfs_metadata_pool_name
-        )
+        self.out_map[
+            "CEPHFS_METADATA_POOL_NAME"
+        ] = self._arg_parser.cephfs_metadata_pool_name
         self.out_map["CEPHFS_FS_NAME"] = self._arg_parser.cephfs_filesystem_name
-        self.out_map["RESTRICTED_AUTH_PERMISSION"] = (
-            self._arg_parser.restricted_auth_permission
-        )
+        self.out_map[
+            "RESTRICTED_AUTH_PERMISSION"
+        ] = self._arg_parser.restricted_auth_permission
         self.out_map["RADOS_NAMESPACE"] = self._arg_parser.rados_namespace
         self.out_map["SUBVOLUME_GROUP"] = self._arg_parser.subvolume_group
         self.out_map["CSI_CEPHFS_NODE_SECRET"] = ""
@@ -1590,9 +1583,9 @@ class RadosJSON:
                 self.out_map["MONITORING_ENDPOINT_PORT"],
             ) = self.get_active_and_standby_mgrs()
         self.out_map["RBD_POOL_NAME"] = self._arg_parser.rbd_data_pool_name
-        self.out_map["RBD_METADATA_EC_POOL_NAME"] = (
-            self.validate_rbd_metadata_ec_pool_name()
-        )
+        self.out_map[
+            "RBD_METADATA_EC_POOL_NAME"
+        ] = self.validate_rbd_metadata_ec_pool_name()
         self.out_map["RGW_POOL_PREFIX"] = self._arg_parser.rgw_pool_prefix
         self.out_map["RGW_ENDPOINT"] = ""
         if self._arg_parser.rgw_endpoint:
@@ -1631,9 +1624,9 @@ class RadosJSON:
                     ) = self.create_rgw_admin_ops_user()
                     err = self.validate_rgw_endpoint(info_cap_supported)
                     if self._arg_parser.rgw_tls_cert_path:
-                        self.out_map["RGW_TLS_CERT"] = (
-                            self.validate_rgw_endpoint_tls_cert()
-                        )
+                        self.out_map[
+                            "RGW_TLS_CERT"
+                        ] = self.validate_rgw_endpoint_tls_cert()
                     # if there is no error, set the RGW_ENDPOINT
                     if err != "-1":
                         self.out_map["RGW_ENDPOINT"] = self._arg_parser.rgw_endpoint
diff --git a/deploy/examples/csi/cephfs/snapshotclass.yaml b/deploy/examples/csi/cephfs/snapshotclass.yaml
index bc1905acc..5a8cdcece 100644
--- a/deploy/examples/csi/cephfs/snapshotclass.yaml
+++ b/deploy/examples/csi/cephfs/snapshotclass.yaml
@@ -3,7 +3,7 @@ apiVersion: snapshot.storage.k8s.io/v1
 kind: VolumeSnapshotClass
 metadata:
   name: csi-cephfsplugin-snapclass
-driver: rook-ceph.cephfs.csi.ceph.com # csi-provisioner-name
+driver: rook-ceph.cephfs.csi.ceph.com # driver:namespace:operator
 parameters:
   # Specify a string that identifies your cluster. Ceph CSI supports any
   # unique string. When Ceph CSI is deployed by Rook use the Rook namespace,
diff --git a/deploy/examples/csi/cephfs/storageclass-ec.yaml b/deploy/examples/csi/cephfs/storageclass-ec.yaml
index 62e658bf4..1a3559a22 100644
--- a/deploy/examples/csi/cephfs/storageclass-ec.yaml
+++ b/deploy/examples/csi/cephfs/storageclass-ec.yaml
@@ -2,7 +2,8 @@ apiVersion: storage.k8s.io/v1
 kind: StorageClass
 metadata:
   name: rook-cephfs
-provisioner: rook-ceph.cephfs.csi.ceph.com # csi-provisioner-name
+# Change "rook-ceph" provisioner prefix to match the operator namespace if needed
+provisioner: rook-ceph.cephfs.csi.ceph.com # driver:namespace:operator
 parameters:
   # clusterID is the namespace where the rook cluster is running
   # If you change this namespace, also change the namespace below where the secret namespaces are defined
diff --git a/deploy/examples/csi/cephfs/storageclass.yaml b/deploy/examples/csi/cephfs/storageclass.yaml
index 0d0bea832..c9f599a83 100644
--- a/deploy/examples/csi/cephfs/storageclass.yaml
+++ b/deploy/examples/csi/cephfs/storageclass.yaml
@@ -2,7 +2,8 @@ apiVersion: storage.k8s.io/v1
 kind: StorageClass
 metadata:
   name: rook-cephfs
-provisioner: rook-ceph.cephfs.csi.ceph.com # csi-provisioner-name
+# Change "rook-ceph" provisioner prefix to match the operator namespace if needed
+provisioner: rook-ceph.cephfs.csi.ceph.com # driver:namespace:operator
 parameters:
   # clusterID is the namespace where the rook cluster is running
   # If you change this namespace, also change the namespace below where the secret namespaces are defined
diff --git a/deploy/examples/csi/nfs/rbac.yaml b/deploy/examples/csi/nfs/rbac.yaml
index 7d459240e..029ec4458 100644
--- a/deploy/examples/csi/nfs/rbac.yaml
+++ b/deploy/examples/csi/nfs/rbac.yaml
@@ -24,7 +24,7 @@ metadata:
 rules:
   - apiGroups: [""]
     resources: ["persistentvolumes"]
-    verbs: ["get", "list", "watch", "create", "update", "delete", "patch"]
+    verbs: ["get", "list", "watch", "create", "delete", "patch"]
   - apiGroups: [""]
     resources: ["persistentvolumeclaims"]
     verbs: ["get", "list", "watch", "patch", "update"]
diff --git a/deploy/examples/csi/nfs/snapshotclass.yaml b/deploy/examples/csi/nfs/snapshotclass.yaml
index 82cd870bf..b11cefd35 100644
--- a/deploy/examples/csi/nfs/snapshotclass.yaml
+++ b/deploy/examples/csi/nfs/snapshotclass.yaml
@@ -3,7 +3,7 @@ apiVersion: snapshot.storage.k8s.io/v1
 kind: VolumeSnapshotClass
 metadata:
   name: csi-nfsplugin-snapclass
-driver: rook-ceph.nfs.csi.ceph.com # csi-provisioner-name
+driver: rook-ceph.nfs.csi.ceph.com # driver:namespace:operator
 parameters:
   # Specify a string that identifies your cluster. Ceph CSI supports any
   # unique string. When Ceph CSI is deployed by Rook use the Rook namespace,
diff --git a/deploy/examples/csi/nfs/storageclass.yaml b/deploy/examples/csi/nfs/storageclass.yaml
index a7fa31ee3..85e60f754 100644
--- a/deploy/examples/csi/nfs/storageclass.yaml
+++ b/deploy/examples/csi/nfs/storageclass.yaml
@@ -2,7 +2,8 @@ apiVersion: storage.k8s.io/v1
 kind: StorageClass
 metadata:
   name: rook-nfs
-provisioner: rook-ceph.nfs.csi.ceph.com # csi-provisioner-name
+# Change "rook-ceph" provisioner prefix to match the operator namespace if needed
+provisioner: rook-ceph.nfs.csi.ceph.com
 parameters:
   # nfsCluster is the name of the NFS cluster as managed by Ceph (sometimes called the NFS cluster ID).
   # With Rook, this should get the name of the CephNFS resource.
diff --git a/deploy/examples/csi/rbd/snapshotclass.yaml b/deploy/examples/csi/rbd/snapshotclass.yaml
index 11d489769..79ed5522d 100644
--- a/deploy/examples/csi/rbd/snapshotclass.yaml
+++ b/deploy/examples/csi/rbd/snapshotclass.yaml
@@ -3,7 +3,7 @@ apiVersion: snapshot.storage.k8s.io/v1
 kind: VolumeSnapshotClass
 metadata:
   name: csi-rbdplugin-snapclass
-driver: rook-ceph.rbd.csi.ceph.com # csi-provisioner-name
+driver: rook-ceph.rbd.csi.ceph.com # driver:namespace:operator
 parameters:
   # Specify a string that identifies your cluster. Ceph CSI supports any
   # unique string. When Ceph CSI is deployed by Rook use the Rook namespace,
diff --git a/deploy/examples/csi/rbd/storageclass-ec.yaml b/deploy/examples/csi/rbd/storageclass-ec.yaml
index e611f4a7a..6804b0b23 100644
--- a/deploy/examples/csi/rbd/storageclass-ec.yaml
+++ b/deploy/examples/csi/rbd/storageclass-ec.yaml
@@ -30,7 +30,8 @@ apiVersion: storage.k8s.io/v1
 kind: StorageClass
 metadata:
   name: rook-ceph-block
-provisioner: rook-ceph.rbd.csi.ceph.com # csi-provisioner-name
+# Change "rook-ceph" provisioner prefix to match the operator namespace if needed
+provisioner: rook-ceph.rbd.csi.ceph.com # driver:namespace:operator
 parameters:
   # clusterID is the namespace where the rook cluster is running
   # If you change this namespace, also change the namespace below where the secret namespaces are defined
diff --git a/deploy/examples/csi/rbd/storageclass.yaml b/deploy/examples/csi/rbd/storageclass.yaml
index 09672960c..c1218982c 100644
--- a/deploy/examples/csi/rbd/storageclass.yaml
+++ b/deploy/examples/csi/rbd/storageclass.yaml
@@ -18,7 +18,8 @@ apiVersion: storage.k8s.io/v1
 kind: StorageClass
 metadata:
   name: rook-ceph-block
-provisioner: rook-ceph.rbd.csi.ceph.com # csi-provisioner-name
+# Change "rook-ceph" provisioner prefix to match the operator namespace if needed
+provisioner: rook-ceph.rbd.csi.ceph.com
 parameters:
   # clusterID is the namespace where the rook cluster is running
   # If you change this namespace, also change the namespace below where the secret namespaces are defined
@@ -46,14 +47,14 @@ parameters:
   # https://docs.ceph.com/docs/master/man/8/rbd-nbd/#options
   # unmapOptions: force
 
-  # (optional) Set it to true to encrypt each volume with encryption keys
-  # from a key management system (KMS)
-  # encrypted: "true"
+   # (optional) Set it to true to encrypt each volume with encryption keys
+   # from a key management system (KMS)
+   # encrypted: "true"
 
-  # (optional) Use external key management system (KMS) for encryption key by
-  # specifying a unique ID matching a KMS ConfigMap. The ID is only used for
-  # correlation to configmap entry.
-  # encryptionKMSID: <kms-config-id>
+   # (optional) Use external key management system (KMS) for encryption key by
+   # specifying a unique ID matching a KMS ConfigMap. The ID is only used for
+   # correlation to configmap entry.
+   # encryptionKMSID: <kms-config-id>
 
   # RBD image format. Defaults to "2".
   imageFormat: "2"
diff --git a/deploy/examples/images.txt b/deploy/examples/images.txt
index f7e14f7f7..bd0331164 100644
--- a/deploy/examples/images.txt
+++ b/deploy/examples/images.txt
@@ -5,7 +5,7 @@
  quay.io/csiaddons/k8s-sidecar:v0.8.0
  registry.k8s.io/sig-storage/csi-attacher:v4.4.2
  registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.9.1
- registry.k8s.io/sig-storage/csi-provisioner:v3.6.3
+ registry.k8s.io/sig-storage/csi-provisioner:v3.6.2
  registry.k8s.io/sig-storage/csi-resizer:v1.9.2
  registry.k8s.io/sig-storage/csi-snapshotter:v6.3.2
  rook/ceph:master
diff --git a/deploy/examples/import-external-cluster.sh b/deploy/examples/import-external-cluster.sh
index 241f53333..c5faa0606 100644
--- a/deploy/examples/import-external-cluster.sh
+++ b/deploy/examples/import-external-cluster.sh
@@ -22,9 +22,8 @@ RBD_STORAGE_CLASS_NAME=ceph-rbd
 CEPHFS_STORAGE_CLASS_NAME=cephfs
 ROOK_EXTERNAL_MONITOR_SECRET=mon-secret
 OPERATOR_NAMESPACE=rook-ceph                                 # default set to rook-ceph
-CSI_DRIVER_NAME_PREFIX=${CSI_DRIVER_NAME_PREFIX:-$OPERATOR_NAMESPACE}
-RBD_PROVISIONER=$CSI_DRIVER_NAME_PREFIX".rbd.csi.ceph.com"       # csi-provisioner-name
-CEPHFS_PROVISIONER=$CSI_DRIVER_NAME_PREFIX=".cephfs.csi.ceph.com" # csi-provisioner-name
+RBD_PROVISIONER=$OPERATOR_NAMESPACE".rbd.csi.ceph.com"       # driver:namespace:operator
+CEPHFS_PROVISIONER=$OPERATOR_NAMESPACE".cephfs.csi.ceph.com" # driver:namespace:operator
 CLUSTER_ID_RBD=$NAMESPACE
 CLUSTER_ID_CEPHFS=$NAMESPACE
 : "${ROOK_EXTERNAL_ADMIN_SECRET:=admin-secret}"
diff --git a/deploy/examples/operator-openshift.yaml b/deploy/examples/operator-openshift.yaml
index 35611ed2c..6bee6b5d1 100644
--- a/deploy/examples/operator-openshift.yaml
+++ b/deploy/examples/operator-openshift.yaml
@@ -193,7 +193,7 @@ data:
   # ROOK_CSI_CEPH_IMAGE: "quay.io/cephcsi/cephcsi:v3.10.1"
   # ROOK_CSI_REGISTRAR_IMAGE: "registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.9.1"
   # ROOK_CSI_RESIZER_IMAGE: "registry.k8s.io/sig-storage/csi-resizer:v1.9.2"
-  # ROOK_CSI_PROVISIONER_IMAGE: "registry.k8s.io/sig-storage/csi-provisioner:v3.6.3"
+  # ROOK_CSI_PROVISIONER_IMAGE: "registry.k8s.io/sig-storage/csi-provisioner:v3.6.2"
   # ROOK_CSI_SNAPSHOTTER_IMAGE: "registry.k8s.io/sig-storage/csi-snapshotter:v6.3.2"
   # ROOK_CSI_ATTACHER_IMAGE: "registry.k8s.io/sig-storage/csi-attacher:v4.4.2"
 
@@ -604,22 +604,6 @@ data:
   CSI_CEPHFS_ATTACH_REQUIRED: "true"
   CSI_RBD_ATTACH_REQUIRED: "true"
   CSI_NFS_ATTACH_REQUIRED: "true"
-
-  # (Optional) Duration in seconds that non-leader candidates will wait to force acquire leadership. Default to 137 seconds.
-  # CSI_LEADER_ELECTION_LEASE_DURATION: "137s"
-
-  # (Optional) Deadline in seconds that the acting leader will retry refreshing leadership before giving up. Defaults to 107 seconds.
-  # CSI_LEADER_ELECTION_RENEW_DEADLINE: "107s"
-
-  # (Optional) Retry period in seconds the LeaderElector clients should wait between tries of actions. Defaults to 26 seconds.
-  # CSI_LEADER_ELECTION_RETRY_PERIOD: "26s"
-
-  # csi driver name prefix for cephfs, rbd and nfs. if not specified, default
-  # will be the namespace name where rook-ceph operator is deployed.
-  # search for `# csi-provisioner-name` in the storageclass and
-  # volumesnashotclass and update the name accordingly.
-  # CSI_DRIVER_NAME_PREFIX: "rook-ceph"
-
   # Rook Discover toleration. Will tolerate all taints with all keys.
   # (Optional) Rook Discover tolerations list. Put here list of taints you want to tolerate in YAML format.
   # DISCOVER_TOLERATIONS: |
@@ -648,10 +632,10 @@ data:
   #   - name: DISCOVER_DAEMON_RESOURCES
   #     resources:
   #       limits:
-  #         cpu: 1500m
+  #         cpu: 500m
   #         memory: 512Mi
   #       requests:
-  #         cpu: 200m
+  #         cpu: 100m
   #         memory: 128Mi
 ---
 # The deployment for the rook operator
diff --git a/deploy/examples/operator.yaml b/deploy/examples/operator.yaml
index a41ffe5ef..9975c6d40 100644
--- a/deploy/examples/operator.yaml
+++ b/deploy/examples/operator.yaml
@@ -61,12 +61,6 @@ data:
   # Supported values from 0 to 5. 0 for general useful logs (the default), 5 for trace level verbosity.
   # CSI_SIDECAR_LOG_LEVEL: "0"
 
-  # csi driver name prefix for cephfs, rbd and nfs. if not specified, default
-  # will be the namespace name where rook-ceph operator is deployed.
-  # search for `# csi-provisioner-name` in the storageclass and
-  # volumesnashotclass and update the name accordingly.
-  # CSI_DRIVER_NAME_PREFIX: "rook-ceph"
-
   # Set replicas for csi provisioner deployment.
   CSI_PROVISIONER_REPLICAS: "2"
 
@@ -115,7 +109,7 @@ data:
   # ROOK_CSI_CEPH_IMAGE: "quay.io/cephcsi/cephcsi:v3.10.1"
   # ROOK_CSI_REGISTRAR_IMAGE: "registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.9.1"
   # ROOK_CSI_RESIZER_IMAGE: "registry.k8s.io/sig-storage/csi-resizer:v1.9.2"
-  # ROOK_CSI_PROVISIONER_IMAGE: "registry.k8s.io/sig-storage/csi-provisioner:v3.6.3"
+  # ROOK_CSI_PROVISIONER_IMAGE: "registry.k8s.io/sig-storage/csi-provisioner:v3.6.2"
   # ROOK_CSI_SNAPSHOTTER_IMAGE: "registry.k8s.io/sig-storage/csi-snapshotter:v6.3.2"
   # ROOK_CSI_ATTACHER_IMAGE: "registry.k8s.io/sig-storage/csi-attacher:v4.4.2"
 
@@ -493,15 +487,6 @@ data:
   # Set to "ms_mode=secure" when connections.encrypted is enabled in CephCluster CR
   # CSI_CEPHFS_KERNEL_MOUNT_OPTIONS: "ms_mode=secure"
 
-  # (Optional) Duration in seconds that non-leader candidates will wait to force acquire leadership. Default to 137 seconds.
-  # CSI_LEADER_ELECTION_LEASE_DURATION: "137s"
-
-  # (Optional) Deadline in seconds that the acting leader will retry refreshing leadership before giving up. Defaults to 107 seconds.
-  # CSI_LEADER_ELECTION_RENEW_DEADLINE: "107s"
-
-  # (Optional) Retry Period in seconds the LeaderElector clients should wait between tries of actions. Defaults to 26 seconds.
-  # CSI_LEADER_ELECTION_RETRY_PERIOD: "26s"
-
   # Whether the OBC provisioner should watch on the operator namespace or not, if not the namespace of the cluster will be used
   ROOK_OBC_WATCH_OPERATOR_NAMESPACE: "true"
 
@@ -677,10 +662,10 @@ spec:
           # Recommended resource requests and limits, if desired
           #resources:
           #  limits:
-          #    cpu: 1500m
+          #    cpu: 500m
           #    memory: 512Mi
           #  requests:
-          #    cpu: 200m
+          #    cpu: 100m
           #    memory: 128Mi
 
           #  Uncomment it to run lib bucket provisioner in multithreaded mode
diff --git a/deploy/examples/storageclass-bucket-delete.yaml b/deploy/examples/storageclass-bucket-delete.yaml
index 97405dfb7..19f5a146a 100644
--- a/deploy/examples/storageclass-bucket-delete.yaml
+++ b/deploy/examples/storageclass-bucket-delete.yaml
@@ -1,16 +1,16 @@
 apiVersion: storage.k8s.io/v1
 kind: StorageClass
 metadata:
-  name: rook-ceph-delete-bucket
+   name: rook-ceph-delete-bucket
 provisioner: rook-ceph.ceph.rook.io/bucket # driver:namespace:cluster
 # set the reclaim policy to delete the bucket and all objects
 # when its OBC is deleted.
 reclaimPolicy: Delete
 parameters:
-  objectStoreName: my-store
-  objectStoreNamespace: rook-ceph # namespace:cluster
-  # To accommodate brownfield cases reference the existing bucket name here instead
-  # of in the ObjectBucketClaim (OBC). In this case the provisioner will grant
-  # access to the bucket by creating a new user, attaching it to the bucket, and
-  # providing the credentials via a Secret in the namespace of the requesting OBC.
-  #bucketName:
+   objectStoreName: my-store
+   objectStoreNamespace: rook-ceph # namespace:cluster
+   # To accommodate brownfield cases reference the existing bucket name here instead
+   # of in the ObjectBucketClaim (OBC). In this case the provisioner will grant
+   # access to the bucket by creating a new user, attaching it to the bucket, and
+   # providing the credentials via a Secret in the namespace of the requesting OBC.
+   #bucketName:
diff --git a/go.mod b/go.mod
index b5f9b0ff1..f0dc29a8f 100644
--- a/go.mod
+++ b/go.mod
@@ -6,7 +6,7 @@ replace github.com/rook/rook/pkg/apis => ./pkg/apis
 
 require (
 	github.com/IBM/keyprotect-go-client v0.12.2
-	github.com/aws/aws-sdk-go v1.50.5
+	github.com/aws/aws-sdk-go v1.49.16
 	github.com/banzaicloud/k8s-objectmatcher v1.8.0
 	github.com/ceph/go-ceph v0.25.0
 	github.com/coreos/pkg v0.0.0-20230601102743-20bbbf26f4d8
@@ -14,14 +14,14 @@ require (
 	github.com/gemalto/kmip-go v0.0.10
 	github.com/go-ini/ini v1.67.0
 	github.com/google/go-cmp v0.6.0
-	github.com/google/uuid v1.6.0
-	github.com/hashicorp/vault/api v1.11.0
-	github.com/k8snetworkplumbingwg/network-attachment-definition-client v1.5.0
+	github.com/google/uuid v1.5.0
+	github.com/hashicorp/vault/api v1.10.0
+	github.com/k8snetworkplumbingwg/network-attachment-definition-client v1.4.0
 	github.com/kube-object-storage/lib-bucket-provisioner v0.0.0-20221122204822-d1a8c34382f1
 	github.com/libopenstorage/secrets v0.0.0-20231011182615-5f4b25ceede1
 	github.com/pkg/errors v0.9.1
-	github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.71.2
-	github.com/prometheus-operator/prometheus-operator/pkg/client v0.71.2
+	github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.70.0
+	github.com/prometheus-operator/prometheus-operator/pkg/client v0.70.0
 	github.com/rook/rook/pkg/apis v0.0.0-20231204200402-5287527732f7
 	github.com/spf13/cobra v1.8.0
 	github.com/spf13/pflag v1.0.5
@@ -32,14 +32,14 @@ require (
 	golang.org/x/sync v0.6.0
 	gopkg.in/ini.v1 v1.67.0
 	gopkg.in/yaml.v2 v2.4.0
-	k8s.io/api v0.29.1
-	k8s.io/apiextensions-apiserver v0.29.1
-	k8s.io/apimachinery v0.29.1
-	k8s.io/cli-runtime v0.29.1
-	k8s.io/client-go v0.29.1
-	k8s.io/cloud-provider v0.29.1
+	k8s.io/api v0.29.0
+	k8s.io/apiextensions-apiserver v0.29.0
+	k8s.io/apimachinery v0.29.0
+	k8s.io/cli-runtime v0.29.0
+	k8s.io/client-go v0.29.0
+	k8s.io/cloud-provider v0.29.0
 	k8s.io/utils v0.0.0-20231127182322-b307cd553661
-	sigs.k8s.io/controller-runtime v0.17.0
+	sigs.k8s.io/controller-runtime v0.16.3
 	sigs.k8s.io/mcs-api v0.1.0
 	sigs.k8s.io/yaml v1.4.0
 )
@@ -51,19 +51,18 @@ require (
 	github.com/ansel1/merry/v2 v2.2.0 // indirect
 	github.com/beorn7/perks v1.0.1 // indirect
 	github.com/cenkalti/backoff/v3 v3.2.2 // indirect
-	github.com/ceph/ceph-csi/api v0.0.0-20231227104434-06f9a98b7a83
 	github.com/cespare/xxhash/v2 v2.2.0 // indirect
 	github.com/containernetworking/cni v1.1.2 // indirect
 	github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf // indirect
 	github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
 	github.com/emicklei/go-restful/v3 v3.11.0 // indirect
 	github.com/evanphx/json-patch v5.7.0+incompatible // indirect
-	github.com/evanphx/json-patch/v5 v5.8.0 // indirect
+	github.com/evanphx/json-patch/v5 v5.7.0 // indirect
 	github.com/fsnotify/fsnotify v1.7.0 // indirect
 	github.com/gemalto/flume v0.13.1 // indirect
 	github.com/go-errors/errors v1.5.1 // indirect
 	github.com/go-jose/go-jose/v3 v3.0.1 // indirect
-	github.com/go-logr/logr v1.4.1 // indirect
+	github.com/go-logr/logr v1.3.0 // indirect
 	github.com/go-logr/zapr v1.3.0 // indirect
 	github.com/go-openapi/jsonpointer v0.20.0 // indirect
 	github.com/go-openapi/jsonreference v0.20.2 // indirect
@@ -111,7 +110,7 @@ require (
 	github.com/openshift/api v0.0.0-20231204192004-bfea29e5e6c4 // indirect
 	github.com/peterbourgon/diskv v2.0.1+incompatible // indirect
 	github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
-	github.com/prometheus/client_golang v1.18.0 // indirect
+	github.com/prometheus/client_golang v1.17.0 // indirect
 	github.com/prometheus/client_model v0.5.0 // indirect
 	github.com/prometheus/common v0.45.0 // indirect
 	github.com/prometheus/procfs v0.12.0 // indirect
@@ -124,7 +123,7 @@ require (
 	golang.org/x/crypto v0.17.0 // indirect
 	golang.org/x/net v0.19.0 // indirect
 	golang.org/x/oauth2 v0.15.0 // indirect
-	golang.org/x/sys v0.16.0 // indirect
+	golang.org/x/sys v0.15.0 // indirect
 	golang.org/x/term v0.15.0 // indirect
 	golang.org/x/text v0.14.0 // indirect
 	golang.org/x/time v0.5.0 // indirect
@@ -134,7 +133,7 @@ require (
 	gopkg.in/evanphx/json-patch.v5 v5.7.0 // indirect
 	gopkg.in/inf.v0 v0.9.1 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
-	k8s.io/component-base v0.29.1 // indirect
+	k8s.io/component-base v0.29.0 // indirect
 	k8s.io/klog/v2 v2.110.1 // indirect
 	k8s.io/kube-openapi v0.0.0-20231129212854-f0671cc7e66a // indirect
 	sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
diff --git a/go.sum b/go.sum
index f3b575783..8e90d1c78 100644
--- a/go.sum
+++ b/go.sum
@@ -111,8 +111,8 @@ github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkY
 github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 github.com/aws/aws-sdk-go v1.44.164/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI=
-github.com/aws/aws-sdk-go v1.50.5 h1:H2Aadcgwr7a2aqS6ZwcE+l1mA6ZrTseYCvjw2QLmxIA=
-github.com/aws/aws-sdk-go v1.50.5/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk=
+github.com/aws/aws-sdk-go v1.49.16 h1:KAQwhLg296hfffRdh+itA9p7Nx/3cXS/qOa3uF9ssig=
+github.com/aws/aws-sdk-go v1.49.16/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk=
 github.com/banzaicloud/k8s-objectmatcher v1.8.0 h1:Nugn25elKtPMTA2br+JgHNeSQ04sc05MDPmpJnd1N2A=
 github.com/banzaicloud/k8s-objectmatcher v1.8.0/go.mod h1:p2LSNAjlECf07fbhDyebTkPUIYnU05G+WfGgkTmgeMg=
 github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
@@ -127,8 +127,6 @@ github.com/cenkalti/backoff/v3 v3.0.0/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4r
 github.com/cenkalti/backoff/v3 v3.2.2 h1:cfUAAO3yvKMYKPrvhDuHSwQnhZNk/RMHKdZqKTxfm6M=
 github.com/cenkalti/backoff/v3 v3.2.2/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs=
 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
-github.com/ceph/ceph-csi/api v0.0.0-20231227104434-06f9a98b7a83 h1:xWhLO5MR+diAsZoOcPe0zVe+JcJrqMaVbScShye6pXw=
-github.com/ceph/ceph-csi/api v0.0.0-20231227104434-06f9a98b7a83/go.mod h1:ZSvtS90FCB/becFi/rjy85sSw1igchaWZfUigxN9FxY=
 github.com/ceph/go-ceph v0.25.0 h1:sorUSVkm0F7tYKrv8afd1eJ8UXwxkYIio9o0xLTX59E=
 github.com/ceph/go-ceph v0.25.0/go.mod h1:HoEJSH32bMcGzmsqJNmSVeYrrcetSxnMfVnGIXBE59Q=
 github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
@@ -211,8 +209,8 @@ github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQL
 github.com/evanphx/json-patch v5.7.0+incompatible h1:vgGkfT/9f8zE6tvSCe74nfpAVDQ2tG6yudJd8LBksgI=
 github.com/evanphx/json-patch v5.7.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
 github.com/evanphx/json-patch/v5 v5.0.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4=
-github.com/evanphx/json-patch/v5 v5.8.0 h1:lRj6N9Nci7MvzrXuX6HFzU8XjmhPiXPlsKEy1u0KQro=
-github.com/evanphx/json-patch/v5 v5.8.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ=
+github.com/evanphx/json-patch/v5 v5.7.0 h1:nJqP7uwL84RJInrohHfW0Fx3awjbm8qZeFv0nW9SYGc=
+github.com/evanphx/json-patch/v5 v5.7.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ=
 github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys=
 github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
 github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
@@ -249,9 +247,8 @@ github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7
 github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
 github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
 github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=
 github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
-github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
-github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
 github.com/go-logr/zapr v0.1.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk=
 github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ=
 github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg=
@@ -418,8 +415,8 @@ github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+
 github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
-github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU=
+github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
 github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
 github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0=
@@ -486,9 +483,8 @@ github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uG
 github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
 github.com/hashicorp/hcl v1.0.1-vault-5 h1:kI3hhbbyzr4dldA8UdTb7ZlVVlI2DACdCfz31RPDgJM=
 github.com/hashicorp/hcl v1.0.1-vault-5/go.mod h1:XYhtn6ijBSAj6n4YqAaf7RBPS4I06AItNorpy+MoQNM=
+github.com/hashicorp/vault/api v1.10.0 h1:/US7sIjWN6Imp4o/Rj1Ce2Nr5bki/AXi9vAW3p2tOJQ=
 github.com/hashicorp/vault/api v1.10.0/go.mod h1:jo5Y/ET+hNyz+JnKDt8XLAdKs+AM0G5W0Vp1IrFI8N8=
-github.com/hashicorp/vault/api v1.11.0 h1:AChWByeHf4/P9sX3Y1B7vFsQhZO2BgQiCMQ2SA1P1UY=
-github.com/hashicorp/vault/api v1.11.0/go.mod h1:si+lJCYO7oGkIoNPAN8j3azBLTn9SjMGS+jFaHd1Cck=
 github.com/hashicorp/vault/api/auth/approle v0.5.0 h1:a1TK6VGwYqSAfkmX4y4dJ4WBxMU5dStIZqScW4EPXR8=
 github.com/hashicorp/vault/api/auth/approle v0.5.0/go.mod h1:CHOQIA1AZACfjTzHggmyfiOZ+xCSKNRFqe48FTCzH0k=
 github.com/hashicorp/vault/api/auth/kubernetes v0.5.0 h1:CXO0fD7M3iCGovP/UApeHhPcH4paDFKcu7AjEXi94rI=
@@ -523,8 +519,8 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X
 github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
 github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k=
 github.com/k0kubun/pp v2.3.0+incompatible/go.mod h1:GWse8YhT0p8pT4ir3ZgBbfZild3tgzSScAn6HmfYukg=
-github.com/k8snetworkplumbingwg/network-attachment-definition-client v1.5.0 h1:V58W9SkSqAoKdYYH6q2aa3uDBE/I/KZ5Pe4Nj6M6oH4=
-github.com/k8snetworkplumbingwg/network-attachment-definition-client v1.5.0/go.mod h1:wxt2YWRVItDtaQmVSmaN5ubE2L1c9CiNoHQwSJnM8Ko=
+github.com/k8snetworkplumbingwg/network-attachment-definition-client v1.4.0 h1:VzM3TYHDgqPkettiP6I6q2jOeQFL4nrJM+UcAc4f6Fs=
+github.com/k8snetworkplumbingwg/network-attachment-definition-client v1.4.0/go.mod h1:nqCI7aelBJU61wiBeeZWJ6oi4bJy5nrjkM6lWIMA4j0=
 github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
 github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
 github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
@@ -628,8 +624,8 @@ github.com/onsi/ginkgo/v2 v2.3.0/go.mod h1:Eew0uilEqZmIEZr8JrvYlvOM7Rr6xzTmMV8Ay
 github.com/onsi/ginkgo/v2 v2.4.0/go.mod h1:iHkDK1fKGcBoEHT5W7YBq4RFWaQulw+caOMkAt4OrFo=
 github.com/onsi/ginkgo/v2 v2.5.0/go.mod h1:Luc4sArBICYCS8THh8v3i3i5CuSZO+RaQRaJoeNwomw=
 github.com/onsi/ginkgo/v2 v2.6.0/go.mod h1:63DOGlLAH8+REH8jUGdL3YpCpu7JODesutUjdENfUAc=
-github.com/onsi/ginkgo/v2 v2.14.0 h1:vSmGj2Z5YPb9JwCWT6z6ihcUvDhuXLc3sJiqd3jMKAY=
-github.com/onsi/ginkgo/v2 v2.14.0/go.mod h1:JkUdW7JkN0V6rFvsHcJ478egV3XH9NxpD27Hal/PhZw=
+github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4=
+github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o=
 github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
 github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
 github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
@@ -665,15 +661,15 @@ github.com/portworx/dcos-secrets v0.0.0-20180616013705-8e8ec3f66611/go.mod h1:4h
 github.com/portworx/kvdb v0.0.0-20200929023115-b312c7519467/go.mod h1:Q8YyrNDvPp3DVF96BDcQuaC7fAYUCuUX+l58S7OnD2M=
 github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
 github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=
-github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.71.2 h1:HZdPRm0ApWPg7F4sHgbqWkL+ddWfpTZsopm5HM/2g4o=
-github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.71.2/go.mod h1:3RiUkFmR9kmPZi9r/8a5jw0a9yg+LMmr7qa0wjqvSiI=
-github.com/prometheus-operator/prometheus-operator/pkg/client v0.71.2 h1:7eyX8MypewjShiOFj6sOX+Ad+EJUIQ5qzdvM/U76cHs=
-github.com/prometheus-operator/prometheus-operator/pkg/client v0.71.2/go.mod h1:dH5cun6jo8vesIzplptAQpdXW9dL8rD2jpvWylG4B6s=
+github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.70.0 h1:CFTvpkpVP4EXXZuaZuxpikAoma8xVha/IZKMDc9lw+Y=
+github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.70.0/go.mod h1:npfc20mPOAu7ViOVnATVMbI7PoXvW99EzgJVqkAomIQ=
+github.com/prometheus-operator/prometheus-operator/pkg/client v0.70.0 h1:PpdpJDS1MyMSLILG+Y0hgzVQ3tu6qEkRD0gR/UuvSZk=
+github.com/prometheus-operator/prometheus-operator/pkg/client v0.70.0/go.mod h1:4I5Rt6iIu95JBYYaDYA+Er+YBfUwIq9Pwh5TEoBmawg=
 github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
 github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
 github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
-github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk=
-github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA=
+github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q=
+github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY=
 github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
 github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
@@ -792,8 +788,8 @@ go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
 go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
 go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
 go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=
-go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
-go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
+go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A=
+go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4=
 go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
 go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
 go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
@@ -1062,8 +1058,8 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU=
-golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
+golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@@ -1168,8 +1164,8 @@ golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E
 golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
 golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA=
 golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
-golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA=
-golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0=
+golang.org/x/tools v0.16.0 h1:GO788SKMRunPIBCXiQyo2AaexLstOrVhuAL5YwsckQM=
+golang.org/x/tools v0.16.0/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0=
 golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -1407,37 +1403,37 @@ k8s.io/api v0.18.2/go.mod h1:SJCWI7OLzhZSvbY7U8zwNl9UA4o1fizoug34OV/2r78=
 k8s.io/api v0.18.4/go.mod h1:lOIQAKYgai1+vz9J7YcDZwC26Z0zQewYOGWdyIPUUQ4=
 k8s.io/api v0.23.5/go.mod h1:Na4XuKng8PXJ2JsploYYrivXrINeTaycCGcYgF91Xm8=
 k8s.io/api v0.26.0/go.mod h1:k6HDTaIFC8yn1i6pSClSqIwLABIcLV9l5Q4EcngKnQg=
-k8s.io/api v0.29.1 h1:DAjwWX/9YT7NQD4INu49ROJuZAAAP/Ijki48GUPzxqw=
-k8s.io/api v0.29.1/go.mod h1:7Kl10vBRUXhnQQI8YR/R327zXC8eJ7887/+Ybta+RoQ=
+k8s.io/api v0.29.0 h1:NiCdQMY1QOp1H8lfRyeEf8eOwV6+0xA6XEE44ohDX2A=
+k8s.io/api v0.29.0/go.mod h1:sdVmXoz2Bo/cb77Pxi71IPTSErEW32xa4aXwKH7gfBA=
 k8s.io/apiextensions-apiserver v0.18.2/go.mod h1:q3faSnRGmYimiocj6cHQ1I3WpLqmDgJFlKL37fC4ZvY=
 k8s.io/apiextensions-apiserver v0.18.4/go.mod h1:NYeyeYq4SIpFlPxSAB6jHPIdvu3hL0pc36wuRChybio=
-k8s.io/apiextensions-apiserver v0.29.1 h1:S9xOtyk9M3Sk1tIpQMu9wXHm5O2MX6Y1kIpPMimZBZw=
-k8s.io/apiextensions-apiserver v0.29.1/go.mod h1:zZECpujY5yTW58co8V2EQR4BD6A9pktVgHhvc0uLfeU=
+k8s.io/apiextensions-apiserver v0.29.0 h1:0VuspFG7Hj+SxyF/Z/2T0uFbI5gb5LRgEyUVE3Q4lV0=
+k8s.io/apiextensions-apiserver v0.29.0/go.mod h1:TKmpy3bTS0mr9pylH0nOt/QzQRrW7/h7yLdRForMZwc=
 k8s.io/apimachinery v0.18.2/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA=
 k8s.io/apimachinery v0.18.4/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko=
 k8s.io/apimachinery v0.19.2/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA=
 k8s.io/apimachinery v0.23.5/go.mod h1:BEuFMMBaIbcOqVIJqNZJXGFTP4W6AycEpb5+m/97hrM=
 k8s.io/apimachinery v0.26.0/go.mod h1:tnPmbONNJ7ByJNz9+n9kMjNP8ON+1qoAIIC70lztu74=
-k8s.io/apimachinery v0.29.1 h1:KY4/E6km/wLBguvCZv8cKTeOwwOBqFNjwJIdMkMbbRc=
-k8s.io/apimachinery v0.29.1/go.mod h1:6HVkd1FwxIagpYrHSwJlQqZI3G9LfYWRPAkUvLnXTKU=
+k8s.io/apimachinery v0.29.0 h1:+ACVktwyicPz0oc6MTMLwa2Pw3ouLAfAon1wPLtG48o=
+k8s.io/apimachinery v0.29.0/go.mod h1:eVBxQ/cwiJxH58eK/jd/vAk4mrxmVlnpBH5J2GbMeis=
 k8s.io/apiserver v0.18.2/go.mod h1:Xbh066NqrZO8cbsoenCwyDJ1OSi8Ag8I2lezeHxzwzw=
 k8s.io/apiserver v0.18.4/go.mod h1:q+zoFct5ABNnYkGIaGQ3bcbUNdmPyOCoEBcg51LChY8=
-k8s.io/cli-runtime v0.29.1 h1:By3WVOlEWYfyxhGko0f/IuAOLQcbBSMzwSaDren2JUs=
-k8s.io/cli-runtime v0.29.1/go.mod h1:vjEY9slFp8j8UoMhV5AlO8uulX9xk6ogfIesHobyBDU=
+k8s.io/cli-runtime v0.29.0 h1:q2kC3cex4rOBLfPOnMSzV2BIrrQlx97gxHJs21KxKS4=
+k8s.io/cli-runtime v0.29.0/go.mod h1:VKudXp3X7wR45L+nER85YUzOQIru28HQpXr0mTdeCrk=
 k8s.io/client-go v0.18.2/go.mod h1:Xcm5wVGXX9HAA2JJ2sSBUn3tCJ+4SVlCbl2MNNv+CIU=
 k8s.io/client-go v0.18.4/go.mod h1:f5sXwL4yAZRkAtzOxRWUhA/N8XzGCb+nPZI8PfobZ9g=
 k8s.io/client-go v0.23.5/go.mod h1:flkeinTO1CirYgzMPRWxUCnV0G4Fbu2vLhYCObnt/r4=
-k8s.io/client-go v0.29.1 h1:19B/+2NGEwnFLzt0uB5kNJnfTsbV8w6TgQRz9l7ti7A=
-k8s.io/client-go v0.29.1/go.mod h1:TDG/psL9hdet0TI9mGyHJSgRkW3H9JZk2dNEUS7bRks=
-k8s.io/cloud-provider v0.29.1 h1:bDLpOSpysWrtU2PCkvyP2sUTwRBa6MGCmxt68CRRW/8=
-k8s.io/cloud-provider v0.29.1/go.mod h1:u50Drm6AbuoKpsVbAstNiFHGgbSVHuJV4TWN5imdM2w=
+k8s.io/client-go v0.29.0 h1:KmlDtFcrdUzOYrBhXHgKw5ycWzc3ryPX5mQe0SkG3y8=
+k8s.io/client-go v0.29.0/go.mod h1:yLkXH4HKMAywcrD82KMSmfYg2DlE8mepPR4JGSo5n38=
+k8s.io/cloud-provider v0.29.0 h1:Qgk/jHsSKGRk/ltTlN6e7eaNuuamLROOzVBd0RPp94M=
+k8s.io/cloud-provider v0.29.0/go.mod h1:gBCt7YYKFV4oUcJ/0xF9lS/9il4MxKunJ+ZKvh39WGo=
 k8s.io/code-generator v0.18.2/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc=
 k8s.io/code-generator v0.18.4/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8b6c=
 k8s.io/code-generator v0.20.1/go.mod h1:UsqdF+VX4PU2g46NC2JRs4gc+IfrctnwHb76RNbWHJg=
 k8s.io/component-base v0.18.2/go.mod h1:kqLlMuhJNHQ9lz8Z7V5bxUUtjFZnrypArGl58gmDfUM=
 k8s.io/component-base v0.18.4/go.mod h1:7jr/Ef5PGmKwQhyAz/pjByxJbC58mhKAhiaDu0vXfPk=
-k8s.io/component-base v0.29.1 h1:MUimqJPCRnnHsskTTjKD+IC1EHBbRCVyi37IoFBrkYw=
-k8s.io/component-base v0.29.1/go.mod h1:fP9GFjxYrLERq1GcWWZAE3bqbNcDKDytn2srWuHTtKc=
+k8s.io/component-base v0.29.0 h1:T7rjd5wvLnPBV1vC4zWd/iWRbV8Mdxs+nGaoaFzGw3s=
+k8s.io/component-base v0.29.0/go.mod h1:sADonFTQ9Zc9yFLghpDpmNXEdHyQmFIGbiuZbqAXQ1M=
 k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
 k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
 k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
@@ -1475,8 +1471,8 @@ rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
 rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
 sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0=
 sigs.k8s.io/controller-runtime v0.6.1/go.mod h1:XRYBPdbf5XJu9kpS84VJiZ7h/u1hF3gEORz0efEja7A=
-sigs.k8s.io/controller-runtime v0.17.0 h1:fjJQf8Ukya+VjogLO6/bNX9HE6Y2xpsO5+fyS26ur/s=
-sigs.k8s.io/controller-runtime v0.17.0/go.mod h1:+MngTvIQQQhfXtwfdGw/UOQ/aIaqsYywfCINOtwMO/s=
+sigs.k8s.io/controller-runtime v0.16.3 h1:2TuvuokmfXvDUamSx1SuAOO3eTyye+47mJCigwG62c4=
+sigs.k8s.io/controller-runtime v0.16.3/go.mod h1:j7bialYoSn142nv9sCOJmQgDXQXxnroFU4VnX/brVJ0=
 sigs.k8s.io/controller-tools v0.3.0/go.mod h1:enhtKGfxZD1GFEoMgP8Fdbu+uKQ/cq1/WGJhdVChfvI=
 sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6/go.mod h1:p4QtZmO4uMYipTQNzagwnNoseA6OxSUutVw05NhYDRs=
 sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
diff --git a/pkg/apis/ceph.rook.io/v1/types.go b/pkg/apis/ceph.rook.io/v1/types.go
index ddcddc316..70806eb7e 100755
--- a/pkg/apis/ceph.rook.io/v1/types.go
+++ b/pkg/apis/ceph.rook.io/v1/types.go
@@ -1141,7 +1141,7 @@ type FilesystemSpec struct {
 type MetadataServerSpec struct {
 	// The number of metadata servers that are active. The remaining servers in the cluster will be in standby mode.
 	// +kubebuilder:validation:Minimum=1
-	// +kubebuilder:validation:Maximum=50
+	// +kubebuilder:validation:Maximum=10
 	ActiveCount int32 `json:"activeCount"`
 
 	// Whether each active MDS instance will have an active standby with a warm metadata cache for faster failover.
diff --git a/pkg/apis/go.mod b/pkg/apis/go.mod
index 277c0947c..e9d7c85e0 100644
--- a/pkg/apis/go.mod
+++ b/pkg/apis/go.mod
@@ -3,24 +3,15 @@ module github.com/rook/rook/pkg/apis
 go 1.21
 
 require (
-	github.com/hashicorp/vault/api v1.11.0
-	github.com/k8snetworkplumbingwg/network-attachment-definition-client v1.5.0
+	github.com/hashicorp/vault/api v1.10.0
+	github.com/k8snetworkplumbingwg/network-attachment-definition-client v1.4.0
 	github.com/kube-object-storage/lib-bucket-provisioner v0.0.0-20221122204822-d1a8c34382f1
 	github.com/libopenstorage/secrets v0.0.0-20231011182615-5f4b25ceede1
+	github.com/openshift/api v0.0.0-20231204192004-bfea29e5e6c4
 	github.com/pkg/errors v0.9.1
 	github.com/stretchr/testify v1.8.4
-	k8s.io/api v0.29.1
-	k8s.io/apimachinery v0.29.1
-)
-
-require (
-	github.com/google/uuid v1.6.0 // indirect
-	github.com/onsi/ginkgo/v2 v2.14.0 // indirect
-	github.com/onsi/gomega v1.30.0 // indirect
-	gopkg.in/yaml.v2 v2.4.0 // indirect
-	k8s.io/client-go v0.29.1 // indirect
-	k8s.io/utils v0.0.0-20231127182322-b307cd553661 // indirect
-	sigs.k8s.io/yaml v1.4.0 // indirect
+	k8s.io/api v0.29.0
+	k8s.io/apimachinery v0.29.0
 )
 
 require (
@@ -31,7 +22,7 @@ require (
 	github.com/evanphx/json-patch v5.7.0+incompatible // indirect
 	github.com/fsnotify/fsnotify v1.7.0 // indirect
 	github.com/go-jose/go-jose/v3 v3.0.1 // indirect
-	github.com/go-logr/logr v1.4.1 // indirect
+	github.com/go-logr/logr v1.3.0 // indirect
 	github.com/go-openapi/jsonpointer v0.20.0 // indirect
 	github.com/go-openapi/jsonreference v0.20.2 // indirect
 	github.com/go-openapi/swag v0.22.4 // indirect
@@ -39,6 +30,7 @@ require (
 	github.com/golang/protobuf v1.5.3 // indirect
 	github.com/google/gnostic-models v0.6.8 // indirect
 	github.com/google/gofuzz v1.2.0 // indirect
+	github.com/google/uuid v1.5.0 // indirect
 	github.com/hashicorp/errwrap v1.1.0 // indirect
 	github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
 	github.com/hashicorp/go-multierror v1.1.1 // indirect
@@ -60,25 +52,30 @@ require (
 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
 	github.com/modern-go/reflect2 v1.0.2 // indirect
 	github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
-	github.com/openshift/api v0.0.0-20231204192004-bfea29e5e6c4
+	github.com/onsi/gomega v1.30.0 // indirect
 	github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
 	github.com/ryanuber/go-glob v1.0.0 // indirect
 	github.com/sirupsen/logrus v1.9.3 // indirect
 	golang.org/x/crypto v0.17.0 // indirect
 	golang.org/x/net v0.19.0 // indirect
 	golang.org/x/oauth2 v0.15.0 // indirect
-	golang.org/x/sys v0.16.0 // indirect
+	golang.org/x/sys v0.15.0 // indirect
 	golang.org/x/term v0.15.0 // indirect
 	golang.org/x/text v0.14.0 // indirect
 	golang.org/x/time v0.5.0 // indirect
+	golang.org/x/tools v0.16.0 // indirect
 	google.golang.org/appengine v1.6.8 // indirect
 	google.golang.org/protobuf v1.31.0 // indirect
 	gopkg.in/inf.v0 v0.9.1 // indirect
+	gopkg.in/yaml.v2 v2.4.0 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
+	k8s.io/client-go v0.29.0 // indirect
 	k8s.io/klog/v2 v2.110.1 // indirect
 	k8s.io/kube-openapi v0.0.0-20231129212854-f0671cc7e66a // indirect
+	k8s.io/utils v0.0.0-20231127182322-b307cd553661 // indirect
 	sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
 	sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect
+	sigs.k8s.io/yaml v1.4.0 // indirect
 )
 
 exclude (
diff --git a/pkg/apis/go.sum b/pkg/apis/go.sum
index 7251d76ed..c134dda68 100644
--- a/pkg/apis/go.sum
+++ b/pkg/apis/go.sum
@@ -145,9 +145,8 @@ github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7
 github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
 github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
 github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=
 github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
-github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
-github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
 github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
 github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
 github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
@@ -263,8 +262,8 @@ github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+
 github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
-github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU=
+github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
 github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
 github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0=
@@ -313,9 +312,8 @@ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ
 github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
 github.com/hashicorp/hcl v1.0.1-vault-5 h1:kI3hhbbyzr4dldA8UdTb7ZlVVlI2DACdCfz31RPDgJM=
 github.com/hashicorp/hcl v1.0.1-vault-5/go.mod h1:XYhtn6ijBSAj6n4YqAaf7RBPS4I06AItNorpy+MoQNM=
+github.com/hashicorp/vault/api v1.10.0 h1:/US7sIjWN6Imp4o/Rj1Ce2Nr5bki/AXi9vAW3p2tOJQ=
 github.com/hashicorp/vault/api v1.10.0/go.mod h1:jo5Y/ET+hNyz+JnKDt8XLAdKs+AM0G5W0Vp1IrFI8N8=
-github.com/hashicorp/vault/api v1.11.0 h1:AChWByeHf4/P9sX3Y1B7vFsQhZO2BgQiCMQ2SA1P1UY=
-github.com/hashicorp/vault/api v1.11.0/go.mod h1:si+lJCYO7oGkIoNPAN8j3azBLTn9SjMGS+jFaHd1Cck=
 github.com/hashicorp/vault/api/auth/approle v0.5.0 h1:a1TK6VGwYqSAfkmX4y4dJ4WBxMU5dStIZqScW4EPXR8=
 github.com/hashicorp/vault/api/auth/approle v0.5.0/go.mod h1:CHOQIA1AZACfjTzHggmyfiOZ+xCSKNRFqe48FTCzH0k=
 github.com/hashicorp/vault/api/auth/kubernetes v0.5.0 h1:CXO0fD7M3iCGovP/UApeHhPcH4paDFKcu7AjEXi94rI=
@@ -335,8 +333,8 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr
 github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
 github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
-github.com/k8snetworkplumbingwg/network-attachment-definition-client v1.5.0 h1:V58W9SkSqAoKdYYH6q2aa3uDBE/I/KZ5Pe4Nj6M6oH4=
-github.com/k8snetworkplumbingwg/network-attachment-definition-client v1.5.0/go.mod h1:wxt2YWRVItDtaQmVSmaN5ubE2L1c9CiNoHQwSJnM8Ko=
+github.com/k8snetworkplumbingwg/network-attachment-definition-client v1.4.0 h1:VzM3TYHDgqPkettiP6I6q2jOeQFL4nrJM+UcAc4f6Fs=
+github.com/k8snetworkplumbingwg/network-attachment-definition-client v1.4.0/go.mod h1:nqCI7aelBJU61wiBeeZWJ6oi4bJy5nrjkM6lWIMA4j0=
 github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
 github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
@@ -411,8 +409,8 @@ github.com/onsi/ginkgo/v2 v2.3.0/go.mod h1:Eew0uilEqZmIEZr8JrvYlvOM7Rr6xzTmMV8Ay
 github.com/onsi/ginkgo/v2 v2.4.0/go.mod h1:iHkDK1fKGcBoEHT5W7YBq4RFWaQulw+caOMkAt4OrFo=
 github.com/onsi/ginkgo/v2 v2.5.0/go.mod h1:Luc4sArBICYCS8THh8v3i3i5CuSZO+RaQRaJoeNwomw=
 github.com/onsi/ginkgo/v2 v2.6.0/go.mod h1:63DOGlLAH8+REH8jUGdL3YpCpu7JODesutUjdENfUAc=
-github.com/onsi/ginkgo/v2 v2.14.0 h1:vSmGj2Z5YPb9JwCWT6z6ihcUvDhuXLc3sJiqd3jMKAY=
-github.com/onsi/ginkgo/v2 v2.14.0/go.mod h1:JkUdW7JkN0V6rFvsHcJ478egV3XH9NxpD27Hal/PhZw=
+github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4=
+github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o=
 github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
 github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
 github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
@@ -713,8 +711,8 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU=
-golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
+golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@@ -808,8 +806,8 @@ golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E=
 golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
 golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA=
-golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA=
-golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0=
+golang.org/x/tools v0.16.0 h1:GO788SKMRunPIBCXiQyo2AaexLstOrVhuAL5YwsckQM=
+golang.org/x/tools v0.16.0/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -1023,15 +1021,15 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9
 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
 k8s.io/api v0.23.5/go.mod h1:Na4XuKng8PXJ2JsploYYrivXrINeTaycCGcYgF91Xm8=
 k8s.io/api v0.26.0/go.mod h1:k6HDTaIFC8yn1i6pSClSqIwLABIcLV9l5Q4EcngKnQg=
-k8s.io/api v0.29.1 h1:DAjwWX/9YT7NQD4INu49ROJuZAAAP/Ijki48GUPzxqw=
-k8s.io/api v0.29.1/go.mod h1:7Kl10vBRUXhnQQI8YR/R327zXC8eJ7887/+Ybta+RoQ=
+k8s.io/api v0.29.0 h1:NiCdQMY1QOp1H8lfRyeEf8eOwV6+0xA6XEE44ohDX2A=
+k8s.io/api v0.29.0/go.mod h1:sdVmXoz2Bo/cb77Pxi71IPTSErEW32xa4aXwKH7gfBA=
 k8s.io/apimachinery v0.23.5/go.mod h1:BEuFMMBaIbcOqVIJqNZJXGFTP4W6AycEpb5+m/97hrM=
 k8s.io/apimachinery v0.26.0/go.mod h1:tnPmbONNJ7ByJNz9+n9kMjNP8ON+1qoAIIC70lztu74=
-k8s.io/apimachinery v0.29.1 h1:KY4/E6km/wLBguvCZv8cKTeOwwOBqFNjwJIdMkMbbRc=
-k8s.io/apimachinery v0.29.1/go.mod h1:6HVkd1FwxIagpYrHSwJlQqZI3G9LfYWRPAkUvLnXTKU=
+k8s.io/apimachinery v0.29.0 h1:+ACVktwyicPz0oc6MTMLwa2Pw3ouLAfAon1wPLtG48o=
+k8s.io/apimachinery v0.29.0/go.mod h1:eVBxQ/cwiJxH58eK/jd/vAk4mrxmVlnpBH5J2GbMeis=
 k8s.io/client-go v0.23.5/go.mod h1:flkeinTO1CirYgzMPRWxUCnV0G4Fbu2vLhYCObnt/r4=
-k8s.io/client-go v0.29.1 h1:19B/+2NGEwnFLzt0uB5kNJnfTsbV8w6TgQRz9l7ti7A=
-k8s.io/client-go v0.29.1/go.mod h1:TDG/psL9hdet0TI9mGyHJSgRkW3H9JZk2dNEUS7bRks=
+k8s.io/client-go v0.29.0 h1:KmlDtFcrdUzOYrBhXHgKw5ycWzc3ryPX5mQe0SkG3y8=
+k8s.io/client-go v0.29.0/go.mod h1:yLkXH4HKMAywcrD82KMSmfYg2DlE8mepPR4JGSo5n38=
 k8s.io/code-generator v0.20.1/go.mod h1:UsqdF+VX4PU2g46NC2JRs4gc+IfrctnwHb76RNbWHJg=
 k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
 k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
diff --git a/pkg/operator/ceph/cluster/cluster_external.go b/pkg/operator/ceph/cluster/cluster_external.go
index f0845b82d..1153140f1 100644
--- a/pkg/operator/ceph/cluster/cluster_external.go
+++ b/pkg/operator/ceph/cluster/cluster_external.go
@@ -20,7 +20,6 @@ package cluster
 import (
 	"context"
 
-	cephcsi "github.com/ceph/ceph-csi/api/deploy/kubernetes"
 	"github.com/pkg/errors"
 	cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
 	"github.com/rook/rook/pkg/clusterd"
@@ -130,13 +129,7 @@ func (c *ClusterController) configureExternalCephCluster(cluster *cluster) error
 
 	// Save CSI configmap
 	monEndpoints := csi.MonEndpoints(cluster.ClusterInfo.Monitors, cluster.Spec.RequireMsgr2())
-	csiConfigEntry := &csi.CSIClusterConfigEntry{
-		Namespace: cluster.ClusterInfo.Namespace,
-		ClusterInfo: cephcsi.ClusterInfo{
-			Monitors: monEndpoints,
-		},
-	}
-	err = csi.SaveClusterConfig(c.context.Clientset, c.namespacedName.Namespace, cluster.ClusterInfo, csiConfigEntry)
+	err = csi.SaveClusterConfig(c.context.Clientset, c.namespacedName.Namespace, cluster.ClusterInfo, &csi.CsiClusterConfigEntry{Namespace: cluster.ClusterInfo.Namespace, Monitors: monEndpoints})
 	if err != nil {
 		return errors.Wrap(err, "failed to update csi cluster config")
 	}
diff --git a/pkg/operator/ceph/cluster/mgr/dashboard.go b/pkg/operator/ceph/cluster/mgr/dashboard.go
index 2b79f1382..ead1a152b 100644
--- a/pkg/operator/ceph/cluster/mgr/dashboard.go
+++ b/pkg/operator/ceph/cluster/mgr/dashboard.go
@@ -51,8 +51,7 @@ const (
 )
 
 var (
-	dashboardInitWaitTime        = 5 * time.Second
-	removeMgrDaemonConfiguration = true
+	dashboardInitWaitTime = 5 * time.Second
 )
 
 func (c *Cluster) configureDashboardService() error {
@@ -94,9 +93,15 @@ func (c *Cluster) configureDashboardModules() error {
 		return errors.Wrap(err, "failed to initialize dashboard")
 	}
 
-	hasChanged, err := c.configureDashboardModuleSettings()
-	if err != nil {
-		return err
+	var hasChanged bool
+	for _, daemonID := range c.getDaemonIDs() {
+		changed, err := c.configureDashboardModuleSettings(daemonID)
+		if err != nil {
+			return err
+		}
+		if changed {
+			hasChanged = true
+		}
 	}
 	if hasChanged {
 		logger.Info("dashboard config has changed. restarting the dashboard module")
@@ -105,54 +110,20 @@ func (c *Cluster) configureDashboardModules() error {
 	return nil
 }
 
-// Delete the manager per-daemon configuration. Returns true
-// if all the configuration entries have been delete successfully.
-func (c *Cluster) deleteManagerDaemonConfiguration() bool {
-
-	mgrKeysToDelete := []string{
-		"mgr/dashboard/url_prefix",
-		"mgr/dashboard/ssl",
-		"mgr/dashboard/PROMETHEUS_API_HOST",
-		"mgr/dashboard/PROMETHEUS_API_SSL_VERIFY",
-		"mgr/dashboard/server_port",
-		"mgr/dashboard/ssl_server_port",
-	}
-
-	success := true
+func (c *Cluster) configureDashboardModuleSettings(daemonID string) (bool, error) {
 	monStore := config.GetMonStore(c.context, c.clusterInfo)
-	for _, daemonID := range c.getDaemonIDs() {
-		mgrDaemonID := fmt.Sprintf("%s.%s", config.MgrType, daemonID)
-		for _, key := range mgrKeysToDelete {
-			err := monStore.Delete(mgrDaemonID, key)
-			if err != nil {
-				logger.Errorf("failed to delete configuration entry %q %q, err: %v", mgrDaemonID, key, err)
-				success = false
-			}
-		}
-	}
-
-	if success {
-		logger.Info("All per-daemon mgr configuration has been deleted successfully.")
-	} else {
-		logger.Error("At least one delete operation failed while trying to delete per-daemon mgr configuration.")
-	}
 
-	return success
-}
-
-func (c *Cluster) configureDashboardModuleSettings() (bool, error) {
-
-	monStore := config.GetMonStore(c.context, c.clusterInfo)
+	daemonID = fmt.Sprintf("mgr.%s", daemonID)
 
 	// url prefix
-	hasChanged, err := monStore.SetIfChanged(config.MgrType, "mgr/dashboard/url_prefix", c.spec.Dashboard.URLPrefix)
+	hasChanged, err := monStore.SetIfChanged(daemonID, "mgr/dashboard/url_prefix", c.spec.Dashboard.URLPrefix)
 	if err != nil {
 		return false, err
 	}
 
 	// ssl support
 	ssl := strconv.FormatBool(c.spec.Dashboard.SSL)
-	changed, err := monStore.SetIfChanged(config.MgrType, "mgr/dashboard/ssl", ssl)
+	changed, err := monStore.SetIfChanged(daemonID, "mgr/dashboard/ssl", ssl)
 	if err != nil {
 		return false, err
 	}
@@ -160,7 +131,7 @@ func (c *Cluster) configureDashboardModuleSettings() (bool, error) {
 
 	// Prometheus host end point
 	prometheusEndpoint := c.spec.Dashboard.PrometheusEndpoint
-	changed, err = monStore.SetIfChanged(config.MgrType, "mgr/dashboard/PROMETHEUS_API_HOST", prometheusEndpoint)
+	changed, err = monStore.SetIfChanged(daemonID, "mgr/dashboard/PROMETHEUS_API_HOST", prometheusEndpoint)
 	if err != nil {
 		return false, err
 	}
@@ -168,7 +139,7 @@ func (c *Cluster) configureDashboardModuleSettings() (bool, error) {
 
 	// Prometheus host end point ssl verify
 	prometheusEndpointSSLVerify := strconv.FormatBool(c.spec.Dashboard.PrometheusEndpointSSLVerify)
-	changed, err = monStore.SetIfChanged(config.MgrType, "mgr/dashboard/PROMETHEUS_API_SSL_VERIFY", prometheusEndpointSSLVerify)
+	changed, err = monStore.SetIfChanged(daemonID, "mgr/dashboard/PROMETHEUS_API_SSL_VERIFY", prometheusEndpointSSLVerify)
 	if err != nil {
 		return false, err
 	}
@@ -176,7 +147,7 @@ func (c *Cluster) configureDashboardModuleSettings() (bool, error) {
 
 	// server port
 	port := strconv.Itoa(c.dashboardInternalPort())
-	changed, err = monStore.SetIfChanged(config.MgrType, "mgr/dashboard/server_port", port)
+	changed, err = monStore.SetIfChanged(daemonID, "mgr/dashboard/server_port", port)
 	if err != nil {
 		return false, err
 	}
@@ -184,18 +155,13 @@ func (c *Cluster) configureDashboardModuleSettings() (bool, error) {
 
 	// SSL enabled. Needed to set specifically the ssl port setting
 	if c.spec.Dashboard.SSL {
-		changed, err = monStore.SetIfChanged(config.MgrType, "mgr/dashboard/ssl_server_port", port)
+		changed, err = monStore.SetIfChanged(daemonID, "mgr/dashboard/ssl_server_port", port)
 		if err != nil {
 			return false, err
 		}
 		hasChanged = hasChanged || changed
 	}
 
-	// Remove any existing per mgr-daemon configuration
-	if removeMgrDaemonConfiguration {
-		removeMgrDaemonConfiguration = !c.deleteManagerDaemonConfiguration()
-	}
-
 	return hasChanged, nil
 }
 
@@ -270,37 +236,19 @@ func (c *Cluster) setLoginCredentials(password string) error {
 	if err != nil {
 		return errors.Wrap(err, "failed to create a temporary dashboard password file")
 	}
-
+	args = []string{"dashboard", "ac-user-create", dashboardUsername, "-i", file.Name(), "administrator"}
 	defer func() {
 		if err := os.Remove(file.Name()); err != nil {
 			logger.Errorf("failed to clean up dashboard password file %q. %v", file.Name(), err)
 		}
 	}()
 
-	// Create dashboard user
-	// > ceph dashboard ac-user-create <username> -i <path-to-password-file>
-	//
-	// Note: this command will succeed in case the user <dashboardUsername> already
-	// exists however it will not update the password. That why we need to explicitly
-	// call the ac-user-set-password command to ensure the password is updated correctly
-	args = []string{"dashboard", "ac-user-create", dashboardUsername, "-i", file.Name(), "administrator"}
-	_, err = client.ExecuteCephCommandWithRetry(func() (string, []byte, error) {
-		output, err := client.NewCephCommand(c.context, c.clusterInfo, args).RunWithTimeout(exec.CephCommandsTimeout)
-		return "create dashboard user", output, err
-	}, 5, dashboardInitWaitTime)
-	if err != nil {
-		return errors.Wrapf(err, "failed to create dashboard user %q", dashboardUsername)
-	}
-
-	// Set dashboard user password
-	// > ceph dashboard ac-user-set-password <username> -i <path-to-password-file>
-	args = []string{"dashboard", "ac-user-set-password", dashboardUsername, "-i", file.Name()}
 	_, err = client.ExecuteCephCommandWithRetry(func() (string, []byte, error) {
 		output, err := client.NewCephCommand(c.context, c.clusterInfo, args).RunWithTimeout(exec.CephCommandsTimeout)
-		return "set dashboard user password", output, err
+		return "set dashboard creds", output, err
 	}, 5, dashboardInitWaitTime)
 	if err != nil {
-		return errors.Wrapf(err, "failed to set password for user %q", dashboardUsername)
+		return errors.Wrap(err, "failed to set login creds on mgr")
 	}
 
 	logger.Info("successfully set ceph dashboard creds")
diff --git a/pkg/operator/ceph/cluster/mon/mon.go b/pkg/operator/ceph/cluster/mon/mon.go
index d2cf989ea..a5961793a 100644
--- a/pkg/operator/ceph/cluster/mon/mon.go
+++ b/pkg/operator/ceph/cluster/mon/mon.go
@@ -49,8 +49,6 @@ import (
 	"k8s.io/apimachinery/pkg/labels"
 	"k8s.io/apimachinery/pkg/util/sets"
 	"k8s.io/apimachinery/pkg/util/wait"
-
-	cephcsi "github.com/ceph/ceph-csi/api/deploy/kubernetes"
 )
 
 const (
@@ -1106,13 +1104,7 @@ func (c *Cluster) saveMonConfig() error {
 	}
 
 	monEndpoints := csi.MonEndpoints(c.ClusterInfo.Monitors, c.spec.RequireMsgr2())
-	csiConfigEntry := &csi.CSIClusterConfigEntry{
-		Namespace: c.ClusterInfo.Namespace,
-		ClusterInfo: cephcsi.ClusterInfo{
-			Monitors: monEndpoints,
-		},
-	}
-	if err := csi.SaveClusterConfig(c.context.Clientset, c.Namespace, c.ClusterInfo, csiConfigEntry); err != nil {
+	if err := csi.SaveClusterConfig(c.context.Clientset, c.Namespace, c.ClusterInfo, &csi.CsiClusterConfigEntry{Namespace: c.ClusterInfo.Namespace, Monitors: monEndpoints}); err != nil {
 		return errors.Wrap(err, "failed to update csi cluster config")
 	}
 
diff --git a/pkg/operator/ceph/cluster/nodedaemon/reconcile.go b/pkg/operator/ceph/cluster/nodedaemon/reconcile.go
index 9553995fc..af714bcd7 100644
--- a/pkg/operator/ceph/cluster/nodedaemon/reconcile.go
+++ b/pkg/operator/ceph/cluster/nodedaemon/reconcile.go
@@ -85,12 +85,12 @@ func (r *ReconcileNode) Reconcile(context context.Context, request reconcile.Req
 	return result, err
 }
 
-func (r *ReconcileNode) cleanupExporterResources(ns string, nodeName string) (reconcile.Result, error) {
+func (r *ReconcileNode) cleanupExporterResources(clusterNamespace string, ns string, nodeName string) (reconcile.Result, error) {
 	err := k8sutil.DeleteServiceMonitor(r.context, r.opManagerContext, ns, cephExporterAppName)
 	if err != nil {
 		logger.Debugf("failed to delete service monitor for ceph exporter in namespace %q on node %q. %v", ns, nodeName, err)
 	}
-	err = k8sutil.DeleteService(r.opManagerContext, r.context.Clientset, ns, cephExporterAppName)
+	err = k8sutil.DeleteService(r.opManagerContext, r.context.Clientset, r.opConfig.OperatorNamespace, cephExporterAppName)
 	if err != nil {
 		return reconcile.Result{}, errors.Wrapf(err, "failed to delete ceph exporter metrics service in namespace %q on node %q", ns, nodeName)
 	}
@@ -207,6 +207,10 @@ func (r *ReconcileNode) reconcile(request reconcile.Request) (reconcile.Result,
 			if err != nil {
 				return reconcile.Result{}, errors.Wrapf(err, "failed to list and delete deployments in namespace %q on node %q", namespace, request.Name)
 			}
+			result, err := r.cleanupExporterResources(cephCluster.Namespace, namespace, request.Name)
+			if err != nil {
+				return result, errors.Wrapf(err, "failed to cleanup exporter resources in namespace %q on node %q", namespace, request.Name)
+			}
 		}
 		// Cleanup exporter if the ceph version isn't supported
 		if !cephVersion.IsAtLeast(MinVersionForCephExporter) {
@@ -215,7 +219,7 @@ func (r *ReconcileNode) reconcile(request reconcile.Request) (reconcile.Result,
 					if err := r.listDeploymentAndDelete(cephExporterAppName, request.Name, namespace); err != nil {
 						return reconcile.Result{}, errors.Wrap(err, "failed to delete ceph-exporter")
 					}
-					result, err := r.cleanupExporterResources(namespace, request.Name)
+					result, err := r.cleanupExporterResources(cephCluster.Namespace, namespace, request.Name)
 					if err != nil {
 						return result, errors.Wrapf(err, "failed to cleanup exporter resources in namespace %q on node %q", namespace, request.Name)
 					}
diff --git a/pkg/operator/ceph/cluster/osd/osd.go b/pkg/operator/ceph/cluster/osd/osd.go
index 812cc5e4f..0487ad25e 100644
--- a/pkg/operator/ceph/cluster/osd/osd.go
+++ b/pkg/operator/ceph/cluster/osd/osd.go
@@ -268,30 +268,20 @@ func (c *Cluster) Start() error {
 		return errors.Wrapf(err, "failed to update ceph storage status")
 	}
 
-	if c.spec.Storage.Store.UpdateStore == OSDStoreUpdateConfirmation {
-		if c.replaceOSD != nil {
-			delOpts := &k8sutil.DeleteOptions{MustDelete: true, WaitOptions: k8sutil.WaitOptions{Wait: true}}
-			err := k8sutil.DeleteConfigMap(c.clusterInfo.Context, c.context.Clientset, OSDReplaceConfigName, namespace, delOpts)
-			if err != nil {
-				return errors.Wrapf(err, "failed to delete the %q configmap", OSDReplaceConfigName)
-			}
-		}
-
-		// wait for the pgs to be healthy before attempting to migrate the next OSD
-		_, err := c.waitForHealthyPGs()
+	if c.replaceOSD != nil {
+		delOpts := &k8sutil.DeleteOptions{MustDelete: true, WaitOptions: k8sutil.WaitOptions{Wait: true}}
+		err := k8sutil.DeleteConfigMap(c.clusterInfo.Context, c.context.Clientset, OSDReplaceConfigName, namespace, delOpts)
 		if err != nil {
-			return errors.Wrapf(err, "failed to wait for pgs to be healhty")
+			return errors.Wrapf(err, "failed to delete the %q configmap", OSDReplaceConfigName)
 		}
 
-		// reconcile if migration of one or more OSD is pending.
-		osdsToReplace, err := c.getOSDWithNonMatchingStore()
+		// Wait for PGs to be healthy before continuing the reconcile
+		_, err = c.waitForHealthyPGs()
 		if err != nil {
-			return errors.Wrapf(err, "failed to check if any OSD migration is pending")
+			return errors.Wrapf(err, "failed to wait for pgs to be healhty")
 		}
 
-		if len(osdsToReplace) != 0 {
-			return errors.New("reconcile operator to replace OSDs that are pending migration")
-		}
+		return errors.New("reconcile operator to replace OSDs that are pending migration")
 	}
 
 	logger.Infof("finished running OSDs in namespace %q", namespace)
@@ -856,7 +846,7 @@ func (c *Cluster) waitForHealthyPGs() (bool, error) {
 		if pgClean {
 			return true, nil
 		}
-		logger.Infof("waiting for PGs to be healthy. PG status: %q", pgHealthMsg)
+		logger.Infof("waiting for PGs to be healthy after replacing an OSD, status: %q", pgHealthMsg)
 		return false, nil
 	}
 
diff --git a/pkg/operator/ceph/cluster/osd/status.go b/pkg/operator/ceph/cluster/osd/status.go
index 999e8b3a1..564e5ce84 100644
--- a/pkg/operator/ceph/cluster/osd/status.go
+++ b/pkg/operator/ceph/cluster/osd/status.go
@@ -218,10 +218,10 @@ func (c *Cluster) updateAndCreateOSDsLoop(
 		ResourceVersion: configMapList.ResourceVersion,
 	}
 	watcher, err := cmClient.Watch(c.clusterInfo.Context, watchOptions)
+	defer watcher.Stop()
 	if err != nil {
 		return false, errors.Wrapf(err, "failed to start watching OSD provisioning status ConfigMaps")
 	}
-	defer watcher.Stop()
 
 	// tick after a short time of waiting for new OSD provision status configmaps to change state
 	// in order to allow opportunistic deployment updates while we wait
diff --git a/pkg/operator/ceph/config/monstore.go b/pkg/operator/ceph/config/monstore.go
index 01c4eac44..63c475e13 100644
--- a/pkg/operator/ceph/config/monstore.go
+++ b/pkg/operator/ceph/config/monstore.go
@@ -108,7 +108,7 @@ func (m *MonStore) Set(who, option, value string) error {
 
 // Delete a config in the centralized mon configuration database.
 func (m *MonStore) Delete(who, option string) error {
-	logger.Infof("deleting %q %q option from the mon configuration database", who, option)
+	logger.Infof("deleting %q option from the mon configuration database", option)
 	args := []string{"config", "rm", who, normalizeKey(option)}
 	cephCmd := client.NewCephCommand(m.context, m.clusterInfo, args)
 	out, err := cephCmd.RunWithTimeout(exec.CephCommandsTimeout)
diff --git a/pkg/operator/ceph/controller/predicate.go b/pkg/operator/ceph/controller/predicate.go
index 843a8234e..4eec479ab 100644
--- a/pkg/operator/ceph/controller/predicate.go
+++ b/pkg/operator/ceph/controller/predicate.go
@@ -436,34 +436,6 @@ func WatchControllerPredicate() predicate.Funcs {
 				if isUpgrade {
 					return true
 				}
-
-			case *cephv1.CephCOSIDriver:
-				objNew := e.ObjectNew.(*cephv1.CephCOSIDriver)
-				namespacedName := fmt.Sprintf("%s/%s", objNew.Namespace, objNew.Name)
-				logger.Debug("update event on CephCOSIDriver %q CR", namespacedName)
-				// If the labels "do_not_reconcile" is set on the object, let's not reconcile that request
-				IsDoNotReconcile := IsDoNotReconcile(objNew.GetLabels())
-				if IsDoNotReconcile {
-					logger.Debugf("object %q matched on update but %q label is set, doing nothing",
-						namespacedName, DoNotReconcileLabelName)
-					return false
-				}
-				diff := cmp.Diff(objOld.Spec, objNew.Spec)
-				if diff != "" {
-					logger.Infof("CephCOSIDriver CR has changed for %q. diff=%s", namespacedName, diff)
-					return true
-				} else if objectToBeDeleted(objOld, objNew) {
-					logger.Debugf("CephCOSIDriver CR %q is going be deleted", namespacedName)
-					return true
-				} else if objOld.GetGeneration() != objNew.GetGeneration() {
-					logger.Debugf("skipping CephCOSIDriver resource %q update with unchanged spec", namespacedName)
-				}
-				// Handling upgrades
-				isUpgrade := isUpgrade(objOld.GetLabels(), objNew.GetLabels())
-				if isUpgrade {
-					return true
-				}
-
 			}
 			return false
 		},
@@ -549,8 +521,8 @@ func WatchPredicateForNonCRDObject(owner runtime.Object, scheme *runtime.Scheme)
 					return false
 				}
 
-				// If the resource is a canary, crash collector, or exporter we don't reconcile because it's ephemeral
-				if isCanary(e.Object) || isCrashCollector(e.Object) || isExporter(e.Object) {
+				// If the resource is a canary deployment we don't reconcile because it's ephemeral
+				if isCanary(e.Object) || isCrashCollector(e.Object) {
 					return false
 				}
 
@@ -721,14 +693,6 @@ func isCanary(obj runtime.Object) bool {
 }
 
 func isCrashCollector(obj runtime.Object) bool {
-	return isDeployment(obj, "rook-ceph-crashcollector")
-}
-
-func isExporter(obj runtime.Object) bool {
-	return isDeployment(obj, "rook-ceph-exporter")
-}
-
-func isDeployment(obj runtime.Object, appName string) bool {
 	// If not a deployment, let's not reconcile
 	d, ok := obj.(*appsv1.Deployment)
 	if !ok {
@@ -739,8 +703,8 @@ func isDeployment(obj runtime.Object, appName string) bool {
 	labels := d.GetLabels()
 
 	labelVal, labelKeyExist := labels["app"]
-	if labelKeyExist && labelVal == appName {
-		logger.Debugf("do not reconcile %q on %s", d.Name, appName)
+	if labelKeyExist && labelVal == "rook-ceph-crashcollector" {
+		logger.Debugf("do not reconcile %q on crash collectors", d.Name)
 		return true
 	}
 
diff --git a/pkg/operator/ceph/csi/cluster_config.go b/pkg/operator/ceph/csi/cluster_config.go
index 42f761412..97928b9bf 100644
--- a/pkg/operator/ceph/csi/cluster_config.go
+++ b/pkg/operator/ceph/csi/cluster_config.go
@@ -33,8 +33,6 @@ import (
 	k8serrors "k8s.io/apimachinery/pkg/api/errors"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/client-go/kubernetes"
-
-	cephcsi "github.com/ceph/ceph-csi/api/deploy/kubernetes"
 )
 
 var (
@@ -42,18 +40,40 @@ var (
 	configMutex sync.Mutex
 )
 
-type CSIClusterConfigEntry struct {
-	cephcsi.ClusterInfo
-	Namespace string `json:"namespace"`
+type CsiClusterConfigEntry struct {
+	ClusterID      string                   `json:"clusterID"`
+	Monitors       []string                 `json:"monitors"`
+	Namespace      string                   `json:"namespace"`
+	CephFS         *CsiCephFSSpec           `json:"cephFS,omitempty"`
+	NFS            *CsiNFSSpec              `json:"nfs,omitempty"`
+	RBD            *CsiRBDSpec              `json:"rbd,omitempty"`
+	RadosNamespace string                   `json:"radosNamespace,omitempty"`
+	ReadAffinity   *cephv1.ReadAffinitySpec `json:"readAffinity,omitempty"`
+}
+
+type CsiCephFSSpec struct {
+	NetNamespaceFilePath string `json:"netNamespaceFilePath,omitempty"`
+	SubvolumeGroup       string `json:"subvolumeGroup,omitempty"`
+	KernelMountOptions   string `json:"kernelMountOptions,omitempty"`
+	FuseMountOptions     string `json:"fuseMountOptions,omitempty"`
 }
 
-type csiClusterConfig []CSIClusterConfigEntry
+type CsiNFSSpec struct {
+	NetNamespaceFilePath string `json:"netNamespaceFilePath,omitempty"`
+}
+
+type CsiRBDSpec struct {
+	NetNamespaceFilePath string `json:"netNamespaceFilePath,omitempty"`
+	RadosNamespace       string `json:"radosNamespace,omitempty"`
+}
+
+type csiClusterConfig []CsiClusterConfigEntry
 
 // FormatCsiClusterConfig returns a json-formatted string containing
 // the cluster-to-mon mapping required to configure ceph csi.
 func FormatCsiClusterConfig(
-	clusterKey string, mons map[string]*cephclient.MonInfo,
-) (string, error) {
+	clusterKey string, mons map[string]*cephclient.MonInfo) (string, error) {
+
 	cc := make(csiClusterConfig, 1)
 	cc[0].ClusterID = clusterKey
 	cc[0].Monitors = []string{}
@@ -105,10 +125,10 @@ func MonEndpoints(mons map[string]*cephclient.MonInfo, requireMsgr2 bool) []stri
 
 // updateCsiClusterConfig returns a json-formatted string containing
 // the cluster-to-mon mapping required to configure ceph csi.
-func updateCsiClusterConfig(curr, clusterKey string, newCsiClusterConfigEntry *CSIClusterConfigEntry) (string, error) {
+func updateCsiClusterConfig(curr, clusterKey string, newCsiClusterConfigEntry *CsiClusterConfigEntry) (string, error) {
 	var (
 		cc     csiClusterConfig
-		centry CSIClusterConfigEntry
+		centry CsiClusterConfigEntry
 		found  bool
 	)
 
@@ -140,15 +160,20 @@ func updateCsiClusterConfig(curr, clusterKey string, newCsiClusterConfigEntry *C
 				break
 			}
 			centry.Monitors = newCsiClusterConfigEntry.Monitors
-			if newCsiClusterConfigEntry.CephFS.SubvolumeGroup != "" || newCsiClusterConfigEntry.CephFS.NetNamespaceFilePath != "" {
+			if newCsiClusterConfigEntry.CephFS != nil && (newCsiClusterConfigEntry.CephFS.SubvolumeGroup != "" || newCsiClusterConfigEntry.CephFS.NetNamespaceFilePath != "") {
 				centry.CephFS = newCsiClusterConfigEntry.CephFS
 			}
-			if newCsiClusterConfigEntry.NFS.NetNamespaceFilePath != "" {
+			if newCsiClusterConfigEntry.NFS != nil && newCsiClusterConfigEntry.NFS.NetNamespaceFilePath != "" {
 				centry.NFS = newCsiClusterConfigEntry.NFS
 			}
-			if newCsiClusterConfigEntry.RBD.RadosNamespace != "" || newCsiClusterConfigEntry.RBD.NetNamespaceFilePath != "" {
+			if newCsiClusterConfigEntry.RBD != nil && (newCsiClusterConfigEntry.RBD.RadosNamespace != "" || newCsiClusterConfigEntry.RBD.NetNamespaceFilePath != "") {
 				centry.RBD = newCsiClusterConfigEntry.RBD
 			}
+			// This maintains backward compatibility for existing clusters, from now on the
+			// preferred way is to use RBD.RadosNamespace
+			if newCsiClusterConfigEntry.RadosNamespace != "" {
+				centry.RadosNamespace = newCsiClusterConfigEntry.RadosNamespace
+			}
 			found = true
 			cc[i] = centry
 			break
@@ -161,14 +186,14 @@ func updateCsiClusterConfig(curr, clusterKey string, newCsiClusterConfigEntry *C
 			centry.ClusterID = clusterKey
 			centry.Namespace = newCsiClusterConfigEntry.Namespace
 			centry.Monitors = newCsiClusterConfigEntry.Monitors
-			if newCsiClusterConfigEntry.RBD.RadosNamespace != "" || newCsiClusterConfigEntry.CephFS.NetNamespaceFilePath != "" {
+			if newCsiClusterConfigEntry.RBD != nil && (newCsiClusterConfigEntry.RBD.RadosNamespace != "" || newCsiClusterConfigEntry.CephFS.NetNamespaceFilePath != "") {
 				centry.RBD = newCsiClusterConfigEntry.RBD
 			}
 			// Add a condition not to fill with empty values
-			if newCsiClusterConfigEntry.CephFS.SubvolumeGroup != "" || newCsiClusterConfigEntry.CephFS.NetNamespaceFilePath != "" {
+			if newCsiClusterConfigEntry.CephFS != nil && (newCsiClusterConfigEntry.CephFS.SubvolumeGroup != "" || newCsiClusterConfigEntry.CephFS.NetNamespaceFilePath != "") {
 				centry.CephFS = newCsiClusterConfigEntry.CephFS
 			}
-			if newCsiClusterConfigEntry.NFS.NetNamespaceFilePath != "" {
+			if newCsiClusterConfigEntry.NFS != nil && newCsiClusterConfigEntry.NFS.NetNamespaceFilePath != "" {
 				centry.NFS = newCsiClusterConfigEntry.NFS
 			}
 			cc = append(cc, centry)
@@ -214,7 +239,7 @@ func CreateCsiConfigMap(ctx context.Context, namespace string, clientset kuberne
 // value that is provided to ceph-csi uses in the storage class.
 // The locker l is typically a mutex and is used to prevent the config
 // map from being updated for multiple clusters simultaneously.
-func SaveClusterConfig(clientset kubernetes.Interface, clusterNamespace string, clusterInfo *cephclient.ClusterInfo, newCsiClusterConfigEntry *CSIClusterConfigEntry) error {
+func SaveClusterConfig(clientset kubernetes.Interface, clusterNamespace string, clusterInfo *cephclient.ClusterInfo, newCsiClusterConfigEntry *CsiClusterConfigEntry) error {
 	// csi is deployed into the same namespace as the operator
 	csiNamespace := os.Getenv(k8sutil.PodNamespaceEnvVar)
 	if csiNamespace == "" {
@@ -261,8 +286,7 @@ func SaveClusterConfig(clientset kubernetes.Interface, clusterNamespace string,
 // updateCSIDriverOptions updates the CSI driver options, including read affinity, kernel mount options
 // and fuse mount options, for all entries belonging to the same cluster.
 func updateCSIDriverOptions(curr, clusterKey string,
-	csiDriverOptions *cephv1.CSIDriverSpec,
-) (string, error) {
+	csiDriverOptions *cephv1.CSIDriverSpec) (string, error) {
 	cc, err := parseCsiClusterConfig(curr)
 	if err != nil {
 		return "", errors.Wrap(err, "failed to parse current csi cluster config")
@@ -271,11 +295,16 @@ func updateCSIDriverOptions(curr, clusterKey string,
 	for i := range cc {
 		// If the clusterID belongs to the same cluster, update the entry.
 		if clusterKey == cc[i].Namespace {
-			cc[i].ReadAffinity.Enabled = csiDriverOptions.ReadAffinity.Enabled
-			cc[i].ReadAffinity.CrushLocationLabels = csiDriverOptions.ReadAffinity.CrushLocationLabels
-
-			cc[i].CephFS.KernelMountOptions = csiDriverOptions.CephFS.KernelMountOptions
-			cc[i].CephFS.FuseMountOptions = csiDriverOptions.CephFS.FuseMountOptions
+			cc[i].ReadAffinity = &csiDriverOptions.ReadAffinity
+			if cc[i].CephFS == nil {
+				cc[i].CephFS = &CsiCephFSSpec{
+					KernelMountOptions: csiDriverOptions.CephFS.KernelMountOptions,
+					FuseMountOptions:   csiDriverOptions.CephFS.FuseMountOptions,
+				}
+			} else {
+				cc[i].CephFS.KernelMountOptions = csiDriverOptions.CephFS.KernelMountOptions
+				cc[i].CephFS.FuseMountOptions = csiDriverOptions.CephFS.FuseMountOptions
+			}
 		}
 	}
 
diff --git a/pkg/operator/ceph/csi/csi.go b/pkg/operator/ceph/csi/csi.go
index 5415ed626..49d79423b 100644
--- a/pkg/operator/ceph/csi/csi.go
+++ b/pkg/operator/ceph/csi/csi.go
@@ -238,39 +238,6 @@ func (r *ReconcileCSI) setParams(ver *version.Info) error {
 		}
 	}
 
-	leaderElectionLeaseDuration := k8sutil.GetValue(r.opConfig.Parameters, "CSI_LEADER_ELECTION_LEASE_DURATION", "")
-	CSIParam.LeaderElectionLeaseDuration = defaultLeaderElectionLeaseDuration
-	if leaderElectionLeaseDuration != "" {
-		d, err := time.ParseDuration(leaderElectionLeaseDuration)
-		if err != nil {
-			logger.Errorf("failed to parse CSI_LEADER_ELECTION_LEASE_DURATION. Defaulting to %s. %v", defaultLeaderElectionLeaseDuration, err)
-		} else {
-			CSIParam.LeaderElectionLeaseDuration = d
-		}
-	}
-
-	leaderElectionRenewDeadline := k8sutil.GetValue(r.opConfig.Parameters, "CSI_LEADER_ELECTION_RENEW_DEADLINE", "")
-	CSIParam.LeaderElectionRenewDeadline = defaultLeaderElectionRenewDeadline
-	if leaderElectionRenewDeadline != "" {
-		d, err := time.ParseDuration(leaderElectionRenewDeadline)
-		if err != nil {
-			logger.Errorf("failed to parse CSI_LEADER_ELECTION_RENEW_DEADLINE. Defaulting to %s. %v", defaultLeaderElectionRenewDeadline, err)
-		} else {
-			CSIParam.LeaderElectionRenewDeadline = d
-		}
-	}
-
-	leaderElectionRetryPeriod := k8sutil.GetValue(r.opConfig.Parameters, "CSI_LEADER_ELECTION_RETRY_PERIOD", "")
-	CSIParam.LeaderElectionRetryPeriod = defaultLeaderElectionRetryPeriod
-	if leaderElectionRetryPeriod != "" {
-		d, err := time.ParseDuration(leaderElectionRetryPeriod)
-		if err != nil {
-			logger.Errorf("failed to parse CSI_LEADER_ELECTION_RETRY_PERIOD. Defaulting to %s. %v", defaultLeaderElectionRetryPeriod, err)
-		} else {
-			CSIParam.LeaderElectionRetryPeriod = d
-		}
-	}
-
 	CSIParam.ProvisionerReplicas = defaultProvisionerReplicas
 	nodes, err := r.context.Clientset.CoreV1().Nodes().List(r.opManagerContext, metav1.ListOptions{})
 	if err == nil {
@@ -320,8 +287,5 @@ func (r *ReconcileCSI) setParams(ver *version.Info) error {
 	if strings.EqualFold(k8sutil.GetValue(r.opConfig.Parameters, "CSI_NFS_ATTACH_REQUIRED", "true"), "false") {
 		CSIParam.NFSAttachRequired = false
 	}
-
-	CSIParam.DriverNamePrefix = k8sutil.GetValue(r.opConfig.Parameters, "CSI_DRIVER_NAME_PREFIX", r.opConfig.OperatorNamespace)
-
 	return nil
 }
diff --git a/pkg/operator/ceph/csi/spec.go b/pkg/operator/ceph/csi/spec.go
index f4ef79865..01c0f248b 100644
--- a/pkg/operator/ceph/csi/spec.go
+++ b/pkg/operator/ceph/csi/spec.go
@@ -20,7 +20,6 @@ import (
 	"context"
 	_ "embed"
 	"fmt"
-	"strings"
 	"time"
 
 	"github.com/rook/rook/pkg/operator/ceph/cluster/telemetry"
@@ -37,9 +36,6 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/types"
 	"k8s.io/apimachinery/pkg/version"
-	"k8s.io/client-go/kubernetes"
-
-	cephcsi "github.com/ceph/ceph-csi/api/deploy/kubernetes"
 )
 
 type Param struct {
@@ -89,9 +85,6 @@ type Param struct {
 	CephFSLivenessMetricsPort                uint16
 	CSIAddonsPort                            uint16
 	RBDLivenessMetricsPort                   uint16
-	LeaderElectionLeaseDuration              time.Duration
-	LeaderElectionRenewDeadline              time.Duration
-	LeaderElectionRetryPeriod                time.Duration
 	ProvisionerReplicas                      int32
 	CSICephFSPodLabels                       map[string]string
 	CSINFSPodLabels                          map[string]string
@@ -140,7 +133,7 @@ var (
 	// image names
 	DefaultCSIPluginImage   = "quay.io/cephcsi/cephcsi:v3.10.1"
 	DefaultRegistrarImage   = "registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.9.1"
-	DefaultProvisionerImage = "registry.k8s.io/sig-storage/csi-provisioner:v3.6.3"
+	DefaultProvisionerImage = "registry.k8s.io/sig-storage/csi-provisioner:v3.6.2"
 	DefaultAttacherImage    = "registry.k8s.io/sig-storage/csi-attacher:v4.4.2"
 	DefaultSnapshotterImage = "registry.k8s.io/sig-storage/csi-snapshotter:v6.3.2"
 	DefaultResizerImage     = "registry.k8s.io/sig-storage/csi-resizer:v1.9.2"
@@ -240,11 +233,6 @@ const (
 	defaultLogLevel        uint8 = 0
 	defaultSidecarLogLevel uint8 = 0
 
-	// default leader election flags
-	defaultLeaderElectionLeaseDuration = 137 * time.Second
-	defaultLeaderElectionRenewDeadline = 107 * time.Second
-	defaultLeaderElectionRetryPeriod   = 26 * time.Second
-
 	// GRPC timeout.
 	defaultGRPCTimeout = 150
 	grpcTimeout        = "CSI_GRPC_TIMEOUT_SECONDS"
@@ -265,17 +253,11 @@ const (
 	csiCephFSProvisioner = "csi-cephfsplugin-provisioner"
 	csiNFSProvisioner    = "csi-nfsplugin-provisioner"
 
-	// cephcsi container names
-	csiRBDContainerName    = "csi-rbdplugin"
-	csiCephFSContainerName = "csi-cephfsplugin"
-	csiNFSContainerName    = "csi-nfsplugin"
-
 	RBDDriverShortName    = "rbd"
 	CephFSDriverShortName = "cephfs"
 	NFSDriverShortName    = "nfs"
 	rbdDriverSuffix       = "rbd.csi.ceph.com"
 	cephFSDriverSuffix    = "cephfs.csi.ceph.com"
-	nfsDriverSuffix       = "nfs.csi.ceph.com"
 )
 
 func CSIEnabled() bool {
@@ -315,25 +297,11 @@ func (r *ReconcileCSI) startDrivers(ver *version.Info, ownerInfo *k8sutil.OwnerI
 		Namespace: r.opConfig.OperatorNamespace,
 	}
 
-	if strings.HasSuffix(tp.DriverNamePrefix, ".") {
-		// As operator is adding a dot at the end of the prefix, we should not
-		// allow the user to add a dot at the end of the prefix. as it will
-		// result in two dots at the end of the prefix. which cases the csi
-		// driver name creation failure
-		return errors.Errorf("driver name prefix %q should not end with a dot", tp.DriverNamePrefix)
-	}
-
-	err = validateCSIDriverNamePrefix(r.opManagerContext, r.context.Clientset, r.opConfig.OperatorNamespace, tp.DriverNamePrefix)
-	if err != nil {
-		return err
-	}
-	// Add a dot at the end of the prefix for having the driver name prefix
-	// with format <prefix>.<driver-name>
-	tp.DriverNamePrefix = fmt.Sprintf("%s.", tp.DriverNamePrefix)
+	tp.DriverNamePrefix = fmt.Sprintf("%s.", r.opConfig.OperatorNamespace)
 
 	CephFSDriverName = tp.DriverNamePrefix + cephFSDriverSuffix
 	RBDDriverName = tp.DriverNamePrefix + rbdDriverSuffix
-	NFSDriverName = tp.DriverNamePrefix + nfsDriverSuffix
+	NFSDriverName = tp.DriverNamePrefix + "nfs.csi.ceph.com"
 
 	tp.Param.MountCustomCephConf = CustomCSICephConfigExists
 
@@ -897,20 +865,15 @@ func (r *ReconcileCSI) configureHolder(driver driverDetails, c ClusterDetail, tp
 		}
 	}
 
-	clusterConfigEntry := &CSIClusterConfigEntry{
-		ClusterInfo: cephcsi.ClusterInfo{
-			Monitors: MonEndpoints(c.clusterInfo.Monitors, c.cluster.Spec.RequireMsgr2()),
-			RBD:      cephcsi.RBD{},
-			CephFS: cephcsi.CephFS{
-				FuseMountOptions:   c.clusterInfo.CSIDriverSpec.CephFS.FuseMountOptions,
-				KernelMountOptions: c.clusterInfo.CSIDriverSpec.CephFS.KernelMountOptions,
-			},
-			NFS: cephcsi.NFS{},
-			ReadAffinity: cephcsi.ReadAffinity{
-				Enabled:             c.clusterInfo.CSIDriverSpec.ReadAffinity.Enabled,
-				CrushLocationLabels: c.clusterInfo.CSIDriverSpec.ReadAffinity.CrushLocationLabels,
-			},
+	clusterConfigEntry := &CsiClusterConfigEntry{
+		Monitors: MonEndpoints(c.clusterInfo.Monitors, c.cluster.Spec.RequireMsgr2()),
+		RBD:      &CsiRBDSpec{},
+		CephFS: &CsiCephFSSpec{
+			FuseMountOptions:   c.clusterInfo.CSIDriverSpec.CephFS.FuseMountOptions,
+			KernelMountOptions: c.clusterInfo.CSIDriverSpec.CephFS.KernelMountOptions,
 		},
+		NFS:          &CsiNFSSpec{},
+		ReadAffinity: &c.clusterInfo.CSIDriverSpec.ReadAffinity,
 	}
 	netNamespaceFilePath := generateNetNamespaceFilePath(CSIParam.KubeletDirPath, driver.fullName, c.cluster.Namespace)
 	if driver.name == RBDDriverShortName {
@@ -957,83 +920,3 @@ func GenerateNetNamespaceFilePath(ctx context.Context, client client.Client, clu
 func generateNetNamespaceFilePath(kubeletDirPath, driverFullName, clusterNamespace string) string {
 	return fmt.Sprintf("%s/plugins/%s/%s.net.ns", kubeletDirPath, driverFullName, clusterNamespace)
 }
-
-func validateCSIDriverNamePrefix(ctx context.Context, clientset kubernetes.Interface, namespace, driverNamePrefix string) error {
-	if EnableRBD {
-		rbdDriverNamePrefix, err := getCSIDriverNamePrefixFromDeployment(ctx, clientset, namespace, csiRBDProvisioner, "csi-rbdplugin")
-		if err != nil {
-			return err
-		}
-		if rbdDriverNamePrefix != "" {
-			if rbdDriverNamePrefix != driverNamePrefix {
-				return errors.Errorf("rbd driver already exists with prefix %q, cannot use prefix %q", rbdDriverNamePrefix, driverNamePrefix)
-			}
-			return nil
-		}
-	}
-
-	if EnableCephFS {
-		cephFSDriverNamePrefix, err := getCSIDriverNamePrefixFromDeployment(ctx, clientset, namespace, csiCephFSProvisioner, "csi-cephfsplugin")
-		if err != nil {
-			return err
-		}
-		if cephFSDriverNamePrefix != "" {
-			if cephFSDriverNamePrefix != driverNamePrefix {
-				return errors.Errorf("cephFS driver already exists with prefix %q, cannot use prefix %q", cephFSDriverNamePrefix, driverNamePrefix)
-			}
-			return nil
-
-		}
-	}
-
-	if EnableNFS {
-		nfsDriverNamePrefix, err := getCSIDriverNamePrefixFromDeployment(ctx, clientset, namespace, csiNFSProvisioner, "csi-nfsplugin")
-		if err != nil {
-			return err
-		}
-		if nfsDriverNamePrefix != "" {
-			if nfsDriverNamePrefix != driverNamePrefix {
-				return errors.Errorf("nfs driver already exists with prefix %q, cannot use prefix %q", nfsDriverNamePrefix, driverNamePrefix)
-			}
-			return nil
-		}
-	}
-
-	return nil
-}
-
-func getCSIDriverNamePrefixFromDeployment(ctx context.Context, clientset kubernetes.Interface, namespace, deploymentName, containerName string) (string, error) {
-	deployment, err := clientset.AppsV1().Deployments(namespace).Get(ctx, deploymentName, metav1.GetOptions{})
-	if kerrors.IsNotFound(err) {
-		return "", nil
-	}
-	if err != nil {
-		return "", errors.Wrapf(err, "failed to get deployment %q", deploymentName)
-	}
-
-	for _, container := range deployment.Spec.Template.Spec.Containers {
-		if container.Name == containerName {
-			for _, arg := range container.Args {
-				if prefix, ok := getPrefixFromArg(arg); ok {
-					return prefix, nil
-				}
-			}
-		}
-	}
-
-	return "", errors.Errorf("failed to get CSI driver name from deployment %q", deploymentName)
-}
-
-func getPrefixFromArg(arg string) (string, bool) {
-	if strings.Contains(arg, "--drivername=") {
-		driverName := strings.Split(arg, "=")[1]
-
-		for _, suffix := range []string{rbdDriverSuffix, cephFSDriverSuffix, nfsDriverSuffix} {
-			// Add a dot as we are adding it to the Prefix
-			if prefix, ok := strings.CutSuffix(driverName, "."+suffix); ok {
-				return prefix, true
-			}
-		}
-	}
-	return "", false
-}
diff --git a/pkg/operator/ceph/csi/template/cephfs/csi-cephfsplugin-provisioner-dep.yaml b/pkg/operator/ceph/csi/template/cephfs/csi-cephfsplugin-provisioner-dep.yaml
index d280f11f9..cdf5c9c51 100644
--- a/pkg/operator/ceph/csi/template/cephfs/csi-cephfsplugin-provisioner-dep.yaml
+++ b/pkg/operator/ceph/csi/template/cephfs/csi-cephfsplugin-provisioner-dep.yaml
@@ -31,9 +31,9 @@ spec:
             - "--leader-election=true"
             - "--timeout={{ .GRPCTimeout }}"
             - "--leader-election-namespace={{ .Namespace }}"
-            - "--leader-election-lease-duration={{ .LeaderElectionLeaseDuration }}"
-            - "--leader-election-renew-deadline={{ .LeaderElectionRenewDeadline }}"
-            - "--leader-election-retry-period={{ .LeaderElectionRetryPeriod }}"
+            - "--leader-election-lease-duration=137s"
+            - "--leader-election-renew-deadline=107s"
+            - "--leader-election-retry-period=26s"
           env:
             - name: ADDRESS
               value: /csi/csi-provisioner.sock
@@ -51,9 +51,9 @@ spec:
             - "--timeout={{ .GRPCTimeout }}"
             - "--leader-election=true"
             - "--leader-election-namespace={{ .Namespace }}"
-            - "--leader-election-lease-duration={{ .LeaderElectionLeaseDuration }}"
-            - "--leader-election-renew-deadline={{ .LeaderElectionRenewDeadline }}"
-            - "--leader-election-retry-period={{ .LeaderElectionRetryPeriod }}"
+            - "--leader-election-lease-duration=137s"
+            - "--leader-election-renew-deadline=107s"
+            - "--leader-election-retry-period=26s"
             - "--extra-create-metadata=true"
           env:
             - name: ADDRESS
@@ -71,11 +71,10 @@ spec:
             - "--timeout={{ .GRPCTimeout }}"
             - "--leader-election=true"
             - "--leader-election-namespace={{ .Namespace }}"
-            - "--leader-election-lease-duration={{ .LeaderElectionLeaseDuration }}"
-            - "--leader-election-renew-deadline={{ .LeaderElectionRenewDeadline }}"
-            - "--leader-election-retry-period={{ .LeaderElectionRetryPeriod }}"
+            - "--leader-election-lease-duration=137s"
+            - "--leader-election-renew-deadline=107s"
+            - "--leader-election-retry-period=26s"
             - "--handle-volume-inuse-error=false"
-            - "--feature-gates=RecoverVolumeExpansionFailure=true"
           env:
             - name: ADDRESS
               value: unix:///csi/csi-provisioner.sock
@@ -92,11 +91,9 @@ spec:
             - "--retry-interval-start=500ms"
             - "--leader-election=true"
             - "--leader-election-namespace={{ .Namespace }}"
-            - "--feature-gates=HonorPVReclaimPolicy=true"
-            - "--prevent-volume-mode-conversion=true"
-            - "--leader-election-lease-duration={{ .LeaderElectionLeaseDuration }}"
-            - "--leader-election-renew-deadline={{ .LeaderElectionRenewDeadline }}"
-            - "--leader-election-retry-period={{ .LeaderElectionRetryPeriod }}"
+            - "--leader-election-lease-duration=137s"
+            - "--leader-election-renew-deadline=107s"
+            - "--leader-election-retry-period=26s"
             - "--extra-create-metadata=true"
           env:
             - name: ADDRESS
@@ -177,9 +174,9 @@ spec:
             - "--pod-uid=$(POD_UID)"
             - "--stagingpath={{ .KubeletDirPath }}/plugins/kubernetes.io/csi/"
             - "--leader-election-namespace={{ .Namespace }}"
-            - "--leader-election-lease-duration={{ .LeaderElectionLeaseDuration }}"
-            - "--leader-election-renew-deadline={{ .LeaderElectionRenewDeadline }}"
-            - "--leader-election-retry-period={{ .LeaderElectionRetryPeriod }}"
+            - "--leader-election-lease-duration=137s"
+            - "--leader-election-renew-deadline=107s"
+            - "--leader-election-retry-period=26s"
           ports:
             - containerPort: {{ .CSIAddonsPort }}
           env:
diff --git a/pkg/operator/ceph/csi/template/nfs/csi-nfsplugin-provisioner-dep.yaml b/pkg/operator/ceph/csi/template/nfs/csi-nfsplugin-provisioner-dep.yaml
index 84706dd72..b8aeebda9 100644
--- a/pkg/operator/ceph/csi/template/nfs/csi-nfsplugin-provisioner-dep.yaml
+++ b/pkg/operator/ceph/csi/template/nfs/csi-nfsplugin-provisioner-dep.yaml
@@ -30,9 +30,9 @@ spec:
             - "--leader-election=true"
             - "--timeout={{ .GRPCTimeout }}"
             - "--leader-election-namespace={{ .Namespace }}"
-            - "--leader-election-lease-duration={{ .LeaderElectionLeaseDuration }}"
-            - "--leader-election-renew-deadline={{ .LeaderElectionRenewDeadline }}"
-            - "--leader-election-retry-period={{ .LeaderElectionRetryPeriod }}"
+            - "--leader-election-lease-duration=137s"
+            - "--leader-election-renew-deadline=107s"
+            - "--leader-election-retry-period=26s"
           env:
             - name: ADDRESS
               value: /csi/csi-provisioner.sock
@@ -50,9 +50,9 @@ spec:
             - "--timeout={{ .GRPCTimeout }}"
             - "--leader-election=true"
             - "--leader-election-namespace={{ .Namespace }}"
-            - "--leader-election-lease-duration={{ .LeaderElectionLeaseDuration }}"
-            - "--leader-election-renew-deadline={{ .LeaderElectionRenewDeadline }}"
-            - "--leader-election-retry-period={{ .LeaderElectionRetryPeriod }}"
+            - "--leader-election-lease-duration=137s"
+            - "--leader-election-renew-deadline=107s"
+            - "--leader-election-retry-period=26s"
             - "--extra-create-metadata=true"
           env:
             - name: ADDRESS
@@ -70,11 +70,10 @@ spec:
             - "--timeout={{ .GRPCTimeout }}"
             - "--leader-election=true"
             - "--leader-election-namespace={{ .Namespace }}"
-            - "--leader-election-lease-duration={{ .LeaderElectionLeaseDuration }}"
-            - "--leader-election-renew-deadline={{ .LeaderElectionRenewDeadline }}"
-            - "--leader-election-retry-period={{ .LeaderElectionRetryPeriod }}"
+            - "--leader-election-lease-duration=137s"
+            - "--leader-election-renew-deadline=107s"
+            - "--leader-election-retry-period=26s"
             - "--handle-volume-inuse-error=false"
-            - "--feature-gates=RecoverVolumeExpansionFailure=true"
           env:
             - name: ADDRESS
               value: unix:///csi/csi-provisioner.sock
@@ -91,11 +90,9 @@ spec:
             - "--retry-interval-start=500ms"
             - "--leader-election=true"
             - "--leader-election-namespace={{ .Namespace }}"
-            - "--feature-gates=HonorPVReclaimPolicy=true"
-            - "--prevent-volume-mode-conversion=true"
-            - "--leader-election-lease-duration={{ .LeaderElectionLeaseDuration }}"
-            - "--leader-election-renew-deadline={{ .LeaderElectionRenewDeadline }}"
-            - "--leader-election-retry-period={{ .LeaderElectionRetryPeriod }}"
+            - "--leader-election-lease-duration=137s"
+            - "--leader-election-renew-deadline=107s"
+            - "--leader-election-retry-period=26s"
           env:
             - name: ADDRESS
               value: unix:///csi/csi-provisioner.sock
diff --git a/pkg/operator/ceph/csi/template/rbd/csi-rbdplugin-provisioner-dep.yaml b/pkg/operator/ceph/csi/template/rbd/csi-rbdplugin-provisioner-dep.yaml
index a564063f1..3abc84de1 100644
--- a/pkg/operator/ceph/csi/template/rbd/csi-rbdplugin-provisioner-dep.yaml
+++ b/pkg/operator/ceph/csi/template/rbd/csi-rbdplugin-provisioner-dep.yaml
@@ -31,13 +31,11 @@ spec:
             - "--retry-interval-start=500ms"
             - "--leader-election=true"
             - "--leader-election-namespace={{ .Namespace }}"
-            - "--leader-election-lease-duration={{ .LeaderElectionLeaseDuration }}"
-            - "--leader-election-renew-deadline={{ .LeaderElectionRenewDeadline }}"
-            - "--leader-election-retry-period={{ .LeaderElectionRetryPeriod }}"
+            - "--leader-election-lease-duration=137s"
+            - "--leader-election-renew-deadline=107s"
+            - "--leader-election-retry-period=26s"
             - "--default-fstype=ext4"
             - "--extra-create-metadata=true"
-            - "--prevent-volume-mode-conversion=true"
-            - "--feature-gates=HonorPVReclaimPolicy=true"
             {{- if .EnableCSITopology }}
             - "--feature-gates=Topology=true"
             {{- end }}
@@ -56,11 +54,10 @@ spec:
             - "--timeout={{ .GRPCTimeout }}"
             - "--leader-election=true"
             - "--leader-election-namespace={{ .Namespace }}"
-            - "--leader-election-lease-duration={{ .LeaderElectionLeaseDuration }}"
-            - "--leader-election-renew-deadline={{ .LeaderElectionRenewDeadline }}"
-            - "--leader-election-retry-period={{ .LeaderElectionRetryPeriod }}"
+            - "--leader-election-lease-duration=137s"
+            - "--leader-election-renew-deadline=107s"
+            - "--leader-election-retry-period=26s"
             - "--handle-volume-inuse-error=false"
-            - "--feature-gates=RecoverVolumeExpansionFailure=true"
           env:
             - name: ADDRESS
               value: unix:///csi/csi-provisioner.sock
@@ -77,9 +74,9 @@ spec:
             - "--csi-address=$(ADDRESS)"
             - "--leader-election=true"
             - "--leader-election-namespace={{ .Namespace }}"
-            - "--leader-election-lease-duration={{ .LeaderElectionLeaseDuration }}"
-            - "--leader-election-renew-deadline={{ .LeaderElectionRenewDeadline }}"
-            - "--leader-election-retry-period={{ .LeaderElectionRetryPeriod }}"
+            - "--leader-election-lease-duration=137s"
+            - "--leader-election-renew-deadline=107s"
+            - "--leader-election-retry-period=26s"
             - "--default-fstype=ext4"
           env:
             - name: ADDRESS
@@ -98,9 +95,9 @@ spec:
             - "--timeout={{ .GRPCTimeout }}"
             - "--leader-election=true"
             - "--leader-election-namespace={{ .Namespace }}"
-            - "--leader-election-lease-duration={{ .LeaderElectionLeaseDuration }}"
-            - "--leader-election-renew-deadline={{ .LeaderElectionRenewDeadline }}"
-            - "--leader-election-retry-period={{ .LeaderElectionRetryPeriod }}"
+            - "--leader-election-lease-duration=137s"
+            - "--leader-election-renew-deadline=107s"
+            - "--leader-election-retry-period=26s"
             - "--extra-create-metadata=true"
           env:
             - name: ADDRESS
@@ -149,9 +146,9 @@ spec:
             - "--pod-uid=$(POD_UID)"
             - "--stagingpath={{ .KubeletDirPath }}/plugins/kubernetes.io/csi/"
             - "--leader-election-namespace={{ .Namespace }}"
-            - "--leader-election-lease-duration={{ .LeaderElectionLeaseDuration }}"
-            - "--leader-election-renew-deadline={{ .LeaderElectionRenewDeadline }}"
-            - "--leader-election-retry-period={{ .LeaderElectionRetryPeriod }}"
+            - "--leader-election-lease-duration=137s"
+            - "--leader-election-renew-deadline=107s"
+            - "--leader-election-retry-period=26s"
           ports:
             - containerPort: {{ .CSIAddonsPort }}
           env:
diff --git a/pkg/operator/ceph/file/subvolumegroup/controller.go b/pkg/operator/ceph/file/subvolumegroup/controller.go
index 0bf5db43f..dc9a18066 100644
--- a/pkg/operator/ceph/file/subvolumegroup/controller.go
+++ b/pkg/operator/ceph/file/subvolumegroup/controller.go
@@ -46,8 +46,6 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime"
 	"k8s.io/apimachinery/pkg/types"
-
-	cephcsi "github.com/ceph/ceph-csi/api/deploy/kubernetes"
 )
 
 const (
@@ -280,26 +278,21 @@ func (r *ReconcileCephFilesystemSubVolumeGroup) updateClusterConfig(cephFilesyst
 	// Update CSI config map
 	// If the mon endpoints change, the mon health check go routine will take care of updating the
 	// config map, so no special care is needed in this controller
-	csiClusterConfigEntry := csi.CSIClusterConfigEntry{
+	csiClusterConfigEntry := csi.CsiClusterConfigEntry{
 		Namespace: r.clusterInfo.Namespace,
-		ClusterInfo: cephcsi.ClusterInfo{
-			Monitors: csi.MonEndpoints(r.clusterInfo.Monitors, cephCluster.Spec.RequireMsgr2()),
-			CephFS: cephcsi.CephFS{
-				SubvolumeGroup:     getSubvolumeGroupName(cephFilesystemSubVolumeGroup),
-				KernelMountOptions: r.clusterInfo.CSIDriverSpec.CephFS.KernelMountOptions,
-				FuseMountOptions:   r.clusterInfo.CSIDriverSpec.CephFS.FuseMountOptions,
-			},
-			ReadAffinity: cephcsi.ReadAffinity{
-				Enabled:             r.clusterInfo.CSIDriverSpec.ReadAffinity.Enabled,
-				CrushLocationLabels: r.clusterInfo.CSIDriverSpec.ReadAffinity.CrushLocationLabels,
-			},
+		Monitors:  csi.MonEndpoints(r.clusterInfo.Monitors, cephCluster.Spec.RequireMsgr2()),
+		CephFS: &csi.CsiCephFSSpec{
+			SubvolumeGroup:     getSubvolumeGroupName(cephFilesystemSubVolumeGroup),
+			KernelMountOptions: r.clusterInfo.CSIDriverSpec.CephFS.KernelMountOptions,
+			FuseMountOptions:   r.clusterInfo.CSIDriverSpec.CephFS.FuseMountOptions,
 		},
+		ReadAffinity: &r.clusterInfo.CSIDriverSpec.ReadAffinity,
 	}
 
 	// If the cluster has Multus enabled we need to append the network namespace of the driver's
 	// holder DaemonSet in the csi configmap
 	if cephCluster.Spec.Network.IsMultus() {
-		netNamespaceFilePath, err := csi.GenerateNetNamespaceFilePath(r.opManagerContext, r.client, cephCluster.Namespace, r.opConfig.OperatorNamespace, csi.CephFSDriverShortName)
+		netNamespaceFilePath, err := csi.GenerateNetNamespaceFilePath(r.opManagerContext, r.client, cephCluster.Name, r.opConfig.OperatorNamespace, csi.CephFSDriverShortName)
 		if err != nil {
 			return errors.Wrap(err, "failed to generate cephfs net namespace file path")
 		}
diff --git a/pkg/operator/ceph/object/objectstore.go b/pkg/operator/ceph/object/objectstore.go
index 78645c570..0b1f984fe 100644
--- a/pkg/operator/ceph/object/objectstore.go
+++ b/pkg/operator/ceph/object/objectstore.go
@@ -392,11 +392,7 @@ func createMultisiteConfigurations(objContext *Context, configType, configTypeAr
 	args = append([]string{configType}, args...)
 	args = append(args, configTypeArg)
 	// get the multisite config before creating
-	configTypeArgs := []string{configType, "get", configTypeArg}
-	if configType == "zonegroup" {
-		configTypeArgs = append(configTypeArgs, fmt.Sprintf("--rgw-realm=%s", objContext.Realm))
-	}
-	output, getConfigErr := RunAdminCommandNoMultisite(objContext, true, configTypeArgs...)
+	output, getConfigErr := RunAdminCommandNoMultisite(objContext, true, configType, "get", configTypeArg)
 	if getConfigErr == nil {
 		return nil
 	}
diff --git a/pkg/operator/ceph/pool/radosnamespace/controller.go b/pkg/operator/ceph/pool/radosnamespace/controller.go
index 0c48e8602..726aa63f1 100644
--- a/pkg/operator/ceph/pool/radosnamespace/controller.go
+++ b/pkg/operator/ceph/pool/radosnamespace/controller.go
@@ -44,8 +44,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 	"sigs.k8s.io/controller-runtime/pkg/source"
-
-	cephcsi "github.com/ceph/ceph-csi/api/deploy/kubernetes"
 )
 
 const (
@@ -266,27 +264,23 @@ func (r *ReconcileCephBlockPoolRadosNamespace) updateClusterConfig(cephBlockPool
 	// Update CSI config map
 	// If the mon endpoints change, the mon health check go routine will take care of updating the
 	// config map, so no special care is needed in this controller
-	csiClusterConfigEntry := csi.CSIClusterConfigEntry{
+	csiClusterConfigEntry := csi.CsiClusterConfigEntry{
 		Namespace: r.clusterInfo.Namespace,
-		ClusterInfo: cephcsi.ClusterInfo{
-			Monitors: csi.MonEndpoints(r.clusterInfo.Monitors, cephCluster.Spec.RequireMsgr2()),
-			RBD: cephcsi.RBD{
-				RadosNamespace: getRadosNamespaceName(cephBlockPoolRadosNamespace),
-			},
-			CephFS: cephcsi.CephFS{
-				KernelMountOptions: r.clusterInfo.CSIDriverSpec.CephFS.KernelMountOptions,
-				FuseMountOptions:   r.clusterInfo.CSIDriverSpec.CephFS.FuseMountOptions,
-			},
-			ReadAffinity: cephcsi.ReadAffinity{
-				Enabled:             r.clusterInfo.CSIDriverSpec.ReadAffinity.Enabled,
-				CrushLocationLabels: r.clusterInfo.CSIDriverSpec.ReadAffinity.CrushLocationLabels,
-			},
+		Monitors:  csi.MonEndpoints(r.clusterInfo.Monitors, cephCluster.Spec.RequireMsgr2()),
+		RBD: &csi.CsiRBDSpec{
+			RadosNamespace: getRadosNamespaceName(cephBlockPoolRadosNamespace),
+		},
+		RadosNamespace: getRadosNamespaceName(cephBlockPoolRadosNamespace),
+		CephFS: &csi.CsiCephFSSpec{
+			KernelMountOptions: r.clusterInfo.CSIDriverSpec.CephFS.KernelMountOptions,
+			FuseMountOptions:   r.clusterInfo.CSIDriverSpec.CephFS.FuseMountOptions,
 		},
+		ReadAffinity: &r.clusterInfo.CSIDriverSpec.ReadAffinity,
 	}
 
 	if cephCluster.Spec.Network.IsMultus() {
 		// Build the network namespace config to be injected into the csi config
-		netNamespaceFilePath, err := csi.GenerateNetNamespaceFilePath(r.opManagerContext, r.client, cephCluster.Namespace, r.opConfig.OperatorNamespace, csi.RBDDriverShortName)
+		netNamespaceFilePath, err := csi.GenerateNetNamespaceFilePath(r.opManagerContext, r.client, cephCluster.Name, r.opConfig.OperatorNamespace, csi.RBDDriverShortName)
 		if err != nil {
 			return errors.Wrap(err, "failed to generate rbd net namespace file path")
 		}


Test patch:
diff --git a/.github/workflows/canary-integration-test.yml b/.github/workflows/canary-integration-test.yml
index 4bcbb2a5f..eb62e52d0 100644
--- a/.github/workflows/canary-integration-test.yml
+++ b/.github/workflows/canary-integration-test.yml
@@ -13,11 +13,6 @@ on:
     paths-ignore:
       - "Documentation/**"
       - "design/**"
-  workflow_dispatch:
-    inputs:
-      ceph-image:
-        description: 'Ceph image for creating Ceph cluster'
-        default: 'quay.io/ceph/ceph:v18'
 
 defaults:
   run:
@@ -47,9 +42,6 @@ jobs:
       - name: setup cluster resources
         uses: ./.github/workflows/canary-test-config
 
-      - name: set Ceph version in CephCluster manifest
-        run: tests/scripts/github-action-helper.sh replace_ceph_image  "deploy/examples/cluster-test.yaml" "${{ github.event.inputs.ceph-image }}"
-
       - name: validate-yaml
         run: tests/scripts/github-action-helper.sh validate_yaml
 
@@ -62,7 +54,7 @@ jobs:
         run: tests/scripts/github-action-helper.sh deploy_cluster
 
       - name: setup csi-addons
-        run: tests/scripts/csiaddons.sh setup_csiaddons
+        run:  tests/scripts/csiaddons.sh setup_csiaddons
 
       - name: wait for prepare pod
         run: tests/scripts/github-action-helper.sh wait_for_prepare_pod 2
@@ -170,11 +162,6 @@ jobs:
           toolbox=$(kubectl get pod -l app=rook-ceph-tools -n rook-ceph -o jsonpath='{.items[*].metadata.name}')
           kubectl -n rook-ceph exec $toolbox -- python3 /etc/ceph/create-external-cluster-resources.py --rbd-data-pool-name replicapool --k8s-cluster-name rookstorage --restricted-auth-permission true
 
-      - name: test external script with restricted_auth_permission flag and with --cluster-name legacy flag
-        run: |
-          toolbox=$(kubectl get pod -l app=rook-ceph-tools -n rook-ceph -o jsonpath='{.items[*].metadata.name}')
-          kubectl -n rook-ceph exec $toolbox -- python3 /etc/ceph/create-external-cluster-resources.py --rbd-data-pool-name replicapool --cluster-name rookstorage --restricted-auth-permission true
-
       - name: test external script with restricted_auth_permission flag
         run: |
           toolbox=$(kubectl get pod -l app=rook-ceph-tools -n rook-ceph -o jsonpath='{.items[*].metadata.name}')
@@ -294,9 +281,6 @@ jobs:
       - name: setup cluster resources
         uses: ./.github/workflows/canary-test-config
 
-      - name: set Ceph version in CephCluster manifest
-        run: tests/scripts/github-action-helper.sh replace_ceph_image  "deploy/examples/cluster-test.yaml" "${{ github.event.inputs.ceph-image }}"
-
       - name: validate-yaml
         run: tests/scripts/github-action-helper.sh validate_yaml
 
@@ -361,9 +345,6 @@ jobs:
       - name: setup cluster resources
         uses: ./.github/workflows/canary-test-config
 
-      - name: set Ceph version in CephCluster manifest
-        run: tests/scripts/github-action-helper.sh replace_ceph_image  "deploy/examples/cluster-test.yaml" "${{ github.event.inputs.ceph-image }}"
-
       - name: validate-yaml
         run: tests/scripts/github-action-helper.sh validate_yaml
 
@@ -408,9 +389,6 @@ jobs:
       - name: setup cluster resources
         uses: ./.github/workflows/canary-test-config
 
-      - name: set Ceph version in CephCluster manifest
-        run: tests/scripts/github-action-helper.sh replace_ceph_image  "deploy/examples/cluster-test.yaml" "${{ github.event.inputs.ceph-image }}"
-
       - name: validate-yaml
         run: tests/scripts/github-action-helper.sh validate_yaml
 
@@ -461,9 +439,6 @@ jobs:
       - name: setup cluster resources
         uses: ./.github/workflows/canary-test-config
 
-      - name: set Ceph version in CephCluster manifest
-        run: tests/scripts/github-action-helper.sh replace_ceph_image  "deploy/examples/cluster-test.yaml" "${{ github.event.inputs.ceph-image }}"
-
       - name: validate-yaml
         run: tests/scripts/github-action-helper.sh validate_yaml
 
@@ -508,9 +483,6 @@ jobs:
       - name: setup cluster resources
         uses: ./.github/workflows/canary-test-config
 
-      - name: set Ceph version in CephCluster manifest
-        run: tests/scripts/github-action-helper.sh replace_ceph_image  "deploy/examples/cluster-test.yaml" "${{ github.event.inputs.ceph-image }}"
-
       - name: validate-yaml
         run: tests/scripts/github-action-helper.sh validate_yaml
 
@@ -560,9 +532,6 @@ jobs:
       - name: setup cluster resources
         uses: ./.github/workflows/canary-test-config
 
-      - name: set Ceph version in CephCluster manifest
-        run: tests/scripts/github-action-helper.sh replace_ceph_image  "tests/manifests/test-cluster-on-pvc-encrypted.yaml" "${{ github.event.inputs.ceph-image }}"
-
       - name: use local disk and create partitions for osds
         run: |
           tests/scripts/github-action-helper.sh use_local_disk
@@ -633,9 +602,6 @@ jobs:
       - name: setup cluster resources
         uses: ./.github/workflows/canary-test-config
 
-      - name: set Ceph version in CephCluster manifest
-        run: tests/scripts/github-action-helper.sh replace_ceph_image  "tests/manifests/test-cluster-on-pvc-encrypted.yaml" "${{ github.event.inputs.ceph-image }}"
-
       - name: use local disk
         run: tests/scripts/github-action-helper.sh use_local_disk
 
@@ -682,9 +648,6 @@ jobs:
       - name: setup cluster resources
         uses: ./.github/workflows/canary-test-config
 
-      - name: set Ceph version in CephCluster manifest
-        run: tests/scripts/github-action-helper.sh replace_ceph_image  "tests/manifests/test-cluster-on-pvc-encrypted.yaml" "${{ github.event.inputs.ceph-image }}"
-
       - name: use local disk
         run: tests/scripts/github-action-helper.sh use_local_disk
 
@@ -734,9 +697,6 @@ jobs:
       - name: setup cluster resources
         uses: ./.github/workflows/canary-test-config
 
-      - name: set Ceph version in CephCluster manifest
-        run: tests/scripts/github-action-helper.sh replace_ceph_image  "tests/manifests/test-cluster-on-pvc-encrypted.yaml" "${{ github.event.inputs.ceph-image }}"
-
       - name: use local disk and create partitions for osds
         run: |
           tests/scripts/github-action-helper.sh use_local_disk
@@ -798,9 +758,6 @@ jobs:
       - name: setup cluster resources
         uses: ./.github/workflows/canary-test-config
 
-      - name: set Ceph version in CephCluster manifest
-        run: tests/scripts/github-action-helper.sh replace_ceph_image  "tests/manifests/test-cluster-on-pvc-encrypted.yaml" "${{ github.event.inputs.ceph-image }}"
-
       - name: use local disk
         run: tests/scripts/github-action-helper.sh use_local_disk
 
@@ -849,9 +806,6 @@ jobs:
       - name: setup cluster resources
         uses: ./.github/workflows/canary-test-config
 
-      - name: set Ceph version in CephCluster manifest
-        run: tests/scripts/github-action-helper.sh replace_ceph_image  "tests/manifests/test-cluster-on-pvc-encrypted.yaml" "${{ github.event.inputs.ceph-image }}"
-
       - name: use local disk
         run: tests/scripts/github-action-helper.sh use_local_disk
 
@@ -910,9 +864,6 @@ jobs:
       - name: setup cluster resources
         uses: ./.github/workflows/canary-test-config
 
-      - name: set Ceph version in CephCluster manifest
-        run: tests/scripts/github-action-helper.sh replace_ceph_image  "tests/manifests/test-cluster-on-pvc-encrypted.yaml" "${{ github.event.inputs.ceph-image }}"
-
       - name: use local disk and create partitions for osds
         run: |
           tests/scripts/github-action-helper.sh use_local_disk
@@ -992,9 +943,6 @@ jobs:
       - name: setup cluster resources
         uses: ./.github/workflows/canary-test-config
 
-      - name: set Ceph version in CephCluster manifest
-        run: tests/scripts/github-action-helper.sh replace_ceph_image  "tests/manifests/test-cluster-on-pvc-encrypted.yaml" "${{ github.event.inputs.ceph-image }}"
-
       - name: use local disk and create partitions for osds
         run: |
           tests/scripts/github-action-helper.sh use_local_disk
@@ -1054,9 +1002,6 @@ jobs:
       - name: setup cluster resources
         uses: ./.github/workflows/canary-test-config
 
-      - name: set Ceph version in CephCluster manifest
-        run: tests/scripts/github-action-helper.sh replace_ceph_image  "tests/manifests/test-cluster-on-pvc-encrypted.yaml" "${{ github.event.inputs.ceph-image }}"
-
       - name: create cluster prerequisites
         run: tests/scripts/github-action-helper.sh create_cluster_prerequisites
 
@@ -1108,9 +1053,6 @@ jobs:
       - name: setup cluster resources
         uses: ./.github/workflows/canary-test-config
 
-      - name: set Ceph version in CephCluster manifest
-        run: tests/scripts/github-action-helper.sh replace_ceph_image  "deploy/examples/cluster-test.yaml" "${{ github.event.inputs.ceph-image }}"
-
       - name: use local disk into two partitions
         run: |
           tests/scripts/github-action-helper.sh use_local_disk
@@ -1361,11 +1303,11 @@ jobs:
         with:
           use-tmate: ${{ secrets.USE_TMATE }}
 
-      - name: set Ceph version in CephCluster manifest
-        run: tests/scripts/github-action-helper.sh replace_ceph_image  "deploy/examples/cluster-test.yaml" "${{ github.event.inputs.ceph-image }}"
-
       - name: run RGW multisite test
         uses: ./.github/workflows/rgw-multisite-test
+        with:
+          github-token: ${{ secrets.GITHUB_TOKEN }}
+          # ceph-image: # use default
 
       - name: upload test result
         uses: actions/upload-artifact@v4
@@ -1429,9 +1371,6 @@ jobs:
       - name: setup cluster resources
         uses: ./.github/workflows/canary-test-config
 
-      - name: set Ceph version in CephCluster manifest
-        run: tests/scripts/github-action-helper.sh replace_ceph_image  "deploy/examples/cluster-test.yaml" "${{ github.event.inputs.ceph-image }}"
-
       - name: install deps
         shell: bash --noprofile --norc -eo pipefail -x {0}
         run: tests/scripts/github-action-helper.sh install_deps
@@ -1506,9 +1445,6 @@ jobs:
       - name: setup cluster resources
         uses: ./.github/workflows/canary-test-config
 
-      - name: set Ceph version in CephCluster manifest
-        run: tests/scripts/github-action-helper.sh replace_ceph_image  "deploy/examples/cluster-test.yaml" "${{ github.event.inputs.ceph-image }}"
-
       - name: use local disk and create partitions for osds
         run: |
           tests/scripts/github-action-helper.sh use_local_disk
diff --git a/.github/workflows/rgw-multisite-test/action.yml b/.github/workflows/rgw-multisite-test/action.yml
index 9471bfe7f..033ac3ab4 100644
--- a/.github/workflows/rgw-multisite-test/action.yml
+++ b/.github/workflows/rgw-multisite-test/action.yml
@@ -1,11 +1,20 @@
 name: RGW Multisite Test
 description: Reusable workflow to test RGW multisite integration
+inputs:
+  github-token:
+    description: GITHUB_TOKEN from the calling workflow
+    required: true
+  ceph-image:
+    description: Ceph image to use for the workflow (e.g., quay.io/ceph/ceph:v17)
+    required: false
 
 runs:
   using: "composite"
   steps:
     - name: setup cluster resources
       uses: ./.github/workflows/canary-test-config
+      with:
+        github-token: ${{ inputs.github-token }}
 
     - name: install additional deps for object testing
       shell: bash --noprofile --norc -eo pipefail -x {0}
@@ -20,6 +29,12 @@ runs:
         tests/scripts/create-bluestore-partitions.sh --disk "$BLOCK" --osd-count 2
         sudo lsblk
 
+    - name: set Ceph version in CephCluster manifest
+      shell: bash --noprofile --norc -eo pipefail -x {0}
+      run: |
+        tests/scripts/github-action-helper.sh replace_ceph_image \
+          "deploy/examples/cluster-test.yaml" "${{ inputs.ceph-image }}"
+
     - name: deploy first cluster rook
       shell: bash --noprofile --norc -eo pipefail -x {0}
       run: |
diff --git a/deploy/examples/csi/rbd/storageclass-test.yaml b/deploy/examples/csi/rbd/storageclass-test.yaml
index 4ed16cec8..f5cf3b45c 100644
--- a/deploy/examples/csi/rbd/storageclass-test.yaml
+++ b/deploy/examples/csi/rbd/storageclass-test.yaml
@@ -18,7 +18,8 @@ apiVersion: storage.k8s.io/v1
 kind: StorageClass
 metadata:
   name: rook-ceph-block
-provisioner: rook-ceph.rbd.csi.ceph.com # csi-provisioner-name
+# Change "rook-ceph" provisioner prefix to match the operator namespace if needed
+provisioner: rook-ceph.rbd.csi.ceph.com # driver:namespace:operator
 parameters:
   # clusterID is the namespace where the rook cluster is running
   # If you change this namespace, also change the namespace below where the secret namespaces are defined
diff --git a/pkg/operator/ceph/cluster/controller_test.go b/pkg/operator/ceph/cluster/controller_test.go
index 8a5ffc6c6..a7adcefbe 100644
--- a/pkg/operator/ceph/cluster/controller_test.go
+++ b/pkg/operator/ceph/cluster/controller_test.go
@@ -49,10 +49,6 @@ func TestReconcileDeleteCephCluster(t *testing.T) {
 	}
 
 	fakeCluster := &cephv1.CephCluster{
-		TypeMeta: metav1.TypeMeta{
-			Kind:       "CephCluster",
-			APIVersion: "ceph.rook.io/v1",
-		},
 		ObjectMeta: metav1.ObjectMeta{
 			Name:              clusterName,
 			Namespace:         cephNs,
diff --git a/pkg/operator/ceph/csi/cluster_config_test.go b/pkg/operator/ceph/csi/cluster_config_test.go
index 7d8ac69fc..bc406f8df 100644
--- a/pkg/operator/ceph/csi/cluster_config_test.go
+++ b/pkg/operator/ceph/csi/cluster_config_test.go
@@ -17,85 +17,46 @@ limitations under the License.
 package csi
 
 import (
-	"encoding/json"
 	"strings"
 	"testing"
 
 	cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
 	cephclient "github.com/rook/rook/pkg/daemon/ceph/client"
 	"github.com/stretchr/testify/assert"
-
-	cephcsi "github.com/ceph/ceph-csi/api/deploy/kubernetes"
 )
 
-func unmarshal(s string) ([]CSIClusterConfigEntry, error) {
-	var csiClusterConfigEntry []CSIClusterConfigEntry
-	if err := json.Unmarshal([]byte(s), &csiClusterConfigEntry); err != nil {
-		return csiClusterConfigEntry, err
-	}
-
-	return csiClusterConfigEntry, nil
-}
-
-func compareJSON(t *testing.T, exceptedJSON, actualJSON string) {
-	var (
-		err              error
-		expected, actual []CSIClusterConfigEntry
-	)
-
-	expected, err = unmarshal(exceptedJSON)
-	if err != nil {
-		t.Error(err)
-	}
-	actual, err = unmarshal(exceptedJSON)
-	if err != nil {
-		t.Error(err)
-	}
-
-	assert.Equal(t, expected, actual)
-}
-
 func TestUpdateCsiClusterConfig(t *testing.T) {
-	csiClusterConfigEntry := CSIClusterConfigEntry{
+	csiClusterConfigEntry := CsiClusterConfigEntry{
 		Namespace: "rook-ceph-1",
-		ClusterInfo: cephcsi.ClusterInfo{
-			Monitors: []string{"1.2.3.4:5000"},
-		},
+		Monitors:  []string{"1.2.3.4:5000"},
 	}
-	csiClusterConfigEntryMultus := CSIClusterConfigEntry{
+	csiClusterConfigEntryMultus := CsiClusterConfigEntry{
 		Namespace: "rook-ceph-1",
-		ClusterInfo: cephcsi.ClusterInfo{
-			Monitors: []string{"1.2.3.4:5000"},
-			RBD: cephcsi.RBD{
-				NetNamespaceFilePath: "/var/run/netns/rook-ceph-1",
-				RadosNamespace:       "rook-ceph-1",
-			},
+		Monitors:  []string{"1.2.3.4:5000"},
+		RBD: &CsiRBDSpec{
+			NetNamespaceFilePath: "/var/run/netns/rook-ceph-1",
+			RadosNamespace:       "rook-ceph-1",
 		},
 	}
-	csiClusterConfigEntry2 := CSIClusterConfigEntry{
+	csiClusterConfigEntry2 := CsiClusterConfigEntry{
 		Namespace: "rook-ceph-2",
-		ClusterInfo: cephcsi.ClusterInfo{
-			Monitors: []string{"20.1.1.1:5000", "20.1.1.2:5000", "20.1.1.3:5000"},
-		},
+		Monitors:  []string{"20.1.1.1:5000", "20.1.1.2:5000", "20.1.1.3:5000"},
 	}
-	csiClusterConfigEntry3 := CSIClusterConfigEntry{
+	csiClusterConfigEntry3 := CsiClusterConfigEntry{
 		Namespace: "rook-ceph-3",
-		ClusterInfo: cephcsi.ClusterInfo{
-			Monitors: []string{"10.1.1.1:5000", "10.1.1.2:5000", "10.1.1.3:5000"},
-			CephFS: cephcsi.CephFS{
-				SubvolumeGroup: "my-group",
-			},
+		Monitors:  []string{"10.1.1.1:5000", "10.1.1.2:5000", "10.1.1.3:5000"},
+		CephFS: &CsiCephFSSpec{
+			SubvolumeGroup: "my-group",
 		},
 	}
 
-	var want, s string
+	var s string
 	var err error
 
 	t.Run("add a simple mons list", func(t *testing.T) {
 		s, err = updateCsiClusterConfig("[]", "rook-ceph-1", &csiClusterConfigEntry)
 		assert.NoError(t, err)
-		want = `[{"clusterID":"rook-ceph-1","monitors":["1.2.3.4:5000"],"namespace":"rook-ceph-1"}]`
-		compareJSON(t, want, s)
+		assert.Equal(t, `[{"clusterID":"rook-ceph-1","monitors":["1.2.3.4:5000"],"namespace":"rook-ceph-1"}]`, s)
 	})
 
 	t.Run("add a 2nd mon to the current cluster", func(t *testing.T) {
@@ -164,6 +125,7 @@ func TestUpdateCsiClusterConfig(t *testing.T) {
 		assert.Equal(t, "10.1.1.1:5000", cc[2].Monitors[0])
 		assert.Equal(t, 3, len(cc[2].Monitors))
 		assert.Equal(t, "my-group", cc[2].CephFS.SubvolumeGroup)
+
 	})
 
 	t.Run("add a 4th mon to the 3rd cluster and subvolumegroup is preserved", func(t *testing.T) {
@@ -187,11 +149,9 @@ func TestUpdateCsiClusterConfig(t *testing.T) {
 	})
 
 	t.Run("add subvolumegroup and mons after", func(t *testing.T) {
-		csiClusterConfigEntry4 := CSIClusterConfigEntry{
-			ClusterInfo: cephcsi.ClusterInfo{
-				CephFS: cephcsi.CephFS{
-					SubvolumeGroup: "my-group2",
-				},
+		csiClusterConfigEntry4 := CsiClusterConfigEntry{
+			CephFS: &CsiCephFSSpec{
+				SubvolumeGroup: "my-group2",
 			},
 		}
 		s, err = updateCsiClusterConfig(s, "quatre", &csiClusterConfigEntry4)
@@ -221,24 +181,20 @@ func TestUpdateCsiClusterConfig(t *testing.T) {
 		subvolGrpNameofCluster1 := "subvol-group"
 		radosNSofCluster1 := "rados-ns"
 
-		csiCluster1ConfigEntry := CSIClusterConfigEntry{
+		csiCluster1ConfigEntry := CsiClusterConfigEntry{
 			Namespace: clusterIDofCluster1,
-			ClusterInfo: cephcsi.ClusterInfo{
-				Monitors: []string{"1.2.3.4:5000"},
-			},
+			Monitors:  []string{"1.2.3.4:5000"},
 		}
 		s, err := updateCsiClusterConfig("[]", clusterIDofCluster1, &csiCluster1ConfigEntry)
 		assert.NoError(t, err)
-		want = `[{"clusterID":"rook-ceph","monitors":["1.2.3.4:5000"],"namespace":"rook-ceph"}]`
-		compareJSON(t, want, s)
+		assert.Equal(t, s,
+			`[{"clusterID":"rook-ceph","monitors":["1.2.3.4:5000"],"namespace":"rook-ceph"}]`)
 		// add subvolumegroup to same cluster
-		subVolCsiCluster1Config := CSIClusterConfigEntry{
+		subVolCsiCluster1Config := CsiClusterConfigEntry{
 			Namespace: clusterIDofCluster1,
-			ClusterInfo: cephcsi.ClusterInfo{
-				Monitors: csiCluster1ConfigEntry.Monitors,
-				CephFS: cephcsi.CephFS{
-					SubvolumeGroup: subvolGrpNameofCluster1,
-				},
+			Monitors:  csiCluster1ConfigEntry.Monitors,
+			CephFS: &CsiCephFSSpec{
+				SubvolumeGroup: subvolGrpNameofCluster1,
 			},
 		}
 		s, err = updateCsiClusterConfig(s, subvolGrpNameofCluster1, &subVolCsiCluster1Config)
@@ -250,13 +206,12 @@ func TestUpdateCsiClusterConfig(t *testing.T) {
 		assert.Equal(t, subvolGrpNameofCluster1, cc[1].CephFS.SubvolumeGroup, cc)
 
 		// add rados to same cluster
-		radosNsCsiCluster1Config := CSIClusterConfigEntry{
-			Namespace: clusterIDofCluster1,
-			ClusterInfo: cephcsi.ClusterInfo{
-				Monitors: csiCluster1ConfigEntry.Monitors,
-				RBD: cephcsi.RBD{
-					RadosNamespace: radosNSofCluster1,
-				},
+		radosNsCsiCluster1Config := CsiClusterConfigEntry{
+			Namespace:      clusterIDofCluster1,
+			Monitors:       csiCluster1ConfigEntry.Monitors,
+			RadosNamespace: radosNSofCluster1,
+			RBD: &CsiRBDSpec{
+				RadosNamespace: radosNSofCluster1,
 			},
 		}
 		s, err = updateCsiClusterConfig(s, radosNSofCluster1, &radosNsCsiCluster1Config)
@@ -265,6 +220,8 @@ func TestUpdateCsiClusterConfig(t *testing.T) {
 		assert.NoError(t, err)
 		assert.Equal(t, 3, len(cc), cc)
 		assert.Equal(t, 1, len(cc[2].Monitors))
+		// Now the configuration of new entries goes into RBD.RadosNamespace so it should be empty
+		assert.Empty(t, cc[2].RadosNamespace, cc)
 		assert.Equal(t, radosNSofCluster1, cc[2].RBD.RadosNamespace, cc)
 
 		// update mon IP's and check is it updating for all clusterID's
@@ -284,29 +241,21 @@ func TestUpdateCsiClusterConfig(t *testing.T) {
 		radosNSofCluster2 := "rados-ns-2"
 
 		cluster2Mons := []string{"192.168.0.2:5000"}
-		csiCluster2ConfigEntry := CSIClusterConfigEntry{
+		csiCluster2ConfigEntry := CsiClusterConfigEntry{
 			Namespace: clusterIDofCluster2,
-			ClusterInfo: cephcsi.ClusterInfo{
-				Monitors: cluster2Mons,
-			},
+			Monitors:  cluster2Mons,
 		}
-		subVolCsiCluster2Config := CSIClusterConfigEntry{
+		subVolCsiCluster2Config := CsiClusterConfigEntry{
 			Namespace: clusterIDofCluster2,
-			ClusterInfo: cephcsi.ClusterInfo{
-				Monitors: cluster2Mons,
-				CephFS: cephcsi.CephFS{
-					SubvolumeGroup: subvolGrpNameofCluster2,
-				},
+			Monitors:  cluster2Mons,
+			CephFS: &CsiCephFSSpec{
+				SubvolumeGroup: subvolGrpNameofCluster2,
 			},
 		}
-		radosNsCsiCluster2Config := CSIClusterConfigEntry{
-			Namespace: clusterIDofCluster2,
-			ClusterInfo: cephcsi.ClusterInfo{
-				Monitors: cluster2Mons,
-				RBD: cephcsi.RBD{
-					RadosNamespace: radosNSofCluster2,
-				},
-			},
+		radosNsCsiCluster2Config := CsiClusterConfigEntry{
+			Namespace:      clusterIDofCluster2,
+			Monitors:       cluster2Mons,
+			RadosNamespace: radosNSofCluster2,
 		}
 		s, err = updateCsiClusterConfig(s, clusterIDofCluster2, &csiCluster2ConfigEntry)
 		assert.NoError(t, err)
@@ -374,8 +323,9 @@ func TestUpdateCsiClusterConfig(t *testing.T) {
 	t.Run("test multus cluster", func(t *testing.T) {
 		s, err = updateCsiClusterConfig("[]", "rook-ceph-1", &csiClusterConfigEntryMultus)
 		assert.NoError(t, err)
-		compareJSON(t, `[{"clusterID":"rook-ceph-1","monitors":["1.2.3.4:5000"],"rbd":{"netNamespaceFilePath":"/var/run/netns/rook-ceph-1","radosNamespace":"rook-ceph-1"},"namespace":"rook-ceph-1"}]`, s)
+		assert.Equal(t, `[{"clusterID":"rook-ceph-1","monitors":["1.2.3.4:5000"],"namespace":"rook-ceph-1","rbd":{"netNamespaceFilePath":"/var/run/netns/rook-ceph-1","radosNamespace":"rook-ceph-1"}}]`, s)
 	})
+
 }
 
 func contains(src, dest []string) bool {
@@ -458,26 +408,21 @@ func TestUpdateCSIDriverOptions(t *testing.T) {
 		{
 			name: "empty current config",
 			args: args{
-				clusterConfig:    []CSIClusterConfigEntry{},
+				clusterConfig:    []CsiClusterConfigEntry{},
 				clusterKey:       "rook-ceph",
 				csiDriverOptions: &cephv1.CSIDriverSpec{},
 			},
-			want:    []CSIClusterConfigEntry{},
+			want:    []CsiClusterConfigEntry{},
 			wantErr: false,
 		},
 		{
 			name: "single matching current config",
 			args: args{
-				clusterConfig: []CSIClusterConfigEntry{
+				clusterConfig: []CsiClusterConfigEntry{
 					{
+						ClusterID: "rook-ceph",
 						Namespace: "rook-ceph",
-						ClusterInfo: cephcsi.ClusterInfo{
-							ClusterID: "rook-ceph",
-							Monitors:  []string{"1.1.1.1"},
-							CephFS: cephcsi.CephFS{
-								NetNamespaceFilePath: "netnamespacefilepath",
-							},
-						},
+						Monitors:  []string{"1.1.1.1"},
 					},
 				},
 				clusterKey: "rook-ceph",
@@ -492,21 +437,18 @@ func TestUpdateCSIDriverOptions(t *testing.T) {
 					},
 				},
 			},
-			want: []CSIClusterConfigEntry{
+			want: []CsiClusterConfigEntry{
 				{
+					ClusterID: "rook-ceph",
 					Namespace: "rook-ceph",
-					ClusterInfo: cephcsi.ClusterInfo{
-						ClusterID: "rook-ceph",
-						Monitors:  []string{"1.1.1.1"},
-						ReadAffinity: cephcsi.ReadAffinity{
-							Enabled:             true,
-							CrushLocationLabels: []string{"topology.rook.io/rack"},
-						},
-						CephFS: cephcsi.CephFS{
-							KernelMountOptions:   "rw,noatime",
-							FuseMountOptions:     "debug",
-							NetNamespaceFilePath: "netnamespacefilepath",
-						},
+					Monitors:  []string{"1.1.1.1"},
+					ReadAffinity: &cephv1.ReadAffinitySpec{
+						Enabled:             true,
+						CrushLocationLabels: []string{"topology.rook.io/rack"},
+					},
+					CephFS: &CsiCephFSSpec{
+						KernelMountOptions: "rw,noatime",
+						FuseMountOptions:   "debug",
 					},
 				},
 			},
@@ -515,27 +457,21 @@ func TestUpdateCSIDriverOptions(t *testing.T) {
 		{
 			name: "multiple matching current config",
 			args: args{
-				clusterConfig: []CSIClusterConfigEntry{
+				clusterConfig: []CsiClusterConfigEntry{
 					{
+						ClusterID: "rook-ceph",
 						Namespace: "rook-ceph",
-						ClusterInfo: cephcsi.ClusterInfo{
-							ClusterID: "rook-ceph",
-							Monitors:  []string{"1.1.1.1"},
-						},
+						Monitors:  []string{"1.1.1.1"},
 					},
 					{
+						ClusterID: "rook-ceph-2",
 						Namespace: "rook-ceph",
-						ClusterInfo: cephcsi.ClusterInfo{
-							ClusterID: "rook-ceph-2",
-							Monitors:  []string{"1.1.1.1"},
-						},
+						Monitors:  []string{"1.1.1.1"},
 					},
 					{
+						ClusterID: "rook-ceph-3",
 						Namespace: "rook-ceph-1",
-						ClusterInfo: cephcsi.ClusterInfo{
-							ClusterID: "rook-ceph-3",
-							Monitors:  []string{"1.1.1.1"},
-						},
+						Monitors:  []string{"1.1.1.1"},
 					},
 				},
 				clusterKey: "rook-ceph",
@@ -550,43 +486,37 @@ func TestUpdateCSIDriverOptions(t *testing.T) {
 					},
 				},
 			},
-			want: []CSIClusterConfigEntry{
+			want: []CsiClusterConfigEntry{
 				{
+					ClusterID: "rook-ceph",
 					Namespace: "rook-ceph",
-					ClusterInfo: cephcsi.ClusterInfo{
-						ClusterID: "rook-ceph",
-						Monitors:  []string{"1.1.1.1"},
-						ReadAffinity: cephcsi.ReadAffinity{
-							Enabled:             true,
-							CrushLocationLabels: []string{"topology.rook.io/rack"},
-						},
-						CephFS: cephcsi.CephFS{
-							KernelMountOptions: "rw,noatime",
-							FuseMountOptions:   "debug",
-						},
+					Monitors:  []string{"1.1.1.1"},
+					ReadAffinity: &cephv1.ReadAffinitySpec{
+						Enabled:             true,
+						CrushLocationLabels: []string{"topology.rook.io/rack"},
+					},
+					CephFS: &CsiCephFSSpec{
+						KernelMountOptions: "rw,noatime",
+						FuseMountOptions:   "debug",
 					},
 				},
 				{
+					ClusterID: "rook-ceph-2",
 					Namespace: "rook-ceph",
-					ClusterInfo: cephcsi.ClusterInfo{
-						ClusterID: "rook-ceph-2",
-						Monitors:  []string{"1.1.1.1"},
-						ReadAffinity: cephcsi.ReadAffinity{
-							Enabled:             true,
-							CrushLocationLabels: []string{"topology.rook.io/rack"},
-						},
-						CephFS: cephcsi.CephFS{
-							KernelMountOptions: "rw,noatime",
-							FuseMountOptions:   "debug",
-						},
+					Monitors:  []string{"1.1.1.1"},
+					ReadAffinity: &cephv1.ReadAffinitySpec{
+						Enabled:             true,
+						CrushLocationLabels: []string{"topology.rook.io/rack"},
+					},
+					CephFS: &CsiCephFSSpec{
+						KernelMountOptions: "rw,noatime",
+						FuseMountOptions:   "debug",
 					},
 				},
 				{
+					ClusterID: "rook-ceph-3",
 					Namespace: "rook-ceph-1",
-					ClusterInfo: cephcsi.ClusterInfo{
-						ClusterID: "rook-ceph-3",
-						Monitors:  []string{"1.1.1.1"},
-					},
+					Monitors:  []string{"1.1.1.1"},
 				},
 			},
 			wantErr: false,
diff --git a/pkg/operator/ceph/csi/spec_test.go b/pkg/operator/ceph/csi/spec_test.go
index 5e75fdfbf..9f911785d 100644
--- a/pkg/operator/ceph/csi/spec_test.go
+++ b/pkg/operator/ceph/csi/spec_test.go
@@ -29,11 +29,9 @@ import (
 	"github.com/rook/rook/pkg/operator/k8sutil"
 	testop "github.com/rook/rook/pkg/operator/test"
 	"github.com/stretchr/testify/assert"
-	apps "k8s.io/api/apps/v1"
 	v1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime"
-	kfake "k8s.io/client-go/kubernetes/fake"
 	"sigs.k8s.io/controller-runtime/pkg/client/fake"
 )
 
@@ -131,91 +129,3 @@ func TestGenerateNetNamespaceFilePath(t *testing.T) {
 		assert.Equal(t, "/foo/plugins/rook-ceph.cephfs.csi.ceph.com/rook-ceph.net.ns", netNsFilePath)
 	})
 }
-
-func Test_getCSIDriverNamePrefixFromDeployment(t *testing.T) {
-	namespace := "test"
-	deployment := func(name, containerName, drivernameSuffix string) *apps.Deployment {
-		return &apps.Deployment{
-			ObjectMeta: metav1.ObjectMeta{Name: name, Namespace: namespace},
-			Spec: apps.DeploymentSpec{
-				Template: v1.PodTemplateSpec{
-					Spec: v1.PodSpec{
-						Containers: []v1.Container{
-							{
-								Name: containerName,
-								Args: []string{
-									"--drivername=test-prefix." + drivernameSuffix,
-								},
-							},
-						},
-					},
-				},
-			},
-		}
-	}
-	clientset := kfake.NewSimpleClientset()
-
-	ctx := context.TODO()
-	csidrivers := []struct {
-		testCaseName     string
-		deploymentName   string
-		containerName    string
-		driverNameSuffix string
-		expectedPrefix   string
-	}{
-		{
-			"get csi driver name prefix for rbd when deployment exists",
-			csiRBDProvisioner,
-			csiRBDContainerName,
-			rbdDriverSuffix,
-			"test-prefix",
-		},
-		{
-			"get csi driver name prefix for rbd when deployment does not exist",
-			"",
-			"csi-rbdplugin",
-			"",
-			"",
-		},
-		{
-			"get csi driver name prefix for cephfs when deployment exists",
-			csiCephFSProvisioner,
-			csiCephFSContainerName,
-			cephFSDriverSuffix,
-			"test-prefix",
-		},
-		{
-			"get csi driver name prefix for cephfs when deployment does not exist",
-			"",
-			"csi-cephfsplugin",
-			"",
-			"",
-		},
-		{
-			"get csi driver name prefix for nfs when deployment exists",
-			csiNFSProvisioner,
-			csiNFSContainerName,
-			nfsDriverSuffix,
-			"test-prefix",
-		},
-		{
-			"get csi driver name prefix for nfs when deployment does not exist",
-			"",
-			"csi-nfsplugin",
-			"",
-			"",
-		},
-	}
-
-	for _, c := range csidrivers {
-		t.Run(c.testCaseName, func(t *testing.T) {
-			if c.deploymentName != "" {
-				_, err := clientset.AppsV1().Deployments(namespace).Create(ctx, deployment(c.deploymentName, c.containerName, c.driverNameSuffix), metav1.CreateOptions{})
-				assert.NoError(t, err)
-			}
-			prefix, err := getCSIDriverNamePrefixFromDeployment(ctx, clientset, namespace, c.deploymentName, c.containerName)
-			assert.NoError(t, err)
-			assert.Equal(t, c.expectedPrefix, prefix)
-		})
-	}
-}
diff --git a/tests/framework/installer/ceph_settings.go b/tests/framework/installer/ceph_settings.go
index 41d1d01dc..1b1a27c7d 100644
--- a/tests/framework/installer/ceph_settings.go
+++ b/tests/framework/installer/ceph_settings.go
@@ -110,8 +110,8 @@ func replaceNamespaces(name, manifest, operatorNamespace, clusterNamespace strin
 	manifest = strings.ReplaceAll(manifest, "rook-ceph:rook-csi-cephfs-provisioner-sa # serviceaccount:namespace:operator", operatorNamespace+":rook-csi-cephfs-provisioner-sa")
 
 	// CSI Drivers
-	manifest = strings.ReplaceAll(manifest, "rook-ceph.cephfs.csi.ceph.com # csi-provisioner-name", operatorNamespace+".cephfs.csi.ceph.com")
-	manifest = strings.ReplaceAll(manifest, "rook-ceph.rbd.csi.ceph.com # csi-provisioner-name", operatorNamespace+".rbd.csi.ceph.com")
+	manifest = strings.ReplaceAll(manifest, "rook-ceph.cephfs.csi.ceph.com # driver:namespace:operator", operatorNamespace+".cephfs.csi.ceph.com")
+	manifest = strings.ReplaceAll(manifest, "rook-ceph.rbd.csi.ceph.com # driver:namespace:operator", operatorNamespace+".rbd.csi.ceph.com")
 
 	// Bucket storage class
 	manifest = strings.ReplaceAll(manifest, "rook-ceph.ceph.rook.io/bucket # driver:namespace:cluster", clusterNamespace+".ceph.rook.io/bucket")
diff --git a/tests/framework/utils/env.go b/tests/framework/utils/env.go
index 2cf3b4119..439bfc749 100644
--- a/tests/framework/utils/env.go
+++ b/tests/framework/utils/env.go
@@ -29,7 +29,7 @@ func TestEnvName() string {
 
 // TestRetryNumber  get the max retry. Example, for OpenShift it's 40.
 func TestRetryNumber() int {
-	count := GetEnvVarWithDefault("RETRY_MAX", "55")
+	count := GetEnvVarWithDefault("RETRY_MAX", "45")
 	number, err := strconv.Atoi(count)
 	if err != nil {
 		panic(fmt.Errorf("Error when converting to numeric value %v", err))
diff --git a/tests/scripts/create-dev-cluster.sh b/tests/scripts/create-dev-cluster.sh
index 3809c84b3..929daa379 100755
--- a/tests/scripts/create-dev-cluster.sh
+++ b/tests/scripts/create-dev-cluster.sh
@@ -4,22 +4,17 @@ DEFAULT_NS="rook-ceph"
 CLUSTER_FILES="common.yaml operator.yaml cluster-test.yaml cluster-on-pvc-minikube.yaml dashboard-external-http.yaml toolbox.yaml"
 MONITORING_FILES="monitoring/prometheus.yaml monitoring/service-monitor.yaml monitoring/exporter-service-monitor.yaml monitoring/prometheus-service.yaml monitoring/rbac.yaml"
 SCRIPT_ROOT=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)
-
-# Script arguments: new arguments must be added here (following the same format)
-export MINIKUBE_NODES="${MINIKUBE_NODES:=1}" ## Specify the minikube number of nodes to create
-export MINIKUBE_DISK_SIZE="${MINIKUBE_DISK_SIZE:=40g}" ## Specify the minikube disk size
-export MINIKUBE_EXTRA_DISKS="${MINIKUBE_EXTRA_DISKS:=3}" ## Specify the minikube number of extra disks
-export ROOK_PROFILE_NAME="${ROOK_PROFILE_NAME:=rook}" ## Specify the minikube profile name
-export ROOK_CLUSTER_NS="${ROOK_CLUSTER_NS:=$DEFAULT_NS}" ## CephCluster namespace
-export ROOK_OPERATOR_NS="${ROOK_OPERATOR_NS:=$DEFAULT_NS}" ## Rook operator namespace (if different from CephCluster namespace)
-export ROOK_EXAMPLES_DIR="${ROOK_EXAMPLES_DIR:="$SCRIPT_ROOT"/../../deploy/examples}" ## Path to Rook examples directory (i.e github.com/rook/rook/deploy/examples)
-export ROOK_CLUSTER_SPEC_FILE="${ROOK_CLUSTER_SPEC_FILE:=cluster-test.yaml}" ## CephCluster manifest file
+ROOK_EXAMPLES_DIR="${SCRIPT_ROOT}/../../deploy/examples/"
 
 init_vars(){
+    ROOK_PROFILE_NAME=${1:-rook}
+    ROOK_CLUSTER_NS=${2:-$DEFAULT_NS}
+    ROOK_OPERATOR_NS=${3:-$DEFAULT_NS}
+    ROOK_CLUSTER_SPEC_FILE=${4:-cluster-test.yaml}
     MINIKUBE="minikube --profile $ROOK_PROFILE_NAME"
     KUBECTL="$MINIKUBE kubectl --"
 
-    echo "Using '$(realpath "$ROOK_EXAMPLES_DIR")' as examples directory.."
+    echo "Using '$ROOK_EXAMPLES_DIR' as examples directory.."
     echo "Using '$ROOK_CLUSTER_SPEC_FILE' as cluster spec file.."
     echo "Using '$ROOK_PROFILE_NAME' as minikube profile.."
     echo "Using '$ROOK_CLUSTER_NS' as cluster namespace.."
@@ -27,19 +22,17 @@ init_vars(){
 }
 
 update_namespaces() {
-    if [ "$ROOK_CLUSTER_NS" != "$DEFAULT_NS" ] || [ "$ROOK_OPERATOR_NS" != "$DEFAULT_NS" ]; then
-	for file in $CLUSTER_FILES $MONITORING_FILES; do
-	    echo "Updating namespace on $file"
-	    sed -i.bak \
-		-e "s/\(.*\):.*# namespace:operator/\1: $ROOK_OPERATOR_NS # namespace:operator/g" \
-		-e "s/\(.*\):.*# namespace:cluster/\1: $ROOK_CLUSTER_NS # namespace:cluster/g" \
-		-e "s/\(.*serviceaccount\):.*:\(.*\) # serviceaccount:namespace:operator/\1:$ROOK_OPERATOR_NS:\2 # serviceaccount:namespace:operator/g" \
-		-e "s/\(.*serviceaccount\):.*:\(.*\) # serviceaccount:namespace:cluster/\1:$ROOK_CLUSTER_NS:\2 # serviceaccount:namespace:cluster/g" \
-		-e "s/\(.*\): [-_A-Za-z0-9]*\.\(.*\) # csi-provisioner-name/\1: $ROOK_OPERATOR_NS.\2 # csi-provisioner-name/g" \
-		-e "s/\(.*\): [-_A-Za-z0-9]*\.\(.*\) # driver:namespace:cluster/\1: $ROOK_CLUSTER_NS.\2 # driver:namespace:cluster/g" \
-		"$file"
-	done
-    fi
+    for file in $CLUSTER_FILES $MONITORING_FILES; do
+	echo "Updating namespace on $file"
+	sed -i.bak \
+            -e "s/\(.*\):.*# namespace:operator/\1: $ROOK_OPERATOR_NS # namespace:operator/g" \
+            -e "s/\(.*\):.*# namespace:cluster/\1: $ROOK_CLUSTER_NS # namespace:cluster/g" \
+            -e "s/\(.*serviceaccount\):.*:\(.*\) # serviceaccount:namespace:operator/\1:$ROOK_OPERATOR_NS:\2 # serviceaccount:namespace:operator/g" \
+            -e "s/\(.*serviceaccount\):.*:\(.*\) # serviceaccount:namespace:cluster/\1:$ROOK_CLUSTER_NS:\2 # serviceaccount:namespace:cluster/g" \
+            -e "s/\(.*\): [-_A-Za-z0-9]*\.\(.*\) # driver:namespace:operator/\1: $ROOK_OPERATOR_NS.\2 # driver:namespace:operator/g" \
+            -e "s/\(.*\): [-_A-Za-z0-9]*\.\(.*\) # driver:namespace:cluster/\1: $ROOK_CLUSTER_NS.\2 # driver:namespace:cluster/g" \
+            "$file"
+    done
 }
 
 wait_for_ceph_cluster() {
@@ -112,7 +105,7 @@ setup_minikube_env() {
     minikube_driver="$(get_minikube_driver)"
     echo "Setting up minikube env for profile '$ROOK_PROFILE_NAME' (using $minikube_driver driver)"
     $MINIKUBE delete
-    $MINIKUBE start --disk-size="$MINIKUBE_DISK_SIZE" --extra-disks="$MINIKUBE_EXTRA_DISKS" --driver "$minikube_driver" -n "$MINIKUBE_NODES"
+    $MINIKUBE start --disk-size=40g --extra-disks=3 --driver "$minikube_driver"
     eval "$($MINIKUBE docker-env)"
 }
 
@@ -180,13 +173,15 @@ enable_monitoring() {
 
 show_usage() {
     echo ""
-    echo "Usage: [ARG=VALUE]... $(basename "$0") [-f] [-r] [-m]"
-    echo "  -f     Force cluster creation by deleting minikube profile"
-    echo "  -r     Enable rook orchestrator"
-    echo "  -m     Enable monitoring"
-    echo "  Args:"
-    sed -n -E "s/^export (.*)=\".*:=.*\" ## (.*)/    \1 (\\$\1):  \2/p;" "$SCRIPT_ROOT"/"$(basename "$0")" | envsubst
-    echo ""
+    echo " Usage: $(basename "$0") [-r] [-m] [-p <profile-name>] [-d /path/to/rook-examples/dir]"
+    echo "  -f                Force cluster creation by deleting minikube profile"
+    echo "  -r                Enable rook orchestrator"
+    echo "  -m                Enable monitoring"
+    echo "  -p <profile-name> Specify the minikube profile name"
+    echo "  -d value          Path to Rook examples directory (i.e github.com/rook/rook/deploy/examples)"
+    echo "  -c <cluster-namespace>"
+    echo "  -o <operator-namespace>"
+    echo "  -i <cluster-spec-yaml>  Specify the cluster file spec name"
 }
 
 invocation_error() {
@@ -198,7 +193,7 @@ invocation_error() {
 ####################################################################
 ################# MAIN #############################################
 
-while getopts ":hrmf" opt; do
+while getopts ":hrmfd:p:i:c:o:" opt; do
     case $opt in
 	h)
 	    show_usage
@@ -213,6 +208,21 @@ while getopts ":hrmf" opt; do
 	f)
 	    force_minikube=true
 	    ;;
+	d)
+	    ROOK_EXAMPLES_DIR="$OPTARG"
+	    ;;
+	p)
+	    minikube_profile_name="$OPTARG"
+	    ;;
+	i)
+	    cluster_spec_file="$OPTARG"
+	    ;;
+	c)
+	    rook_cluster_ns="$OPTARG"
+	    ;;
+	o)
+	    rook_operator_ns="$OPTARG"
+	    ;;
 	\?)
 	    invocation_error "Invalid option: -$OPTARG"
 	    ;;
@@ -222,21 +232,30 @@ while getopts ":hrmf" opt; do
     esac
 done
 
-# initialization zone
-init_vars
+init_vars "$minikube_profile_name" "$rook_cluster_ns" "$rook_operator_ns" "$cluster_spec_file"
 change_to_examples_dir
-[ -z "$force_minikube" ] && check_minikube_exists
-update_namespaces
 
-# cluster creation zone
+if [ -z "$force_minikube" ]; then
+    check_minikube_exists
+fi
+
+if [ "$rook_cluster_ns" != "$DEFAULT_NS" ] || [ "$rook_operator_ns" != "$DEFAULT_NS" ]; then
+    update_namespaces
+fi
+
 setup_minikube_env
 create_rook_cluster
 wait_for_rook_operator
 wait_for_ceph_cluster
 
-# final tweaks and ceph cluster tuning
-[ "$enable_rook" = true ] && enable_rook_orchestrator
-[ "$enable_monitoring" = true ] && enable_monitoring
+if [ "$enable_rook" = true ]; then
+    enable_rook_orchestrator
+fi
+
+if [ "$enable_monitoring" = true ]; then
+    enable_monitoring
+fi
+
 show_info "$enable_monitoring"
 
 ####################################################################
diff --git a/tests/scripts/pythonwebserver/server.py b/tests/scripts/pythonwebserver/server.py
index eb2c841b0..a9c359001 100644
--- a/tests/scripts/pythonwebserver/server.py
+++ b/tests/scripts/pythonwebserver/server.py
@@ -13,7 +13,6 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 """
-
 #!/usr/bin/env python3
 """
 Very simple HTTP server in python for logging requests