Repository: rook/rook
Pull request #6666 (2020-11-18 11:17:24)

ci: fix device intermittent failure
<!-- 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:**

* Use sudo to read the disks
* Wait for partprobe and udev events to finish

**Which issue is resolved by this Pull Request:**
Resolves https://github.com/rook/rook/issues/6580

**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-cluster-crd.md b/Documentation/ceph-cluster-crd.md
index db652eab3..4a6a25a1f 100755
--- a/Documentation/ceph-cluster-crd.md
+++ b/Documentation/ceph-cluster-crd.md
@@ -304,9 +304,7 @@ The selector keys are required to be `public` and `cluster` where each represent
 * `public`: client communications with the cluster (reads/writes)
 * `cluster`: internal Ceph replication network
 
-If you want to learn more, please read
-* [Ceph Networking reference](https://docs.ceph.com/docs/master/rados/configuration/network-config-ref/).
-* [Multus documentation](https://intel.github.io/multus-cni/doc/how-to-use.html)
+If you want to learn more, please read [Ceph Networking reference](https://docs.ceph.com/docs/master/rados/configuration/network-config-ref/).
 
 Based on the configuration, the operator will do the following:
 
@@ -316,47 +314,14 @@ Based on the configuration, the operator will do the following:
 In order to work, each selector value must match a `NetworkAttachmentDefinition` object name in Multus.
 For example, you can do:
 
-* `public`: "rook-ceph/my-public-storage-network"
-* `cluster`: "rook-ceph/my-replication-storage-network"
+* `public`: "my-public-storage-network"
+* `cluster`: "my-replication-storage-network"
 
 For `multus` network provider, an already working cluster with Multus networking is required. Network attachment definition that later will be attached to the cluster needs to be created before the Cluster CRD.
 The Network attachment definitions should be using whereabouts cni.
 If Rook cannot find the provided Network attachment definition it will fail running the Ceph OSD pods.
 You can add the Multus network attachment selection annotation selecting the created network attachment definition on `selectors`.
 
-A valid NetworkAttachmentDefinition will look like following:
-
-```yaml
-apiVersion: "k8s.cni.cncf.io/v1"
-kind: NetworkAttachmentDefinition
-metadata:
-  name: rook-public-nw
-spec:
-  config: '{
-      "cniVersion": "0.3.0",
-      "name": "public-nad",
-      "type": "macvlan",
-      "master": "ens5",
-      "mode": "bridge",
-      "ipam": {
-        "type": "whereabouts",
-        "range": "192.168.1.0/24"
-      }
-    }'
-```
-
-* Ensure that `master` matches the network interface of the host that you want to use.
-* The NAD should be referenced along with the namespace in which it is present like `public: <namespace>/<name of NAD>`.
-  e.g., the network attachment definition are in `rook-multus` namespace:
-
-```yaml
-  public: rook-multus/rook-public-nw
-  cluster: rook-multus/rook-cluster-nw
-```
-
-This is required in order to use the NAD across namespaces.
-* In Openshift, to use the NetworkAttachmentDefinition across namespaces, the NAD must be deployed in the default namespace and it can be referenced as `default/myNAD` where `default` is the namespace and `myNAD` is the network attachment definition.
-
 #### IPFamily
 
 Provide single-stack IPv4 or IPv6 protocol to assign corresponding addresses to pods and services. This field is optional. Possible inputs are IPv6 and IPv4. Empty value will be treated as IPv4. Kubernetes version should be at least v1.13 to run IPv6. Dual-stack is not supported by ceph.
diff --git a/Documentation/ceph-quickstart.md b/Documentation/ceph-quickstart.md
index d244ae58e..40e2dbbc6 100644
--- a/Documentation/ceph-quickstart.md
+++ b/Documentation/ceph-quickstart.md
@@ -70,7 +70,8 @@ The first step is to deploy the Rook operator. Check that you are using the [exa
 
 ```console
 cd cluster/examples/kubernetes/ceph
-kubectl create -f crds.yaml -f common.yaml -f operator.yaml
+kubectl create -f common.yaml
+kubectl create -f operator.yaml
 
 ## verify the rook-ceph-operator is in the `Running` state before proceeding
 kubectl -n rook-ceph get pod
diff --git a/Documentation/helm-operator.md b/Documentation/helm-operator.md
index 439017727..f63fe96b0 100644
--- a/Documentation/helm-operator.md
+++ b/Documentation/helm-operator.md
@@ -75,69 +75,69 @@ The command removes all the Kubernetes components associated with the chart and
 
 The following tables lists the configurable parameters of the rook-operator chart and their default values.
 
-| Parameter                          | Description                                                                                                                    | Default                                                   |
-| ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------- |
-| `image.repository`                 | Image                                                                                                                          | `rook/ceph`                                               |
-| `image.tag`                        | Image tag                                                                                                                      | `master`                                                  |
-| `image.pullPolicy`                 | Image pull policy                                                                                                              | `IfNotPresent`                                            |
-| `crds.enabled`                     | If true, the helm chart will create the Rook CRDs. **WARNING** Do NOT change during upgrades or the cluster will be destroyed. | `true`                                                    |
-| `rbacEnable`                       | If true, create & use RBAC resources                                                                                           | `true`                                                    |
-| `pspEnable`                        | If true, create & use PSP resources                                                                                            | `true`                                                    |
-| `resources`                        | Pod resource requests & limits                                                                                                 | `{}`                                                      |
-| `annotations`                      | Pod annotations                                                                                                                | `{}`                                                      |
-| `logLevel`                         | Global log level                                                                                                               | `INFO`                                                    |
-| `nodeSelector`                     | Kubernetes `nodeSelector` to add to the Deployment.                                                                            | <none>                                                    |
-| `tolerations`                      | List of Kubernetes `tolerations` to add to the Deployment.                                                                     | `[]`                                                      |
-| `unreachableNodeTolerationSeconds` | Delay to use for the node.kubernetes.io/unreachable pod failure toleration to override the Kubernetes default of 5 minutes     | `5s`                                                      |
-| `currentNamespaceOnly`             | Whether the operator should watch cluster CRD in its own namespace or not                                                      | `false`                                                   |
-| `hostpathRequiresPrivileged`       | Runs Ceph Pods as privileged to be able to write to `hostPath`s in OpenShift with SELinux restrictions.                        | `false`                                                   |
-| `discover.priorityClassName`       | The priority class name to add to the discover pods                                                                            | <none>                                                    |
-| `discover.toleration`              | Toleration for the discover pods                                                                                               | <none>                                                    |
-| `discover.tolerationKey`           | The specific key of the taint to tolerate                                                                                      | <none>                                                    |
-| `discover.tolerations`             | Array of tolerations in YAML format which will be added to discover deployment                                                 | <none>                                                    |
-| `discover.nodeAffinity`            | The node labels for affinity of `discover-agent` (***)                                                                         | <none>                                                    |
-| `discover.podLabels`               | Labels to add to the discover pods.                                                                                            | <none>                                                    |
-| `csi.enableRbdDriver`              | Enable Ceph CSI RBD driver.                                                                                                    | `true`                                                    |
-| `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.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>                                                    |
-| `csi.provisionerNodeAffinity`      | The node labels for affinity of the CSI provisioner deployment (***)                                                           | <none>                                                    |
-| `csi.pluginTolerations`            | Array of tolerations in YAML format which will be added to Ceph CSI plugin DaemonSet                                           | <none>                                                    |
-| `csi.pluginNodeAffinity`           | The node labels for affinity of the Ceph CSI plugin DaemonSet (***)                                                            | <none>                                                    |
-| `csi.csiRBDProvisionerResource`    | CEPH CSI RBD provisioner resource requirement list.                                                                            | <none>                                                    |
-| `csi.csiRBDPluginResource`         | CEPH CSI RBD plugin resource requirement list.                                                                                 | <none>                                                    |
-| `csi.csiCephFSProvisionerResource` | CEPH CSI CephFS provisioner resource requirement list.                                                                         | <none>                                                    |
-| `csi.csiCephFSPluginResource`      | CEPH CSI CephFS plugin resource requirement list.                                                                              | <none>                                                    |
-| `csi.cephfsGrpcMetricsPort`        | CSI CephFS driver GRPC metrics port.                                                                                           | `9091`                                                    |
-| `csi.cephfsLivenessMetricsPort`    | CSI CephFS driver metrics port.                                                                                                | `9081`                                                    |
-| `csi.rbdGrpcMetricsPort`           | Ceph CSI RBD driver GRPC metrics port.                                                                                         | `9090`                                                    |
-| `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.1.1`                          |
-| `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` |
-| `csi.resizer.image`                | Kubernetes CSI resizer image.                                                                                                  | `k8s.gcr.io/sig-storage/csi-resizer:v1.0.0`               |
-| `csi.provisioner.image`            | Kubernetes CSI provisioner image.                                                                                              | `k8s.gcr.io/sig-storage/csi-provisioner:v2.0.0`           |
-| `csi.snapshotter.image`            | Kubernetes CSI snapshotter image.                                                                                              | `k8s.gcr.io/sig-storage/csi-snapshotter:v3.0.0`           |
-| `csi.attacher.image`               | Kubernetes CSI Attacher image.                                                                                                 | `k8s.gcr.io/sig-storage/csi-attacher:v3.0.0`              |
-| `csi.cephfsPodLabels`              | Labels to add to the CSI CephFS Pods.                                                                                          | <none>                                                    |
-| `csi.rbdPodLabels`                 | Labels to add to the CSI RBD Pods.                                                                                             | <none>                                                    |
-| `agent.flexVolumeDirPath`          | Path where the Rook agent discovers the flex volume plugins (*)                                                                | `/usr/libexec/kubernetes/kubelet-plugins/volume/exec/`    |
-| `agent.libModulesDirPath`          | Path where the Rook agent should look for kernel modules (*)                                                                   | `/lib/modules`                                            |
-| `agent.mounts`                     | Additional paths to be mounted in the agent container (**)                                                                     | <none>                                                    |
-| `agent.mountSecurityMode`          | Mount Security Mode for the agent.                                                                                             | `Any`                                                     |
-| `agent.priorityClassName`          | The priority class name to add to the agent pods                                                                               | <none>                                                    |
-| `agent.toleration`                 | Toleration for the agent pods                                                                                                  | <none>                                                    |
-| `agent.tolerationKey`              | The specific key of the taint to tolerate                                                                                      | <none>                                                    |
-| `agent.tolerations`                | Array of tolerations in YAML format which will be added to agent deployment                                                    | <none>                                                    |
-| `agent.nodeAffinity`               | The node labels for affinity of `rook-agent` (***)                                                                             | <none>                                                    |
-| `admissionController.tolerations`  | Array of tolerations in YAML format which will be added to admission controller deployment.                                    | <none>                                                    |
-| `admissionController.nodeAffinity` | The node labels for affinity of the admission controller deployment (***)                                                      | <none>                                                    |
+| Parameter                          | Description                                                                                                                 | Default                                                   |
+| ---------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------- |
+| `image.repository`                 | Image                                                                                                                       | `rook/ceph`                                               |
+| `image.tag`                        | Image tag                                                                                                                   | `master`                                                  |
+| `image.pullPolicy`                 | Image pull policy                                                                                                           | `IfNotPresent`                                            |
+| `crds.enabled`                     | If true, the helm chart will create the Rook CRDs. Should not change during upgrades or the cluster could be destroyed.     | `true`                                                    |
+| `rbacEnable`                       | If true, create & use RBAC resources                                                                                        | `true`                                                    |
+| `pspEnable`                        | If true, create & use PSP resources                                                                                         | `true`                                                    |
+| `resources`                        | Pod resource requests & limits                                                                                              | `{}`                                                      |
+| `annotations`                      | Pod annotations                                                                                                             | `{}`                                                      |
+| `logLevel`                         | Global log level                                                                                                            | `INFO`                                                    |
+| `nodeSelector`                     | Kubernetes `nodeSelector` to add to the Deployment.                                                                         | <none>                                                    |
+| `tolerations`                      | List of Kubernetes `tolerations` to add to the Deployment.                                                                  | `[]`                                                      |
+| `unreachableNodeTolerationSeconds` | Delay to use for the node.kubernetes.io/unreachable pod failure toleration to override the Kubernetes default of 5 minutes  | `5s`                                                      |
+| `currentNamespaceOnly`             | Whether the operator should watch cluster CRD in its own namespace or not                                                   | `false`                                                   |
+| `hostpathRequiresPrivileged`       | Runs Ceph Pods as privileged to be able to write to `hostPath`s in OpenShift with SELinux restrictions.                     | `false`                                                   |
+| `discover.priorityClassName`       | The priority class name to add to the discover pods                                                                         | <none>                                                    |
+| `discover.toleration`              | Toleration for the discover pods                                                                                            | <none>                                                    |
+| `discover.tolerationKey`           | The specific key of the taint to tolerate                                                                                   | <none>                                                    |
+| `discover.tolerations`             | Array of tolerations in YAML format which will be added to discover deployment                                              | <none>                                                    |
+| `discover.nodeAffinity`            | The node labels for affinity of `discover-agent` (***)                                                                      | <none>                                                    |
+| `discover.podLabels`               | Labels to add to the discover pods.                                                                                         | <none>                                                    |
+| `csi.enableRbdDriver`              | Enable Ceph CSI RBD driver.                                                                                                 | `true`                                                    |
+| `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.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>                                                    |
+| `csi.provisionerNodeAffinity`      | The node labels for affinity of the CSI provisioner deployment (***)                                                        | <none>                                                    |
+| `csi.pluginTolerations`            | Array of tolerations in YAML format which will be added to Ceph CSI plugin DaemonSet                                        | <none>                                                    |
+| `csi.pluginNodeAffinity`           | The node labels for affinity of the Ceph CSI plugin DaemonSet (***)                                                         | <none>                                                    |
+| `csi.csiRBDProvisionerResource`    | CEPH CSI RBD provisioner resource requirement list.                                                                         | <none>                                                    |
+| `csi.csiRBDPluginResource`         | CEPH CSI RBD plugin resource requirement list.                                                                              | <none>                                                    |
+| `csi.csiCephFSProvisionerResource` | CEPH CSI CephFS provisioner resource requirement list.                                                                      | <none>                                                    |
+| `csi.csiCephFSPluginResource`      | CEPH CSI CephFS plugin resource requirement list.                                                                           | <none>                                                    |
+| `csi.cephfsGrpcMetricsPort`        | CSI CephFS driver GRPC metrics port.                                                                                        | `9091`                                                    |
+| `csi.cephfsLivenessMetricsPort`    | CSI CephFS driver metrics port.                                                                                             | `9081`                                                    |
+| `csi.rbdGrpcMetricsPort`           | Ceph CSI RBD driver GRPC metrics port.                                                                                      | `9090`                                                    |
+| `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.1.1`                          |
+| `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` |
+| `csi.resizer.image`                | Kubernetes CSI resizer image.                                                                                               | `k8s.gcr.io/sig-storage/csi-resizer:v1.0.0`               |
+| `csi.provisioner.image`            | Kubernetes CSI provisioner image.                                                                                           | `k8s.gcr.io/sig-storage/csi-provisioner:v2.0.0`           |
+| `csi.snapshotter.image`            | Kubernetes CSI snapshotter image.                                                                                           | `k8s.gcr.io/sig-storage/csi-snapshotter:v3.0.0`           |
+| `csi.attacher.image`               | Kubernetes CSI Attacher image.                                                                                              | `k8s.gcr.io/sig-storage/csi-attacher:v3.0.0`              |
+| `csi.cephfsPodLabels`              | Labels to add to the CSI CephFS Pods.                                                                                       | <none>                                                    |
+| `csi.rbdPodLabels`                 | Labels to add to the CSI RBD Pods.                                                                                          | <none>                                                    |
+| `agent.flexVolumeDirPath`          | Path where the Rook agent discovers the flex volume plugins (*)                                                             | `/usr/libexec/kubernetes/kubelet-plugins/volume/exec/`    |
+| `agent.libModulesDirPath`          | Path where the Rook agent should look for kernel modules (*)                                                                | `/lib/modules`                                            |
+| `agent.mounts`                     | Additional paths to be mounted in the agent container (**)                                                                  | <none>                                                    |
+| `agent.mountSecurityMode`          | Mount Security Mode for the agent.                                                                                          | `Any`                                                     |
+| `agent.priorityClassName`          | The priority class name to add to the agent pods                                                                            | <none>                                                    |
+| `agent.toleration`                 | Toleration for the agent pods                                                                                               | <none>                                                    |
+| `agent.tolerationKey`              | The specific key of the taint to tolerate                                                                                   | <none>                                                    |
+| `agent.tolerations`                | Array of tolerations in YAML format which will be added to agent deployment                                                 | <none>                                                    |
+| `agent.nodeAffinity`               | The node labels for affinity of `rook-agent` (***)                                                                          | <none>                                                    |
+| `admissionController.tolerations`  | Array of tolerations in YAML format which will be added to admission controller deployment.                                 | <none>                                                    |
+| `admissionController.nodeAffinity` | The node labels for affinity of the admission controller deployment (***)                                                   | <none>                                                    |
 
 &ast; For information on what to set `agent.flexVolumeDirPath` to, please refer to the [Rook flexvolume documentation](flexvolume.md)
 
diff --git a/cluster/charts/rook-ceph/values.yaml b/cluster/charts/rook-ceph/values.yaml
index 5fea16e86..c68c285c9 100644
--- a/cluster/charts/rook-ceph/values.yaml
+++ b/cluster/charts/rook-ceph/values.yaml
@@ -11,7 +11,7 @@ image:
 crds:
   # Whether the helm chart should create and update the CRDs. If false, the CRDs must be
   # managed independently with cluster/examples/kubernetes/ceph/crds.yaml.
-  # **WARNING** Only set during first deployment. If later disabled the cluster will be destroyed.
+  # IMPORTANT: Only set during first deployment. If later disabled the cluster could be destroyed.
   enabled: true
 
 resources:
diff --git a/cluster/examples/kubernetes/ceph/common.yaml b/cluster/examples/kubernetes/ceph/common.yaml
index 9c68238f1..8114bdd1f 100644
--- a/cluster/examples/kubernetes/ceph/common.yaml
+++ b/cluster/examples/kubernetes/ceph/common.yaml
@@ -129,6 +129,12 @@ rules:
   - create
   - update
   - delete
+- apiGroups:
+  - k8s.cni.cncf.io
+  resources:
+  - network-attachment-definitions
+  verbs:
+  - get
 ---
 # The cluster role for managing the Rook CRDs
 apiVersion: rbac.authorization.k8s.io/v1
@@ -242,12 +248,6 @@ rules:
   - delete
   - get
   - update
-- apiGroups:
-  - k8s.cni.cncf.io
-  resources:
-  - network-attachment-definitions
-  verbs:
-  - get
 ---
 # Aspects of ceph-mgr that require cluster-wide access
 kind: ClusterRole
diff --git a/design/ceph/ceph-cluster-cleanup.md b/design/ceph/ceph-cluster-cleanup.md
index 5bebb434e..8057eff43 100644
--- a/design/ceph/ceph-cluster-cleanup.md
+++ b/design/ceph/ceph-cluster-cleanup.md
@@ -6,14 +6,9 @@ As a rook user, I want to clean up data on the hosts after I intentionally unins
 
 ## Background
 
-### Cluster deletion
-If the user deletes a rook-ceph cluster and wants to start a new cluster on the same hosts, then following manual steps should be performed:
-- Delete the dataDirHostPath on each host. Otherwise, stale keys and other configs will remain from the previous cluster and the new mons will fail to start.
-- Clean the OSD disks from the previous cluster before starting a new one.
+### Host-based cluster deletion
 
-Read more about the manual clean up steps [here](https://github.com/rook/rook/blob/master/Documentation/ceph-teardown.md#delete-the-data-on-hosts)
-
-This implementation aims to automate both of these manual steps.
+If the user deletes a host-based cluster (running on raw devices and not on PVs) and starts a new cluster on the same hosts, the path used by dataDirHostPath must be deleted. Otherwise, stale keys and other config will remain from the previous cluster and the new mons will fail to start. As of now, the user has to manually delete the dataDirHostPath on each host. This implementation aims to automate this deletion.
 
 ## Design Flow
 
@@ -24,7 +19,7 @@ This implementation aims to automate both of these manual steps.
 
 ### How to add user confirmation
 
-- If the user really wants to clean up the data on the cluster, then update the ceph cluster CRD with cleanupPolicy configuration like below :
+- If the user really wants to clean up the data on the cluster, then user should update the ceph cluster CRD with cleanupPolicy configuration like below :
 
 ```yaml
 apiVersion: ceph.rook.io/v1
@@ -43,33 +38,22 @@ spec:
     useAllNodes: true
     useAllDevices: true
   cleanupPolicy:
-    confirmation: yes-really-destroy-data
-    sanitizeDisks:
-      method: quick
-      dataSource: zero
-      iteration: 1
-    allowUninstallWithVolumes: false
+    deleteDataDirOnHosts: yes-really-destroy-data
 ```
 
-- Updating the cluster `cleanupPolicy` with `confirmation: yes-really-destroy-data` would cause the operator to refuse running any further orchestration.
+- Adding `cleanupPolicy` would cause the operator to refuse running an orchestration
 
 ### How the Operator cleans up the cluster
 
 - Operator starts the clean up flow only when deletionTimeStamp is present on the ceph Cluster.
-- Operator checks for user confirmation (that is, `confirmation: yes-really-destroy-data`) on the ceph cluster before starting the clean up.
+- Operator checks for user confirmation (for example `deleteDataDirOnHosts: yes-really-destroy-data`) on the ceph cluster before starting the clean up.
 - Identify the nodes where ceph daemons are running.
 - Wait till all the ceph daemons are destroyed on each node. This is important because deleting the data (say dataDirHostPath) before the daemons would cause the daemons to panic.
 - Create a batch job that runs on each of the above nodes.
 - The job performs the following action on each node based on the user confirmation:
-  - cleanup the cluster namespace on the dataDirHostPath. For example `/var/lib/rook/rook-ceph`
-  - Delete all the ceph monitor directories on the dataDirHostPath. For example `/var/lib/rook/mon-a`, `/var/lib/rook/mon-b`, etc.
-  - Sanitize the local disks used by OSDs on each node.
-- Local disk sanitization can be further configured by the admin with following options:
-  - `method`: use `complete` to sanitize the entire disk and `quick` (default) to sanitize only ceph's metadata.
-  - `dataSource`: indicate where to get random bytes from to write on the disk. Possible choices are `zero` (default) or `random`.
-  Using random sources will consume entropy from the system and will take much more time then the zero source.
-  - `iteration`: overwrite N times instead of the default (1). Takes an integer value.
-- If `allowUninstallWithVolumes` is `false` (default), then operator would wait for the PVCs to be deleted before finally deleting the cluster.
+  - cleanup the cluster namespace on the dataDirHostPath
+  - Delete all the ceph monitor directories on the dataDirHostPath. For example mon-a, mon-b, etc.
+  - Clean up the devices on each node.
 
 #### Cleanup Job Spec:
 
@@ -77,12 +61,7 @@ spec:
 apiVersion: batch/v1
 kind: Job
 metadata:
-  name: cluster-cleanup-job-<node-name>
-  namespace: <namespace>
-  labels:
-    app: rook-ceph-cleanup
-    rook-ceph-cleanup: "true"
-    rook_cluster: <namespace>
+  name: rook-ceph-cleanup-<node-name>
 spec:
   template:
     spec:
@@ -95,34 +74,15 @@ spec:
           # if ROOK_DATA_DIR_HOST_PATH is available, then delete the dataDirHostPath
           - name: ROOK_DATA_DIR_HOST_PATH
             value: <dataDirHostPath>
-          - name: ROOK_NAMESPACE_DIR
-            value: <namespace>
-          - name: ROOK_MON_SECRET
-            value: <dataDirHostPath>
-          - name: ROOK_CLUSTER_FSID
-            value: <dataDirHostPath>
-          - name: ROOK_LOG_LEVEL
-            value: <dataDirHostPath>
-          - name: ROOK_SANITIZE_METHOD
-            value: <method>
-          - name: ROOK_SANITIZE_DATA_SOURCE
-            value: <dataSource>
-            - name: ROOK_SANITIZE_ITERATION
-            value: <iteration>
           args: []string{"ceph", "clean"}
           volumeMounts:
             - name: cleanup-volume
               # data dir host path that needs to be cleaned up.
               mountPath: <dataDirHostPath>
-            - name: devices
-              mountPath: /dev
       volume:
         - name: cleanup-volume
           hostPath:
             #directory location on the host
             path: <dataDirHostPath>
-        - name: devices
-          hostpath:
-            path: /dev
-      restartPolicy: OnFailure
+      restartPolicy: Never
 ```
diff --git a/images/ceph/Dockerfile b/images/ceph/Dockerfile
index 89b01b5ec..92ab46781 100644
--- a/images/ceph/Dockerfile
+++ b/images/ceph/Dockerfile
@@ -25,7 +25,6 @@ RUN curl --fail -sSL -o /tini https://github.com/krallin/tini/releases/download/
 COPY rook rookflex toolbox.sh /usr/local/bin/
 COPY ceph-csi /etc/ceph-csi
 COPY ceph-monitoring /etc/ceph-monitoring
-COPY rook-external /etc/rook-external/
 COPY ceph-csv-templates /etc/ceph-csv-templates
 ENTRYPOINT ["/tini", "--", "/usr/local/bin/rook"]
 CMD [""]
diff --git a/images/ceph/Makefile b/images/ceph/Makefile
index c547a2ad5..3eeb27d2a 100755
--- a/images/ceph/Makefile
+++ b/images/ceph/Makefile
@@ -48,8 +48,6 @@ do.build: generate-csv-ceph-templates
 	@cp $(OUTPUT_DIR)/bin/linux_$(GOARCH)/rookflex $(TEMP)
 	@cp -r ../../cluster/examples/kubernetes/ceph/csi/template $(TEMP)/ceph-csi
 	@cp -r ../../cluster/examples/kubernetes/ceph/monitoring $(TEMP)/ceph-monitoring
-	@mkdir -p $(TEMP)/rook-external
-	@cp ../../cluster/examples/kubernetes/ceph/create-external-cluster-resources.* $(TEMP)/rook-external/
 	@if [ ! "$(INCLUDE_CSV_TEMPLATES)" = "" ]; then\
 		cp -r ../../cluster/olm/ceph/templates $(TEMP)/ceph-csv-templates;\
 	else\
diff --git a/pkg/operator/ceph/cluster/cluster.go b/pkg/operator/ceph/cluster/cluster.go
index 83c00e074..23383f1d9 100755
--- a/pkg/operator/ceph/cluster/cluster.go
+++ b/pkg/operator/ceph/cluster/cluster.go
@@ -371,13 +371,8 @@ func (c *ClusterController) preClusterStartValidation(cluster *cluster) error {
 				continue
 			}
 
-			multusNamespace, nad := config.GetMultusNamespace(cluster.Spec.Network.Selectors[selector])
-			if multusNamespace == "" {
-				multusNamespace = cluster.Namespace
-			}
-
 			// Get network attachment definition
-			_, err := c.context.NetworkClient.NetworkAttachmentDefinitions(multusNamespace).Get(nad, metav1.GetOptions{})
+			_, err := c.context.NetworkClient.NetworkAttachmentDefinitions(cluster.Namespace).Get(cluster.Spec.Network.Selectors[selector], metav1.GetOptions{})
 			if err != nil {
 				if kerrors.IsNotFound(err) {
 					return errors.Wrapf(err, "specified network attachment definition for selector %q does not exist", selector)
diff --git a/pkg/operator/ceph/cluster/mon/mon.go b/pkg/operator/ceph/cluster/mon/mon.go
index 26247a176..26f00c3d3 100644
--- a/pkg/operator/ceph/cluster/mon/mon.go
+++ b/pkg/operator/ceph/cluster/mon/mon.go
@@ -465,7 +465,6 @@ func (c *Cluster) clusterInfoToMonConfig(excludedMon string) []*monConfig {
 			ResourceName: resourceName(monitor.Name),
 			DaemonName:   monitor.Name,
 			Port:         cephutil.GetPortFromEndpoint(monitor.Endpoint),
-			PublicIP:     cephutil.GetIPFromEndpoint(monitor.Endpoint),
 			Zone:         zone,
 			DataPathMap: config.NewStatefulDaemonDataPathMap(
 				c.spec.DataDirHostPath, dataDirRelativeHostPath(monitor.Name), config.MonType, monitor.Name, c.Namespace),
diff --git a/pkg/operator/ceph/cluster/mon/service.go b/pkg/operator/ceph/cluster/mon/service.go
index 9b9cab06c..17183fe8d 100644
--- a/pkg/operator/ceph/cluster/mon/service.go
+++ b/pkg/operator/ceph/cluster/mon/service.go
@@ -22,7 +22,6 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rook/rook/pkg/operator/k8sutil"
 	v1 "k8s.io/api/core/v1"
-	kerrors "k8s.io/apimachinery/pkg/api/errors"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/util/intstr"
 )
@@ -52,17 +51,6 @@ func (c *Cluster) createService(mon *monConfig) (string, error) {
 	// If deploying Nautilus or newer we need a new port for the monitor service
 	addServicePort(svcDef, "tcp-msgr2", DefaultMsgr2Port)
 
-	// Set the ClusterIP if the service does not exist and we expect a certain cluster IP
-	// For example, in disaster recovery the service might have been deleted accidentally, but we have the
-	// expected endpoint from the mon configmap.
-	if mon.PublicIP != "" {
-		_, err := c.context.Clientset.CoreV1().Services(c.Namespace).Get(svcDef.Name, metav1.GetOptions{})
-		if err != nil && kerrors.IsNotFound(err) {
-			logger.Infof("ensuring the clusterIP for mon %q is %q", mon.DaemonName, mon.PublicIP)
-			svcDef.Spec.ClusterIP = mon.PublicIP
-		}
-	}
-
 	s, err := k8sutil.CreateOrUpdateService(c.context.Clientset, c.Namespace, svcDef)
 	if err != nil {
 		return "", errors.Wrapf(err, "failed to create service for mon %s", mon.DaemonName)
@@ -76,7 +64,7 @@ func (c *Cluster) createService(mon *monConfig) (string, error) {
 	// mon endpoint are not actually like, they remain with the mgrs1 format
 	// however it's interesting to show that monitors can be addressed via 2 different ports
 	// in the end the service has msgr1 and msgr2 ports configured so it's not entirely wrong
-	logger.Infof("mon %q endpoint is [v2:%s:%s,v1:%s:%d]", mon.DaemonName, s.Spec.ClusterIP, strconv.Itoa(int(DefaultMsgr2Port)), s.Spec.ClusterIP, mon.Port)
+	logger.Infof("mon %q endpoint are [v2:%s:%s,v1:%s:%d]", mon.DaemonName, s.Spec.ClusterIP, strconv.Itoa(int(DefaultMsgr2Port)), s.Spec.ClusterIP, mon.Port)
 
 	return s.Spec.ClusterIP, nil
 }
diff --git a/pkg/operator/ceph/config/network.go b/pkg/operator/ceph/config/network.go
index cc75bc928..97a54709f 100644
--- a/pkg/operator/ceph/config/network.go
+++ b/pkg/operator/ceph/config/network.go
@@ -19,7 +19,6 @@ package config
 
 import (
 	"fmt"
-	"strings"
 
 	"github.com/pkg/errors"
 	"github.com/rook/rook/pkg/clusterd"
@@ -53,15 +52,11 @@ func generateNetworkSettings(context *clusterd.Context, namespace string, networ
 			continue
 		}
 
-		multusNamespace, nad := GetMultusNamespace(networkSelectors[selectorKey])
-		if multusNamespace == "" {
-			multusNamespace = namespace
-		}
 		// Get network attachment definition
-		netDefinition, err := context.NetworkClient.NetworkAttachmentDefinitions(multusNamespace).Get(nad, metav1.GetOptions{})
+		netDefinition, err := context.NetworkClient.NetworkAttachmentDefinitions(namespace).Get(networkSelectors[selectorKey], metav1.GetOptions{})
 		if err != nil {
 			if kerrors.IsNotFound(err) {
-				return []Option{}, errors.Wrapf(err, "specified network attachment definition %q in namespace %q for selector %q does not exist", nad, namespace, selectorKey)
+				return []Option{}, errors.Wrapf(err, "specified network attachment definition for selector %q does not exist", selectorKey)
 			}
 			return []Option{}, errors.Wrapf(err, "failed to fetch network attachment definition for selector %q", selectorKey)
 		}
@@ -83,14 +78,6 @@ func generateNetworkSettings(context *clusterd.Context, namespace string, networ
 	return cephNetworks, nil
 }
 
-func GetMultusNamespace(nad string) (string, string) {
-	tmp := strings.Split(nad, "/")
-	if len(tmp) == 2 {
-		return tmp[0], tmp[1]
-	}
-	return "", nad
-}
-
 func getNetworkRange(netConfig k8sutil.NetworkAttachmentConfig) string {
 	if netConfig.Ipam.Subnet != "" {
 		return netConfig.Ipam.Subnet
diff --git a/pkg/operator/ceph/csi/csi.go b/pkg/operator/ceph/csi/csi.go
index 91fae6ec1..d50b4cb76 100644
--- a/pkg/operator/ceph/csi/csi.go
+++ b/pkg/operator/ceph/csi/csi.go
@@ -20,7 +20,7 @@ import (
 	"strconv"
 
 	"github.com/pkg/errors"
-	"github.com/rook/rook/pkg/clusterd"
+	rookclient "github.com/rook/rook/pkg/client/clientset/versioned"
 	controllerutil "github.com/rook/rook/pkg/operator/ceph/controller"
 	"github.com/rook/rook/pkg/operator/k8sutil"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -28,9 +28,9 @@ import (
 	"k8s.io/client-go/kubernetes"
 )
 
-func ValidateAndConfigureDrivers(context *clusterd.Context, namespace, rookImage, securityAccount string, serverVersion *version.Info, ownerRef *metav1.OwnerReference) {
+func ValidateAndConfigureDrivers(clientset kubernetes.Interface, rookclientset rookclient.Interface, namespace, rookImage, securityAccount string, serverVersion *version.Info, ownerRef *metav1.OwnerReference) {
 	if !AllowUnsupported {
-		if err := validateCSIVersion(context.Clientset, namespace, rookImage, securityAccount, ownerRef); err != nil {
+		if err := validateCSIVersion(clientset, namespace, rookImage, securityAccount, ownerRef); err != nil {
 			logger.Errorf("invalid csi version. %+v", err)
 			return
 		}
@@ -38,11 +38,11 @@ func ValidateAndConfigureDrivers(context *clusterd.Context, namespace, rookImage
 		logger.Info("Skipping csi version check, since unsupported versions are allowed")
 	}
 
-	if err := startDrivers(context, namespace, serverVersion, ownerRef); err != nil {
+	if err := startDrivers(clientset, rookclientset, namespace, serverVersion, ownerRef); err != nil {
 		logger.Errorf("failed to start Ceph csi drivers. %v", err)
 		return
 	}
-	stopDrivers(context.Clientset, namespace, serverVersion)
+	stopDrivers(clientset, namespace, serverVersion)
 }
 
 func SetParams(clientset kubernetes.Interface) error {
diff --git a/pkg/operator/ceph/csi/spec.go b/pkg/operator/ceph/csi/spec.go
index b7fbd5a40..57d1c550d 100644
--- a/pkg/operator/ceph/csi/spec.go
+++ b/pkg/operator/ceph/csi/spec.go
@@ -17,20 +17,17 @@ limitations under the License.
 package csi
 
 import (
-	"context"
 	"fmt"
 	"strconv"
 	"strings"
 	"time"
 
-	v1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
+	rookclient "github.com/rook/rook/pkg/client/clientset/versioned"
 	controllerutil "github.com/rook/rook/pkg/operator/ceph/controller"
 	"github.com/rook/rook/pkg/operator/k8sutil"
 	"github.com/rook/rook/pkg/operator/k8sutil/cmdreporter"
-	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	"github.com/pkg/errors"
-	"github.com/rook/rook/pkg/clusterd"
 	apps "k8s.io/api/apps/v1"
 	corev1 "k8s.io/api/core/v1"
 	k8scsi "k8s.io/api/storage/v1beta1"
@@ -204,7 +201,7 @@ func ValidateCSIParam() error {
 	return nil
 }
 
-func startDrivers(context *clusterd.Context, namespace string, ver *version.Info, ownerRef *metav1.OwnerReference) error {
+func startDrivers(clientset kubernetes.Interface, rookclientset rookclient.Interface, namespace string, ver *version.Info, ownerRef *metav1.OwnerReference) error {
 	var (
 		err                                                   error
 		rbdPlugin, cephfsPlugin                               *apps.DaemonSet
@@ -228,7 +225,7 @@ func startDrivers(context *clusterd.Context, namespace string, ver *version.Info
 	tp.EnableCSIGRPCMetrics = fmt.Sprintf("%t", EnableCSIGRPCMetrics)
 
 	// If not set or set to anything but "false", the kernel client will be enabled
-	kClient, err := k8sutil.GetOperatorSetting(context.Clientset, controllerutil.OperatorSettingConfigMapName, "CSI_FORCE_CEPHFS_KERNEL_CLIENT", "true")
+	kClient, err := k8sutil.GetOperatorSetting(clientset, controllerutil.OperatorSettingConfigMapName, "CSI_FORCE_CEPHFS_KERNEL_CLIENT", "true")
 	if err != nil {
 		return errors.Wrap(err, "failed to load CSI_FORCE_CEPHFS_KERNEL_CLIENT setting")
 	}
@@ -238,38 +235,38 @@ func startDrivers(context *clusterd.Context, namespace string, ver *version.Info
 		tp.ForceCephFSKernelClient = "true"
 	}
 	// parse GRPC and Liveness ports
-	tp.CephFSGRPCMetricsPort, err = getPortFromConfig(context.Clientset, "CSI_CEPHFS_GRPC_METRICS_PORT", DefaultCephFSGRPCMerticsPort)
+	tp.CephFSGRPCMetricsPort, err = getPortFromConfig(clientset, "CSI_CEPHFS_GRPC_METRICS_PORT", DefaultCephFSGRPCMerticsPort)
 	if err != nil {
 		return errors.Wrap(err, "error getting CSI CephFS GRPC metrics port.")
 	}
-	tp.CephFSLivenessMetricsPort, err = getPortFromConfig(context.Clientset, "CSI_CEPHFS_LIVENESS_METRICS_PORT", DefaultCephFSLivenessMerticsPort)
+	tp.CephFSLivenessMetricsPort, err = getPortFromConfig(clientset, "CSI_CEPHFS_LIVENESS_METRICS_PORT", DefaultCephFSLivenessMerticsPort)
 	if err != nil {
 		return errors.Wrap(err, "error getting CSI CephFS liveness metrics port.")
 	}
 
-	tp.RBDGRPCMetricsPort, err = getPortFromConfig(context.Clientset, "CSI_RBD_GRPC_METRICS_PORT", DefaultRBDGRPCMerticsPort)
+	tp.RBDGRPCMetricsPort, err = getPortFromConfig(clientset, "CSI_RBD_GRPC_METRICS_PORT", DefaultRBDGRPCMerticsPort)
 	if err != nil {
 		return errors.Wrap(err, "error getting CSI RBD GRPC metrics port.")
 	}
-	tp.RBDLivenessMetricsPort, err = getPortFromConfig(context.Clientset, "CSI_RBD_LIVENESS_METRICS_PORT", DefaultRBDLivenessMerticsPort)
+	tp.RBDLivenessMetricsPort, err = getPortFromConfig(clientset, "CSI_RBD_LIVENESS_METRICS_PORT", DefaultRBDLivenessMerticsPort)
 	if err != nil {
 		return errors.Wrap(err, "error getting CSI RBD liveness metrics port.")
 	}
 
 	// default value `system-node-critical` is the highest available priority
-	tp.PluginPriorityClassName, err = k8sutil.GetOperatorSetting(context.Clientset, controllerutil.OperatorSettingConfigMapName, "CSI_PLUGIN_PRIORITY_CLASSNAME", "")
+	tp.PluginPriorityClassName, err = k8sutil.GetOperatorSetting(clientset, controllerutil.OperatorSettingConfigMapName, "CSI_PLUGIN_PRIORITY_CLASSNAME", "")
 	if err != nil {
 		return errors.Wrap(err, "failed to load CSI_PLUGIN_PRIORITY_CLASSNAME setting")
 	}
 
 	// default value `system-cluster-critical` is applied for some
 	// critical pods in cluster but less priority than plugin pods
-	tp.ProvisionerPriorityClassName, err = k8sutil.GetOperatorSetting(context.Clientset, controllerutil.OperatorSettingConfigMapName, "CSI_PROVISIONER_PRIORITY_CLASSNAME", "")
+	tp.ProvisionerPriorityClassName, err = k8sutil.GetOperatorSetting(clientset, controllerutil.OperatorSettingConfigMapName, "CSI_PROVISIONER_PRIORITY_CLASSNAME", "")
 	if err != nil {
 		return errors.Wrap(err, "failed to load CSI_PROVISIONER_PRIORITY_CLASSNAME setting")
 	}
 
-	updateStrategy, err := k8sutil.GetOperatorSetting(context.Clientset, controllerutil.OperatorSettingConfigMapName, "CSI_CEPHFS_PLUGIN_UPDATE_STRATEGY", rollingUpdate)
+	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")
 	}
@@ -279,7 +276,7 @@ func startDrivers(context *clusterd.Context, namespace string, ver *version.Info
 		tp.CephFSPluginUpdateStrategy = rollingUpdate
 	}
 
-	updateStrategy, err = k8sutil.GetOperatorSetting(context.Clientset, controllerutil.OperatorSettingConfigMapName, "CSI_RBD_PLUGIN_UPDATE_STRATEGY", rollingUpdate)
+	updateStrategy, err = k8sutil.GetOperatorSetting(clientset, controllerutil.OperatorSettingConfigMapName, "CSI_RBD_PLUGIN_UPDATE_STRATEGY", rollingUpdate)
 	if err != nil {
 		return errors.Wrap(err, "failed to load CSI_RBD_PLUGIN_UPDATE_STRATEGY setting")
 	}
@@ -291,7 +288,7 @@ func startDrivers(context *clusterd.Context, namespace string, ver *version.Info
 
 	logger.Infof("Kubernetes version is %s.%s", ver.Major, ver.Minor)
 
-	tp.ResizerImage, err = k8sutil.GetOperatorSetting(context.Clientset, controllerutil.OperatorSettingConfigMapName, "ROOK_CSI_RESIZER_IMAGE", DefaultResizerImage)
+	tp.ResizerImage, err = k8sutil.GetOperatorSetting(clientset, controllerutil.OperatorSettingConfigMapName, "ROOK_CSI_RESIZER_IMAGE", DefaultResizerImage)
 	if err != nil {
 		return errors.Wrap(err, "failed to load ROOK_CSI_RESIZER_IMAGE setting")
 	}
@@ -306,7 +303,7 @@ func startDrivers(context *clusterd.Context, namespace string, ver *version.Info
 		logger.Warning("CSI Block volume expansion requires Kubernetes version >=1.16.0")
 	}
 
-	logLevel, err := k8sutil.GetOperatorSetting(context.Clientset, controllerutil.OperatorSettingConfigMapName, "CSI_LOG_LEVEL", "")
+	logLevel, err := k8sutil.GetOperatorSetting(clientset, controllerutil.OperatorSettingConfigMapName, "CSI_LOG_LEVEL", "")
 	if err != nil {
 		// logging a warning and intentionally continuing with the default log level
 		logger.Warningf("failed to load CSI_LOG_LEVEL. Defaulting to %d. %v", defaultLogLevel, err)
@@ -322,7 +319,7 @@ func startDrivers(context *clusterd.Context, namespace string, ver *version.Info
 	}
 
 	tp.ProvisionerReplicas = 2
-	nodes, err := context.Clientset.CoreV1().Nodes().List(metav1.ListOptions{})
+	nodes, err := clientset.CoreV1().Nodes().List(metav1.ListOptions{})
 	if err == nil {
 		if len(nodes.Items) == 1 {
 			tp.ProvisionerReplicas = 1
@@ -367,24 +364,24 @@ func startDrivers(context *clusterd.Context, namespace string, ver *version.Info
 	}
 
 	// get provisioner toleration and node affinity
-	provisionerTolerations := getToleration(context.Clientset, true)
-	provisionerNodeAffinity := getNodeAffinity(context.Clientset, true)
+	provisionerTolerations := getToleration(clientset, true)
+	provisionerNodeAffinity := getNodeAffinity(clientset, true)
 	// get plugin toleration and node affinity
-	pluginTolerations := getToleration(context.Clientset, false)
-	pluginNodeAffinity := getNodeAffinity(context.Clientset, false)
+	pluginTolerations := getToleration(clientset, false)
+	pluginNodeAffinity := getNodeAffinity(clientset, false)
 	if rbdPlugin != nil {
 		applyToPodSpec(&rbdPlugin.Spec.Template.Spec, pluginNodeAffinity, pluginTolerations)
 		// apply resource request and limit to rbdplugin containers
-		applyResourcesToContainers(context.Clientset, rbdPluginResource, &rbdPlugin.Spec.Template.Spec)
+		applyResourcesToContainers(clientset, rbdPluginResource, &rbdPlugin.Spec.Template.Spec)
 		k8sutil.SetOwnerRef(&rbdPlugin.ObjectMeta, ownerRef)
-		multusApplied, err := applyCephClusterNetworkConfig(context, &rbdPlugin.Spec.Template.ObjectMeta)
+		multusApplied, err := applyCephClusterNetworkConfig(&rbdPlugin.Spec.Template.ObjectMeta, rookclientset)
 		if err != nil {
 			return errors.Wrapf(err, "failed to apply network config to rbd plugin daemonset: %+v", rbdPlugin)
 		}
 		if multusApplied {
 			rbdPlugin.Spec.Template.Spec.HostNetwork = false
 		}
-		err = k8sutil.CreateDaemonSet(csiRBDPlugin, namespace, context.Clientset, rbdPlugin)
+		err = k8sutil.CreateDaemonSet(csiRBDPlugin, namespace, clientset, rbdPlugin)
 		if err != nil {
 			return errors.Wrapf(err, "failed to start rbdplugin daemonset: %+v", rbdPlugin)
 		}
@@ -394,7 +391,7 @@ func startDrivers(context *clusterd.Context, namespace string, ver *version.Info
 	if rbdProvisionerDeployment != nil {
 		applyToPodSpec(&rbdProvisionerDeployment.Spec.Template.Spec, provisionerNodeAffinity, provisionerTolerations)
 		// apply resource request and limit to rbd provisioner containers
-		applyResourcesToContainers(context.Clientset, rbdProvisionerResource, &rbdProvisionerDeployment.Spec.Template.Spec)
+		applyResourcesToContainers(clientset, rbdProvisionerResource, &rbdProvisionerDeployment.Spec.Template.Spec)
 		k8sutil.SetOwnerRef(&rbdProvisionerDeployment.ObjectMeta, ownerRef)
 		antiAffinity := GetPodAntiAffinity("app", csiRBDProvisioner)
 		rbdProvisionerDeployment.Spec.Template.Spec.Affinity.PodAntiAffinity = &antiAffinity
@@ -402,11 +399,11 @@ func startDrivers(context *clusterd.Context, namespace string, ver *version.Info
 			Type: apps.RecreateDeploymentStrategyType,
 		}
 
-		_, err = applyCephClusterNetworkConfig(context, &rbdProvisionerDeployment.Spec.Template.ObjectMeta)
+		_, err = applyCephClusterNetworkConfig(&rbdProvisionerDeployment.Spec.Template.ObjectMeta, rookclientset)
 		if err != nil {
 			return errors.Wrapf(err, "failed to apply network config to rbd plugin provisioner deployment: %+v", rbdProvisionerDeployment)
 		}
-		err = k8sutil.CreateDeployment(context.Clientset, csiRBDProvisioner, namespace, rbdProvisionerDeployment)
+		err = k8sutil.CreateDeployment(clientset, csiRBDProvisioner, namespace, rbdProvisionerDeployment)
 		if err != nil {
 			return errors.Wrapf(err, "failed to start rbd provisioner deployment: %+v", rbdProvisionerDeployment)
 		}
@@ -415,7 +412,7 @@ func startDrivers(context *clusterd.Context, namespace string, ver *version.Info
 
 	if rbdService != nil {
 		k8sutil.SetOwnerRef(&rbdService.ObjectMeta, ownerRef)
-		_, err = k8sutil.CreateOrUpdateService(context.Clientset, namespace, rbdService)
+		_, err = k8sutil.CreateOrUpdateService(clientset, namespace, rbdService)
 		if err != nil {
 			return errors.Wrapf(err, "failed to create rbd service: %+v", rbdService)
 		}
@@ -424,16 +421,16 @@ func startDrivers(context *clusterd.Context, namespace string, ver *version.Info
 	if cephfsPlugin != nil {
 		applyToPodSpec(&cephfsPlugin.Spec.Template.Spec, pluginNodeAffinity, pluginTolerations)
 		// apply resource request and limit to cephfs plugin containers
-		applyResourcesToContainers(context.Clientset, cephFSPluginResource, &cephfsPlugin.Spec.Template.Spec)
+		applyResourcesToContainers(clientset, cephFSPluginResource, &cephfsPlugin.Spec.Template.Spec)
 		k8sutil.SetOwnerRef(&cephfsPlugin.ObjectMeta, ownerRef)
-		multusApplied, err := applyCephClusterNetworkConfig(context, &cephfsPlugin.Spec.Template.ObjectMeta)
+		multusApplied, err := applyCephClusterNetworkConfig(&cephfsPlugin.Spec.Template.ObjectMeta, rookclientset)
 		if err != nil {
 			return errors.Wrapf(err, "failed to apply network config to cephfs plugin daemonset: %+v", cephfsPlugin)
 		}
 		if multusApplied {
 			cephfsPlugin.Spec.Template.Spec.HostNetwork = false
 		}
-		err = k8sutil.CreateDaemonSet(csiCephFSPlugin, namespace, context.Clientset, cephfsPlugin)
+		err = k8sutil.CreateDaemonSet(csiCephFSPlugin, namespace, clientset, cephfsPlugin)
 		if err != nil {
 			return errors.Wrapf(err, "failed to start cephfs plugin daemonset: %+v", cephfsPlugin)
 		}
@@ -444,7 +441,7 @@ func startDrivers(context *clusterd.Context, namespace string, ver *version.Info
 		applyToPodSpec(&cephfsProvisionerDeployment.Spec.Template.Spec, provisionerNodeAffinity, provisionerTolerations)
 		// get resource details for cephfs provisioner
 		// apply resource request and limit to cephfs provisioner containers
-		applyResourcesToContainers(context.Clientset, cephFSProvisionerResource, &cephfsProvisionerDeployment.Spec.Template.Spec)
+		applyResourcesToContainers(clientset, cephFSProvisionerResource, &cephfsProvisionerDeployment.Spec.Template.Spec)
 		k8sutil.SetOwnerRef(&cephfsProvisionerDeployment.ObjectMeta, ownerRef)
 		antiAffinity := GetPodAntiAffinity("app", csiCephFSProvisioner)
 		cephfsProvisionerDeployment.Spec.Template.Spec.Affinity.PodAntiAffinity = &antiAffinity
@@ -452,11 +449,11 @@ func startDrivers(context *clusterd.Context, namespace string, ver *version.Info
 			Type: apps.RecreateDeploymentStrategyType,
 		}
 
-		_, err = applyCephClusterNetworkConfig(context, &cephfsProvisionerDeployment.Spec.Template.ObjectMeta)
+		_, err = applyCephClusterNetworkConfig(&cephfsProvisionerDeployment.Spec.Template.ObjectMeta, rookclientset)
 		if err != nil {
 			return errors.Wrapf(err, "failed to apply network config to cephfs plugin provisioner deployment: %+v", cephfsProvisionerDeployment)
 		}
-		err = k8sutil.CreateDeployment(context.Clientset, csiCephFSProvisioner, namespace, cephfsProvisionerDeployment)
+		err = k8sutil.CreateDeployment(clientset, csiCephFSProvisioner, namespace, cephfsProvisionerDeployment)
 		if err != nil {
 			return errors.Wrapf(err, "failed to start cephfs provisioner deployment: %+v", cephfsProvisionerDeployment)
 		}
@@ -464,20 +461,20 @@ func startDrivers(context *clusterd.Context, namespace string, ver *version.Info
 	}
 	if cephfsService != nil {
 		k8sutil.SetOwnerRef(&cephfsService.ObjectMeta, ownerRef)
-		_, err = k8sutil.CreateOrUpdateService(context.Clientset, namespace, cephfsService)
+		_, err = k8sutil.CreateOrUpdateService(clientset, namespace, cephfsService)
 		if err != nil {
 			return errors.Wrapf(err, "failed to create rbd service: %+v", cephfsService)
 		}
 	}
 
 	if EnableRBD {
-		err = createCSIDriverInfo(context.Clientset, RBDDriverName)
+		err = createCSIDriverInfo(clientset, RBDDriverName)
 		if err != nil {
 			return errors.Wrapf(err, "failed to create CSI driver object for %q", RBDDriverName)
 		}
 	}
 	if EnableCephFS {
-		err = createCSIDriverInfo(context.Clientset, CephFSDriverName)
+		err = createCSIDriverInfo(clientset, CephFSDriverName)
 		if err != nil {
 			return errors.Wrapf(err, "failed to create CSI driver object for %q", CephFSDriverName)
 		}
@@ -537,12 +534,11 @@ func deleteCSIDriverResources(
 	return succeeded
 }
 
-func applyCephClusterNetworkConfig(ctx *clusterd.Context, objectMeta *metav1.ObjectMeta) (bool, error) {
+func applyCephClusterNetworkConfig(objectMeta *metav1.ObjectMeta, rookclientset rookclient.Interface) (bool, error) {
 	var isMultusApplied bool
-	cephClusters := &v1.CephClusterList{}
-	err := ctx.Client.List(context.TODO(), cephClusters, &client.ListOptions{})
+	cephClusters, err := rookclientset.CephV1().CephClusters(objectMeta.Namespace).List(metav1.ListOptions{})
 	if err != nil {
-		return false, errors.Wrap(err, "failed to find CephClusters")
+		return false, errors.Errorf("failed to find CephClusters in namespace %q", objectMeta.Namespace)
 	}
 	for _, cephCluster := range cephClusters.Items {
 		if cephCluster.Spec.Network.IsMultus() {
diff --git a/pkg/operator/ceph/operator.go b/pkg/operator/ceph/operator.go
index 3f1eecd01..5b21fbb3c 100644
--- a/pkg/operator/ceph/operator.go
+++ b/pkg/operator/ceph/operator.go
@@ -251,7 +251,7 @@ func (o *Operator) updateDrivers() error {
 		return errors.Wrap(err, "invalid csi params")
 	}
 
-	go csi.ValidateAndConfigureDrivers(o.context, o.operatorNamespace, o.rookImage, o.securityAccount, serverVersion, ownerRef)
+	go csi.ValidateAndConfigureDrivers(o.context.Clientset, o.context.RookClientset, o.operatorNamespace, o.rookImage, o.securityAccount, serverVersion, ownerRef)
 	return nil
 }
 


Test patch:
diff --git a/.github/workflows/integration-test.yaml b/.github/workflows/integration-test.yaml
deleted file mode 100644
index ff230d93a..000000000
--- a/.github/workflows/integration-test.yaml
+++ /dev/null
@@ -1,307 +0,0 @@
-name: Integration test
-on: [pull_request]
-
-jobs:
-  TestCephSmokeSuite:
-    runs-on: ubuntu-latest
-    steps:
-    - name: checkout
-      uses: actions/checkout@v2
-
-    - name: setup golang
-      uses: actions/setup-go@v2
-      with:
-        go-version: 1.15
-
-    - name: setup minikube
-      uses: manusa/actions-setup-minikube@v2.0.1
-      with:
-        minikube version: 'v1.13.1'
-        kubernetes version: 'v1.19.2'
-        start args: --memory 6g --cpus=2
-
-    - name: check k8s cluster status
-      run: |
-        kubectl cluster-info
-        kubectl get pods -n kube-system
-
-    - name: use local disk
-      run: |
-        sudo swapoff --all --verbose
-        sudo umount /mnt
-        # search for the device since it keeps changing between sda and sdb
-        sudo wipefs --all --force /dev/$(lsblk|awk '/14G/ {print $1}'| head -1)1
-        sudo lsblk
-
-    - name: build rook
-      run: |
-        # set VERSION to a dummy value since Jenkins normally sets it for us. Do this to make Helm happy and not fail with "Error: Invalid Semantic Version"
-        GOPATH=$(go env GOPATH) make clean && make -j$nproc IMAGES='ceph' VERSION=0 build
-        docker images
-        docker tag $(docker images|awk '/build-/ {print $1}') rook/ceph:master
-
-    - name: TestCephSmokeSuite
-      run: |
-       export DEVICE_FILTER=$(lsblk|awk '/14G/ {print $1}'| head -1)
-       go test -v -timeout 1800s -run CephSmokeSuite github.com/rook/rook/tests/integration
-
-    - name: Artifact
-      uses: actions/upload-artifact@v2
-      if: failure()
-      with:
-        name: ceph-smoke-suite-artifact
-        path: /home/runner/work/rook/rook/tests/integration/_output/tests/
-      
-  TestCephFlexSuite:
-    runs-on: ubuntu-latest
-    steps:
-    - name: checkout
-      uses: actions/checkout@v2
-
-    - name: setup golang
-      uses: actions/setup-go@v2
-      with:
-        go-version: 1.15
-
-    - name: setup minikube
-      uses: manusa/actions-setup-minikube@v2.0.1
-      with:
-        minikube version: 'v1.13.1'
-        kubernetes version: 'v1.19.2'
-        start args: --memory 6g --cpus=2
-
-    - name: check k8s cluster status
-      run: |
-        kubectl cluster-info
-        kubectl get pods -n kube-system
-
-    - name: use local disk
-      run: |
-        sudo swapoff --all --verbose
-        sudo umount /mnt
-        # search for the device since it keeps changing between sda and sdb
-        sudo wipefs --all --force /dev/$(lsblk|awk '/14G/ {print $1}'| head -1)1
-        sudo lsblk
-
-    - name: build rook
-      run: |
-        # set VERSION to a dummy value since Jenkins normally sets it for us. Do this to make Helm happy and not fail with "Error: Invalid Semantic Version"
-        GOPATH=$(go env GOPATH) make clean && make -j$nproc IMAGES='ceph' VERSION=0 build
-        docker images
-        docker tag $(docker images|awk '/build-/ {print $1}') rook/ceph:master
-
-    - name: TestCephFlexSuite
-      run: |
-       export DEVICE_FILTER=$(lsblk|awk '/14G/ {print $1}'| head -1)
-       go test -v -timeout 1800s -run CephFlexSuite github.com/rook/rook/tests/integration
-
-    - name: Artifact
-      uses: actions/upload-artifact@v2
-      if: failure()
-      with:
-        name: ceph-flex-suite-artifact
-        path: /home/runner/work/rook/rook/tests/integration/_output/tests/
-      
-  TestCephUpgradeSuite:
-    runs-on: ubuntu-latest
-    steps:
-    - name: checkout
-      uses: actions/checkout@v2
-
-    - name: setup golang
-      uses: actions/setup-go@v2
-      with:
-        go-version: 1.15
-
-    - name: setup minikube
-      uses: manusa/actions-setup-minikube@v2.0.1
-      with:
-        minikube version: 'v1.13.1'
-        kubernetes version: 'v1.19.2'
-        start args: --memory 6g --cpus=2
-
-    - name: check k8s cluster status
-      run: |
-        kubectl cluster-info
-        kubectl get pods -n kube-system
-
-    - name: use local disk
-      run: |
-        sudo swapoff --all --verbose
-        sudo umount /mnt
-        # search for the device since it keeps changing between sda and sdb
-        sudo wipefs --all --force /dev/$(lsblk|awk '/14G/ {print $1}'| head -1)1
-        sudo lsblk
-
-    - name: build rook
-      run: |
-        # set VERSION to a dummy value since Jenkins normally sets it for us. Do this to make Helm happy and not fail with "Error: Invalid Semantic Version"
-        GOPATH=$(go env GOPATH) make clean && make -j$nproc IMAGES='ceph' VERSION=0 build
-        docker images
-        docker tag $(docker images|awk '/build-/ {print $1}') rook/ceph:master
-
-    - name: TestCephUpgradeSuite
-      run: |
-       export DEVICE_FILTER=$(lsblk|awk '/14G/ {print $1}'| head -1)
-       go test -v -timeout 1800s -run CephUpgradeSuite github.com/rook/rook/tests/integration
-
-    - name: Artifact
-      uses: actions/upload-artifact@v2
-      if: failure()
-      with:
-        name: ceph-upgrade-suite-artifact
-        path: /home/runner/work/rook/rook/tests/integration/_output/tests/
-      
-  TestCephMgrSuite:
-    runs-on: ubuntu-latest
-    steps:
-    - name: checkout
-      uses: actions/checkout@v2
-
-    - name: setup golang
-      uses: actions/setup-go@v2
-      with:
-        go-version: 1.15
-
-    - name: setup minikube
-      uses: manusa/actions-setup-minikube@v2.0.1
-      with:
-        minikube version: 'v1.13.1'
-        kubernetes version: 'v1.19.2'
-        start args: --memory 6g --cpus=2
-
-    - name: check k8s cluster status
-      run: |
-        kubectl cluster-info
-        kubectl get pods -n kube-system
-
-    - name: use local disk
-      run: |
-        sudo swapoff --all --verbose
-        sudo umount /mnt
-        # search for the device since it keeps changing between sda and sdb
-        sudo wipefs --all --force /dev/$(lsblk|awk '/14G/ {print $1}'| head -1)1
-        sudo lsblk
-
-    - name: build rook
-      run: |
-        # set VERSION to a dummy value since Jenkins normally sets it for us. Do this to make Helm happy and not fail with "Error: Invalid Semantic Version"
-        GOPATH=$(go env GOPATH) make clean && make -j$nproc IMAGES='ceph' VERSION=0 build
-        docker images
-        docker tag $(docker images|awk '/build-/ {print $1}') rook/ceph:master
-
-    - name: TestCephMgrSuite
-      run: |
-       export DEVICE_FILTER=$(lsblk|awk '/14G/ {print $1}'| head -1)
-       go test -v -timeout 1800s -run CephMgrSuite github.com/rook/rook/tests/integration
-
-    - name: Artifact
-      uses: actions/upload-artifact@v2
-      if: failure()
-      with:
-        name: ceph-mgr-suite-artifact
-        path: /home/runner/work/rook/rook/tests/integration/_output/tests/
-      
-  TestCephHelmSuite:
-    runs-on: ubuntu-latest
-    steps:
-    - name: checkout
-      uses: actions/checkout@v2
-
-    - name: setup golang
-      uses: actions/setup-go@v2
-      with:
-        go-version: 1.15
-
-    - name: setup minikube
-      uses: manusa/actions-setup-minikube@v2.0.1
-      with:
-        minikube version: 'v1.13.1'
-        kubernetes version: 'v1.19.2'
-        start args: --memory 6g --cpus=2
-
-    - name: check k8s cluster status
-      run: |
-        kubectl cluster-info
-        kubectl get pods -n kube-system
-
-    - name: use local disk
-      run: |
-        sudo swapoff --all --verbose
-        sudo umount /mnt
-        # search for the device since it keeps changing between sda and sdb
-        sudo wipefs --all --force /dev/$(lsblk|awk '/14G/ {print $1}'| head -1)1
-        sudo lsblk
-
-    - name: build rook
-      run: |
-       # set VERSION to a dummy value since Jenkins normally sets it for us. Do this to make Helm happy and not fail with "Error: Invalid Semantic Version"
-       GOPATH=$(go env GOPATH) make clean && make -j$nproc IMAGES='ceph' VERSION=0 build
-       docker images
-       docker tag $(docker images|awk '/build-/ {print $1}') rook/ceph:master
-
-    - name: TestCephHelmSuite
-      run: |
-       tests/scripts/minikube.sh helm
-       tests/scripts/helm.sh up
-       export DEVICE_FILTER=$(lsblk|awk '/14G/ {print $1}'| head -1)
-       go test -v -timeout 1800s -run CephHelmSuite github.com/rook/rook/tests/integration
-
-    - name: Artifact
-      uses: actions/upload-artifact@v2
-      if: failure()
-      with:
-        name: ceph-helm-suite-artifact
-        path: /home/runner/work/rook/rook/tests/integration/_output/tests/
-      
-  TestCephMultiClusterDeploySuite:
-    runs-on: ubuntu-latest
-    steps:
-    - name: checkout
-      uses: actions/checkout@v2
-
-    - name: setup golang
-      uses: actions/setup-go@v2
-      with:
-        go-version: 1.15
-
-    - name: setup minikube
-      uses: manusa/actions-setup-minikube@v2.0.1
-      with:
-        minikube version: 'v1.13.1'
-        kubernetes version: 'v1.19.2'
-        start args: --memory 6g --cpus=2
-
-    - name: check k8s cluster status
-      run: |
-        kubectl cluster-info
-        kubectl get pods -n kube-system
-
-    - name: use local disk
-      run: |
-        sudo swapoff --all --verbose
-        sudo umount /mnt
-        # search for the device since it keeps changing between sda and sdb
-        sudo wipefs --all --force /dev/$(lsblk|awk '/14G/ {print $1}'| head -1)1
-        sudo lsblk
-
-    - name: build rook
-      run: |
-       # set VERSION to a dummy value since Jenkins normally sets it for us. Do this to make Helm happy and not fail with "Error: Invalid Semantic Version"
-       GOPATH=$(go env GOPATH) make clean && make -j$nproc IMAGES='ceph' VERSION=0 build
-       docker images
-       docker tag $(docker images|awk '/build-/ {print $1}') rook/ceph:master
-
-    - name: TestCephMultiClusterDeploySuite
-      run: |
-       export TEST_SCRATCH_DEVICE=$(sudo lsblk --paths|awk '/14G/ {print $1}'| head -1)1
-       export DEVICE_FILTER=$(lsblk|awk '/14G/ {print $1}'| head -1)
-       go test -v -timeout 1800s -run CephMultiClusterDeploySuite github.com/rook/rook/tests/integration
-
-    - name: Artifact
-      uses: actions/upload-artifact@v2
-      if: failure()
-      with:
-        name: ceph-multi-cluster-deploy-suite-artifact
-        path: /home/runner/work/rook/rook/tests/integration/_output/tests/
-      
\ No newline at end of file
diff --git a/pkg/operator/ceph/cluster/mon/service_test.go b/pkg/operator/ceph/cluster/mon/service_test.go
deleted file mode 100644
index 908c59151..000000000
--- a/pkg/operator/ceph/cluster/mon/service_test.go
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
-Copyright 2020 The Rook Authors. All rights reserved.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-	http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package mon
-
-import (
-	"sync"
-	"testing"
-
-	cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
-	"github.com/rook/rook/pkg/clusterd"
-	"github.com/rook/rook/pkg/operator/test"
-	"github.com/stretchr/testify/assert"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-)
-
-func TestCreateService(t *testing.T) {
-	clientset := test.New(t, 1)
-	c := New(&clusterd.Context{Clientset: clientset}, "ns", cephv1.ClusterSpec{}, metav1.OwnerReference{}, &sync.Mutex{})
-	m := &monConfig{ResourceName: "rook-ceph-mon-b", DaemonName: "b"}
-	clusterIP, err := c.createService(m)
-	assert.NoError(t, err)
-	// the clusterIP will not be set in a mock service
-	assert.Equal(t, "", clusterIP)
-
-	m.PublicIP = "1.2.3.4"
-	clusterIP, err = c.createService(m)
-	assert.NoError(t, err)
-	// the clusterIP will not be set in the mock because the service already exists
-	assert.Equal(t, "", clusterIP)
-
-	// delete the service to mock a disaster recovery scenario
-	err = clientset.CoreV1().Services(c.Namespace).Delete(m.ResourceName, &metav1.DeleteOptions{})
-	assert.NoError(t, err)
-
-	clusterIP, err = c.createService(m)
-	assert.NoError(t, err)
-	// the clusterIP will now be set to the expected value
-	assert.Equal(t, m.PublicIP, clusterIP)
-}
diff --git a/pkg/operator/ceph/config/network_test.go b/pkg/operator/ceph/config/network_test.go
index 6f0c2b62c..6eb4896c1 100644
--- a/pkg/operator/ceph/config/network_test.go
+++ b/pkg/operator/ceph/config/network_test.go
@@ -196,15 +196,3 @@ func TestGetNetworkRange(t *testing.T) {
 	networkRange = getNetworkRange(netConfig)
 	assert.Equal(t, "192.168.0.0/24", networkRange)
 }
-
-func TestGetMultusNamespace(t *testing.T) {
-	// TEST 1: When namespace is specified with the NAD
-	namespace, nad := GetMultusNamespace("multus-ns/public-nad")
-	assert.Equal(t, "multus-ns", namespace)
-	assert.Equal(t, "public-nad", nad)
-
-	// TEST 2: When only NAD is specified
-	namespace, nad = GetMultusNamespace("public-nad")
-	assert.Empty(t, namespace)
-	assert.Equal(t, "public-nad", nad)
-}
diff --git a/pkg/operator/ceph/csi/spec_test.go b/pkg/operator/ceph/csi/spec_test.go
index c4b1e61b8..491386f06 100644
--- a/pkg/operator/ceph/csi/spec_test.go
+++ b/pkg/operator/ceph/csi/spec_test.go
@@ -19,8 +19,7 @@ package csi
 import (
 	"testing"
 
-	rookfake "github.com/rook/rook/pkg/client/clientset/versioned/fake"
-	"github.com/rook/rook/pkg/clusterd"
+	rookclient "github.com/rook/rook/pkg/client/clientset/versioned"
 	"github.com/rook/rook/pkg/operator/test"
 
 	"github.com/stretchr/testify/assert"
@@ -40,14 +39,11 @@ func TestStartCSI(t *testing.T) {
 		SnapshotterImage: "image",
 	}
 	clientset := test.New(t, 3)
-	context := &clusterd.Context{
-		Clientset:     clientset,
-		RookClientset: rookfake.NewSimpleClientset(),
-	}
+	var rookclientset rookclient.Interface
 	serverVersion, err := clientset.Discovery().ServerVersion()
 	if err != nil {
 		assert.Nil(t, err)
 	}
-	err = startDrivers(context, "ns", serverVersion, nil)
+	err = startDrivers(clientset, rookclientset, "ns", serverVersion, nil)
 	assert.Nil(t, err)
 }
diff --git a/tests/framework/installer/ceph_manifests.go b/tests/framework/installer/ceph_manifests.go
index cdc097b93..3df735d07 100644
--- a/tests/framework/installer/ceph_manifests.go
+++ b/tests/framework/installer/ceph_manifests.go
@@ -3442,7 +3442,7 @@ spec:
   storage:
     useAllNodes: ` + strconv.FormatBool(!settings.skipOSDCreation) + `
     useAllDevices: ` + strconv.FormatBool(!settings.skipOSDCreation) + `
-    deviceFilter:  ` + getDeviceFilter() + `
+    deviceFilter:  ''
     config:
       ` + store + `
       databaseSizeMB: "1024"
diff --git a/tests/framework/installer/environment.go b/tests/framework/installer/environment.go
index b572145a0..a11fc5443 100644
--- a/tests/framework/installer/environment.go
+++ b/tests/framework/installer/environment.go
@@ -69,11 +69,6 @@ func TestScratchDevice() string {
 	return getEnvVarWithDefault("TEST_SCRATCH_DEVICE", "/dev/nvme0n1")
 }
 
-// getDeviceFilter get the device name used for OSD
-func getDeviceFilter() string {
-	return getEnvVarWithDefault("DEVICE_FILTER", "")
-}
-
 func getEnvVarWithDefault(env, defaultValue string) string {
 	val := os.Getenv(env)
 	if val == "" {
diff --git a/tests/framework/utils/k8s_helper.go b/tests/framework/utils/k8s_helper.go
index f6f72dbf3..e919a1df6 100644
--- a/tests/framework/utils/k8s_helper.go
+++ b/tests/framework/utils/k8s_helper.go
@@ -363,7 +363,7 @@ func (k8sh *K8sHelper) DeleteResource(args ...string) error {
 func (k8sh *K8sHelper) WaitForCustomResourceDeletion(namespace string, checkerFunc func() error) error {
 
 	// wait for the operator to finalize and delete the CRD
-	for i := 0; i < 60; i++ {
+	for i := 0; i < 30; i++ {
 		err := checkerFunc()
 		if err == nil {
 			logger.Infof("custom resource %s still exists", namespace)
@@ -615,7 +615,7 @@ func (k8sh *K8sHelper) PrintEventsForNamespace(namespace string) {
 // IsPodRunning returns true if a Pod is running status or goes to Running status within 90s else returns false
 func (k8sh *K8sHelper) IsPodRunning(name string, namespace string) bool {
 	getOpts := metav1.GetOptions{}
-	for i := 0; i < 60; i++ {
+	for i := 0; i < 30; i++ {
 		pod, err := k8sh.Clientset.CoreV1().Pods(namespace).Get(name, getOpts)
 		if err == nil {
 			if pod.Status.Phase == "Running" {
diff --git a/tests/scripts/create-bluestore-partitions.sh b/tests/scripts/create-bluestore-partitions.sh
index 8c9263cb9..77a617297 100755
--- a/tests/scripts/create-bluestore-partitions.sh
+++ b/tests/scripts/create-bluestore-partitions.sh
@@ -54,7 +54,10 @@ case "$BLUESTORE_TYPE" in
 create_block_partition
 
 # Inform the kernel of partition table changes
-sudo partprobe
+sudo partprobe "$DISK"
+
+# Wait the udev event queue, and exits if all current events are handled.
+sudo udevadm settle
 
 # Print drives
 sudo lsblk
diff --git a/tests/scripts/localPathPV.sh b/tests/scripts/localPathPV.sh
index f40a9c2c4..a643b1bf8 100755
--- a/tests/scripts/localPathPV.sh
+++ b/tests/scripts/localPathPV.sh
@@ -9,12 +9,10 @@ fi
 db_device=$2
 wal_device=$3
 
-lsblk
+sudo lsblk
+
+sudo test ! -b "${test_scratch_device}" && echo "invalid scratch device, not a block device: ${test_scratch_device}" >&2 && exit 1
 
-if [ ! -b "${test_scratch_device}" ] ; then
-  echo "invalid scratch device, not a block device: ${test_scratch_device}" >&2
-  exit 1
-fi
 
 sudo rm -rf /var/lib/rook/rook-integration-test
 sudo mkdir -p /var/lib/rook/rook-integration-test/mon1 /var/lib/rook/rook-integration-test/mon2 /var/lib/rook/rook-integration-test/mon3