Repository: rook/rook
Pull request #6822 (2020-12-11 21:23:33)

ceph: Allow OSDs on both PVCs and devices
<!-- Please take a look at our [Contributing](https://rook.io/docs/rook/master/development-flow.html)
documentation before submitting a Pull Request!
Thank you for contributing to Rook! -->

**Description of your changes:**
The OSD configuration on local devices was being skipped if a storageClassDeviceSet was specified. Both types of OSDs should be allowed in the same cluster, which allows a cluster in the cloud to also take advantage of local devices with different perf properties.

**Checklist:**

- [ ] **Commit Message Formatting**: Commit titles and messages follow guidelines in the [developer guide](https://rook.io/docs/rook/master/development-flow.html#commit-structure).
- [ ] **Skip Tests for Docs**: Add the flag for skipping the build if this is only a documentation change. See [here](https://github.com/rook/rook/blob/master/INSTALL.md#skip-ci) for the flag.
- [ ] **Skip Unrelated Tests**: Add a flag to run tests for a specific storage provider. See [test options](https://github.com/rook/rook/blob/master/INSTALL.md#test-storage-provider).
- [ ] Reviewed the developer guide on [Submitting a Pull Request](https://rook.io/docs/rook/master/development-flow.html#submitting-a-pull-request)
- [ ] Documentation has been updated, if necessary.
- [ ] Unit tests have been added, if necessary.
- [ ] Integration tests have been added, if necessary.
- [ ] Pending release notes updated with breaking and/or notable changes, if necessary.
- [ ] Upgrade from previous release is tested and upgrade user guide is updated, if necessary.
- [ ] Code generation (`make codegen`) has been run to update object specifications, if necessary.



Patch:
diff --git a/Documentation/ceph-advanced-configuration.md b/Documentation/ceph-advanced-configuration.md
index f2f7e40d1..0a59a5299 100644
--- a/Documentation/ceph-advanced-configuration.md
+++ b/Documentation/ceph-advanced-configuration.md
@@ -10,7 +10,6 @@ These examples show how to perform advanced configuration tasks on your Rook
 storage cluster.
 
 * [Prerequisites](#prerequisites)
-* [Using alternate namespaces](#using-alternate-namespaces)
 * [Use custom Ceph user and secret for mounting](#use-custom-ceph-user-and-secret-for-mounting)
 * [Log Collection](#log-collection)
 * [OSD Information](#osd-information)
@@ -31,37 +30,6 @@ The Kubernetes based examples assume Rook OSD pods are in the `rook-ceph` namesp
 If you run them in a different namespace, modify `kubectl -n rook-ceph [...]` to fit
 your situation.
 
-## Using alternate namespaces
-
-If you wish to deploy the Rook Operator and/or Ceph clusters to namespaces other than the default
-`rook-ceph`, the manifests are commented to allow for easy `sed` replacements. Change
-`ROOK_CLUSTER_NAMESPACE` to tailor the manifests for additional Ceph clusters. You can choose
-to also change `ROOK_OPERATOR_NAMESPACE` to create a new Rook Operator for each Ceph cluster (don't
-forget to set `ROOK_CURRENT_NAMESPACE_ONLY`), or you can leave it at the same value for every
-Ceph cluster if you only wish to have one Operator manage all Ceph clusters.
-
-This will help you manage namespaces more easily, but you should still make sure the resources are
-configured to your liking.
-
-```sh
-cd cluster/examples/kubernetes/ceph
-
-export ROOK_OPERATOR_NAMESPACE="rook-ceph"
-export ROOK_CLUSTER_NAMESPACE="rook-ceph"
-
-sed -i.bak \
-    -e "s/\(.*\):.*# namespace:operator/\1: $ROOK_OPERATOR_NAMESPACE # namespace:operator/g" \
-    -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
-
-# You need to use `apply` for all Ceph clusters after the first if you have only one Operator
-kubectl apply -f common.yaml -f operator.yaml -f cluster.yaml # add other files as desired for yourconfig
-```
-
 ## Use custom Ceph user and secret for mounting
 
 > **NOTE**: For extensive info about creating Ceph users, consult the Ceph documentation: http://docs.ceph.com/docs/mimic/rados/operations/user-management/#add-a-user.
diff --git a/Documentation/ceph-block.md b/Documentation/ceph-block.md
index 044794862..0e9232baf 100644
--- a/Documentation/ceph-block.md
+++ b/Documentation/ceph-block.md
@@ -54,20 +54,6 @@ parameters:
     # Ceph pool into which the RBD image shall be created
     pool: replicapool
 
-    # (optional) mapOptions is a comma-separated list of map options.
-    # For krbd options refer
-    # https://docs.ceph.com/docs/master/man/8/rbd/#kernel-rbd-krbd-options
-    # For nbd options refer
-    # https://docs.ceph.com/docs/master/man/8/rbd-nbd/#options
-    # mapOptions: lock_on_read,queue_depth=1024
-
-    # (optional) unmapOptions is a comma-separated list of unmap options.
-    # For krbd options refer
-    # https://docs.ceph.com/docs/master/man/8/rbd/#kernel-rbd-krbd-options
-    # For nbd options refer
-    # https://docs.ceph.com/docs/master/man/8/rbd-nbd/#options
-    # unmapOptions: force
-
     # RBD image format. Defaults to "2".
     imageFormat: "2"
 
diff --git a/Documentation/ceph-quickstart.md b/Documentation/ceph-quickstart.md
index 444628c36..d244ae58e 100644
--- a/Documentation/ceph-quickstart.md
+++ b/Documentation/ceph-quickstart.md
@@ -86,9 +86,6 @@ Before you start the operator in production, there are some settings that you ma
    2. Flex driver: The flex driver is deprecated in favor of the CSI driver, but can still be enabled with the `ROOK_ENABLE_FLEX_DRIVER` setting.
    3. Node affinity and tolerations: The CSI driver by default will run on any node in the cluster. To configure the CSI driver affinity, several settings are available.
 
-If you wish to deploy into a namespace other than the default `rook-ceph`, see the [Ceph advanced
-configuration section](ceph-advanced-configuration.md#using-alternate-namespaces) on the topic.
-
 ## Create a Rook Ceph Cluster
 
 Now that the Rook operator is running we can create the Ceph cluster. For the cluster to survive reboots,
diff --git a/Documentation/ceph-upgrade.md b/Documentation/ceph-upgrade.md
index 2112dc69a..e03811883 100644
--- a/Documentation/ceph-upgrade.md
+++ b/Documentation/ceph-upgrade.md
@@ -50,24 +50,12 @@ With this upgrade guide, there are a few notes to consider:
 ## Patch Release Upgrades
 
 Unless otherwise noted due to extenuating requirements, upgrades from one patch release of Rook to
-another are as simple as updating the common resources and the image of the Rook operator. For
-example, when Rook v1.5.3 is released, the process of updating from v1.5.0 is as simple as running
-the following:
+another are as simple as updating the common resources and the image of the Rook operator. For example, when Rook v1.5.1 is
+released, the process of updating from v1.5.0 is as simple as running the following:
 
-First get the latest common resources manifests that contain the latest changes for Rook v1.5.
-```sh
-git clone --single-branch --branch v1.5.3 https://github.com/rook/rook.git
-cd rook/cluster/examples/kubernetes/ceph
-```
-
-If you have deployed the Rook Operator or the Ceph cluster into a different namespace than
-`rook-ceph`, see the [Update common resources and CRDs](#1-update-common-resources-and-crds)
-section for instructions on how to change the default namespaces in `common.yaml`.
-
-Then apply the latest changes from v1.5 and update the Rook Operator image.
 ```console
 kubectl apply -f common.yaml -f crds.yaml
-kubectl -n rook-ceph set image deploy/rook-ceph-operator rook-ceph-operator=rook/ceph:v1.5.3
+kubectl -n rook-ceph set image deploy/rook-ceph-operator rook-ceph-operator=rook/ceph:v1.5.1
 ```
 
 As exemplified above, it is a good practice to update Rook-Ceph common resources from the example
@@ -114,8 +102,8 @@ environment variables throughout this document.
 
 ```sh
 # Parameterize the environment
-export ROOK_OPERATOR_NAMESPACE="rook-ceph"
-export ROOK_CLUSTER_NAMESPACE="rook-ceph"
+export ROOK_SYSTEM_NAMESPACE="rook-ceph"
+export ROOK_NAMESPACE="rook-ceph"
 ```
 
 In order to successfully upgrade a Rook cluster, the following prerequisites must be met:
@@ -145,7 +133,7 @@ In a healthy Rook cluster, the operator, the agents and all Rook namespace pods
 `Running` state and have few, if any, pod restarts. To verify this, run the following commands:
 
 ```sh
-kubectl -n $ROOK_CLUSTER_NAMESPACE get pods
+kubectl -n $ROOK_NAMESPACE get pods
 ```
 
 ### Status Output
@@ -154,8 +142,8 @@ The Rook toolbox contains the Ceph tools that can give you status details of the
 `ceph status` command. Let's look at an output sample and review some of the details:
 
 ```sh
-TOOLS_POD=$(kubectl -n $ROOK_CLUSTER_NAMESPACE get pod -l "app=rook-ceph-tools" -o jsonpath='{.items[0].metadata.name}')
-kubectl -n $ROOK_CLUSTER_NAMESPACE exec -it $TOOLS_POD -- ceph status
+TOOLS_POD=$(kubectl -n $ROOK_NAMESPACE get pod -l "app=rook-ceph-tools" -o jsonpath='{.items[0].metadata.name}')
+kubectl -n $ROOK_NAMESPACE exec -it $TOOLS_POD -- ceph status
 ```
 
 ```console
@@ -209,16 +197,16 @@ output. For example for the monitor pod `mon-b`, we can verify the container ver
 with the below commands:
 
 ```sh
-POD_NAME=$(kubectl -n $ROOK_CLUSTER_NAMESPACE get pod -o custom-columns=name:.metadata.name --no-headers | grep rook-ceph-mon-b)
-kubectl -n $ROOK_CLUSTER_NAMESPACE get pod ${POD_NAME} -o jsonpath='{.spec.containers[0].image}'
+POD_NAME=$(kubectl -n $ROOK_NAMESPACE get pod -o custom-columns=name:.metadata.name --no-headers | grep rook-ceph-mon-b)
+kubectl -n $ROOK_NAMESPACE get pod ${POD_NAME} -o jsonpath='{.spec.containers[0].image}'
 ```
 
 The status and container versions for all Rook pods can be collected all at once with the following
 commands:
 
 ```sh
-kubectl -n $ROOK_OPERATOR_NAMESPACE get pod -o jsonpath='{range .items[*]}{.metadata.name}{"\n\t"}{.status.phase}{"\t\t"}{.spec.containers[0].image}{"\t"}{.spec.initContainers[0]}{"\n"}{end}' && \
-kubectl -n $ROOK_CLUSTER_NAMESPACE get pod -o jsonpath='{range .items[*]}{.metadata.name}{"\n\t"}{.status.phase}{"\t\t"}{.spec.containers[0].image}{"\t"}{.spec.initContainers[0].image}{"\n"}{end}'
+kubectl -n $ROOK_SYSTEM_NAMESPACE get pod -o jsonpath='{range .items[*]}{.metadata.name}{"\n\t"}{.status.phase}{"\t\t"}{.spec.containers[0].image}{"\t"}{.spec.initContainers[0]}{"\n"}{end}' && \
+kubectl -n $ROOK_NAMESPACE get pod -o jsonpath='{range .items[*]}{.metadata.name}{"\n\t"}{.status.phase}{"\t\t"}{.spec.containers[0].image}{"\t"}{.spec.initContainers[0].image}{"\n"}{end}'
 ```
 
 The `rook-version` label exists on Ceph controller resources. For various resource controllers, a
@@ -228,9 +216,9 @@ the version of Rook for resources managed by the updated Rook-Ceph operator. Not
 and toolbox deployments do not have a `rook-version` label set.
 
 ```sh
-kubectl -n $ROOK_CLUSTER_NAMESPACE get deployments -o jsonpath='{range .items[*]}{.metadata.name}{"  \treq/upd/avl: "}{.spec.replicas}{"/"}{.status.updatedReplicas}{"/"}{.status.readyReplicas}{"  \trook-version="}{.metadata.labels.rook-version}{"\n"}{end}'
+kubectl -n $ROOK_NAMESPACE get deployments -o jsonpath='{range .items[*]}{.metadata.name}{"  \treq/upd/avl: "}{.spec.replicas}{"/"}{.status.updatedReplicas}{"/"}{.status.readyReplicas}{"  \trook-version="}{.metadata.labels.rook-version}{"\n"}{end}'
 
-kubectl -n $ROOK_CLUSTER_NAMESPACE get jobs -o jsonpath='{range .items[*]}{.metadata.name}{"  \tsucceeded: "}{.status.succeeded}{"      \trook-version="}{.metadata.labels.rook-version}{"\n"}{end}'
+kubectl -n $ROOK_NAMESPACE get jobs -o jsonpath='{range .items[*]}{.metadata.name}{"  \tsucceeded: "}{.status.succeeded}{"      \trook-version="}{.metadata.labels.rook-version}{"\n"}{end}'
 ```
 
 ### Rook Volume Health
@@ -244,7 +232,7 @@ Any pod that is using a Rook volume should also remain healthy:
 ## Rook Operator Upgrade Process
 
 In the examples given in this guide, we will be upgrading a live Rook cluster running `v1.4.7` to
-the version `v1.5.3`. This upgrade should work from any official patch release of Rook v1.4 to any
+the version `v1.5.0`. This upgrade should work from any official patch release of Rook v1.4 to any
 official patch release of v1.5.
 
 **Rook release from `master` are expressly unsupported.** It is strongly recommended that you use
@@ -253,11 +241,6 @@ master branch are subject to changes and incompatibilities that will not be supp
 official releases. Builds from the master branch can have functionality changed or removed at any
 time without compatibility support and without prior notice.
 
-These methods should work for any number of Rook-Ceph clusters and Rook Operators as long as you
-parameterize the environment correctly. Merely repeat these steps for each Rook-Ceph cluster
-(`ROOK_CLUSTER_NAMESPACE`), and be sure to update the `ROOK_OPERATOR_NAMESPACE` parameter each time
-if applicable.
-
 Let's get started!
 
 ## 1. Update common resources and CRDs
@@ -272,24 +255,9 @@ needed by the Operator. Also update the Custom Resource Definitions (CRDs).
 > `rbac.authorization.k8s.io/v1beta1` instead of `rbac.authorization.k8s.io/v1`
 > You will also need to apply `pre-k8s-1.16/crds.yaml` instead of `crds.yaml`.
 
-First get the latest common resources manifests that contain the latest changes for Rook v1.5.
 ```sh
-git clone --single-branch --branch v1.5.3 https://github.com/rook/rook.git
+git clone --single-branch --branch v1.5.0 https://github.com/rook/rook.git
 cd rook/cluster/examples/kubernetes/ceph
-```
-
-If you have deployed the Rook Operator or the Ceph cluster into a different namespace than
-`rook-ceph`, update the common resource manifests to use your `ROOK_OPERATOR_NAMESPACE` and
-`ROOK_CLUSTER_NAMESPACE` using `sed`.
-```sh
-sed -i.bak \
-    -e "s/\(.*\):.*# namespace:operator/\1: $ROOK_OPERATOR_NAMESPACE # namespace:operator/g" \
-    -e "s/\(.*\):.*# namespace:cluster/\1: $ROOK_CLUSTER_NAMESPACE # namespace:cluster/g" \
-  common.yaml
-```
-
-Then apply the latest changes from v1.5.
-```sh
 kubectl apply -f common.yaml -f crds.yaml
 ```
 
@@ -309,7 +277,7 @@ The largest portion of the upgrade is triggered when the operator's image is upd
 When the operator is updated, it will proceed to update all of the Ceph daemons.
 
 ```sh
-kubectl -n $ROOK_OPERATOR_NAMESPACE set image deploy/rook-ceph-operator rook-ceph-operator=rook/ceph:v1.5.3
+kubectl -n $ROOK_SYSTEM_NAMESPACE set image deploy/rook-ceph-operator rook-ceph-operator=rook/ceph:v1.5.0
 ```
 
 ## 4. Wait for the upgrade to complete
@@ -321,21 +289,21 @@ and the Ceph Filesystem may fall offline a few times while the MDSes are upgradi
 The versions of the components can be viewed as they are updated:
 
 ```sh
-watch --exec kubectl -n $ROOK_CLUSTER_NAMESPACE get deployments -l rook_cluster=$ROOK_CLUSTER_NAMESPACE -o jsonpath='{range .items[*]}{.metadata.name}{"  \treq/upd/avl: "}{.spec.replicas}{"/"}{.status.updatedReplicas}{"/"}{.status.readyReplicas}{"  \trook-version="}{.metadata.labels.rook-version}{"\n"}{end}'
+watch --exec kubectl -n $ROOK_NAMESPACE get deployments -l rook_cluster=$ROOK_NAMESPACE -o jsonpath='{range .items[*]}{.metadata.name}{"  \treq/upd/avl: "}{.spec.replicas}{"/"}{.status.updatedReplicas}{"/"}{.status.readyReplicas}{"  \trook-version="}{.metadata.labels.rook-version}{"\n"}{end}'
 ```
 
 As an example, this cluster is midway through updating the OSDs from v1.4 to v1.5. When all
-deployments report `1/1/1` availability and `rook-version=v1.5.3`, the Ceph cluster's core
+deployments report `1/1/1` availability and `rook-version=v1.5.0`, the Ceph cluster's core
 components are fully updated.
 
 ```console
 Every 2.0s: kubectl -n rook-ceph get deployment -o j...
 
-rook-ceph-mgr-a         req/upd/avl: 1/1/1      rook-version=v1.5.3
-rook-ceph-mon-a         req/upd/avl: 1/1/1      rook-version=v1.5.3
-rook-ceph-mon-b         req/upd/avl: 1/1/1      rook-version=v1.5.3
-rook-ceph-mon-c         req/upd/avl: 1/1/1      rook-version=v1.5.3
-rook-ceph-osd-0         req/upd/avl: 1//        rook-version=v1.5.3
+rook-ceph-mgr-a         req/upd/avl: 1/1/1      rook-version=v1.5.0
+rook-ceph-mon-a         req/upd/avl: 1/1/1      rook-version=v1.5.0
+rook-ceph-mon-b         req/upd/avl: 1/1/1      rook-version=v1.5.0
+rook-ceph-mon-c         req/upd/avl: 1/1/1      rook-version=v1.5.0
+rook-ceph-osd-0         req/upd/avl: 1//        rook-version=v1.5.0
 rook-ceph-osd-1         req/upd/avl: 1/1/1      rook-version=v1.4.7
 rook-ceph-osd-2         req/upd/avl: 1/1/1      rook-version=v1.4.7
 ```
@@ -344,17 +312,17 @@ An easy check to see if the upgrade is totally finished is to check that there i
 `rook-version` reported across the cluster.
 
 ```console
-# kubectl -n $ROOK_CLUSTER_NAMESPACE get deployment -l rook_cluster=$ROOK_CLUSTER_NAMESPACE -o jsonpath='{range .items[*]}{"rook-version="}{.metadata.labels.rook-version}{"\n"}{end}' | sort | uniq
+# kubectl -n $ROOK_NAMESPACE get deployment -l rook_cluster=$ROOK_NAMESPACE -o jsonpath='{range .items[*]}{"rook-version="}{.metadata.labels.rook-version}{"\n"}{end}' | sort | uniq
 This cluster is not yet finished:
   rook-version=v1.4.7
-  rook-version=v1.5.3
+  rook-version=v1.5.0
 This cluster is finished:
-  rook-version=v1.5.3
+  rook-version=v1.5.0
 ```
 
 ## 5. Verify the updated cluster
 
-At this point, your Rook operator should be running version `rook/ceph:v1.5.3`.
+At this point, your Rook operator should be running version `rook/ceph:v1.5.0`.
 
 Verify the Ceph cluster's health using the [health verification section](#health-verification).
 
@@ -396,8 +364,8 @@ Ceph image field in the cluster CRD (`spec.cephVersion.image`).
 
 ```sh
 NEW_CEPH_IMAGE='ceph/ceph:v15.2.7-20201201'
-CLUSTER_NAME="$ROOK_CLUSTER_NAMESPACE"  # change if your cluster name is not the Rook namespace
-kubectl -n $ROOK_CLUSTER_NAMESPACE patch CephCluster $CLUSTER_NAME --type=merge -p "{\"spec\": {\"cephVersion\": {\"image\": \"$NEW_CEPH_IMAGE\"}}}"
+CLUSTER_NAME="$ROOK_NAMESPACE"  # change if your cluster name is not the Rook namespace
+kubectl -n $ROOK_NAMESPACE patch CephCluster $CLUSTER_NAME --type=merge -p "{\"spec\": {\"cephVersion\": {\"image\": \"$NEW_CEPH_IMAGE\"}}}"
 ```
 
 #### 2. Wait for the daemon pod updates to complete
@@ -406,13 +374,13 @@ As with upgrading Rook, you must now wait for the upgrade to complete. Status ca
 similar way to the Rook upgrade as well.
 
 ```sh
-watch --exec kubectl -n $ROOK_CLUSTER_NAMESPACE get deployments -l rook_cluster=$ROOK_CLUSTER_NAMESPACE -o jsonpath='{range .items[*]}{.metadata.name}{"  \treq/upd/avl: "}{.spec.replicas}{"/"}{.status.updatedReplicas}{"/"}{.status.readyReplicas}{"  \tceph-version="}{.metadata.labels.ceph-version}{"\n"}{end}'
+watch --exec kubectl -n $ROOK_NAMESPACE get deployments -l rook_cluster=$ROOK_NAMESPACE -o jsonpath='{range .items[*]}{.metadata.name}{"  \treq/upd/avl: "}{.spec.replicas}{"/"}{.status.updatedReplicas}{"/"}{.status.readyReplicas}{"  \tceph-version="}{.metadata.labels.ceph-version}{"\n"}{end}'
 ```
 
 Determining when the Ceph has fully updated is rather simple.
 
 ```console
-# kubectl -n $ROOK_CLUSTER_NAMESPACE get deployment -l rook_cluster=$ROOK_CLUSTER_NAMESPACE -o jsonpath='{range .items[*]}{"ceph-version="}{.metadata.labels.ceph-version}{"\n"}{end}' | sort | uniq
+# kubectl -n $ROOK_NAMESPACE get deployment -l rook_cluster=$ROOK_NAMESPACE -o jsonpath='{range .items[*]}{"ceph-version="}{.metadata.labels.ceph-version}{"\n"}{end}' | sort | uniq
 This cluster is not yet finished:
     ceph-version=14.2.7-0
     ceph-version=15.2.4-0
@@ -435,13 +403,13 @@ The operator configuration variables have recently moved from the operator deplo
 but if the ConfigMap settings are applied, they will override the operator deployment settings.
 
 ```console
-kubectl -n $ROOK_OPERATOR_NAMESPACE edit configmap rook-ceph-operator-config
+kubectl -n $ROOK_NAMESPACE edit configmap rook-ceph-operator-config
 ```
 
 The default upstream images are included below, which you can change to your desired images.
 
 ```yaml
-ROOK_CSI_CEPH_IMAGE: "quay.io/cephcsi/cephcsi:v3.2.0"
+ROOK_CSI_CEPH_IMAGE: "quay.io/cephcsi/cephcsi:v3.1.2"
 ROOK_CSI_REGISTRAR_IMAGE: "k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.0.1"
 ROOK_CSI_PROVISIONER_IMAGE: "k8s.gcr.io/sig-storage/csi-provisioner:v2.0.0"
 ROOK_CSI_SNAPSHOTTER_IMAGE: "k8s.gcr.io/sig-storage/csi-snapshotter:v3.0.0"
@@ -460,7 +428,7 @@ You can use the below command to see the CSI images currently being used in the
 
 ```console
 # kubectl --namespace rook-ceph get pod -o jsonpath='{range .items[*]}{range .spec.containers[*]}{.image}{"\n"}' -l 'app in (csi-rbdplugin,csi-rbdplugin-provisioner,csi-cephfsplugin,csi-cephfsplugin-provisioner)' | sort | uniq
-quay.io/cephcsi/cephcsi:v3.2.0
+quay.io/cephcsi/cephcsi:v3.1.2
 k8s.gcr.io/sig-storage/csi-attacher:v3.0.0
 k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.0.1
 k8s.gcr.io/sig-storage/csi-provisioner:v2.0.0
diff --git a/Documentation/helm-operator.md b/Documentation/helm-operator.md
index 0113612f5..6eb21ff82 100644
--- a/Documentation/helm-operator.md
+++ b/Documentation/helm-operator.md
@@ -101,7 +101,6 @@ The following tables lists the configurable parameters of the rook-operator char
 | `csi.enableCephfsDriver`           | Enable Ceph CSI CephFS driver.                                                                                                 | `true`                                                    |
 | `csi.pluginPriorityClassName`      | PriorityClassName to be set on csi driver plugin pods.                                                                         | <none>                                                    |
 | `csi.provisionerPriorityClassName` | PriorityClassName to be set on csi driver provisioner pods.                                                                    | <none>                                                    |
-| `csi.enableOMAPGenerator`          | EnableOMAP generator deploys omap sidecar in CSI provisioner pod, to enable it set it to true                                  | `false`                                                    |
 | `csi.logLevel`                     | Set logging level for csi containers. Supported values from 0 to 5. 0 for general useful logs, 5 for trace level verbosity.    | `0`                                                       |
 | `csi.enableGrpcMetrics`            | Enable Ceph CSI GRPC Metrics.                                                                                                  | `true`                                                    |
 | `csi.provisionerTolerations`       | Array of tolerations in YAML format which will be added to CSI provisioner deployment.                                         | <none>                                                    |
@@ -118,7 +117,7 @@ The following tables lists the configurable parameters of the rook-operator char
 | `csi.rbdLivenessMetricsPort`       | Ceph CSI RBD driver metrics port.                                                                                              | `8080`                                                    |
 | `csi.forceCephFSKernelClient`      | Enable Ceph Kernel clients on kernel < 4.17 which support quotas for Cephfs.                                                   | `true`                                                    |
 | `csi.kubeletDirPath`               | Kubelet root directory path (if the Kubelet uses a different path for the `--root-dir` flag)                                   | `/var/lib/kubelet`                                        |
-| `csi.cephcsi.image`                | Ceph CSI image.                                                                                                                | `quay.io/cephcsi/cephcsi:v3.2.0`                          |
+| `csi.cephcsi.image`                | Ceph CSI image.                                                                                                                | `quay.io/cephcsi/cephcsi:v3.1.2`                          |
 | `csi.rbdPluginUpdateStrategy`      | CSI Rbd plugin daemonset update strategy, supported values are OnDelete and RollingUpdate.                                     | `OnDelete`                                                |
 | `csi.cephFSPluginUpdateStrategy`   | CSI CephFS plugin daemonset update strategy, supported values are OnDelete and RollingUpdate.                                  | `OnDelete`                                                |
 | `csi.registrar.image`              | Kubernetes CSI registrar image.                                                                                                | `k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.0.1` |
diff --git a/cluster/charts/rook-ceph/templates/deployment.yaml b/cluster/charts/rook-ceph/templates/deployment.yaml
index aee9194c9..a5b1df4a1 100644
--- a/cluster/charts/rook-ceph/templates/deployment.yaml
+++ b/cluster/charts/rook-ceph/templates/deployment.yaml
@@ -114,8 +114,6 @@ spec:
           value: {{ .Values.csi.pluginPriorityClassName | quote }}
         - name: CSI_PROVISIONER_PRIORITY_CLASSNAME
           value: {{ .Values.csi.provisionerPriorityClassName | quote }}
-        - name: CSI_ENABLE_OMAP_GENERATOR
-          value: {{ .Values.csi.enableOMAPGenerator | quote }}
 {{- if .Values.csi.cephFSPluginUpdateStrategy }}
         - name: CSI_CEPHFS_PLUGIN_UPDATE_STRATEGY
           value: {{ .Values.csi.cephFSPluginUpdateStrategy | quote }}
diff --git a/cluster/charts/rook-ceph/values.yaml b/cluster/charts/rook-ceph/values.yaml
index c435a4697..952b89e84 100644
--- a/cluster/charts/rook-ceph/values.yaml
+++ b/cluster/charts/rook-ceph/values.yaml
@@ -62,13 +62,6 @@ csi:
   # (Optional) set user created priorityclassName for csi provisioner pods.
   # provisionerPriorityClassName: system-cluster-critical
 
-  # OMAP generator generates the omap mapping between the PV name and the RBD image
-  # which helps CSI to identify the rbd images for CSI operations.
-  # CSI_ENABLE_OMAP_GENERATOR need to be enabled when we are using rbd mirroring feature.
-  # By default OMAP generator is disabled and when enabled it will be deployed as a
-  # sidecar with CSI provisioner pod, to enable set it to true.
-  enableOMAPGenerator: false
-
   # Set logging level for csi containers.
   # Supported values from 0 to 5. 0 for general useful logs, 5 for trace level verbosity.
   #logLevel: 0
@@ -252,7 +245,7 @@ csi:
   #rbdLivenessMetricsPort: 9080
   #kubeletDirPath: /var/lib/kubelet
   #cephcsi:
-    #image: quay.io/cephcsi/cephcsi:v3.2.0
+    #image: quay.io/cephcsi/cephcsi:v3.1.2
   #registrar:
     #image: k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.0.1
   #provisioner:
diff --git a/cluster/examples/kubernetes/ceph/ceph-client.yaml b/cluster/examples/kubernetes/ceph/ceph-client.yaml
index b4d9baabd..0d7d4b0c6 100644
--- a/cluster/examples/kubernetes/ceph/ceph-client.yaml
+++ b/cluster/examples/kubernetes/ceph/ceph-client.yaml
@@ -3,7 +3,7 @@ apiVersion: ceph.rook.io/v1
 kind: CephClient
 metadata:
   name: glance
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 spec:
   caps:
     mon: 'profile rbd'
@@ -13,8 +13,8 @@ apiVersion: ceph.rook.io/v1
 kind: CephClient
 metadata:
   name: cinder
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 spec:
   caps:
     mon: 'profile rbd'
-    osd: 'profile rbd pool=volumes, profile rbd pool=vms, profile rbd-read-only pool=images'
+    osd: 'profile rbd pool=volumes, profile rbd pool=vms, profile rbd-read-only pool=images'
\ No newline at end of file
diff --git a/cluster/examples/kubernetes/ceph/cluster-external-management.yaml b/cluster/examples/kubernetes/ceph/cluster-external-management.yaml
index ba84a1309..42f91f891 100644
--- a/cluster/examples/kubernetes/ceph/cluster-external-management.yaml
+++ b/cluster/examples/kubernetes/ceph/cluster-external-management.yaml
@@ -12,7 +12,7 @@ apiVersion: ceph.rook.io/v1
 kind: CephCluster
 metadata:
   name: rook-ceph-external
-  namespace: rook-ceph-external # namespace:cluster
+  namespace: rook-ceph-external
 spec:
   external:
     enable: true
diff --git a/cluster/examples/kubernetes/ceph/cluster-external.yaml b/cluster/examples/kubernetes/ceph/cluster-external.yaml
index 9f386c321..d1ea40f66 100644
--- a/cluster/examples/kubernetes/ceph/cluster-external.yaml
+++ b/cluster/examples/kubernetes/ceph/cluster-external.yaml
@@ -13,7 +13,7 @@ apiVersion: ceph.rook.io/v1
 kind: CephCluster
 metadata:
   name: rook-ceph-external
-  namespace: rook-ceph-external # namespace:cluster
+  namespace: rook-ceph-external
 spec:
   external:
     enable: true
diff --git a/cluster/examples/kubernetes/ceph/cluster-on-pvc.yaml b/cluster/examples/kubernetes/ceph/cluster-on-pvc.yaml
index 599d580eb..22d94d71e 100644
--- a/cluster/examples/kubernetes/ceph/cluster-on-pvc.yaml
+++ b/cluster/examples/kubernetes/ceph/cluster-on-pvc.yaml
@@ -11,7 +11,7 @@ apiVersion: ceph.rook.io/v1
 kind: CephCluster
 metadata:
   name: rook-ceph
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 spec:
   dataDirHostPath: /var/lib/rook
   mon:
@@ -191,6 +191,6 @@ spec:
 # kind: Secret
 # metadata:
 #   name: rook-vault-token
-#   namespace: rook-ceph # namespace:cluster
+#   namespace: rook-ceph
 # data:
 #   token: ROOK_TOKEN_CHANGE_ME
diff --git a/cluster/examples/kubernetes/ceph/cluster-stretched.yaml b/cluster/examples/kubernetes/ceph/cluster-stretched.yaml
index 3a8bc7917..1cb5a3d73 100644
--- a/cluster/examples/kubernetes/ceph/cluster-stretched.yaml
+++ b/cluster/examples/kubernetes/ceph/cluster-stretched.yaml
@@ -12,7 +12,7 @@ apiVersion: ceph.rook.io/v1
 kind: CephCluster
 metadata:
   name: rook-ceph
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 spec:
   dataDirHostPath: /var/lib/rook
   mon:
diff --git a/cluster/examples/kubernetes/ceph/cluster-with-drive-groups.yaml b/cluster/examples/kubernetes/ceph/cluster-with-drive-groups.yaml
index 7450e9534..828394eac 100644
--- a/cluster/examples/kubernetes/ceph/cluster-with-drive-groups.yaml
+++ b/cluster/examples/kubernetes/ceph/cluster-with-drive-groups.yaml
@@ -12,7 +12,7 @@ apiVersion: ceph.rook.io/v1
 kind: CephCluster
 metadata:
   name: rook-ceph
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 spec:
   cephVersion:
       image: ceph/ceph:v15.2.7
diff --git a/cluster/examples/kubernetes/ceph/cluster.yaml b/cluster/examples/kubernetes/ceph/cluster.yaml
index e5d9a372a..254848ba3 100644
--- a/cluster/examples/kubernetes/ceph/cluster.yaml
+++ b/cluster/examples/kubernetes/ceph/cluster.yaml
@@ -12,7 +12,7 @@ apiVersion: ceph.rook.io/v1
 kind: CephCluster
 metadata:
   name: rook-ceph
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 spec:
   cephVersion:
     # The container image used to launch the Ceph daemon pods (mon, mgr, osd, mds, rgw).
diff --git a/cluster/examples/kubernetes/ceph/common-external.yaml b/cluster/examples/kubernetes/ceph/common-external.yaml
index dd2d7107f..59aa5d9ed 100644
--- a/cluster/examples/kubernetes/ceph/common-external.yaml
+++ b/cluster/examples/kubernetes/ceph/common-external.yaml
@@ -21,13 +21,13 @@
 apiVersion: v1
 kind: Namespace
 metadata:
-  name: rook-ceph-external # namespace:cluster
+  name: rook-ceph-external
 ---
 kind: RoleBinding
 apiVersion: rbac.authorization.k8s.io/v1
 metadata:
   name: rook-ceph-cluster-mgmt
-  name: rook-ceph-external # namespace:cluster
+  namespace: rook-ceph-external
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: ClusterRole
@@ -35,13 +35,13 @@ roleRef:
 subjects:
 - kind: ServiceAccount
   name: rook-ceph-system
-  namespace: rook-ceph # namespace:operator
+  namespace: rook-ceph
 ---
 kind: RoleBinding
 apiVersion: rbac.authorization.k8s.io/v1
 metadata:
   name: rook-ceph-cmd-reporter
-  name: rook-ceph-external # namespace:cluster
+  namespace: rook-ceph-external
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: Role
@@ -49,19 +49,19 @@ roleRef:
 subjects:
 - kind: ServiceAccount
   name: rook-ceph-cmd-reporter
-  name: rook-ceph-external # namespace:cluster
+  namespace: rook-ceph-external
 ---
 apiVersion: v1
 kind: ServiceAccount
 metadata:
   name: rook-ceph-cmd-reporter
-  name: rook-ceph-external # namespace:cluster
+  namespace: rook-ceph-external
 ---
 kind: Role
 apiVersion: rbac.authorization.k8s.io/v1
 metadata:
   name: rook-ceph-cmd-reporter
-  name: rook-ceph-external # namespace:cluster
+  namespace: rook-ceph-external
 rules:
 - apiGroups:
   - ""
diff --git a/cluster/examples/kubernetes/ceph/common.yaml b/cluster/examples/kubernetes/ceph/common.yaml
index 6ccbc74fd..15c7d04e1 100644
--- a/cluster/examples/kubernetes/ceph/common.yaml
+++ b/cluster/examples/kubernetes/ceph/common.yaml
@@ -14,7 +14,7 @@
 apiVersion: v1
 kind: Namespace
 metadata:
-  name: rook-ceph # namespace:cluster
+  name: rook-ceph
 # OLM: BEGIN OBJECTBUCKET ROLEBINDING
 ---
 kind: ClusterRoleBinding
@@ -28,7 +28,7 @@ roleRef:
 subjects:
   - kind: ServiceAccount
     name: rook-ceph-system
-    namespace: rook-ceph # namespace:operator
+    namespace: rook-ceph
 # OLM: END OBJECTBUCKET ROLEBINDING
 # OLM: BEGIN OPERATOR ROLE
 ---
@@ -36,7 +36,7 @@ apiVersion: v1
 kind: ServiceAccount
 metadata:
   name: rook-ceph-admission-controller
-  namespace: rook-ceph # namespace:operator
+  namespace: rook-ceph
 ---
 kind: ClusterRole
 apiVersion: rbac.authorization.k8s.io/v1
@@ -55,7 +55,7 @@ subjects:
   - kind: ServiceAccount
     name: rook-ceph-admission-controller
     apiGroup: ""
-    namespace: rook-ceph # namespace:operator
+    namespace: rook-ceph
 roleRef:
   kind: ClusterRole
   name: rook-ceph-admission-controller-role
@@ -96,7 +96,7 @@ apiVersion: rbac.authorization.k8s.io/v1
 kind: Role
 metadata:
   name: rook-ceph-system
-  namespace: rook-ceph # namespace:operator
+  namespace: rook-ceph
   labels:
     operator: rook
     storage-backend: ceph
@@ -323,7 +323,7 @@ apiVersion: v1
 kind: ServiceAccount
 metadata:
   name: rook-ceph-system
-  namespace: rook-ceph # namespace:operator
+  namespace: rook-ceph
   labels:
     operator: rook
     storage-backend: ceph
@@ -338,7 +338,7 @@ kind: RoleBinding
 apiVersion: rbac.authorization.k8s.io/v1
 metadata:
   name: rook-ceph-system
-  namespace: rook-ceph # namespace:operator
+  namespace: rook-ceph
   labels:
     operator: rook
     storage-backend: ceph
@@ -349,7 +349,7 @@ roleRef:
 subjects:
 - kind: ServiceAccount
   name: rook-ceph-system
-  namespace: rook-ceph # namespace:operator
+  namespace: rook-ceph
 ---
 # Grant the rook system daemons cluster-wide access to manage the Rook CRDs, PVCs, and storage classes
 kind: ClusterRoleBinding
@@ -366,7 +366,7 @@ roleRef:
 subjects:
 - kind: ServiceAccount
   name: rook-ceph-system
-  namespace: rook-ceph # namespace:operator
+  namespace: rook-ceph
 # OLM: END OPERATOR ROLEBINDING
 #################################################################################################################
 # Beginning of cluster-specific resources. The example will assume the cluster will be created in the "rook-ceph"
@@ -380,7 +380,7 @@ apiVersion: v1
 kind: ServiceAccount
 metadata:
   name: rook-ceph-osd
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 # imagePullSecrets:
 # - name: my-registry-secret
 
@@ -392,7 +392,7 @@ apiVersion: v1
 kind: ServiceAccount
 metadata:
   name: rook-ceph-mgr
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 # imagePullSecrets:
 # - name: my-registry-secret
 
@@ -403,7 +403,7 @@ apiVersion: v1
 kind: ServiceAccount
 metadata:
   name: rook-ceph-cmd-reporter
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 # OLM: END CMD REPORTER SERVICE ACCOUNT
 # OLM: BEGIN CLUSTER ROLE
 ---
@@ -411,7 +411,7 @@ kind: Role
 apiVersion: rbac.authorization.k8s.io/v1
 metadata:
   name: rook-ceph-osd
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 rules:
 - apiGroups: [""]
   resources: ["configmaps"]
@@ -453,7 +453,7 @@ kind: Role
 apiVersion: rbac.authorization.k8s.io/v1
 metadata:
   name: rook-ceph-mgr
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 rules:
 - apiGroups:
   - ""
@@ -490,7 +490,7 @@ kind: Role
 apiVersion: rbac.authorization.k8s.io/v1
 metadata:
   name: rook-ceph-cmd-reporter
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 rules:
 - apiGroups:
   - ""
@@ -512,7 +512,7 @@ kind: RoleBinding
 apiVersion: rbac.authorization.k8s.io/v1
 metadata:
   name: rook-ceph-cluster-mgmt
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: ClusterRole
@@ -520,14 +520,14 @@ roleRef:
 subjects:
 - kind: ServiceAccount
   name: rook-ceph-system
-  namespace: rook-ceph # namespace:operator
+  namespace: rook-ceph
 ---
 # Allow the osd pods in this namespace to work with configmaps
 kind: RoleBinding
 apiVersion: rbac.authorization.k8s.io/v1
 metadata:
   name: rook-ceph-osd
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: Role
@@ -535,14 +535,14 @@ roleRef:
 subjects:
 - kind: ServiceAccount
   name: rook-ceph-osd
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 ---
 # Allow the ceph mgr to access the cluster-specific resources necessary for the mgr modules
 kind: RoleBinding
 apiVersion: rbac.authorization.k8s.io/v1
 metadata:
   name: rook-ceph-mgr
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: Role
@@ -550,14 +550,14 @@ roleRef:
 subjects:
 - kind: ServiceAccount
   name: rook-ceph-mgr
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 ---
 # Allow the ceph mgr to access the rook system resources necessary for the mgr modules
 kind: RoleBinding
 apiVersion: rbac.authorization.k8s.io/v1
 metadata:
   name: rook-ceph-mgr-system
-  namespace: rook-ceph  # namespace:operator
+  namespace: rook-ceph
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: ClusterRole
@@ -565,7 +565,7 @@ roleRef:
 subjects:
 - kind: ServiceAccount
   name: rook-ceph-mgr
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 ---
 # Allow the ceph mgr to access cluster-wide resources necessary for the mgr modules
 kind: ClusterRoleBinding
@@ -579,7 +579,7 @@ roleRef:
 subjects:
 - kind: ServiceAccount
   name: rook-ceph-mgr
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 
 ---
 # Allow the ceph osd to access cluster-wide resources necessary for determining their topology location
@@ -594,7 +594,7 @@ roleRef:
 subjects:
 - kind: ServiceAccount
   name: rook-ceph-osd
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 
 # OLM: END CLUSTER ROLEBINDING
 # OLM: BEGIN CMD REPORTER ROLEBINDING
@@ -603,7 +603,7 @@ kind: RoleBinding
 apiVersion: rbac.authorization.k8s.io/v1
 metadata:
   name: rook-ceph-cmd-reporter
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: Role
@@ -611,7 +611,7 @@ roleRef:
 subjects:
 - kind: ServiceAccount
   name: rook-ceph-cmd-reporter
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 # OLM: END CMD REPORTER ROLEBINDING
 #################################################################################################################
 # Beginning of pod security policy resources. The example will assume the cluster will be created in the
@@ -718,13 +718,13 @@ roleRef:
 subjects:
   - kind: ServiceAccount
     name: rook-ceph-system
-    namespace: rook-ceph # namespace:operator
+    namespace: rook-ceph
 ---
 apiVersion: rbac.authorization.k8s.io/v1
 kind: RoleBinding
 metadata:
   name: rook-ceph-default-psp
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: ClusterRole
@@ -732,13 +732,13 @@ roleRef:
 subjects:
 - kind: ServiceAccount
   name: default
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 ---
 apiVersion: rbac.authorization.k8s.io/v1
 kind: RoleBinding
 metadata:
   name: rook-ceph-osd-psp
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: ClusterRole
@@ -746,13 +746,13 @@ roleRef:
 subjects:
 - kind: ServiceAccount
   name: rook-ceph-osd
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 ---
 apiVersion: rbac.authorization.k8s.io/v1
 kind: RoleBinding
 metadata:
   name: rook-ceph-mgr-psp
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: ClusterRole
@@ -760,13 +760,13 @@ roleRef:
 subjects:
 - kind: ServiceAccount
   name: rook-ceph-mgr
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 ---
 apiVersion: rbac.authorization.k8s.io/v1
 kind: RoleBinding
 metadata:
   name: rook-ceph-cmd-reporter-psp
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: ClusterRole
@@ -774,7 +774,7 @@ roleRef:
 subjects:
 - kind: ServiceAccount
   name: rook-ceph-cmd-reporter
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 # OLM: END CLUSTER POD SECURITY POLICY BINDINGS
 # OLM: BEGIN CSI CEPHFS SERVICE ACCOUNT
 ---
@@ -782,21 +782,21 @@ apiVersion: v1
 kind: ServiceAccount
 metadata:
   name: rook-csi-cephfs-plugin-sa
-  namespace: rook-ceph # namespace:operator
+  namespace: rook-ceph
 ---
 apiVersion: v1
 kind: ServiceAccount
 metadata:
   name: rook-csi-cephfs-provisioner-sa
-  namespace: rook-ceph # namespace:operator
+  namespace: rook-ceph
 # OLM: END CSI CEPHFS SERVICE ACCOUNT
 # OLM: BEGIN CSI CEPHFS ROLE
 ---
 kind: Role
 apiVersion: rbac.authorization.k8s.io/v1
 metadata:
+  namespace: rook-ceph
   name: cephfs-external-provisioner-cfg
-  namespace: rook-ceph # namespace:operator
 rules:
   - apiGroups: [""]
     resources: ["endpoints"]
@@ -814,11 +814,11 @@ kind: RoleBinding
 apiVersion: rbac.authorization.k8s.io/v1
 metadata:
   name: cephfs-csi-provisioner-role-cfg
-  namespace: rook-ceph # namespace:operator
+  namespace: rook-ceph
 subjects:
   - kind: ServiceAccount
     name: rook-csi-cephfs-provisioner-sa
-    namespace: rook-ceph # namespace:operator
+    namespace: rook-ceph
 roleRef:
   kind: Role
   name: cephfs-external-provisioner-cfg
@@ -911,7 +911,7 @@ roleRef:
 subjects:
   - kind: ServiceAccount
     name: rook-csi-cephfs-plugin-sa
-    namespace: rook-ceph # namespace:operator
+    namespace: rook-ceph
 ---
 apiVersion: rbac.authorization.k8s.io/v1
 kind: ClusterRoleBinding
@@ -924,7 +924,7 @@ roleRef:
 subjects:
   - kind: ServiceAccount
     name: rook-csi-cephfs-provisioner-sa
-    namespace: rook-ceph # namespace:operator
+    namespace: rook-ceph
 ---
 kind: ClusterRoleBinding
 apiVersion: rbac.authorization.k8s.io/v1
@@ -933,7 +933,7 @@ metadata:
 subjects:
   - kind: ServiceAccount
     name: rook-csi-cephfs-plugin-sa
-    namespace: rook-ceph # namespace:operator
+    namespace: rook-ceph
 roleRef:
   kind: ClusterRole
   name: cephfs-csi-nodeplugin
@@ -947,7 +947,7 @@ metadata:
 subjects:
   - kind: ServiceAccount
     name: rook-csi-cephfs-provisioner-sa
-    namespace: rook-ceph # namespace:operator
+    namespace: rook-ceph
 roleRef:
   kind: ClusterRole
   name: cephfs-external-provisioner-runner
@@ -959,21 +959,21 @@ apiVersion: v1
 kind: ServiceAccount
 metadata:
   name: rook-csi-rbd-plugin-sa
-  namespace: rook-ceph # namespace:operator
+  namespace: rook-ceph
 ---
 apiVersion: v1
 kind: ServiceAccount
 metadata:
   name: rook-csi-rbd-provisioner-sa
-  namespace: rook-ceph # namespace:operator
+  namespace: rook-ceph
 # OLM: END CSI RBD SERVICE ACCOUNT
 # OLM: BEGIN CSI RBD ROLE
 ---
 kind: Role
 apiVersion: rbac.authorization.k8s.io/v1
 metadata:
+  namespace: rook-ceph
   name: rbd-external-provisioner-cfg
-  namespace: rook-ceph # namespace:operator
 rules:
   - apiGroups: [""]
     resources: ["endpoints"]
@@ -991,11 +991,11 @@ kind: RoleBinding
 apiVersion: rbac.authorization.k8s.io/v1
 metadata:
   name: rbd-csi-provisioner-role-cfg
-  namespace: rook-ceph # namespace:operator
+  namespace: rook-ceph
 subjects:
   - kind: ServiceAccount
     name: rook-csi-rbd-provisioner-sa
-    namespace: rook-ceph # namespace:operator
+    namespace: rook-ceph
 roleRef:
   kind: Role
   name: rbd-external-provisioner-cfg
@@ -1091,7 +1091,7 @@ roleRef:
 subjects:
   - kind: ServiceAccount
     name: rook-csi-rbd-plugin-sa
-    namespace: rook-ceph # namespace:operator
+    namespace: rook-ceph
 ---
 apiVersion: rbac.authorization.k8s.io/v1
 kind: ClusterRoleBinding
@@ -1104,7 +1104,7 @@ roleRef:
 subjects:
   - kind: ServiceAccount
     name: rook-csi-rbd-provisioner-sa
-    namespace: rook-ceph # namespace:operator
+    namespace: rook-ceph
 ---
 kind: ClusterRoleBinding
 apiVersion: rbac.authorization.k8s.io/v1
@@ -1113,7 +1113,7 @@ metadata:
 subjects:
   - kind: ServiceAccount
     name: rook-csi-rbd-plugin-sa
-    namespace: rook-ceph # namespace:operator
+    namespace: rook-ceph
 roleRef:
   kind: ClusterRole
   name: rbd-csi-nodeplugin
@@ -1126,7 +1126,7 @@ metadata:
 subjects:
   - kind: ServiceAccount
     name: rook-csi-rbd-provisioner-sa
-    namespace: rook-ceph # namespace:operator
+    namespace: rook-ceph
 roleRef:
   kind: ClusterRole
   name: rbd-external-provisioner-runner
diff --git a/cluster/examples/kubernetes/ceph/csi/cephfs/snapshotclass.yaml b/cluster/examples/kubernetes/ceph/csi/cephfs/snapshotclass.yaml
index e2aaac009..45f7fc4e4 100644
--- a/cluster/examples/kubernetes/ceph/csi/cephfs/snapshotclass.yaml
+++ b/cluster/examples/kubernetes/ceph/csi/cephfs/snapshotclass.yaml
@@ -3,12 +3,12 @@ apiVersion: snapshot.storage.k8s.io/v1beta1
 kind: VolumeSnapshotClass
 metadata:
   name: csi-cephfsplugin-snapclass
-driver: rook-ceph.cephfs.csi.ceph.com # driver:namespace:operator
+driver: rook-ceph.cephfs.csi.ceph.com
 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,
   # for example "rook-ceph".
-  clusterID: rook-ceph # namespace:cluster
+  clusterID: rook-ceph
   csi.storage.k8s.io/snapshotter-secret-name: rook-csi-cephfs-provisioner
-  csi.storage.k8s.io/snapshotter-secret-namespace: rook-ceph # namespace:cluster
+  csi.storage.k8s.io/snapshotter-secret-namespace: rook-ceph
 deletionPolicy: Delete
diff --git a/cluster/examples/kubernetes/ceph/csi/cephfs/storageclass.yaml b/cluster/examples/kubernetes/ceph/csi/cephfs/storageclass.yaml
index 6e4e2cb24..34a6a7644 100644
--- a/cluster/examples/kubernetes/ceph/csi/cephfs/storageclass.yaml
+++ b/cluster/examples/kubernetes/ceph/csi/cephfs/storageclass.yaml
@@ -2,10 +2,10 @@ apiVersion: storage.k8s.io/v1
 kind: StorageClass
 metadata:
   name: rook-cephfs
-provisioner: rook-ceph.cephfs.csi.ceph.com # driver:namespace:operator
+provisioner: rook-ceph.cephfs.csi.ceph.com
 parameters:
   # clusterID is the namespace where operator is deployed.
-  clusterID: rook-ceph # namespace:cluster
+  clusterID: rook-ceph
 
   # CephFS filesystem name into which the volume shall be created
   fsName: myfs
@@ -21,11 +21,11 @@ parameters:
   # The secrets contain Ceph admin credentials. These are generated automatically by the operator
   # in the same namespace as the cluster.
   csi.storage.k8s.io/provisioner-secret-name: rook-csi-cephfs-provisioner
-  csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph # namespace:cluster
+  csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph
   csi.storage.k8s.io/controller-expand-secret-name: rook-csi-cephfs-provisioner
-  csi.storage.k8s.io/controller-expand-secret-namespace: rook-ceph # namespace:cluster
+  csi.storage.k8s.io/controller-expand-secret-namespace: rook-ceph
   csi.storage.k8s.io/node-stage-secret-name: rook-csi-cephfs-node
-  csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph # namespace:cluster
+  csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph
 
   # (optional) The driver can use either ceph-fuse (fuse) or ceph kernel client (kernel)
   # If omitted, default volume mounter will be used - this is determined by probing for ceph-fuse
diff --git a/cluster/examples/kubernetes/ceph/csi/rbd/snapshotclass.yaml b/cluster/examples/kubernetes/ceph/csi/rbd/snapshotclass.yaml
index df7896822..d2ee65fe2 100644
--- a/cluster/examples/kubernetes/ceph/csi/rbd/snapshotclass.yaml
+++ b/cluster/examples/kubernetes/ceph/csi/rbd/snapshotclass.yaml
@@ -3,12 +3,12 @@ apiVersion: snapshot.storage.k8s.io/v1beta1
 kind: VolumeSnapshotClass
 metadata:
   name: csi-rbdplugin-snapclass
-driver: rook-ceph.rbd.csi.ceph.com # driver:namespace:operator
+driver: rook-ceph.rbd.csi.ceph.com
 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,
   # for example "rook-ceph".
-  clusterID: rook-ceph # namespace:cluster
+  clusterID: rook-ceph
   csi.storage.k8s.io/snapshotter-secret-name: rook-csi-rbd-provisioner
-  csi.storage.k8s.io/snapshotter-secret-namespace: rook-ceph # namespace:cluster
+  csi.storage.k8s.io/snapshotter-secret-namespace: rook-ceph
 deletionPolicy: Delete
diff --git a/cluster/examples/kubernetes/ceph/csi/rbd/storageclass-ec.yaml b/cluster/examples/kubernetes/ceph/csi/rbd/storageclass-ec.yaml
index 504d3bbb5..4a3b5e347 100644
--- a/cluster/examples/kubernetes/ceph/csi/rbd/storageclass-ec.yaml
+++ b/cluster/examples/kubernetes/ceph/csi/rbd/storageclass-ec.yaml
@@ -9,7 +9,7 @@ apiVersion: ceph.rook.io/v1
 kind: CephBlockPool
 metadata:
   name: replicated-metadata-pool
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 spec:
   replicated:
     size: 2
@@ -18,7 +18,7 @@ apiVersion: ceph.rook.io/v1
 kind: CephBlockPool
 metadata:
   name: ec-data-pool
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 spec:
   # Make sure you have enough nodes and OSDs running bluestore to support the replica size or erasure code chunks.
   # For the below settings, you need at least 3 OSDs on different nodes (because the `failureDomain` is `host` by default).
@@ -31,11 +31,11 @@ kind: StorageClass
 metadata:
    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
+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
-    clusterID: rook-ceph # namespace:cluster
+    clusterID: rook-ceph
 
     # If you want to use erasure coded pool with RBD, you need to create
     # two pools. one erasure coded and one replicated.
@@ -45,20 +45,6 @@ parameters:
     dataPool: ec-data-pool
     pool: replicated-metadata-pool
 
-    # (optional) mapOptions is a comma-separated list of map options.
-    # For krbd options refer
-    # https://docs.ceph.com/docs/master/man/8/rbd/#kernel-rbd-krbd-options
-    # For nbd options refer
-    # https://docs.ceph.com/docs/master/man/8/rbd-nbd/#options
-    # mapOptions: lock_on_read,queue_depth=1024
-
-    # (optional) unmapOptions is a comma-separated list of unmap options.
-    # For krbd options refer
-    # https://docs.ceph.com/docs/master/man/8/rbd/#kernel-rbd-krbd-options
-    # For nbd options refer
-    # https://docs.ceph.com/docs/master/man/8/rbd-nbd/#options
-    # unmapOptions: force
-
     # RBD image format. Defaults to "2".
     imageFormat: "2"
 
@@ -68,11 +54,11 @@ parameters:
     # The secrets contain Ceph admin credentials. These are generated automatically by the operator
     # in the same namespace as the cluster.
     csi.storage.k8s.io/provisioner-secret-name: rook-csi-rbd-provisioner
-    csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph # namespace:cluster
+    csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph
     csi.storage.k8s.io/controller-expand-secret-name: rook-csi-rbd-provisioner
-    csi.storage.k8s.io/controller-expand-secret-namespace: rook-ceph # namespace:cluster
+    csi.storage.k8s.io/controller-expand-secret-namespace: rook-ceph
     csi.storage.k8s.io/node-stage-secret-name: rook-csi-rbd-node
-    csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph # namespace:cluster
+    csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph
     # Specify the filesystem type of the volume. If not specified, csi-provisioner
     # will set default as `ext4`.
     csi.storage.k8s.io/fstype: ext4
diff --git a/cluster/examples/kubernetes/ceph/csi/rbd/storageclass.yaml b/cluster/examples/kubernetes/ceph/csi/rbd/storageclass.yaml
index f90735cca..c2df6f4dc 100644
--- a/cluster/examples/kubernetes/ceph/csi/rbd/storageclass.yaml
+++ b/cluster/examples/kubernetes/ceph/csi/rbd/storageclass.yaml
@@ -23,7 +23,7 @@ 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
-    clusterID: rook-ceph # namespace:cluster
+    clusterID: rook-ceph
 
     # If you want to use erasure coded pool with RBD, you need to create
     # two pools. one erasure coded and one replicated.
@@ -33,20 +33,6 @@ parameters:
     #dataPool: ec-data-pool
     pool: replicapool
 
-    # (optional) mapOptions is a comma-separated list of map options.
-    # For krbd options refer
-    # https://docs.ceph.com/docs/master/man/8/rbd/#kernel-rbd-krbd-options
-    # For nbd options refer
-    # https://docs.ceph.com/docs/master/man/8/rbd-nbd/#options
-    # mapOptions: lock_on_read,queue_depth=1024
-
-    # (optional) unmapOptions is a comma-separated list of unmap options.
-    # For krbd options refer
-    # https://docs.ceph.com/docs/master/man/8/rbd/#kernel-rbd-krbd-options
-    # For nbd options refer
-    # https://docs.ceph.com/docs/master/man/8/rbd-nbd/#options
-    # unmapOptions: force
-
     # RBD image format. Defaults to "2".
     imageFormat: "2"
 
@@ -56,11 +42,11 @@ parameters:
     # The secrets contain Ceph admin credentials. These are generated automatically by the operator
     # in the same namespace as the cluster.
     csi.storage.k8s.io/provisioner-secret-name: rook-csi-rbd-provisioner
-    csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph # namespace:cluster
+    csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph
     csi.storage.k8s.io/controller-expand-secret-name: rook-csi-rbd-provisioner
-    csi.storage.k8s.io/controller-expand-secret-namespace: rook-ceph # namespace:cluster
+    csi.storage.k8s.io/controller-expand-secret-namespace: rook-ceph
     csi.storage.k8s.io/node-stage-secret-name: rook-csi-rbd-node
-    csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph # namespace:cluster
+    csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph
     # Specify the filesystem type of the volume. If not specified, csi-provisioner
     # will set default as `ext4`. Note that `xfs` is not recommended due to potential deadlock
     # in hyperconverged settings where the volume is mounted on the same node as the osds.
diff --git a/cluster/examples/kubernetes/ceph/csi/template/rbd/csi-rbdplugin-provisioner-dep.yaml b/cluster/examples/kubernetes/ceph/csi/template/rbd/csi-rbdplugin-provisioner-dep.yaml
index a51bf993a..4367c3421 100644
--- a/cluster/examples/kubernetes/ceph/csi/template/rbd/csi-rbdplugin-provisioner-dep.yaml
+++ b/cluster/examples/kubernetes/ceph/csi/template/rbd/csi-rbdplugin-provisioner-dep.yaml
@@ -85,26 +85,6 @@ spec:
           volumeMounts:
             - name: socket-dir
               mountPath: /csi
-        {{ if .EnableOMAPGenerator }}
-        - name: csi-omap-generator
-          image: {{ .CSIPluginImage }}
-          args :
-            - "--type=controller"
-            - "--drivernamespace=$(DRIVER_NAMESPACE)"
-            - "--v={{ .LogLevel }}"
-            - "--drivername={{ .DriverNamePrefix }}rbd.csi.ceph.com"
-          env:
-            - name: DRIVER_NAMESPACE
-              valueFrom:
-                fieldRef:
-                  fieldPath: metadata.namespace
-          imagePullPolicy: "IfNotPresent"
-          volumeMounts:
-            - name: ceph-csi-config
-              mountPath: /etc/ceph-csi-config/
-            - name: keys-tmp-dir
-              mountPath: /tmp/csi/keys
-        {{ end }}
         - name: csi-rbdplugin
           image: {{ .CSIPluginImage }}
           args :
diff --git a/cluster/examples/kubernetes/ceph/dashboard-external-http.yaml b/cluster/examples/kubernetes/ceph/dashboard-external-http.yaml
index 332b032a3..c67ac4c5e 100644
--- a/cluster/examples/kubernetes/ceph/dashboard-external-http.yaml
+++ b/cluster/examples/kubernetes/ceph/dashboard-external-http.yaml
@@ -2,10 +2,10 @@ apiVersion: v1
 kind: Service
 metadata:
   name: rook-ceph-mgr-dashboard-external-http
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
   labels:
     app: rook-ceph-mgr
-    rook_cluster: rook-ceph # namespace:cluster
+    rook_cluster: rook-ceph
 spec:
   ports:
   - name: dashboard
diff --git a/cluster/examples/kubernetes/ceph/dashboard-external-https.yaml b/cluster/examples/kubernetes/ceph/dashboard-external-https.yaml
index c9c3a0146..4b94a3778 100644
--- a/cluster/examples/kubernetes/ceph/dashboard-external-https.yaml
+++ b/cluster/examples/kubernetes/ceph/dashboard-external-https.yaml
@@ -2,10 +2,10 @@ apiVersion: v1
 kind: Service
 metadata:
   name: rook-ceph-mgr-dashboard-external-https
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
   labels:
     app: rook-ceph-mgr
-    rook_cluster: rook-ceph # namespace:cluster
+    rook_cluster: rook-ceph
 spec:
   ports:
   - name: dashboard
diff --git a/cluster/examples/kubernetes/ceph/dashboard-ingress-https.yaml b/cluster/examples/kubernetes/ceph/dashboard-ingress-https.yaml
index 5e497f8c8..005c6b172 100644
--- a/cluster/examples/kubernetes/ceph/dashboard-ingress-https.yaml
+++ b/cluster/examples/kubernetes/ceph/dashboard-ingress-https.yaml
@@ -9,7 +9,7 @@ apiVersion: extensions/v1beta1
 kind: Ingress
 metadata:
   name: rook-ceph-mgr-dashboard
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
   annotations:
     kubernetes.io/ingress.class: "nginx"
     kubernetes.io/tls-acme: "true"
diff --git a/cluster/examples/kubernetes/ceph/dashboard-loadbalancer.yaml b/cluster/examples/kubernetes/ceph/dashboard-loadbalancer.yaml
index 69b732d8a..8019b6f3a 100644
--- a/cluster/examples/kubernetes/ceph/dashboard-loadbalancer.yaml
+++ b/cluster/examples/kubernetes/ceph/dashboard-loadbalancer.yaml
@@ -2,10 +2,10 @@ apiVersion: v1
 kind: Service
 metadata:
   name: rook-ceph-mgr-dashboard-loadbalancer
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
   labels:
     app: rook-ceph-mgr
-    rook_cluster: rook-ceph # namespace:cluster
+    rook_cluster: rook-ceph
 spec:
   ports:
   - name: dashboard
diff --git a/cluster/examples/kubernetes/ceph/direct-mount.yaml b/cluster/examples/kubernetes/ceph/direct-mount.yaml
index 1ed86da64..7dff3d73a 100644
--- a/cluster/examples/kubernetes/ceph/direct-mount.yaml
+++ b/cluster/examples/kubernetes/ceph/direct-mount.yaml
@@ -2,7 +2,7 @@ apiVersion: apps/v1
 kind: Deployment
 metadata:
   name: rook-direct-mount
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
   labels:
     app: rook-direct-mount
 spec:
diff --git a/cluster/examples/kubernetes/ceph/filesystem-ec.yaml b/cluster/examples/kubernetes/ceph/filesystem-ec.yaml
index ca436ee2e..7c38342b9 100644
--- a/cluster/examples/kubernetes/ceph/filesystem-ec.yaml
+++ b/cluster/examples/kubernetes/ceph/filesystem-ec.yaml
@@ -8,7 +8,7 @@ apiVersion: ceph.rook.io/v1
 kind: CephFilesystem
 metadata:
   name: myfs-ec
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 spec:
   # The metadata pool spec
   metadataPool:
diff --git a/cluster/examples/kubernetes/ceph/filesystem.yaml b/cluster/examples/kubernetes/ceph/filesystem.yaml
index dd2da681f..b3a37f1c3 100644
--- a/cluster/examples/kubernetes/ceph/filesystem.yaml
+++ b/cluster/examples/kubernetes/ceph/filesystem.yaml
@@ -8,7 +8,7 @@ apiVersion: ceph.rook.io/v1
 kind: CephFilesystem
 metadata:
   name: myfs
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 spec:
   # The metadata pool spec. Must use replication.
   metadataPool:
diff --git a/cluster/examples/kubernetes/ceph/nfs.yaml b/cluster/examples/kubernetes/ceph/nfs.yaml
index 929cfc639..1082641fa 100644
--- a/cluster/examples/kubernetes/ceph/nfs.yaml
+++ b/cluster/examples/kubernetes/ceph/nfs.yaml
@@ -2,7 +2,7 @@ apiVersion: ceph.rook.io/v1
 kind: CephNFS
 metadata:
   name: my-nfs
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 spec:
   rados:
     # RADOS pool where NFS client recovery data is stored.
diff --git a/cluster/examples/kubernetes/ceph/object-ec.yaml b/cluster/examples/kubernetes/ceph/object-ec.yaml
index 6d3306a26..d2e86791b 100644
--- a/cluster/examples/kubernetes/ceph/object-ec.yaml
+++ b/cluster/examples/kubernetes/ceph/object-ec.yaml
@@ -8,7 +8,7 @@ apiVersion: ceph.rook.io/v1
 kind: CephObjectStore
 metadata:
   name: my-store
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 spec:
   # The pool spec used to create the metadata pools. Must use replication.
   metadataPool:
diff --git a/cluster/examples/kubernetes/ceph/object-external.yaml b/cluster/examples/kubernetes/ceph/object-external.yaml
index 172b52e7c..f10e5a34f 100644
--- a/cluster/examples/kubernetes/ceph/object-external.yaml
+++ b/cluster/examples/kubernetes/ceph/object-external.yaml
@@ -8,7 +8,7 @@ apiVersion: ceph.rook.io/v1
 kind: CephObjectStore
 metadata:
   name: external-store
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 spec:
   gateway:
     # The port on which **ALL** the gateway(s) are listening on.
diff --git a/cluster/examples/kubernetes/ceph/object-multisite.yaml b/cluster/examples/kubernetes/ceph/object-multisite.yaml
index 3938aa966..a2e25f023 100644
--- a/cluster/examples/kubernetes/ceph/object-multisite.yaml
+++ b/cluster/examples/kubernetes/ceph/object-multisite.yaml
@@ -6,13 +6,13 @@ apiVersion: ceph.rook.io/v1
 kind: CephObjectRealm
 metadata:
   name: realm-a
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 ---
 apiVersion: ceph.rook.io/v1
 kind: CephObjectZoneGroup
 metadata:
   name: zonegroup-a
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 spec:
   realm: realm-a
 ---
@@ -20,7 +20,7 @@ apiVersion: ceph.rook.io/v1
 kind: CephObjectZone
 metadata:
   name: zone-a
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 spec:
   zoneGroup: zonegroup-a
   metadataPool:
@@ -40,7 +40,7 @@ apiVersion: ceph.rook.io/v1
 kind: CephObjectStore
 metadata:
   name: multisite-store
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 spec:
   gateway:
     type: s3
diff --git a/cluster/examples/kubernetes/ceph/object-openshift.yaml b/cluster/examples/kubernetes/ceph/object-openshift.yaml
index 1a0afcd7e..2e3fa2662 100644
--- a/cluster/examples/kubernetes/ceph/object-openshift.yaml
+++ b/cluster/examples/kubernetes/ceph/object-openshift.yaml
@@ -8,7 +8,7 @@ apiVersion: ceph.rook.io/v1
 kind: CephObjectStore
 metadata:
   name: my-store
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 spec:
   # The pool spec used to create the metadata pools. Must use replication.
   metadataPool:
diff --git a/cluster/examples/kubernetes/ceph/object-user.yaml b/cluster/examples/kubernetes/ceph/object-user.yaml
index bf2b6b41f..96a974d54 100644
--- a/cluster/examples/kubernetes/ceph/object-user.yaml
+++ b/cluster/examples/kubernetes/ceph/object-user.yaml
@@ -7,7 +7,7 @@ apiVersion: ceph.rook.io/v1
 kind: CephObjectStoreUser
 metadata:
   name: my-user
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 spec:
   store: my-store
   displayName: "my display name"
diff --git a/cluster/examples/kubernetes/ceph/object.yaml b/cluster/examples/kubernetes/ceph/object.yaml
index 72548f1cb..a6373c2cd 100644
--- a/cluster/examples/kubernetes/ceph/object.yaml
+++ b/cluster/examples/kubernetes/ceph/object.yaml
@@ -8,7 +8,7 @@ apiVersion: ceph.rook.io/v1
 kind: CephObjectStore
 metadata:
   name: my-store
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 spec:
   # The pool spec used to create the metadata pools. Must use replication.
   metadataPool:
diff --git a/cluster/examples/kubernetes/ceph/operator-openshift.yaml b/cluster/examples/kubernetes/ceph/operator-openshift.yaml
index 00ac34a3a..9639a0741 100644
--- a/cluster/examples/kubernetes/ceph/operator-openshift.yaml
+++ b/cluster/examples/kubernetes/ceph/operator-openshift.yaml
@@ -45,10 +45,10 @@ users:
   # A user needs to be added for each rook service account.
   # This assumes running in the default sample "rook-ceph" namespace.
   # If other namespaces or service accounts are configured, they need to be updated here.
-  - system:serviceaccount:rook-ceph:rook-ceph-system # serviceaccount:namespace:operator
-  - system:serviceaccount:rook-ceph:default # serviceaccount:namespace:cluster
-  - system:serviceaccount:rook-ceph:rook-ceph-mgr # serviceaccount:namespace:cluster
-  - system:serviceaccount:rook-ceph:rook-ceph-osd # serviceaccount:namespace:cluster
+  - system:serviceaccount:rook-ceph:rook-ceph-system
+  - system:serviceaccount:rook-ceph:default
+  - system:serviceaccount:rook-ceph:rook-ceph-mgr
+  - system:serviceaccount:rook-ceph:rook-ceph-osd
 ---
 # scc for the CSI driver
 kind: SecurityContextConstraints
@@ -82,10 +82,10 @@ users:
   # A user needs to be added for each rook service account.
   # This assumes running in the default sample "rook-ceph" namespace.
   # If other namespaces or service accounts are configured, they need to be updated here.
-  - system:serviceaccount:rook-ceph:rook-csi-rbd-plugin-sa # serviceaccount:namespace:operator
-  - system:serviceaccount:rook-ceph:rook-csi-rbd-provisioner-sa # serviceaccount:namespace:operator
-  - system:serviceaccount:rook-ceph:rook-csi-cephfs-plugin-sa # serviceaccount:namespace:operator
-  - system:serviceaccount:rook-ceph:rook-csi-cephfs-provisioner-sa # serviceaccount:namespace:operator
+  - system:serviceaccount:rook-ceph:rook-csi-rbd-plugin-sa
+  - system:serviceaccount:rook-ceph:rook-csi-rbd-provisioner-sa
+  - system:serviceaccount:rook-ceph:rook-csi-cephfs-plugin-sa
+  - system:serviceaccount:rook-ceph:rook-csi-cephfs-provisioner-sa
 ---
 # Rook Ceph Operator Config
 # Use this ConfigMap to override operator configurations
@@ -96,7 +96,7 @@ apiVersion: v1
 metadata:
   name: rook-ceph-operator-config
   # should be in the namespace of the operator
-  namespace: rook-ceph # namespace:operator
+  namespace: rook-ceph
 data:
   # Enable the CSI driver.
   # To run the non-default version of the CSI driver, see the override-able image properties in operator.yaml
@@ -109,13 +109,6 @@ data:
   # Supported values from 0 to 5. 0 for general useful logs, 5 for trace level verbosity.
   # CSI_LOG_LEVEL: "0"
 
-  # OMAP generator generates the omap mapping between the PV name and the RBD image
-  # which helps CSI to identify the rbd images for CSI operations.
-  # CSI_ENABLE_OMAP_GENERATOR need to be enabled when we are using rbd mirroring feature.
-  # By default OMAP generator is disabled and when enabled it willbe deployed as a
-  # sidecar with CSI provisioner pod, to enable set it to true.
-  # CSI_ENABLE_OMAP_GENERATOR: "true"
-
   # Enable Ceph Kernel clients on kernel < 4.17 which support quotas for Cephfs
   # If you disable the kernel client, your application may be disrupted during upgrade.
   # See the upgrade guide: https://rook.io/docs/rook/master/ceph-upgrade.html
@@ -126,7 +119,7 @@ data:
   # The default version of CSI supported by Rook will be started. To change the version
   # of the CSI driver to something other than what is officially supported, change
   # these images to the desired release of the CSI driver.
-  # ROOK_CSI_CEPH_IMAGE: "quay.io/cephcsi/cephcsi:v3.2.0"
+  # ROOK_CSI_CEPH_IMAGE: "quay.io/cephcsi/cephcsi:v3.1.2"
   # ROOK_CSI_REGISTRAR_IMAGE: "k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.0.1"
   # ROOK_CSI_RESIZER_IMAGE: "k8s.gcr.io/sig-storage/csi-resizer:v1.0.0"
   # ROOK_CSI_PROVISIONER_IMAGE: "k8s.gcr.io/sig-storage/csi-provisioner:v2.0.0"
@@ -354,7 +347,7 @@ apiVersion: apps/v1
 kind: Deployment
 metadata:
   name: rook-ceph-operator
-  namespace: rook-ceph # namespace:operator
+  namespace: rook-ceph
   labels:
     operator: rook
     storage-backend: ceph
diff --git a/cluster/examples/kubernetes/ceph/operator.yaml b/cluster/examples/kubernetes/ceph/operator.yaml
index 70c84691a..3b7505686 100644
--- a/cluster/examples/kubernetes/ceph/operator.yaml
+++ b/cluster/examples/kubernetes/ceph/operator.yaml
@@ -20,7 +20,7 @@ apiVersion: v1
 metadata:
   name: rook-ceph-operator-config
   # should be in the namespace of the operator
-  namespace: rook-ceph # namespace:operator
+  namespace: rook-ceph
 data:
   # Enable the CSI driver.
   # To run the non-default version of the CSI driver, see the override-able image properties in operator.yaml
@@ -33,12 +33,6 @@ data:
   # Supported values from 0 to 5. 0 for general useful logs, 5 for trace level verbosity.
   # CSI_LOG_LEVEL: "0"
 
-  # OMAP generator will generate the omap mapping between the PV name and the RBD image.
-  # CSI_ENABLE_OMAP_GENERATOR need to be enabled when we are using rbd mirroring feature.
-  # By default OMAP generator sidecar is deployed with CSI provisioner pod, to disable
-  # it set it to false.
-  # CSI_ENABLE_OMAP_GENERATOR: "false"
-
   # Enable cephfs kernel driver instead of ceph-fuse.
   # If you disable the kernel client, your application may be disrupted during upgrade.
   # See the upgrade guide: https://rook.io/docs/rook/master/ceph-upgrade.html
@@ -50,7 +44,7 @@ data:
   # The default version of CSI supported by Rook will be started. To change the version
   # of the CSI driver to something other than what is officially supported, change
   # these images to the desired release of the CSI driver.
-  # ROOK_CSI_CEPH_IMAGE: "quay.io/cephcsi/cephcsi:v3.2.0"
+  # ROOK_CSI_CEPH_IMAGE: "quay.io/cephcsi/cephcsi:v3.1.2"
   # ROOK_CSI_REGISTRAR_IMAGE: "k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.0.1"
   # ROOK_CSI_RESIZER_IMAGE: "k8s.gcr.io/sig-storage/csi-resizer:v1.0.0"
   # ROOK_CSI_PROVISIONER_IMAGE: "k8s.gcr.io/sig-storage/csi-provisioner:v2.0.0"
@@ -277,7 +271,7 @@ apiVersion: apps/v1
 kind: Deployment
 metadata:
   name: rook-ceph-operator
-  namespace: rook-ceph # namespace:operator
+  namespace: rook-ceph
   labels:
     operator: rook
     storage-backend: ceph
diff --git a/cluster/examples/kubernetes/ceph/osd-purge.yaml b/cluster/examples/kubernetes/ceph/osd-purge.yaml
index cb3255762..f0ee43229 100644
--- a/cluster/examples/kubernetes/ceph/osd-purge.yaml
+++ b/cluster/examples/kubernetes/ceph/osd-purge.yaml
@@ -2,7 +2,7 @@ apiVersion: batch/v1
 kind: Job
 metadata:
   name: rook-ceph-purge-osd
-  namespace: rook-ceph # namespace:operator
+  namespace: rook-ceph
   labels:
     app: rook-ceph-purge-osd
 spec:
@@ -52,4 +52,4 @@ spec:
       volumes:
         - emptyDir: {}
           name: ceph-conf-emptydir
-      restartPolicy: Never
+      restartPolicy: Never
\ No newline at end of file
diff --git a/cluster/examples/kubernetes/ceph/pool-ec.yaml b/cluster/examples/kubernetes/ceph/pool-ec.yaml
index d98f964e5..d6b363b81 100644
--- a/cluster/examples/kubernetes/ceph/pool-ec.yaml
+++ b/cluster/examples/kubernetes/ceph/pool-ec.yaml
@@ -7,7 +7,7 @@ apiVersion: ceph.rook.io/v1
 kind: CephBlockPool
 metadata:
   name: ec-pool
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 spec:
   # The failure domain will spread the replicas of the data across different failure zones
   failureDomain: osd
diff --git a/cluster/examples/kubernetes/ceph/pool.yaml b/cluster/examples/kubernetes/ceph/pool.yaml
index 87467e90f..46b289f99 100644
--- a/cluster/examples/kubernetes/ceph/pool.yaml
+++ b/cluster/examples/kubernetes/ceph/pool.yaml
@@ -8,7 +8,7 @@ apiVersion: ceph.rook.io/v1
 kind: CephBlockPool
 metadata:
   name: replicapool
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 spec:
   # The failure domain will spread the replicas of the data across different failure zones
   failureDomain: host
diff --git a/cluster/examples/kubernetes/ceph/rbdmirror.yaml b/cluster/examples/kubernetes/ceph/rbdmirror.yaml
index f0b79f5a2..c7262b3a5 100644
--- a/cluster/examples/kubernetes/ceph/rbdmirror.yaml
+++ b/cluster/examples/kubernetes/ceph/rbdmirror.yaml
@@ -7,7 +7,7 @@ apiVersion: ceph.rook.io/v1
 kind: CephRBDMirror
 metadata:
   name: my-rbd-mirror
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 spec:
   # the number of rbd-mirror daemons to deploy
   count: 1
diff --git a/cluster/examples/kubernetes/ceph/rgw-external.yaml b/cluster/examples/kubernetes/ceph/rgw-external.yaml
index 57b0b0de3..83a9561ea 100644
--- a/cluster/examples/kubernetes/ceph/rgw-external.yaml
+++ b/cluster/examples/kubernetes/ceph/rgw-external.yaml
@@ -2,10 +2,10 @@ apiVersion: v1
 kind: Service
 metadata:
   name: rook-ceph-rgw-my-store-external
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
   labels:
     app: rook-ceph-rgw
-    rook_cluster: rook-ceph # namespace:cluster
+    rook_cluster: rook-ceph
     rook_object_store: my-store
 spec:
   ports:
@@ -15,7 +15,7 @@ spec:
     targetPort: 8080
   selector:
     app: rook-ceph-rgw
-    rook_cluster: rook-ceph # namespace:cluster
+    rook_cluster: rook-ceph
     rook_object_store: my-store
   sessionAffinity: None
   type: NodePort
diff --git a/cluster/examples/kubernetes/ceph/scc.yaml b/cluster/examples/kubernetes/ceph/scc.yaml
index 88dc4883f..3b0c01f6a 100644
--- a/cluster/examples/kubernetes/ceph/scc.yaml
+++ b/cluster/examples/kubernetes/ceph/scc.yaml
@@ -38,10 +38,10 @@ users:
   # A user needs to be added for each rook service account.
   # This assumes running in the default sample "rook-ceph" namespace.
   # If other namespaces or service accounts are configured, they need to be updated here.
-  - system:serviceaccount:rook-ceph:rook-ceph-system # serviceaccount:namespace:operator
-  - system:serviceaccount:rook-ceph:default # serviceaccount:namespace:cluster
-  - system:serviceaccount:rook-ceph:rook-ceph-mgr # serviceaccount:namespace:cluster
-  - system:serviceaccount:rook-ceph:rook-ceph-osd # serviceaccount:namespace:cluster
+  - system:serviceaccount:rook-ceph:rook-ceph-system
+  - system:serviceaccount:rook-ceph:default
+  - system:serviceaccount:rook-ceph:rook-ceph-mgr
+  - system:serviceaccount:rook-ceph:rook-ceph-osd
 ---
 # scc for the CSI driver
 kind: SecurityContextConstraints
@@ -75,7 +75,7 @@ users:
   # A user needs to be added for each rook service account.
   # This assumes running in the default sample "rook-ceph" namespace.
   # If other namespaces or service accounts are configured, they need to be updated here.
-  - system:serviceaccount:rook-ceph:rook-csi-rbd-plugin-sa # serviceaccount:namespace:operator
-  - system:serviceaccount:rook-ceph:rook-csi-rbd-provisioner-sa # serviceaccount:namespace:operator
-  - system:serviceaccount:rook-ceph:rook-csi-cephfs-plugin-sa # serviceaccount:namespace:operator
-  - system:serviceaccount:rook-ceph:rook-csi-cephfs-provisioner-sa # serviceaccount:namespace:operator
+  - system:serviceaccount:rook-ceph:rook-csi-rbd-plugin-sa
+  - system:serviceaccount:rook-ceph:rook-csi-rbd-provisioner-sa
+  - system:serviceaccount:rook-ceph:rook-csi-cephfs-plugin-sa
+  - system:serviceaccount:rook-ceph:rook-csi-cephfs-provisioner-sa
diff --git a/cluster/examples/kubernetes/ceph/storageclass-bucket-delete.yaml b/cluster/examples/kubernetes/ceph/storageclass-bucket-delete.yaml
index 8d155635e..3ace9d5d4 100644
--- a/cluster/examples/kubernetes/ceph/storageclass-bucket-delete.yaml
+++ b/cluster/examples/kubernetes/ceph/storageclass-bucket-delete.yaml
@@ -2,13 +2,13 @@ apiVersion: storage.k8s.io/v1
 kind: StorageClass
 metadata:
    name: rook-ceph-delete-bucket
-provisioner: rook-ceph.ceph.rook.io/bucket # driver:namespace:cluster
+provisioner: rook-ceph.ceph.rook.io/bucket
 # 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
+  objectStoreNamespace: rook-ceph
   region: us-east-1
   # To accommodate brownfield cases reference the existing bucket name here instead
   # of in the ObjectBucketClaim (OBC). In this case the provisioner will grant
diff --git a/cluster/examples/kubernetes/ceph/storageclass-bucket-retain.yaml b/cluster/examples/kubernetes/ceph/storageclass-bucket-retain.yaml
index 31a606a43..1b87c1db7 100644
--- a/cluster/examples/kubernetes/ceph/storageclass-bucket-retain.yaml
+++ b/cluster/examples/kubernetes/ceph/storageclass-bucket-retain.yaml
@@ -2,12 +2,12 @@ apiVersion: storage.k8s.io/v1
 kind: StorageClass
 metadata:
    name: rook-ceph-retain-bucket
-provisioner: rook-ceph.ceph.rook.io/bucket # driver:namespace:cluster
+provisioner: rook-ceph.ceph.rook.io/bucket
 # set the reclaim policy to retain the bucket when its OBC is deleted
 reclaimPolicy: Retain
 parameters:
   objectStoreName: my-store # port 80 assumed
-  objectStoreNamespace: rook-ceph # namespace:cluster
+  objectStoreNamespace: rook-ceph
   region: us-east-1
   # To accommodate brownfield cases reference the existing bucket name here instead
   # of in the ObjectBucketClaim (OBC). In this case the provisioner will grant
diff --git a/cluster/examples/kubernetes/ceph/toolbox-job.yaml b/cluster/examples/kubernetes/ceph/toolbox-job.yaml
index c6e11d876..64a4a06f4 100644
--- a/cluster/examples/kubernetes/ceph/toolbox-job.yaml
+++ b/cluster/examples/kubernetes/ceph/toolbox-job.yaml
@@ -2,7 +2,7 @@ apiVersion: batch/v1
 kind: Job
 metadata:
   name: rook-ceph-toolbox-job
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
   labels:
     app: ceph-toolbox-job
 spec:
diff --git a/cluster/examples/kubernetes/ceph/toolbox.yaml b/cluster/examples/kubernetes/ceph/toolbox.yaml
index 9b6ca5a06..a0581d099 100644
--- a/cluster/examples/kubernetes/ceph/toolbox.yaml
+++ b/cluster/examples/kubernetes/ceph/toolbox.yaml
@@ -2,7 +2,7 @@ apiVersion: apps/v1
 kind: Deployment
 metadata:
   name: rook-ceph-tools
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
   labels:
     app: rook-ceph-tools
 spec:
diff --git a/pkg/daemon/ceph/client/mon.go b/pkg/daemon/ceph/client/mon.go
index df0c680bd..c9e4b8d3a 100644
--- a/pkg/daemon/ceph/client/mon.go
+++ b/pkg/daemon/ceph/client/mon.go
@@ -18,7 +18,6 @@ package client
 import (
 	"encoding/json"
 	"fmt"
-	"strings"
 	"syscall"
 
 	"github.com/pkg/errors"
@@ -58,21 +57,6 @@ type AddrvecEntry struct {
 	Nonce int    `json:"nonce"`
 }
 
-// MonDump represents the response from a mon dump
-type MonDump struct {
-	StretchMode      bool           `json:"stretch_mode"`
-	ElectionStrategy int            `json:"election_strategy"`
-	FSID             string         `json:"fsid"`
-	Mons             []MonDumpEntry `json:"mons"`
-	Quorum           []int          `json:"quorum"`
-}
-
-type MonDumpEntry struct {
-	Name          string `json:"name"`
-	Rank          int    `json:"rank"`
-	CrushLocation string `json:"crush_location"`
-}
-
 // GetMonQuorumStatus calls quorum_status mon_command
 func GetMonQuorumStatus(context *clusterd.Context, clusterInfo *ClusterInfo) (MonStatusResponse, error) {
 	args := []string{"quorum_status"}
@@ -91,24 +75,6 @@ func GetMonQuorumStatus(context *clusterd.Context, clusterInfo *ClusterInfo) (Mo
 	return resp, nil
 }
 
-// GetMonDump calls mon dump command
-func GetMonDump(context *clusterd.Context, clusterInfo *ClusterInfo) (MonDump, error) {
-	args := []string{"mon", "dump"}
-	cmd := NewCephCommand(context, clusterInfo, args)
-	buf, err := cmd.Run()
-	if err != nil {
-		return MonDump{}, errors.Wrap(err, "mon dump failed")
-	}
-
-	var response MonDump
-	err = json.Unmarshal(buf, &response)
-	if err != nil {
-		return MonDump{}, errors.Wrapf(err, "unmarshal failed. raw buffer response: %s", buf)
-	}
-
-	return response, nil
-}
-
 // EnableStretchElectionStrategy enables the mon connectivity algorithm for stretch clusters
 func EnableStretchElectionStrategy(context *clusterd.Context, clusterInfo *ClusterInfo) error {
 	args := []string{"mon", "set", "election_strategy", "connectivity"}
@@ -153,12 +119,8 @@ func SetMonStretchTiebreaker(context *clusterd.Context, clusterInfo *ClusterInfo
 	buf, err := NewCephCommand(context, clusterInfo, args).Run()
 	if err != nil {
 		if code, ok := exec.ExitStatus(err); ok && code == int(syscall.EINVAL) {
-			// TODO: Get a more distinctive error from ceph so we don't have to compare the error message
-			if strings.Contains(string(buf), "stretch mode is already engaged") {
-				logger.Infof("stretch mode is already enabled")
-				return nil
-			}
-			return errors.Wrapf(err, "stretch mode failed to be enabled. %s", string(buf))
+			logger.Infof("stretch mode is already enabled. %s", string(buf))
+			return nil
 		}
 		return errors.Wrap(err, "failed to set mon stretch zone")
 	}
diff --git a/pkg/operator/ceph/cluster/mon/config.go b/pkg/operator/ceph/cluster/mon/config.go
index 106c38047..5713042eb 100644
--- a/pkg/operator/ceph/cluster/mon/config.go
+++ b/pkg/operator/ceph/cluster/mon/config.go
@@ -233,9 +233,8 @@ func loadMonConfig(clientset kubernetes.Interface, namespace string) (map[string
 	}
 
 	// Parse the max monitor id
-	storedMaxMonID := -1
 	if id, ok := cm.Data[MaxMonIDKey]; ok {
-		storedMaxMonID, err = strconv.Atoi(id)
+		maxMonID, err = strconv.Atoi(id)
 		if err != nil {
 			logger.Errorf("invalid max mon id %q. %v", id, err)
 		}
@@ -248,9 +247,6 @@ func loadMonConfig(clientset kubernetes.Interface, namespace string) (map[string
 			maxMonID = id
 		}
 	}
-	if maxMonID != storedMaxMonID {
-		logger.Infof("updating obsolete maxMonID %d to actual value %d", storedMaxMonID, maxMonID)
-	}
 
 	err = json.Unmarshal([]byte(cm.Data[MappingKey]), &monMapping)
 	if err != nil {
diff --git a/pkg/operator/ceph/cluster/mon/mon.go b/pkg/operator/ceph/cluster/mon/mon.go
index 5544531ce..03c919fef 100644
--- a/pkg/operator/ceph/cluster/mon/mon.go
+++ b/pkg/operator/ceph/cluster/mon/mon.go
@@ -49,7 +49,6 @@ import (
 	kerrors "k8s.io/apimachinery/pkg/api/errors"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/labels"
-	"k8s.io/apimachinery/pkg/util/wait"
 )
 
 const (
@@ -108,22 +107,24 @@ var (
 
 // Cluster represents the Rook and environment configuration settings needed to set up Ceph mons.
 type Cluster struct {
-	ClusterInfo        *cephclient.ClusterInfo
-	context            *clusterd.Context
-	spec               cephv1.ClusterSpec
-	Namespace          string
-	Keyring            string
-	rookVersion        string
-	orchestrationMutex sync.Mutex
-	Port               int32
-	maxMonID           int
-	waitForStart       bool
-	monTimeoutList     map[string]time.Time
-	mapping            *Mapping
-	ownerRef           metav1.OwnerReference
-	csiConfigMutex     *sync.Mutex
-	isUpgrade          bool
-	arbiterMon         string
+	ClusterInfo         *cephclient.ClusterInfo
+	context             *clusterd.Context
+	spec                cephv1.ClusterSpec
+	Namespace           string
+	Keyring             string
+	rookVersion         string
+	orchestrationMutex  sync.Mutex
+	Port                int32
+	maxMonID            int
+	waitForStart        bool
+	monPodRetryInterval time.Duration
+	monPodTimeout       time.Duration
+	monTimeoutList      map[string]time.Time
+	mapping             *Mapping
+	ownerRef            metav1.OwnerReference
+	csiConfigMutex      *sync.Mutex
+	isUpgrade           bool
+	arbiterMon          string
 }
 
 // monConfig for a single monitor
@@ -167,12 +168,14 @@ type SchedulingResult struct {
 // New creates an instance of a mon cluster
 func New(context *clusterd.Context, namespace string, spec cephv1.ClusterSpec, ownerRef metav1.OwnerReference, csiConfigMutex *sync.Mutex) *Cluster {
 	return &Cluster{
-		context:        context,
-		spec:           spec,
-		Namespace:      namespace,
-		maxMonID:       -1,
-		waitForStart:   true,
-		monTimeoutList: map[string]time.Time{},
+		context:             context,
+		spec:                spec,
+		Namespace:           namespace,
+		maxMonID:            -1,
+		waitForStart:        true,
+		monPodRetryInterval: 6 * time.Second,
+		monPodTimeout:       5 * time.Minute,
+		monTimeoutList:      map[string]time.Time{},
 		mapping: &Mapping{
 			Schedule: map[string]*MonScheduleInfo{},
 		},
@@ -342,12 +345,6 @@ func (c *Cluster) isArbiterZone(zone string) bool {
 func (c *Cluster) assignStretchMonsToZones(mons []*monConfig) error {
 	arbiterZone := c.getArbiterZone()
 
-	// Get the mon dump to see if the zones are already applied to the mons
-	monDump, err := client.GetMonDump(c.context, c.ClusterInfo)
-	if err != nil {
-		return errors.Wrap(err, "failed to detect if stretch mons are already assigned to zones")
-	}
-
 	// Set the location for each mon
 	domainName := c.stretchFailureDomainName()
 	for _, mon := range mons {
@@ -355,21 +352,6 @@ func (c *Cluster) assignStretchMonsToZones(mons []*monConfig) error {
 			// remember the arbiter mon to be set later in the reconcile after the OSDs are configured
 			c.arbiterMon = mon.DaemonName
 		}
-		// Check if the zone is already set on the mon
-		alreadySet := false
-		for _, monInfo := range monDump.Mons {
-			if monInfo.Name == mon.DaemonName {
-				desiredLocation := fmt.Sprintf("{%s=%s}", domainName, mon.Zone)
-				if monInfo.CrushLocation == desiredLocation {
-					alreadySet = true
-				}
-				break
-			}
-		}
-		if alreadySet {
-			logger.Infof("mon %q stretch domain %q is already set to %q", mon.DaemonName, domainName, mon.Zone)
-			continue
-		}
 		logger.Infof("setting mon %q to stretch %s=%s", mon.DaemonName, domainName, mon.Zone)
 		if err := client.SetMonStretchZone(c.context, c.ClusterInfo, mon.DaemonName, domainName, mon.Zone); err != nil {
 			return errors.Wrapf(err, "failed to set mon %q zone", mon.DaemonName)
@@ -383,91 +365,14 @@ func (c *Cluster) ConfigureArbiter() error {
 		return errors.New("arbiter not specified for the stretch cluster")
 	}
 
-	monDump, err := client.GetMonDump(c.context, c.ClusterInfo)
-	if err != nil {
-		logger.Warningf("attempting to enable arbiter after failed to detect if already enabled. %v", err)
-	} else if monDump.StretchMode {
-		logger.Infof("stretch mode is already enabled")
-		return nil
-	}
-
-	// Wait for the CRUSH map to have at least two zones
-	// The timeout is relatively short since the operator will requeue the reconcile
-	// and try again at a higher level if not yet found
-	failureDomain := c.stretchFailureDomainName()
-	logger.Infof("enabling stretch mode... waiting for two failure domains of type %q to be found in the CRUSH map after OSD initialization", failureDomain)
-	pollInterval := 5 * time.Second
-	totalWaitTime := 2 * time.Minute
-	err = wait.Poll(pollInterval, totalWaitTime, func() (bool, error) {
-		return c.readyToConfigureArbiter(true)
-	})
-	if err != nil {
-		return errors.Wrapf(err, "failed to find two failure domains %q in the CRUSH map", failureDomain)
-	}
-
 	// Set the mon tiebreaker
-	if err := client.SetMonStretchTiebreaker(c.context, c.ClusterInfo, c.arbiterMon, failureDomain); err != nil {
+	if err := client.SetMonStretchTiebreaker(c.context, c.ClusterInfo, c.arbiterMon, c.stretchFailureDomainName()); err != nil {
 		return errors.Wrap(err, "failed to set mon tiebreaker")
 	}
 
 	return nil
 }
 
-func (c *Cluster) readyToConfigureArbiter(checkOSDPods bool) (bool, error) {
-	failureDomain := c.stretchFailureDomainName()
-
-	if checkOSDPods {
-		// Wait for the OSD pods to be running
-		// can't use osd.AppName due to a circular dependency
-		allRunning, err := k8sutil.PodsWithLabelAreAllRunning(c.context.Clientset, c.Namespace, fmt.Sprintf("%s=rook-ceph-osd", k8sutil.AppAttr))
-		if err != nil {
-			return false, errors.Wrap(err, "failed to check whether all osds are running before enabling the arbiter")
-		}
-		if !allRunning {
-			logger.Infof("waiting for all OSD pods to be in running state")
-			return false, nil
-		}
-	}
-
-	crushMap, err := client.GetCrushMap(c.context, c.ClusterInfo)
-	if err != nil {
-		return false, errors.Wrap(err, "failed to get crush map")
-	}
-
-	// Check if the crush rule already exists
-	zoneCount := 0
-	zoneWeight := -1
-	for _, bucket := range crushMap.Buckets {
-		if bucket.TypeName == failureDomain {
-			// skip zones specific to device classes
-			if strings.Index(bucket.Name, "~") > 0 {
-				logger.Debugf("skipping device class bucket %q", bucket.Name)
-				continue
-			}
-			logger.Infof("found %s %q in CRUSH map with weight %d", failureDomain, bucket.Name, bucket.Weight)
-			zoneCount++
-
-			// check that the weights of the failure domains are all the same
-			if zoneWeight == -1 {
-				// found the first matching bucket
-				zoneWeight = bucket.Weight
-			} else if zoneWeight != bucket.Weight {
-				logger.Infof("found failure domains that have different weights")
-				return false, nil
-			}
-		}
-	}
-	if zoneCount < 2 {
-		// keep waiting to see if more zones will be created
-		return false, nil
-	}
-	if zoneCount > 2 {
-		return false, fmt.Errorf("cannot configure stretch cluster with more than 2 failure domains, and found %d of type %q", zoneCount, failureDomain)
-	}
-	logger.Infof("found two expected failure domains %q for the stretch cluster", failureDomain)
-	return true, nil
-}
-
 // ensureMonsRunning is called in two scenarios:
 // 1. To create a new mon and wait for it to join quorum (requireAllInQuorum = true). This method will be called multiple times
 //    to add a mon until we have reached the desired number of mons.
@@ -1234,7 +1139,7 @@ func (c *Cluster) startMon(m *monConfig, schedule *MonScheduleInfo) error {
 		}
 	}
 
-	if schedule == nil || schedule.Zone != "" {
+	if schedule == nil {
 		k8sutil.SetNodeAntiAffinityForPod(&d.Spec.Template.Spec, p, requiredDuringScheduling(&c.spec),
 			map[string]string{k8sutil.AppAttr: AppName}, nil)
 	} else {
diff --git a/pkg/operator/ceph/cluster/osd/spec.go b/pkg/operator/ceph/cluster/osd/spec.go
index ee380cfa3..fa495c41c 100644
--- a/pkg/operator/ceph/cluster/osd/spec.go
+++ b/pkg/operator/ceph/cluster/osd/spec.go
@@ -238,10 +238,11 @@ func (c *Cluster) makeDeployment(osdProps osdProperties, osd OSDInfo, provisionC
 	volumeMounts := controller.CephVolumeMounts(provisionConfig.DataPathMap, false)
 	configVolumeMounts := controller.RookVolumeMounts(provisionConfig.DataPathMap, false)
 	// When running on PVC, the OSDs don't need a bindmount on dataDirHostPath, only the monitors do
+	dataDirHostPath := c.spec.DataDirHostPath
 	if osdProps.onPVC() {
-		c.spec.DataDirHostPath = ""
+		dataDirHostPath = ""
 	}
-	volumes := controller.PodVolumes(provisionConfig.DataPathMap, c.spec.DataDirHostPath, false)
+	volumes := controller.PodVolumes(provisionConfig.DataPathMap, dataDirHostPath, false)
 	failureDomainValue := osdProps.crushHostname
 	doConfigInit := true       // initialize ceph.conf in init container?
 	doBinaryCopyInit := true   // copy tini and rook binaries in an init container?
diff --git a/pkg/operator/ceph/csi/csi.go b/pkg/operator/ceph/csi/csi.go
index 4745fc4bc..6005dffe8 100644
--- a/pkg/operator/ceph/csi/csi.go
+++ b/pkg/operator/ceph/csi/csi.go
@@ -29,10 +29,8 @@ import (
 )
 
 func ValidateAndConfigureDrivers(context *clusterd.Context, namespace, rookImage, securityAccount string, serverVersion *version.Info, ownerRef *metav1.OwnerReference) {
-	var v *CephCSIVersion
-	var err error
 	if !AllowUnsupported {
-		if v, err = validateCSIVersion(context.Clientset, namespace, rookImage, securityAccount, ownerRef); err != nil {
+		if err := validateCSIVersion(context.Clientset, namespace, rookImage, securityAccount, ownerRef); err != nil {
 			logger.Errorf("invalid csi version. %+v", err)
 			return
 		}
@@ -40,7 +38,7 @@ func ValidateAndConfigureDrivers(context *clusterd.Context, namespace, rookImage
 		logger.Info("Skipping csi version check, since unsupported versions are allowed")
 	}
 
-	if err := startDrivers(context.Clientset, context.RookClientset, namespace, serverVersion, ownerRef, v); err != nil {
+	if err := startDrivers(context.Clientset, context.RookClientset, namespace, serverVersion, ownerRef); err != nil {
 		logger.Errorf("failed to start Ceph csi drivers. %v", err)
 		return
 	}
diff --git a/pkg/operator/ceph/csi/spec.go b/pkg/operator/ceph/csi/spec.go
index 01ea8a74e..385c93c0f 100644
--- a/pkg/operator/ceph/csi/spec.go
+++ b/pkg/operator/ceph/csi/spec.go
@@ -53,7 +53,6 @@ type Param struct {
 	RBDPluginUpdateStrategy      string
 	PluginPriorityClassName      string
 	ProvisionerPriorityClassName string
-	EnableOMAPGenerator          bool
 	LogLevel                     uint8
 	CephFSGRPCMetricsPort        uint16
 	CephFSLivenessMetricsPort    uint16
@@ -102,7 +101,7 @@ var (
 // manually challenging.
 var (
 	// image names
-	DefaultCSIPluginImage   = "quay.io/cephcsi/cephcsi:v3.2.0"
+	DefaultCSIPluginImage   = "quay.io/cephcsi/cephcsi:v3.1.2"
 	DefaultRegistrarImage   = "k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.0.1"
 	DefaultProvisionerImage = "k8s.gcr.io/sig-storage/csi-provisioner:v2.0.0"
 	DefaultAttacherImage    = "k8s.gcr.io/sig-storage/csi-attacher:v3.0.0"
@@ -203,7 +202,7 @@ func ValidateCSIParam() error {
 	return nil
 }
 
-func startDrivers(clientset kubernetes.Interface, rookclientset rookclient.Interface, namespace string, ver *version.Info, ownerRef *metav1.OwnerReference, v *CephCSIVersion) error {
+func startDrivers(clientset kubernetes.Interface, rookclientset rookclient.Interface, namespace string, ver *version.Info, ownerRef *metav1.OwnerReference) error {
 	ctx := context.TODO()
 	var (
 		err                                                   error
@@ -269,21 +268,6 @@ func startDrivers(clientset kubernetes.Interface, rookclientset rookclient.Inter
 		return errors.Wrap(err, "failed to load CSI_PROVISIONER_PRIORITY_CLASSNAME setting")
 	}
 
-	// OMAP generator will be enabled by default
-	// If AllowUnsupported is set to false and if CSI version is less than
-	// <3.2.0 disable OMAP generator sidecar
-	if !v.SupportsOMAPController() {
-		tp.EnableOMAPGenerator = false
-	}
-
-	enableOMAPGenerator, err := k8sutil.GetOperatorSetting(clientset, controllerutil.OperatorSettingConfigMapName, "CSI_ENABLE_OMAP_GENERATOR", "false")
-	if err != nil {
-		return errors.Wrap(err, "failed to load CSI_ENABLE_OMAP_GENERATOR setting")
-	}
-	if strings.EqualFold(enableOMAPGenerator, "true") {
-		tp.EnableOMAPGenerator = true
-	}
-
 	updateStrategy, err := k8sutil.GetOperatorSetting(clientset, controllerutil.OperatorSettingConfigMapName, "CSI_CEPHFS_PLUGIN_UPDATE_STRATEGY", rollingUpdate)
 	if err != nil {
 		return errors.Wrap(err, "failed to load CSI_CEPHFS_PLUGIN_UPDATE_STRATEGY setting")
@@ -622,7 +606,7 @@ func deleteCSIDriverInfo(ctx context.Context, clientset kubernetes.Interface, na
 }
 
 // ValidateCSIVersion checks if the configured ceph-csi image is supported
-func validateCSIVersion(clientset kubernetes.Interface, namespace, rookImage, serviceAccountName string, ownerRef *metav1.OwnerReference) (*CephCSIVersion, error) {
+func validateCSIVersion(clientset kubernetes.Interface, namespace, rookImage, serviceAccountName string, ownerRef *metav1.OwnerReference) error {
 	timeout := 15 * time.Minute
 
 	logger.Infof("detecting the ceph csi image version for image %q", CSIParam.CSIPluginImage)
@@ -635,7 +619,7 @@ func validateCSIVersion(clientset kubernetes.Interface, namespace, rookImage, se
 		rookImage, CSIParam.CSIPluginImage)
 
 	if err != nil {
-		return nil, errors.Wrap(err, "failed to set up ceph CSI version job")
+		return errors.Wrap(err, "failed to set up ceph CSI version job")
 	}
 
 	job := versionReporter.Job()
@@ -645,21 +629,21 @@ func validateCSIVersion(clientset kubernetes.Interface, namespace, rookImage, se
 	job.Spec.Template.Spec.Tolerations = getToleration(clientset, true)
 	stdout, _, retcode, err := versionReporter.Run(timeout)
 	if err != nil {
-		return nil, errors.Wrap(err, "failed to complete ceph CSI version job")
+		return errors.Wrap(err, "failed to complete ceph CSI version job")
 	}
 
 	if retcode != 0 {
-		return nil, errors.Errorf("ceph CSI version job returned %d", retcode)
+		return errors.Errorf("ceph CSI version job returned %d", retcode)
 	}
 
 	version, err := extractCephCSIVersion(stdout)
 	if err != nil {
-		return nil, errors.Wrap(err, "failed to extract ceph CSI version")
+		return errors.Wrap(err, "failed to extract ceph CSI version")
 	}
 	logger.Infof("Detected ceph CSI image version: %q", version)
 
 	if !version.Supported() {
-		return nil, errors.Errorf("ceph CSI image needs to be at least version %q", minimum.String())
+		return errors.Errorf("ceph CSI image needs to be at least version %q", minimum.String())
 	}
-	return version, nil
+	return nil
 }
diff --git a/pkg/operator/ceph/csi/version.go b/pkg/operator/ceph/csi/version.go
index 8cb82e404..655a27647 100644
--- a/pkg/operator/ceph/csi/version.go
+++ b/pkg/operator/ceph/csi/version.go
@@ -31,10 +31,8 @@ var (
 	releaseV210          = CephCSIVersion{2, 1, 0}
 	releasev300          = CephCSIVersion{3, 0, 0}
 	releasev310          = CephCSIVersion{3, 1, 0}
-	releasev320          = CephCSIVersion{3, 2, 0}
-	supportedCSIVersions = []CephCSIVersion{minimum, releaseV210, releasev300, releasev310, releasev320}
-	// omap generator is supported in v3.2.0+
-	omapSupportedVersions = releasev320
+	supportedCSIVersions = []CephCSIVersion{minimum, releaseV210, releasev300, releasev310}
+
 	// for parsing the output of `cephcsi`
 	versionCSIPattern = regexp.MustCompile(`v(\d+)\.(\d+)\.(\d+)`)
 )
@@ -51,33 +49,6 @@ func (v *CephCSIVersion) String() string {
 		v.Major, v.Minor, v.Bugfix)
 }
 
-// SupportsOMAPController checks if the detected version supports OMAP generator
-func (v *CephCSIVersion) SupportsOMAPController() bool {
-
-	// if AllowUnsupported is set also a csi-image greater than the supported ones are allowed
-	if AllowUnsupported {
-		return true
-	}
-
-	if !v.isAtLeast(&minimum) {
-		return false
-	}
-
-	if v.Major > omapSupportedVersions.Major {
-		return true
-	}
-	if v.Major == omapSupportedVersions.Major {
-		if v.Minor > omapSupportedVersions.Minor {
-			return true
-		}
-		if v.Minor == omapSupportedVersions.Minor {
-			return v.Bugfix >= omapSupportedVersions.Bugfix
-		}
-	}
-
-	return false
-}
-
 // Supported checks if the detected version is part of the known supported CSI versions
 func (v *CephCSIVersion) Supported() bool {
 	if !v.isAtLeast(&minimum) {
diff --git a/pkg/operator/k8sutil/pod.go b/pkg/operator/k8sutil/pod.go
index cca3f1259..58a4eac39 100644
--- a/pkg/operator/k8sutil/pod.go
+++ b/pkg/operator/k8sutil/pod.go
@@ -214,37 +214,19 @@ func MakeRookImage(version string) string {
 
 // PodsRunningWithLabel returns the number of running pods with the given label
 func PodsRunningWithLabel(clientset kubernetes.Interface, namespace, label string) (int, error) {
-	running, _, err := podStatusWithLabel(clientset, namespace, label)
-	return running, err
-}
-
-// PodsWithLabelAreAllRunning returns whether all pods with the label are in running state
-func PodsWithLabelAreAllRunning(clientset kubernetes.Interface, namespace, label string) (bool, error) {
-	running, notRunning, err := podStatusWithLabel(clientset, namespace, label)
-	if err != nil {
-		return false, err
-	}
-	// At least one pod must be running and none should be in another state
-	return running > 0 && notRunning == 0, err
-}
-
-func podStatusWithLabel(clientset kubernetes.Interface, namespace, label string) (int, int, error) {
 	ctx := context.TODO()
 	pods, err := clientset.CoreV1().Pods(namespace).List(ctx, metav1.ListOptions{LabelSelector: label})
 	if err != nil {
-		return 0, 0, err
+		return 0, err
 	}
 
 	running := 0
-	notRunning := 0
 	for _, pod := range pods.Items {
 		if pod.Status.Phase == v1.PodRunning {
 			running++
-		} else {
-			notRunning++
 		}
 	}
-	return running, notRunning, nil
+	return running, nil
 }
 
 // GetPodPhaseMap takes a list of pods and returns a map of pod phases to the names of pods that are in that phase


Test patch:
diff --git a/.github/workflows/canary-integration-test.yml b/.github/workflows/canary-integration-test.yml
index 17f5a4256..6e4c1e6c0 100644
--- a/.github/workflows/canary-integration-test.yml
+++ b/.github/workflows/canary-integration-test.yml
@@ -8,7 +8,6 @@ on:
     - 'build/**'
     - 'tests/**'
     - 'images/**'
-    - '.github/workflows/**'
 
 jobs:
   canary:
@@ -49,16 +48,10 @@ jobs:
         docker images
         docker tag $(docker images|awk '/build-/ {print $1}') rook/ceph:master
 
-    
-    - name: validate-yaml
-      run: |
-        cd cluster/examples/kubernetes/ceph/
-        kubectl create -f crds.yaml -f common.yaml 
-        # skipping folders and some yamls that are only for openshift.
-        kubectl create  $(ls -I scc.yaml -I operator-openshift.yaml -I "*.sh" -I "*.py" -p | grep -v / | awk ' { print " -f " $1 } ') --dry-run
-
     - name: deploy rook
       run: |
+        kubectl create -f cluster/examples/kubernetes/ceph/crds.yaml
+        kubectl create -f cluster/examples/kubernetes/ceph/common.yaml
         kubectl create -f cluster/examples/kubernetes/ceph/operator.yaml
         sed -i "s|#deviceFilter:|deviceFilter: $(lsblk|awk '/14G/ {print $1}'| head -1)|g" cluster/examples/kubernetes/ceph/cluster-test.yaml
         kubectl create -f cluster/examples/kubernetes/ceph/cluster-test.yaml
@@ -627,4 +620,4 @@ jobs:
     - name: validate vault
       run: |
         tests/scripts/deploy-validate-vault.sh validate
-        sudo lsblk
\ No newline at end of file
+        sudo lsblk
diff --git a/cluster/examples/kubernetes/ceph/cluster-test.yaml b/cluster/examples/kubernetes/ceph/cluster-test.yaml
index 3cef25ee4..601c292c1 100644
--- a/cluster/examples/kubernetes/ceph/cluster-test.yaml
+++ b/cluster/examples/kubernetes/ceph/cluster-test.yaml
@@ -11,7 +11,7 @@ kind: ConfigMap
 apiVersion: v1
 metadata:
   name: rook-config-override
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 data:
   config: |
     [global]
@@ -22,7 +22,7 @@ apiVersion: ceph.rook.io/v1
 kind: CephCluster
 metadata:
   name: my-cluster
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 spec:
   dataDirHostPath: /var/lib/rook
   cephVersion:
diff --git a/cluster/examples/kubernetes/ceph/csi/rbd/storageclass-test.yaml b/cluster/examples/kubernetes/ceph/csi/rbd/storageclass-test.yaml
index 764af76b2..3ce2550f8 100644
--- a/cluster/examples/kubernetes/ceph/csi/rbd/storageclass-test.yaml
+++ b/cluster/examples/kubernetes/ceph/csi/rbd/storageclass-test.yaml
@@ -2,7 +2,7 @@ apiVersion: ceph.rook.io/v1
 kind: CephBlockPool
 metadata:
   name: replicapool
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 spec:
   failureDomain: host
   replicated:
@@ -19,11 +19,11 @@ kind: StorageClass
 metadata:
    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
+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
-    clusterID: rook-ceph # namespace:cluster
+    clusterID: rook-ceph
 
     # If you want to use erasure coded pool with RBD, you need to create
     # two pools. one erasure coded and one replicated.
@@ -42,11 +42,11 @@ parameters:
     # The secrets contain Ceph admin credentials. These are generated automatically by the operator
     # in the same namespace as the cluster.
     csi.storage.k8s.io/provisioner-secret-name: rook-csi-rbd-provisioner
-    csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph # namespace:cluster
+    csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph
     csi.storage.k8s.io/controller-expand-secret-name: rook-csi-rbd-provisioner
-    csi.storage.k8s.io/controller-expand-secret-namespace: rook-ceph # namespace:cluster
+    csi.storage.k8s.io/controller-expand-secret-namespace: rook-ceph
     csi.storage.k8s.io/node-stage-secret-name: rook-csi-rbd-node
-    csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph # namespace:cluster
+    csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph
     # Specify the filesystem type of the volume. If not specified, csi-provisioner
     # will set default as `ext4`.
     csi.storage.k8s.io/fstype: ext4
diff --git a/cluster/examples/kubernetes/ceph/filesystem-test.yaml b/cluster/examples/kubernetes/ceph/filesystem-test.yaml
index c001f7531..c7eb9772c 100644
--- a/cluster/examples/kubernetes/ceph/filesystem-test.yaml
+++ b/cluster/examples/kubernetes/ceph/filesystem-test.yaml
@@ -7,7 +7,7 @@ apiVersion: ceph.rook.io/v1
 kind: CephFilesystem
 metadata:
   name: myfs
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 spec:
   metadataPool:
     replicated:
diff --git a/cluster/examples/kubernetes/ceph/nfs-test.yaml b/cluster/examples/kubernetes/ceph/nfs-test.yaml
index 46770bdb6..aaec96a3e 100644
--- a/cluster/examples/kubernetes/ceph/nfs-test.yaml
+++ b/cluster/examples/kubernetes/ceph/nfs-test.yaml
@@ -2,7 +2,7 @@ apiVersion: ceph.rook.io/v1
 kind: CephNFS
 metadata:
   name: my-nfs
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 spec:
   rados:
     # RADOS pool where NFS client recovery data is stored.
diff --git a/cluster/examples/kubernetes/ceph/object-test.yaml b/cluster/examples/kubernetes/ceph/object-test.yaml
index bdb182752..526379c21 100644
--- a/cluster/examples/kubernetes/ceph/object-test.yaml
+++ b/cluster/examples/kubernetes/ceph/object-test.yaml
@@ -7,7 +7,7 @@ apiVersion: ceph.rook.io/v1
 kind: CephObjectStore
 metadata:
   name: my-store
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 spec:
   metadataPool:
     replicated:
diff --git a/cluster/examples/kubernetes/ceph/pool-test.yaml b/cluster/examples/kubernetes/ceph/pool-test.yaml
index 6a5be41d3..a005a7024 100644
--- a/cluster/examples/kubernetes/ceph/pool-test.yaml
+++ b/cluster/examples/kubernetes/ceph/pool-test.yaml
@@ -7,7 +7,7 @@ apiVersion: ceph.rook.io/v1
 kind: CephBlockPool
 metadata:
   name: replicapool
-  namespace: rook-ceph # namespace:cluster
+  namespace: rook-ceph
 spec:
   replicated:
     size: 1
diff --git a/pkg/daemon/ceph/client/mon_test.go b/pkg/daemon/ceph/client/mon_test.go
index 414cdc6d0..c472d4fb5 100644
--- a/pkg/daemon/ceph/client/mon_test.go
+++ b/pkg/daemon/ceph/client/mon_test.go
@@ -125,34 +125,3 @@ func TestStretchClusterMonTiebreaker(t *testing.T) {
 	err := SetMonStretchTiebreaker(context, clusterInfo, monName, failureDomain)
 	assert.NoError(t, err)
 }
-
-func TestMonDump(t *testing.T) {
-	executor := &exectest.MockExecutor{}
-	executor.MockExecuteCommandWithOutputFile = func(command, outputFile string, args ...string) (string, error) {
-		logger.Infof("Command: %s %v", command, args)
-		switch {
-		case args[0] == "mon" && args[1] == "dump":
-			return `{"epoch":3,"fsid":"6a31a264-9090-4048-8d95-4b8c3cde909d","modified":"2020-12-09T18:13:36.346150Z","created":"2020-12-09T18:13:13.014270Z","min_mon_release":15,"min_mon_release_name":"octopus",
-		"features":{"persistent":["kraken","luminous","mimic","osdmap-prune","nautilus","octopus"],"optional":[]},
-		"election_strategy":1,"mons":[
-		{"rank":0,"name":"a","crush_location":"{zone=a}","public_addrs":{"addrvec":[{"type":"v2","addr":"10.109.80.104:3300","nonce":0},{"type":"v1","addr":"10.109.80.104:6789","nonce":0}]},"addr":"10.109.80.104:6789/0","public_addr":"10.109.80.104:6789/0","priority":0,"weight":0},
-		{"rank":1,"name":"b","crush_location":"{zone=b}","public_addrs":{"addrvec":[{"type":"v2","addr":"10.107.12.199:3300","nonce":0},{"type":"v1","addr":"10.107.12.199:6789","nonce":0}]},"addr":"10.107.12.199:6789/0","public_addr":"10.107.12.199:6789/0","priority":0,"weight":0},
-		{"rank":2,"name":"c","crush_location":"{zone=c}","public_addrs":{"addrvec":[{"type":"v2","addr":"10.107.5.207:3300","nonce":0},{"type":"v1","addr":"10.107.5.207:6789","nonce":0}]},"addr":"10.107.5.207:6789/0","public_addr":"10.107.5.207:6789/0","priority":0,"weight":0}],
-		"quorum":[0,1,2]}`, nil
-		}
-		return "", errors.Errorf("unexpected ceph command %q", args)
-	}
-	context := &clusterd.Context{Executor: executor}
-	clusterInfo := AdminClusterInfo("mycluster")
-
-	dump, err := GetMonDump(context, clusterInfo)
-	assert.NoError(t, err)
-	assert.Equal(t, 1, dump.ElectionStrategy)
-	assert.Equal(t, "{zone=a}", dump.Mons[0].CrushLocation)
-	assert.Equal(t, "a", dump.Mons[0].Name)
-	assert.Equal(t, 0, dump.Mons[0].Rank)
-	assert.Equal(t, "b", dump.Mons[1].Name)
-	assert.Equal(t, 1, dump.Mons[1].Rank)
-	assert.Equal(t, 3, len(dump.Mons))
-	assert.Equal(t, 3, len(dump.Quorum))
-}
diff --git a/pkg/operator/ceph/cluster/mon/mon_test.go b/pkg/operator/ceph/cluster/mon/mon_test.go
index 75a2aa5ec..016322ce0 100644
--- a/pkg/operator/ceph/cluster/mon/mon_test.go
+++ b/pkg/operator/ceph/cluster/mon/mon_test.go
@@ -118,9 +118,11 @@ func newCluster(context *clusterd.Context, namespace string, allowMultiplePerNod
 			},
 			Resources: map[string]v1.ResourceRequirements{"mon": resources},
 		},
-		maxMonID:       -1,
-		waitForStart:   false,
-		monTimeoutList: map[string]time.Time{},
+		maxMonID:            -1,
+		waitForStart:        false,
+		monPodRetryInterval: 10 * time.Millisecond,
+		monPodTimeout:       1 * time.Second,
+		monTimeoutList:      map[string]time.Time{},
 		mapping: &Mapping{
 			Schedule: map[string]*MonScheduleInfo{},
 		},
@@ -517,82 +519,3 @@ func TestArbiterPlacement(t *testing.T) {
 	result = c.getMonPlacement("c")
 	assert.Equal(t, placement, result)
 }
-
-func TestCheckIfArbiterReady(t *testing.T) {
-
-	c := &Cluster{
-		Namespace: "ns",
-		spec: cephv1.ClusterSpec{
-			Mon: cephv1.MonSpec{
-				StretchCluster: &cephv1.StretchClusterSpec{
-					Zones: []cephv1.StretchClusterZoneSpec{
-						{Name: "a", Arbiter: true},
-						{Name: "b"},
-						{Name: "c"},
-					},
-				},
-			},
-		}}
-	crushZoneCount := 0
-	balanced := true
-	executor := &exectest.MockExecutor{
-		MockExecuteCommandWithOutput: func(command string, args ...string) (string, error) {
-			return "", fmt.Errorf("unrecognized output command: %s %v", command, args)
-		},
-		MockExecuteCommandWithOutputFile: func(command string, outFileArg string, args ...string) (string, error) {
-			switch {
-			case args[0] == "osd" && args[1] == "crush" && args[2] == "dump":
-				crushBuckets := `
-					{"id": -1,"name": "default","type_id": 10,"type_name": "root","weight": 1028},
-					{"id": -2,"name": "default~hdd","type_id": 10,"type_name": "root","weight": 1028},
-					{"id": -3,"name": "mynode","type_id": 1,"type_name": "host","weight": 1028},
-					{"id": -4,"name": "mynode~hdd","type_id": 1,"type_name": "host","weight": 1028}`
-				for i := 0; i < crushZoneCount; i++ {
-					weight := 2056
-					if !balanced && i%2 == 1 {
-						// simulate unbalanced with every other zone having half the weight
-						weight = 1028
-					}
-					crushBuckets = crushBuckets +
-						fmt.Sprintf(`,{"id": -%d,"name": "zone%d","type_id": 1,"type_name": "zone","weight": %d}
-						 ,{"id": -%d,"name": "zone%d~ssd","type_id": 1,"type_name": "zone","weight": 2056}`, i+5, i, weight, i+6, i)
-				}
-				return fmt.Sprintf(`{"buckets": [%s]}`, crushBuckets), nil
-
-			}
-			return "", fmt.Errorf("unrecognized output file command: %s %v", command, args)
-		},
-	}
-	c.context = &clusterd.Context{Clientset: test.New(t, 5), Executor: executor}
-	c.ClusterInfo = clienttest.CreateTestClusterInfo(5)
-
-	// Not ready if no pods running
-	ready, err := c.readyToConfigureArbiter(true)
-	assert.False(t, ready)
-	assert.NoError(t, err)
-
-	// For the remainder of tests, skip checking OSD pods
-	// Now there are not enough zones
-	ready, err = c.readyToConfigureArbiter(false)
-	assert.False(t, ready)
-	assert.NoError(t, err)
-
-	// Valid
-	crushZoneCount = 2
-	ready, err = c.readyToConfigureArbiter(false)
-	assert.True(t, ready)
-	assert.NoError(t, err)
-
-	// Valid, except the CRUSH map is not balanced
-	balanced = false
-	ready, err = c.readyToConfigureArbiter(false)
-	assert.False(t, ready)
-	assert.NoError(t, err)
-
-	// Too many zones in the CRUSH map
-	crushZoneCount = 3
-	balanced = true
-	ready, err = c.readyToConfigureArbiter(false)
-	assert.False(t, ready)
-	assert.Error(t, err)
-}
diff --git a/pkg/operator/ceph/csi/spec_test.go b/pkg/operator/ceph/csi/spec_test.go
index 272fcd417..08037514d 100644
--- a/pkg/operator/ceph/csi/spec_test.go
+++ b/pkg/operator/ceph/csi/spec_test.go
@@ -48,7 +48,6 @@ func TestStartCSI(t *testing.T) {
 	if err != nil {
 		assert.Nil(t, err)
 	}
-	AllowUnsupported = true
-	err = startDrivers(context.Clientset, context.RookClientset, "ns", serverVersion, nil, nil)
+	err = startDrivers(context.Clientset, context.RookClientset, "ns", serverVersion, nil)
 	assert.Nil(t, err)
 }
diff --git a/pkg/operator/ceph/csi/version_test.go b/pkg/operator/ceph/csi/version_test.go
index b298fa34f..ace6b077c 100644
--- a/pkg/operator/ceph/csi/version_test.go
+++ b/pkg/operator/ceph/csi/version_test.go
@@ -26,9 +26,6 @@ var (
 	testMinVersion         = CephCSIVersion{2, 0, 0}
 	testReleaseV210        = CephCSIVersion{2, 1, 0}
 	testReleaseV300        = CephCSIVersion{3, 0, 0}
-	testReleaseV320        = CephCSIVersion{3, 2, 0}
-	testReleaseV321        = CephCSIVersion{3, 2, 1}
-	testReleaseV330        = CephCSIVersion{3, 3, 0}
 	testVersionUnsupported = CephCSIVersion{4, 0, 0}
 )
 
@@ -89,7 +86,6 @@ func TestIsAtLeast(t *testing.T) {
 }
 
 func TestSupported(t *testing.T) {
-	AllowUnsupported = false
 	ret := testMinVersion.Supported()
 	assert.Equal(t, true, ret)
 
@@ -100,27 +96,6 @@ func TestSupported(t *testing.T) {
 	assert.Equal(t, false, ret)
 }
 
-func TestSupportOMAPController(t *testing.T) {
-	AllowUnsupported = true
-	ret := testMinVersion.SupportsOMAPController()
-	assert.True(t, ret)
-
-	AllowUnsupported = false
-	ret = testMinVersion.SupportsOMAPController()
-	assert.False(t, ret)
-
-	ret = testReleaseV300.SupportsOMAPController()
-	assert.False(t, ret)
-
-	ret = testReleaseV320.SupportsOMAPController()
-	assert.True(t, ret)
-
-	ret = testReleaseV321.SupportsOMAPController()
-	assert.True(t, ret)
-
-	ret = testReleaseV330.SupportsOMAPController()
-	assert.True(t, ret)
-}
 func Test_extractCephCSIVersion(t *testing.T) {
 	expectedVersion := CephCSIVersion{3, 0, 0}
 	csiString := []byte(`Cephcsi Version: v3.0.0
diff --git a/tests/framework/installer/ceph_manifests.go b/tests/framework/installer/ceph_manifests.go
index 26267699a..f67c96762 100644
--- a/tests/framework/installer/ceph_manifests.go
+++ b/tests/framework/installer/ceph_manifests.go
@@ -33,17 +33,17 @@ const (
 type CephManifests interface {
 	GetRookCRDs(v1ExtensionsSupported bool) string
 	GetRookOperator(namespace string) string
-	GetClusterRoles(namespace, operatorNamespace string) string
-	GetClusterExternalRoles(namespace, operatorNamespace string) string
+	GetClusterRoles(namespace, systemNamespace string) string
+	GetClusterExternalRoles(namespace, systemNamespace string) string
 	GetRookCluster(settings *clusterSettings) string
 	GetRookExternalCluster(settings *clusterExternalSettings) string
 	GetRookToolBox(namespace string) string
 	GetBlockPoolDef(poolName, namespace, replicaSize string) string
-	GetBlockStorageClassDef(csi bool, poolName, storageClassName, reclaimPolicy, namespace, operatorNamespace string) string
-	GetFileStorageClassDef(fsName, storageClassName, operatorNamespace, namespace string) string
+	GetBlockStorageClassDef(csi bool, poolName, storageClassName, reclaimPolicy, namespace, systemNamespace string) string
+	GetFileStorageClassDef(fsName, storageClassName, systemNamespace, namespace string) string
 	GetPVC(claimName, namespace, storageClassName, accessModes, size string) string
-	GetBlockSnapshotClass(snapshotClassName, namespace, operatorNamespace, reclaimPolicy string) string
-	GetFileStorageSnapshotClass(snapshotClassName, namespace, operatorNamespace, reclaimPolicy string) string
+	GetBlockSnapshotClass(snapshotClassName, namespace, systemNamespace, reclaimPolicy string) string
+	GetFileStorageSnapshotClass(snapshotClassName, namespace, systemNamespace, reclaimPolicy string) string
 	GetPVCRestore(claimName, snapshotName, namespace, storageClassName, accessModes, size string) string
 	GetPVCClone(cloneClaimName, parentClaimName, namespace, storageClassName, accessModes, size string) string
 	GetSnapshot(snapshotName, claimName, snapshotClassName, namespace string) string
@@ -2256,7 +2256,7 @@ users:
 }
 
 // GetRookOperator returns rook Operator manifest
-func (m *CephManifestsMaster) GetRookOperator(operatorNamespace string) string {
+func (m *CephManifestsMaster) GetRookOperator(namespace string) string {
 	var operatorManifest string
 	openshiftEnv := ""
 
@@ -2266,7 +2266,7 @@ func (m *CephManifestsMaster) GetRookOperator(operatorNamespace string) string {
           value: "true"
         - name: FLEXVOLUME_DIR_PATH
           value: "/etc/kubernetes/kubelet-plugins/volume/exec"`
-		operatorManifest = getOpenshiftSCC(operatorNamespace)
+		operatorManifest = getOpenshiftSCC(namespace)
 	}
 
 	operatorManifest = operatorManifest + `---
@@ -2274,7 +2274,7 @@ apiVersion: rbac.authorization.k8s.io/v1beta1
 kind: Role
 metadata:
   name: rook-ceph-system
-  namespace: ` + operatorNamespace + `
+  namespace: ` + namespace + `
   labels:
     operator: rook
     storage-backend: ceph
@@ -2573,13 +2573,13 @@ roleRef:
 subjects:
   - kind: ServiceAccount
     name: rook-ceph-system
-    namespace: ` + operatorNamespace + `
+    namespace: ` + namespace + `
 ---
 apiVersion: v1
 kind: ServiceAccount
 metadata:
   name: rook-ceph-system
-  namespace: ` + operatorNamespace + `
+  namespace: ` + namespace + `
   labels:
     operator: rook
     storage-backend: ceph
@@ -2588,7 +2588,7 @@ kind: RoleBinding
 apiVersion: rbac.authorization.k8s.io/v1
 metadata:
   name: rook-ceph-system
-  namespace: ` + operatorNamespace + `
+  namespace: ` + namespace + `
   labels:
     operator: rook
     storage-backend: ceph
@@ -2599,7 +2599,7 @@ roleRef:
 subjects:
 - kind: ServiceAccount
   name: rook-ceph-system
-  namespace: ` + operatorNamespace + `
+  namespace: ` + namespace + `
 ---
 kind: ClusterRoleBinding
 apiVersion: rbac.authorization.k8s.io/v1
@@ -2615,13 +2615,13 @@ roleRef:
 subjects:
 - kind: ServiceAccount
   name: rook-ceph-system
-  namespace: ` + operatorNamespace + `
+  namespace: ` + namespace + `
 ---
 apiVersion: v1
 kind: ServiceAccount
 metadata:
   name: rook-csi-rbd-plugin-sa
-  namespace: ` + operatorNamespace + `
+  namespace: ` + namespace + `
 ---
 kind: ClusterRole
 apiVersion: rbac.authorization.k8s.io/v1
@@ -2654,7 +2654,7 @@ metadata:
 subjects:
   - kind: ServiceAccount
     name: rook-csi-rbd-plugin-sa
-    namespace: ` + operatorNamespace + `
+    namespace: ` + namespace + `
 roleRef:
   kind: ClusterRole
   name: rbd-csi-nodeplugin
@@ -2664,7 +2664,7 @@ apiVersion: v1
 kind: ServiceAccount
 metadata:
   name: rook-csi-rbd-provisioner-sa
-  namespace: ` + operatorNamespace + `
+  namespace: ` + namespace + `
 ---
 kind: ClusterRole
 apiVersion: rbac.authorization.k8s.io/v1
@@ -2724,7 +2724,7 @@ metadata:
 subjects:
   - kind: ServiceAccount
     name: rook-csi-rbd-provisioner-sa
-    namespace: ` + operatorNamespace + `
+    namespace: ` + namespace + `
 roleRef:
   kind: ClusterRole
   name: rbd-external-provisioner-runner
@@ -2733,7 +2733,7 @@ roleRef:
 kind: Role
 apiVersion: rbac.authorization.k8s.io/v1
 metadata:
-  namespace: ` + operatorNamespace + `
+  namespace: ` + namespace + `
   name: rbd-external-provisioner-cfg
 rules:
   - apiGroups: [""]
@@ -2750,11 +2750,11 @@ kind: RoleBinding
 apiVersion: rbac.authorization.k8s.io/v1
 metadata:
   name: rbd-csi-provisioner-role-cfg
-  namespace: ` + operatorNamespace + `
+  namespace: ` + namespace + `
 subjects:
   - kind: ServiceAccount
     name: rook-csi-rbd-provisioner-sa
-    namespace: ` + operatorNamespace + `
+    namespace: ` + namespace + `
 roleRef:
   kind: Role
   name: rbd-external-provisioner-cfg
@@ -2764,7 +2764,7 @@ apiVersion: v1
 kind: ServiceAccount
 metadata:
   name: rook-csi-cephfs-plugin-sa
-  namespace: ` + operatorNamespace + `
+  namespace: ` + namespace + `
 ---
 kind: ClusterRole
 apiVersion: rbac.authorization.k8s.io/v1
@@ -2795,7 +2795,7 @@ metadata:
 subjects:
   - kind: ServiceAccount
     name: rook-csi-cephfs-plugin-sa
-    namespace: ` + operatorNamespace + `
+    namespace: ` + namespace + `
 roleRef:
   kind: ClusterRole
   name: cephfs-csi-nodeplugin
@@ -2805,7 +2805,7 @@ apiVersion: v1
 kind: ServiceAccount
 metadata:
   name: rook-csi-cephfs-provisioner-sa
-  namespace: ` + operatorNamespace + `
+  namespace: ` + namespace + `
 ---
 kind: ClusterRole
 apiVersion: rbac.authorization.k8s.io/v1
@@ -2865,7 +2865,7 @@ metadata:
 subjects:
   - kind: ServiceAccount
     name: rook-csi-cephfs-provisioner-sa
-    namespace: ` + operatorNamespace + `
+    namespace: ` + namespace + `
 roleRef:
   kind: ClusterRole
   name: cephfs-external-provisioner-runner
@@ -2874,7 +2874,7 @@ roleRef:
 kind: Role
 apiVersion: rbac.authorization.k8s.io/v1
 metadata:
-  namespace: ` + operatorNamespace + `
+  namespace: ` + namespace + `
   name: cephfs-external-provisioner-cfg
 rules:
   - apiGroups: [""]
@@ -2891,11 +2891,11 @@ kind: RoleBinding
 apiVersion: rbac.authorization.k8s.io/v1
 metadata:
   name: cephfs-csi-provisioner-role-cfg
-  namespace: ` + operatorNamespace + `
+  namespace: ` + namespace + `
 subjects:
   - kind: ServiceAccount
     name: rook-csi-cephfs-provisioner-sa
-    namespace: ` + operatorNamespace + `
+    namespace: ` + namespace + `
 roleRef:
   kind: Role
   name: cephfs-external-provisioner-cfg
@@ -2992,7 +2992,7 @@ roleRef:
 subjects:
   - kind: ServiceAccount
     name: rook-ceph-system
-    namespace: ` + operatorNamespace + `
+    namespace: ` + namespace + `
 ---
 apiVersion: rbac.authorization.k8s.io/v1
 kind: ClusterRoleBinding
@@ -3005,7 +3005,7 @@ roleRef:
 subjects:
   - kind: ServiceAccount
     name: rook-csi-rbd-provisioner-sa
-    namespace: ` + operatorNamespace + `
+    namespace: ` + namespace + `
 ---
 apiVersion: rbac.authorization.k8s.io/v1
 kind: ClusterRoleBinding
@@ -3018,7 +3018,7 @@ roleRef:
 subjects:
   - kind: ServiceAccount
     name: rook-csi-rbd-plugin-sa
-    namespace: ` + operatorNamespace + `
+    namespace: ` + namespace + `
 ---
 apiVersion: rbac.authorization.k8s.io/v1
 kind: ClusterRoleBinding
@@ -3031,7 +3031,7 @@ roleRef:
 subjects:
   - kind: ServiceAccount
     name: rook-csi-cephfs-provisioner-sa
-    namespace: ` + operatorNamespace + `
+    namespace: ` + namespace + `
 ---
 apiVersion: rbac.authorization.k8s.io/v1
 kind: ClusterRoleBinding
@@ -3044,13 +3044,13 @@ roleRef:
 subjects:
   - kind: ServiceAccount
     name: rook-csi-cephfs-plugin-sa
-    namespace: ` + operatorNamespace + `
+    namespace: ` + namespace + `
 ---
 apiVersion: v1
 kind: ServiceAccount
 metadata:
   name: rook-ceph-admission-controller
-  namespace: ` + operatorNamespace + `
+  namespace: ` + namespace + `
 ---
 kind: ClusterRole
 apiVersion: rbac.authorization.k8s.io/v1
@@ -3069,7 +3069,7 @@ subjects:
   - kind: ServiceAccount
     name: rook-ceph-admission-controller
     apiGroup: ""
-    namespace: ` + operatorNamespace + `
+    namespace: ` + namespace + `
 roleRef:
   kind: ClusterRole
   name: rook-ceph-admission-controller-role
@@ -3079,7 +3079,7 @@ apiVersion: apps/v1
 kind: Deployment
 metadata:
   name: rook-ceph-operator
-  namespace: ` + operatorNamespace + `
+  namespace: ` + namespace + `
   labels:
     operator: rook
     storage-backend: ceph
@@ -3134,7 +3134,7 @@ kind: ConfigMap
 apiVersion: v1
 metadata:
   name: rook-ceph-operator-config
-  namespace: ` + operatorNamespace + `
+  namespace: ` + namespace + `
 data:
   ROOK_CSI_ENABLE_CEPHFS: "true"
   ROOK_CSI_ENABLE_RBD: "true"
@@ -3146,7 +3146,7 @@ data:
 }
 
 // GetClusterRoles returns rook-cluster manifest
-func (m *CephManifestsMaster) GetClusterRoles(namespace, operatorNamespace string) string {
+func (m *CephManifestsMaster) GetClusterRoles(namespace, systemNamespace string) string {
 	return `apiVersion: v1
 kind: ServiceAccount
 metadata:
@@ -3274,7 +3274,7 @@ roleRef:
 subjects:
 - kind: ServiceAccount
   name: rook-ceph-system
-  namespace: ` + operatorNamespace + `
+  namespace: ` + systemNamespace + `
 ---
 # Allow the osd pods in this namespace to work with configmaps
 kind: RoleBinding
@@ -3311,7 +3311,7 @@ kind: RoleBinding
 apiVersion: rbac.authorization.k8s.io/v1
 metadata:
   name: rook-ceph-mgr-system ` + namespace + `
-  namespace: ` + operatorNamespace + `
+  namespace: ` + systemNamespace + `
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: ClusterRole
@@ -3571,14 +3571,14 @@ spec:
           path: mon-endpoints`
 }
 
-func (m *CephManifestsMaster) GetBlockSnapshotClass(snapshotClassName, namespace, operatorNamespace, reclaimPolicy string) string {
+func (m *CephManifestsMaster) GetBlockSnapshotClass(snapshotClassName, namespace, systemNamespace, reclaimPolicy string) string {
 	// Create a CSI driver snapshotclass
 	return `
 apiVersion: snapshot.storage.k8s.io/v1beta1
 kind: VolumeSnapshotClass
 metadata:
   name: ` + snapshotClassName + `
-driver: ` + operatorNamespace + `.rbd.csi.ceph.com
+driver: ` + systemNamespace + `.rbd.csi.ceph.com
 deletionPolicy: ` + reclaimPolicy + `
 parameters:
   clusterID: ` + namespace + `
@@ -3587,14 +3587,14 @@ parameters:
 `
 }
 
-func (m *CephManifestsMaster) GetFileStorageSnapshotClass(snapshotClassName, namespace, operatorNamespace, reclaimPolicy string) string {
+func (m *CephManifestsMaster) GetFileStorageSnapshotClass(snapshotClassName, namespace, systemNamespace, reclaimPolicy string) string {
 	// Create a CSI driver snapshotclass
 	return `
 apiVersion: snapshot.storage.k8s.io/v1beta1
 kind: VolumeSnapshotClass
 metadata:
   name: ` + snapshotClassName + `
-driver: ` + operatorNamespace + `.cephfs.csi.ceph.com
+driver: ` + systemNamespace + `.cephfs.csi.ceph.com
 deletionPolicy: ` + reclaimPolicy + `
 parameters:
   clusterID: ` + namespace + `
@@ -3698,7 +3698,7 @@ spec:
       interval: 10s`
 }
 
-func (m *CephManifestsMaster) GetBlockStorageClassDef(csi bool, poolName, storageClassName, reclaimPolicy, namespace, operatorNamespace string) string {
+func (m *CephManifestsMaster) GetBlockStorageClassDef(csi bool, poolName, storageClassName, reclaimPolicy, namespace, systemNamespace string) string {
 	// Create a CSI driver storage class
 	if csi {
 		return `
@@ -3706,7 +3706,7 @@ apiVersion: storage.k8s.io/v1
 kind: StorageClass
 metadata:
   name: ` + storageClassName + `
-provisioner: ` + operatorNamespace + `.rbd.csi.ceph.com
+provisioner: ` + systemNamespace + `.rbd.csi.ceph.com
 reclaimPolicy: ` + reclaimPolicy + `
 parameters:
   pool: ` + poolName + `
@@ -3732,7 +3732,7 @@ parameters:
     clusterNamespace: ` + namespace
 }
 
-func (m *CephManifestsMaster) GetFileStorageClassDef(fsName, storageClassName, operatorNamespace, namespace string) string {
+func (m *CephManifestsMaster) GetFileStorageClassDef(fsName, storageClassName, systemNamespace, namespace string) string {
 	// Create a CSI driver storage class
 	csiCephFSNodeSecret := "rook-csi-cephfs-node"               //nolint:gosec // We safely suppress gosec in tests file
 	csiCephFSProvisionerSecret := "rook-csi-cephfs-provisioner" //nolint:gosec // We safely suppress gosec in tests file
@@ -3741,7 +3741,7 @@ apiVersion: storage.k8s.io/v1
 kind: StorageClass
 metadata:
   name: ` + storageClassName + `
-provisioner: ` + operatorNamespace + `.cephfs.csi.ceph.com
+provisioner: ` + systemNamespace + `.cephfs.csi.ceph.com
 parameters:
   clusterID: ` + namespace + `
   fsName: ` + fsName + `
diff --git a/tests/scripts/validate_cluster.sh b/tests/scripts/validate_cluster.sh
index b30d630ea..069eaa84a 100755
--- a/tests/scripts/validate_cluster.sh
+++ b/tests/scripts/validate_cluster.sh
@@ -73,12 +73,7 @@ function test_demo_pool {
 
 function test_csi {
   # shellcheck disable=SC2046
-  #return $(wait_for_daemon "test $(kubectl -n rook-ceph get pods --field-selector=status.phase=Running|grep -c ^csi-) -eq 4")
-  timeout 90  sh -c 'until [ $(kubectl -n rook-ceph get pods --field-selector=status.phase=Running|grep -c ^csi-) -eq 4 ]; do sleep 1; done'
-  if [ $? -eq 0 ]; then
-    return 0
-  fi
-  return 1
+  return $(wait_for_daemon "test $(kubectl -n rook-ceph get pods --field-selector=status.phase=Running|grep -c ^csi-) -eq 4")
 }
 
 function display_status {
@@ -152,4 +147,4 @@ echo "Ceph is up and running, have a look!"
 $EXEC_COMMAND -s
 kubectl -n rook-ceph get pods
 kubectl -n rook-ceph logs "$(kubectl -n rook-ceph -l app=rook-ceph-operator get pods -o jsonpath='{.items[*].metadata.name}')"
-kubectl -n rook-ceph get cephcluster -o yaml
+kubectl -n rook-ceph get cephcluster -o yaml
\ No newline at end of file