Repository: rook/rook
Pull request #7912 (2021-05-15 00:05:07)

build: Refactor to consolidate the rook.io/v1 package
<!-- 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 rook.io/v1 package was only an internal implementation detail and does not have any CRDs that rely on it. The CRD deserialization will handle the conversion in internal types. This consolidation gives more flexibility for the storage providers to implement exactly what is needed for their storage provider instead of forcing to use the same types and risk affecting another storage provider.

**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/build/codegen/codegen.sh b/build/codegen/codegen.sh
index 70884fae5..71deb8351 100755
--- a/build/codegen/codegen.sh
+++ b/build/codegen/codegen.sh
@@ -14,7 +14,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-GROUP_VERSIONS="rook.io:v1 rook.io:v1alpha2 ceph.rook.io:v1 nfs.rook.io:v1alpha1 cassandra.rook.io:v1alpha1"
+GROUP_VERSIONS="rook.io:v1alpha2 ceph.rook.io:v1 nfs.rook.io:v1alpha1 cassandra.rook.io:v1alpha1"
 
 scriptdir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
 
diff --git a/design/common/multiple-storage-types-support.md b/design/common/multiple-storage-types-support.md
index ada020127..51ec8c841 100644
--- a/design/common/multiple-storage-types-support.md
+++ b/design/common/multiple-storage-types-support.md
@@ -179,7 +179,6 @@ package v1alpha1 // "github.com/rook/rook/pkg/apis/ceph.rook.io/v1alpha1"
 
 import (
   metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-  rook "github.com/rook/rook/pkg/apis/rook.io/v1"
 )
 
 type Cluster struct {
@@ -441,4 +440,3 @@ spec:
             requests:
               storage: "1Gi"
 ```
-
diff --git a/pkg/apis/cassandra.rook.io/v1alpha1/types.go b/pkg/apis/cassandra.rook.io/v1alpha1/types.go
index 85b5aad75..0d61240bf 100644
--- a/pkg/apis/cassandra.rook.io/v1alpha1/types.go
+++ b/pkg/apis/cassandra.rook.io/v1alpha1/types.go
@@ -17,13 +17,21 @@ limitations under the License.
 package v1alpha1
 
 import (
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
+	"github.com/rook/rook/pkg/apis/rook.io"
 	corev1 "k8s.io/api/core/v1"
+	v1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
 const (
 	APIVersion = CustomResourceGroup + "/" + Version
+
+	// These are valid condition statuses. "ConditionTrue" means a resource is in the condition;
+	// "ConditionFalse" means a resource is not in the condition; "ConditionUnknown" means kubernetes
+	// can't decide if a resource is in the condition or not.
+	ConditionTrue    ConditionStatus = "True"
+	ConditionFalse   ConditionStatus = "False"
+	ConditionUnknown ConditionStatus = "Unknown"
 )
 
 // ***************************************************************************
@@ -59,7 +67,7 @@ type ClusterList struct {
 // ClusterSpec is the desired state for a Cassandra Cluster.
 type ClusterSpec struct {
 	// The annotations-related configuration to add/set on each Pod related object.
-	Annotations rookv1.Annotations `json:"annotations"`
+	Annotations rook.Annotations `json:"annotations"`
 	// Version of Cassandra to use.
 	Version string `json:"version"`
 	// Repository to pull the image from.
@@ -98,11 +106,11 @@ type RackSpec struct {
 	// User-provided ConfigMap for jmx prometheus exporter
 	JMXExporterConfigMapName *string `json:"jmxExporterConfigMapName,omitempty"`
 	// Storage describes the underlying storage that Cassandra will consume.
-	Storage rookv1.StorageScopeSpec `json:"storage"`
+	Storage StorageScopeSpec `json:"storage"`
 	// The annotations-related configuration to add/set on each Pod related object.
-	Annotations rookv1.Annotations `json:"annotations"`
+	Annotations map[string]string `json:"annotations"`
 	// Placement describes restrictions for the nodes Cassandra is scheduled on.
-	Placement *rookv1.Placement `json:"placement,omitempty"`
+	Placement *Placement `json:"placement,omitempty"`
 	// Resources the Cassandra Pods will use.
 	Resources corev1.ResourceRequirements `json:"resources"`
 }
@@ -144,11 +152,39 @@ const (
 
 type ConditionStatus string
 
-// These are valid condition statuses. "ConditionTrue" means a resource is in the condition;
-// "ConditionFalse" means a resource is not in the condition; "ConditionUnknown" means kubernetes
-// can't decide if a resource is in the condition or not.
-const (
-	ConditionTrue    ConditionStatus = "True"
-	ConditionFalse   ConditionStatus = "False"
-	ConditionUnknown ConditionStatus = "Unknown"
-)
+type StorageScopeSpec struct {
+	// +nullable
+	// +optional
+	Nodes []Node `json:"nodes,omitempty"`
+
+	// PersistentVolumeClaims to use as storage
+	// +optional
+	VolumeClaimTemplates []v1.PersistentVolumeClaim `json:"volumeClaimTemplates,omitempty"`
+}
+
+// Node is a storage nodes
+// +nullable
+type Node struct {
+	// +optional
+	Name string `json:"name,omitempty"`
+}
+
+// Placement is the placement for an object
+type Placement struct {
+	// NodeAffinity is a group of node affinity scheduling rules
+	// +optional
+	NodeAffinity *v1.NodeAffinity `json:"nodeAffinity,omitempty"`
+	// PodAffinity is a group of inter pod affinity scheduling rules
+	// +optional
+	PodAffinity *v1.PodAffinity `json:"podAffinity,omitempty"`
+	// PodAntiAffinity is a group of inter pod anti affinity scheduling rules
+	// +optional
+	PodAntiAffinity *v1.PodAntiAffinity `json:"podAntiAffinity,omitempty"`
+	// The pod this Toleration is attached to tolerates any taint that matches
+	// the triple <key,value,effect> using the matching operator <operator>
+	// +optional
+	Tolerations []v1.Toleration `json:"tolerations,omitempty"`
+	// TopologySpreadConstraint specifies how to spread matching pods among the given topology
+	// +optional
+	TopologySpreadConstraints []v1.TopologySpreadConstraint `json:"topologySpreadConstraints,omitempty"`
+}
diff --git a/pkg/apis/cassandra.rook.io/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/cassandra.rook.io/v1alpha1/zz_generated.deepcopy.go
index 731915d26..c1b46e0bb 100644
--- a/pkg/apis/cassandra.rook.io/v1alpha1/zz_generated.deepcopy.go
+++ b/pkg/apis/cassandra.rook.io/v1alpha1/zz_generated.deepcopy.go
@@ -21,7 +21,8 @@ limitations under the License.
 package v1alpha1
 
 import (
-	v1 "github.com/rook/rook/pkg/apis/rook.io/v1"
+	rookio "github.com/rook/rook/pkg/apis/rook.io"
+	v1 "k8s.io/api/core/v1"
 	runtime "k8s.io/apimachinery/pkg/runtime"
 )
 
@@ -91,7 +92,7 @@ func (in *ClusterSpec) DeepCopyInto(out *ClusterSpec) {
 	*out = *in
 	if in.Annotations != nil {
 		in, out := &in.Annotations, &out.Annotations
-		*out = make(v1.Annotations, len(*in))
+		*out = make(rookio.Annotations, len(*in))
 		for key, val := range *in {
 			(*out)[key] = val
 		}
@@ -190,6 +191,67 @@ func (in *ImageSpec) DeepCopy() *ImageSpec {
 	return out
 }
 
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Node) DeepCopyInto(out *Node) {
+	*out = *in
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Node.
+func (in *Node) DeepCopy() *Node {
+	if in == nil {
+		return nil
+	}
+	out := new(Node)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Placement) DeepCopyInto(out *Placement) {
+	*out = *in
+	if in.NodeAffinity != nil {
+		in, out := &in.NodeAffinity, &out.NodeAffinity
+		*out = new(v1.NodeAffinity)
+		(*in).DeepCopyInto(*out)
+	}
+	if in.PodAffinity != nil {
+		in, out := &in.PodAffinity, &out.PodAffinity
+		*out = new(v1.PodAffinity)
+		(*in).DeepCopyInto(*out)
+	}
+	if in.PodAntiAffinity != nil {
+		in, out := &in.PodAntiAffinity, &out.PodAntiAffinity
+		*out = new(v1.PodAntiAffinity)
+		(*in).DeepCopyInto(*out)
+	}
+	if in.Tolerations != nil {
+		in, out := &in.Tolerations, &out.Tolerations
+		*out = make([]v1.Toleration, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	if in.TopologySpreadConstraints != nil {
+		in, out := &in.TopologySpreadConstraints, &out.TopologySpreadConstraints
+		*out = make([]v1.TopologySpreadConstraint, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Placement.
+func (in *Placement) DeepCopy() *Placement {
+	if in == nil {
+		return nil
+	}
+	out := new(Placement)
+	in.DeepCopyInto(out)
+	return out
+}
+
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *RackCondition) DeepCopyInto(out *RackCondition) {
 	*out = *in
@@ -222,14 +284,14 @@ func (in *RackSpec) DeepCopyInto(out *RackSpec) {
 	in.Storage.DeepCopyInto(&out.Storage)
 	if in.Annotations != nil {
 		in, out := &in.Annotations, &out.Annotations
-		*out = make(v1.Annotations, len(*in))
+		*out = make(map[string]string, len(*in))
 		for key, val := range *in {
 			(*out)[key] = val
 		}
 	}
 	if in.Placement != nil {
 		in, out := &in.Placement, &out.Placement
-		*out = new(v1.Placement)
+		*out = new(Placement)
 		(*in).DeepCopyInto(*out)
 	}
 	in.Resources.DeepCopyInto(&out.Resources)
@@ -266,3 +328,31 @@ func (in *RackStatus) DeepCopy() *RackStatus {
 	in.DeepCopyInto(out)
 	return out
 }
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *StorageScopeSpec) DeepCopyInto(out *StorageScopeSpec) {
+	*out = *in
+	if in.Nodes != nil {
+		in, out := &in.Nodes, &out.Nodes
+		*out = make([]Node, len(*in))
+		copy(*out, *in)
+	}
+	if in.VolumeClaimTemplates != nil {
+		in, out := &in.VolumeClaimTemplates, &out.VolumeClaimTemplates
+		*out = make([]v1.PersistentVolumeClaim, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StorageScopeSpec.
+func (in *StorageScopeSpec) DeepCopy() *StorageScopeSpec {
+	if in == nil {
+		return nil
+	}
+	out := new(StorageScopeSpec)
+	in.DeepCopyInto(out)
+	return out
+}
diff --git a/pkg/apis/ceph.rook.io/v1/annotations.go b/pkg/apis/ceph.rook.io/v1/annotations.go
index 2c2a522bc..07d7f1f19 100644
--- a/pkg/apis/ceph.rook.io/v1/annotations.go
+++ b/pkg/apis/ceph.rook.io/v1/annotations.go
@@ -17,35 +17,44 @@ limitations under the License.
 package v1
 
 import (
-	rook "github.com/rook/rook/pkg/apis/rook.io/v1"
+	rook "github.com/rook/rook/pkg/apis/rook.io"
 )
 
+// AnnotationsSpec is the main spec annotation for all daemons
+// +kubebuilder:pruning:PreserveUnknownFields
+// +nullable
+type AnnotationsSpec map[rook.KeyType]rook.Annotations
+
+func (a AnnotationsSpec) All() rook.Annotations {
+	return a[KeyAll]
+}
+
 // GetMgrAnnotations returns the Annotations for the MGR service
-func GetMgrAnnotations(a rook.AnnotationsSpec) rook.Annotations {
+func GetMgrAnnotations(a AnnotationsSpec) rook.Annotations {
 	return mergeAllAnnotationsWithKey(a, KeyMgr)
 }
 
 // GetMonAnnotations returns the Annotations for the MON service
-func GetMonAnnotations(a rook.AnnotationsSpec) rook.Annotations {
+func GetMonAnnotations(a AnnotationsSpec) rook.Annotations {
 	return mergeAllAnnotationsWithKey(a, KeyMon)
 }
 
 // GetOSDPrepareAnnotations returns the annotations for the OSD service
-func GetOSDPrepareAnnotations(a rook.AnnotationsSpec) rook.Annotations {
+func GetOSDPrepareAnnotations(a AnnotationsSpec) rook.Annotations {
 	return mergeAllAnnotationsWithKey(a, KeyOSDPrepare)
 }
 
 // GetOSDAnnotations returns the annotations for the OSD service
-func GetOSDAnnotations(a rook.AnnotationsSpec) rook.Annotations {
+func GetOSDAnnotations(a AnnotationsSpec) rook.Annotations {
 	return mergeAllAnnotationsWithKey(a, KeyOSD)
 }
 
 // GetCleanupAnnotations returns the Annotations for the cleanup job
-func GetCleanupAnnotations(a rook.AnnotationsSpec) rook.Annotations {
+func GetCleanupAnnotations(a AnnotationsSpec) rook.Annotations {
 	return mergeAllAnnotationsWithKey(a, KeyCleanup)
 }
 
-func mergeAllAnnotationsWithKey(a rook.AnnotationsSpec, name rook.KeyType) rook.Annotations {
+func mergeAllAnnotationsWithKey(a AnnotationsSpec, name rook.KeyType) rook.Annotations {
 	all := a.All()
 	if all != nil {
 		return all.Merge(a[name])
diff --git a/pkg/apis/ceph.rook.io/v1/keys.go b/pkg/apis/ceph.rook.io/v1/keys.go
index f6b040e94..9f2fc2a53 100644
--- a/pkg/apis/ceph.rook.io/v1/keys.go
+++ b/pkg/apis/ceph.rook.io/v1/keys.go
@@ -17,16 +17,17 @@ limitations under the License.
 package v1
 
 import (
-	rook "github.com/rook/rook/pkg/apis/rook.io/v1"
+	rookcore "github.com/rook/rook/pkg/apis/rook.io"
 )
 
 const (
-	KeyMds        rook.KeyType = "mds"
-	KeyMon        rook.KeyType = "mon"
-	KeyMonArbiter rook.KeyType = "arbiter"
-	KeyMgr        rook.KeyType = "mgr"
-	KeyOSDPrepare rook.KeyType = "prepareosd"
-	KeyOSD        rook.KeyType = "osd"
-	KeyCleanup    rook.KeyType = "cleanup"
-	KeyMonitoring rook.KeyType = "monitoring"
+	KeyAll                         = "all"
+	KeyMds        rookcore.KeyType = "mds"
+	KeyMon        rookcore.KeyType = "mon"
+	KeyMonArbiter rookcore.KeyType = "arbiter"
+	KeyMgr        rookcore.KeyType = "mgr"
+	KeyOSDPrepare rookcore.KeyType = "prepareosd"
+	KeyOSD        rookcore.KeyType = "osd"
+	KeyCleanup    rookcore.KeyType = "cleanup"
+	KeyMonitoring rookcore.KeyType = "monitoring"
 )
diff --git a/pkg/apis/ceph.rook.io/v1/labels.go b/pkg/apis/ceph.rook.io/v1/labels.go
index 5e889b412..aed8af9ae 100644
--- a/pkg/apis/ceph.rook.io/v1/labels.go
+++ b/pkg/apis/ceph.rook.io/v1/labels.go
@@ -17,40 +17,47 @@ limitations under the License.
 package v1
 
 import (
-	rook "github.com/rook/rook/pkg/apis/rook.io/v1"
+	rook "github.com/rook/rook/pkg/apis/rook.io"
 )
 
+// LabelsSpec is the main spec label for all daemons
+type LabelsSpec map[rook.KeyType]rook.Labels
+
+func (a LabelsSpec) All() rook.Labels {
+	return a[KeyAll]
+}
+
 // GetMgrLabels returns the Labels for the MGR service
-func GetMgrLabels(a rook.LabelsSpec) rook.Labels {
+func GetMgrLabels(a LabelsSpec) rook.Labels {
 	return mergeAllLabelsWithKey(a, KeyMgr)
 }
 
 // GetMonLabels returns the Labels for the MON service
-func GetMonLabels(a rook.LabelsSpec) rook.Labels {
+func GetMonLabels(a LabelsSpec) rook.Labels {
 	return mergeAllLabelsWithKey(a, KeyMon)
 }
 
 // GetOSDPrepareLabels returns the Labels for the OSD prepare job
-func GetOSDPrepareLabels(a rook.LabelsSpec) rook.Labels {
+func GetOSDPrepareLabels(a LabelsSpec) rook.Labels {
 	return mergeAllLabelsWithKey(a, KeyOSDPrepare)
 }
 
 // GetOSDLabels returns the Labels for the OSD service
-func GetOSDLabels(a rook.LabelsSpec) rook.Labels {
+func GetOSDLabels(a LabelsSpec) rook.Labels {
 	return mergeAllLabelsWithKey(a, KeyOSD)
 }
 
 // GetCleanupLabels returns the Labels for the cleanup job
-func GetCleanupLabels(a rook.LabelsSpec) rook.Labels {
+func GetCleanupLabels(a LabelsSpec) rook.Labels {
 	return mergeAllLabelsWithKey(a, KeyCleanup)
 }
 
 // GetMonitoringLabels returns the Labels for monitoring resources
-func GetMonitoringLabels(a rook.LabelsSpec) rook.Labels {
+func GetMonitoringLabels(a LabelsSpec) rook.Labels {
 	return mergeAllLabelsWithKey(a, KeyMonitoring)
 }
 
-func mergeAllLabelsWithKey(a rook.LabelsSpec, name rook.KeyType) rook.Labels {
+func mergeAllLabelsWithKey(a LabelsSpec, name rook.KeyType) rook.Labels {
 	all := a.All()
 	if all != nil {
 		return all.Merge(a[name])
diff --git a/pkg/apis/ceph.rook.io/v1/network.go b/pkg/apis/ceph.rook.io/v1/network.go
index f33a6efa6..68c0296b3 100644
--- a/pkg/apis/ceph.rook.io/v1/network.go
+++ b/pkg/apis/ceph.rook.io/v1/network.go
@@ -16,9 +16,13 @@ limitations under the License.
 
 package v1
 
+// IsMultus get whether to use multus network provider
+func (n *NetworkSpec) IsMultus() bool {
+	return n.Provider == "multus"
+}
+
 // IsHost get whether to use host network provider. This method also preserve
 // compatibility with the old HostNetwork field.
-func (net *NetworkSpec) IsHost() bool {
-	rookNet := net.NetworkSpec
-	return (net.HostNetwork && net.Provider == "") || rookNet.IsHost()
+func (n *NetworkSpec) IsHost() bool {
+	return (n.HostNetwork && n.Provider == "") || n.Provider == "host"
 }
diff --git a/pkg/apis/ceph.rook.io/v1/placement.go b/pkg/apis/ceph.rook.io/v1/placement.go
index 1a74050a5..04bdafd25 100644
--- a/pkg/apis/ceph.rook.io/v1/placement.go
+++ b/pkg/apis/ceph.rook.io/v1/placement.go
@@ -15,28 +15,122 @@ limitations under the License.
 */
 package v1
 
-import (
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
-)
+import v1 "k8s.io/api/core/v1"
+
+func (p PlacementSpec) All() Placement {
+	return p[KeyAll]
+}
+
+// ApplyToPodSpec adds placement to a pod spec
+func (p Placement) ApplyToPodSpec(t *v1.PodSpec) {
+	if t.Affinity == nil {
+		t.Affinity = &v1.Affinity{}
+	}
+	if p.NodeAffinity != nil {
+		t.Affinity.NodeAffinity = p.mergeNodeAffinity(t.Affinity.NodeAffinity)
+	}
+	if p.PodAffinity != nil {
+		t.Affinity.PodAffinity = p.PodAffinity.DeepCopy()
+	}
+	if p.PodAntiAffinity != nil {
+		t.Affinity.PodAntiAffinity = p.PodAntiAffinity.DeepCopy()
+	}
+	if p.Tolerations != nil {
+		t.Tolerations = p.Tolerations
+	}
+	if p.TopologySpreadConstraints != nil {
+		t.TopologySpreadConstraints = p.TopologySpreadConstraints
+	}
+}
+
+func (p Placement) mergeNodeAffinity(nodeAffinity *v1.NodeAffinity) *v1.NodeAffinity {
+	// no node affinity is specified yet, so return the placement's nodeAffinity
+	result := p.NodeAffinity.DeepCopy()
+	if nodeAffinity == nil {
+		return result
+	}
+
+	// merge the preferred node affinity that was already specified, and the placement's nodeAffinity
+	result.PreferredDuringSchedulingIgnoredDuringExecution = append(
+		nodeAffinity.PreferredDuringSchedulingIgnoredDuringExecution,
+		p.NodeAffinity.PreferredDuringSchedulingIgnoredDuringExecution...)
+
+	// nothing to merge if no affinity was passed in
+	if nodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution == nil {
+		return result
+	}
+	// take the desired affinity if there was none on the placement
+	if p.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution == nil {
+		result.RequiredDuringSchedulingIgnoredDuringExecution = nodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution
+		return result
+	}
+	// take the desired affinity node selectors without the need to merge
+	if len(nodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms) == 0 {
+		return result
+	}
+	// take the placement affinity node selectors without the need to merge
+	if len(p.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms) == 0 {
+		// take the placement from the first option since the second isn't specified
+		result.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms =
+			nodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms
+		return result
+	}
+
+	// merge the match expressions together since they are defined in both placements
+	// this will only work if we want an "and" between all the expressions, more complex conditions won't work with this merge
+	var nodeTerm v1.NodeSelectorTerm
+	nodeTerm.MatchExpressions = append(
+		nodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms[0].MatchExpressions,
+		p.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms[0].MatchExpressions...)
+	nodeTerm.MatchFields = append(
+		nodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms[0].MatchFields,
+		p.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms[0].MatchFields...)
+	result.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms[0] = nodeTerm
+
+	return result
+}
+
+// Merge returns a Placement which results from merging the attributes of the
+// original Placement with the attributes of the supplied one. The supplied
+// Placement's attributes will override the original ones if defined.
+func (p Placement) Merge(with Placement) Placement {
+	ret := p
+	if with.NodeAffinity != nil {
+		ret.NodeAffinity = with.NodeAffinity
+	}
+	if with.PodAffinity != nil {
+		ret.PodAffinity = with.PodAffinity
+	}
+	if with.PodAntiAffinity != nil {
+		ret.PodAntiAffinity = with.PodAntiAffinity
+	}
+	if with.Tolerations != nil {
+		ret.Tolerations = with.Tolerations
+	}
+	if with.TopologySpreadConstraints != nil {
+		ret.TopologySpreadConstraints = with.TopologySpreadConstraints
+	}
+	return ret
+}
 
 // GetMgrPlacement returns the placement for the MGR service
-func GetMgrPlacement(p rookv1.PlacementSpec) rookv1.Placement {
+func GetMgrPlacement(p PlacementSpec) Placement {
 	return p.All().Merge(p[KeyMgr])
 }
 
 // GetMonPlacement returns the placement for the MON service
-func GetMonPlacement(p rookv1.PlacementSpec) rookv1.Placement {
+func GetMonPlacement(p PlacementSpec) Placement {
 	return p.All().Merge(p[KeyMon])
 }
 
 // GetArbiterPlacement returns the placement for the arbiter MON service
-func GetArbiterPlacement(p rookv1.PlacementSpec) rookv1.Placement {
+func GetArbiterPlacement(p PlacementSpec) Placement {
 	// If the mon is the arbiter in a stretch cluster and its placement is specified, return it
 	// without merging with the "all" placement so it can be handled separately from all other daemons
 	return p[KeyMonArbiter]
 }
 
 // GetOSDPlacement returns the placement for the OSD service
-func GetOSDPlacement(p rookv1.PlacementSpec) rookv1.Placement {
+func GetOSDPlacement(p PlacementSpec) Placement {
 	return p.All().Merge(p[KeyOSD])
 }
diff --git a/pkg/apis/rook.io/v1/placement_test.go b/pkg/apis/ceph.rook.io/v1/placement_test.go
similarity index 100%
rename from pkg/apis/rook.io/v1/placement_test.go
rename to pkg/apis/ceph.rook.io/v1/placement_test.go
diff --git a/pkg/apis/ceph.rook.io/v1/priorityclasses.go b/pkg/apis/ceph.rook.io/v1/priorityclasses.go
index 9e1ec2bfb..d60ed1acd 100644
--- a/pkg/apis/ceph.rook.io/v1/priorityclasses.go
+++ b/pkg/apis/ceph.rook.io/v1/priorityclasses.go
@@ -16,12 +16,16 @@ limitations under the License.
 
 package v1
 
-import (
-	rook "github.com/rook/rook/pkg/apis/rook.io/v1"
-)
+// All returns the priority class name defined for 'all' daemons in the Ceph cluster CRD.
+func (p PriorityClassNamesSpec) All() string {
+	if val, ok := p[KeyAll]; ok {
+		return val
+	}
+	return ""
+}
 
 // GetMgrPriorityClassName returns the priority class name for the MGR service
-func GetMgrPriorityClassName(p rook.PriorityClassNamesSpec) string {
+func GetMgrPriorityClassName(p PriorityClassNamesSpec) string {
 	if _, ok := p[KeyMgr]; !ok {
 		return p.All()
 	}
@@ -29,7 +33,7 @@ func GetMgrPriorityClassName(p rook.PriorityClassNamesSpec) string {
 }
 
 // GetMonPriorityClassName returns the priority class name for the monitors
-func GetMonPriorityClassName(p rook.PriorityClassNamesSpec) string {
+func GetMonPriorityClassName(p PriorityClassNamesSpec) string {
 	if _, ok := p[KeyMon]; !ok {
 		return p.All()
 	}
@@ -37,7 +41,7 @@ func GetMonPriorityClassName(p rook.PriorityClassNamesSpec) string {
 }
 
 // GetOSDPriorityClassName returns the priority class name for the OSDs
-func GetOSDPriorityClassName(p rook.PriorityClassNamesSpec) string {
+func GetOSDPriorityClassName(p PriorityClassNamesSpec) string {
 	if _, ok := p[KeyOSD]; !ok {
 		return p.All()
 	}
@@ -45,7 +49,7 @@ func GetOSDPriorityClassName(p rook.PriorityClassNamesSpec) string {
 }
 
 // GetCleanupPriorityClassName returns the priority class name for the cleanup job
-func GetCleanupPriorityClassName(p rook.PriorityClassNamesSpec) string {
+func GetCleanupPriorityClassName(p PriorityClassNamesSpec) string {
 	if _, ok := p[KeyCleanup]; !ok {
 		return p.All()
 	}
diff --git a/pkg/apis/rook.io/v1/priorityclasses_test.go b/pkg/apis/ceph.rook.io/v1/priorityclasses_test.go
similarity index 100%
rename from pkg/apis/rook.io/v1/priorityclasses_test.go
rename to pkg/apis/ceph.rook.io/v1/priorityclasses_test.go
diff --git a/pkg/apis/ceph.rook.io/v1/resources.go b/pkg/apis/ceph.rook.io/v1/resources.go
index bf363d17e..20d79833a 100644
--- a/pkg/apis/ceph.rook.io/v1/resources.go
+++ b/pkg/apis/ceph.rook.io/v1/resources.go
@@ -17,7 +17,6 @@ limitations under the License.
 package v1
 
 import (
-	rook "github.com/rook/rook/pkg/apis/rook.io/v1"
 	v1 "k8s.io/api/core/v1"
 )
 
@@ -47,41 +46,41 @@ const (
 )
 
 // GetMgrResources returns the placement for the MGR service
-func GetMgrResources(p rook.ResourceSpec) v1.ResourceRequirements {
+func GetMgrResources(p ResourceSpec) v1.ResourceRequirements {
 	return p[ResourcesKeyMgr]
 }
 
 // GetMgrSidecarResources returns the placement for the MGR sidecar container
-func GetMgrSidecarResources(p rook.ResourceSpec) v1.ResourceRequirements {
+func GetMgrSidecarResources(p ResourceSpec) v1.ResourceRequirements {
 	return p[ResourcesKeyMgrSidecar]
 }
 
 // GetMonResources returns the placement for the monitors
-func GetMonResources(p rook.ResourceSpec) v1.ResourceRequirements {
+func GetMonResources(p ResourceSpec) v1.ResourceRequirements {
 	return p[ResourcesKeyMon]
 }
 
 // GetOSDResources returns the placement for the OSDs
-func GetOSDResources(p rook.ResourceSpec) v1.ResourceRequirements {
+func GetOSDResources(p ResourceSpec) v1.ResourceRequirements {
 	return p[ResourcesKeyOSD]
 }
 
 // GetPrepareOSDResources returns the placement for the OSDs prepare job
-func GetPrepareOSDResources(p rook.ResourceSpec) v1.ResourceRequirements {
+func GetPrepareOSDResources(p ResourceSpec) v1.ResourceRequirements {
 	return p[ResourcesKeyPrepareOSD]
 }
 
 // GetCrashCollectorResources returns the placement for the crash daemon
-func GetCrashCollectorResources(p rook.ResourceSpec) v1.ResourceRequirements {
+func GetCrashCollectorResources(p ResourceSpec) v1.ResourceRequirements {
 	return p[ResourcesKeyCrashCollector]
 }
 
 // GetLogCollectorResources returns the placement for the crash daemon
-func GetLogCollectorResources(p rook.ResourceSpec) v1.ResourceRequirements {
+func GetLogCollectorResources(p ResourceSpec) v1.ResourceRequirements {
 	return p[ResourcesKeyCrashCollector]
 }
 
 // GetCleanupResources returns the placement for the cleanup job
-func GetCleanupResources(p rook.ResourceSpec) v1.ResourceRequirements {
+func GetCleanupResources(p ResourceSpec) v1.ResourceRequirements {
 	return p[ResourcesKeyCleanup]
 }
diff --git a/pkg/apis/rook.io/v1/storage.go b/pkg/apis/ceph.rook.io/v1/storage.go
similarity index 100%
rename from pkg/apis/rook.io/v1/storage.go
rename to pkg/apis/ceph.rook.io/v1/storage.go
diff --git a/pkg/apis/rook.io/v1/storage_test.go b/pkg/apis/ceph.rook.io/v1/storage_test.go
similarity index 100%
rename from pkg/apis/rook.io/v1/storage_test.go
rename to pkg/apis/ceph.rook.io/v1/storage_test.go
diff --git a/pkg/apis/ceph.rook.io/v1/types.go b/pkg/apis/ceph.rook.io/v1/types.go
index b6212daae..5551069d5 100755
--- a/pkg/apis/ceph.rook.io/v1/types.go
+++ b/pkg/apis/ceph.rook.io/v1/types.go
@@ -19,7 +19,7 @@ package v1
 import (
 	"time"
 
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
+	rook "github.com/rook/rook/pkg/apis/rook.io"
 	v1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
@@ -61,7 +61,7 @@ type CephClusterHealthCheckSpec struct {
 	DaemonHealth DaemonHealthSpec `json:"daemonHealth,omitempty"`
 	// LivenessProbe allows to change the livenessprobe configuration for a given daemon
 	// +optional
-	LivenessProbe map[rookv1.KeyType]*rookv1.ProbeSpec `json:"livenessProbe,omitempty"`
+	LivenessProbe map[rook.KeyType]*ProbeSpec `json:"livenessProbe,omitempty"`
 }
 
 // DaemonHealthSpec is a daemon health check
@@ -99,24 +99,24 @@ type ClusterSpec struct {
 	// A spec for available storage in the cluster and how it should be used
 	// +optional
 	// +nullable
-	Storage rookv1.StorageScopeSpec `json:"storage,omitempty"`
+	Storage StorageScopeSpec `json:"storage,omitempty"`
 
 	// The annotations-related configuration to add/set on each Pod related object.
 	// +nullable
 	// +optional
-	Annotations rookv1.AnnotationsSpec `json:"annotations,omitempty"`
+	Annotations AnnotationsSpec `json:"annotations,omitempty"`
 
 	// The labels-related configuration to add/set on each Pod related object.
 	// +kubebuilder:pruning:PreserveUnknownFields
 	// +nullable
 	// +optional
-	Labels rookv1.LabelsSpec `json:"labels,omitempty"`
+	Labels LabelsSpec `json:"labels,omitempty"`
 
 	// The placement-related configuration to pass to kubernetes (affinity, node selector, tolerations).
 	// +kubebuilder:pruning:PreserveUnknownFields
 	// +nullable
 	// +optional
-	Placement rookv1.PlacementSpec `json:"placement,omitempty"`
+	Placement PlacementSpec `json:"placement,omitempty"`
 
 	// Network related configuration
 	// +kubebuilder:pruning:PreserveUnknownFields
@@ -128,13 +128,13 @@ type ClusterSpec struct {
 	// +kubebuilder:pruning:PreserveUnknownFields
 	// +nullable
 	// +optional
-	Resources rookv1.ResourceSpec `json:"resources,omitempty"`
+	Resources ResourceSpec `json:"resources,omitempty"`
 
 	// PriorityClassNames sets priority classes on components
 	// +kubebuilder:pruning:PreserveUnknownFields
 	// +nullable
 	// +optional
-	PriorityClassNames rookv1.PriorityClassNamesSpec `json:"priorityClassNames,omitempty"`
+	PriorityClassNames PriorityClassNamesSpec `json:"priorityClassNames,omitempty"`
 
 	// The path on the host where config and data can be persisted
 	// +kubebuilder:validation:Pattern=`^/(\S+)`
@@ -951,19 +951,19 @@ type MetadataServerSpec struct {
 	// +kubebuilder:pruning:PreserveUnknownFields
 	// +nullable
 	// +optional
-	Placement rookv1.Placement `json:"placement,omitempty"`
+	Placement Placement `json:"placement,omitempty"`
 
 	// The annotations-related configuration to add/set on each Pod related object.
 	// +kubebuilder:pruning:PreserveUnknownFields
 	// +nullable
 	// +optional
-	Annotations rookv1.Annotations `json:"annotations,omitempty"`
+	Annotations rook.Annotations `json:"annotations,omitempty"`
 
 	// The labels-related configuration to add/set on each Pod related object.
 	// +kubebuilder:pruning:PreserveUnknownFields
 	// +nullable
 	// +optional
-	Labels rookv1.Labels `json:"labels,omitempty"`
+	Labels rook.Labels `json:"labels,omitempty"`
 
 	// The resource requirements for the rgw pods
 	// +kubebuilder:pruning:PreserveUnknownFields
@@ -1048,7 +1048,7 @@ type BucketHealthCheckSpec struct {
 	// +optional
 	Bucket HealthCheckSpec `json:"bucket,omitempty"`
 	// +optional
-	LivenessProbe *rookv1.ProbeSpec `json:"livenessProbe,omitempty"`
+	LivenessProbe *ProbeSpec `json:"livenessProbe,omitempty"`
 }
 
 // HealthCheckSpec represents the health check of an object store bucket
@@ -1088,19 +1088,19 @@ type GatewaySpec struct {
 	// +kubebuilder:pruning:PreserveUnknownFields
 	// +nullable
 	// +optional
-	Placement rookv1.Placement `json:"placement,omitempty"`
+	Placement Placement `json:"placement,omitempty"`
 
 	// The annotations-related configuration to add/set on each Pod related object.
 	// +kubebuilder:pruning:PreserveUnknownFields
 	// +nullable
 	// +optional
-	Annotations rookv1.Annotations `json:"annotations,omitempty"`
+	Annotations rook.Annotations `json:"annotations,omitempty"`
 
 	// The labels-related configuration to add/set on each Pod related object.
 	// +kubebuilder:pruning:PreserveUnknownFields
 	// +nullable
 	// +optional
-	Labels rookv1.Labels `json:"labels,omitempty"`
+	Labels rook.Labels `json:"labels,omitempty"`
 
 	// The resource requirements for the rgw pods
 	// +kubebuilder:pruning:PreserveUnknownFields
@@ -1300,7 +1300,7 @@ type RGWServiceSpec struct {
 	// The annotations-related configuration to add/set on each rgw service.
 	// nullable
 	// optional
-	Annotations rookv1.Annotations `json:"annotations,omitempty"`
+	Annotations rook.Annotations `json:"annotations,omitempty"`
 }
 
 // CephNFS represents a Ceph NFS
@@ -1353,19 +1353,19 @@ type GaneshaServerSpec struct {
 	// +kubebuilder:pruning:PreserveUnknownFields
 	// +nullable
 	// +optional
-	Placement rookv1.Placement `json:"placement,omitempty"`
+	Placement Placement `json:"placement,omitempty"`
 
 	// The annotations-related configuration to add/set on each Pod related object.
 	// +kubebuilder:pruning:PreserveUnknownFields
 	// +nullable
 	// +optional
-	Annotations rookv1.Annotations `json:"annotations,omitempty"`
+	Annotations rook.Annotations `json:"annotations,omitempty"`
 
 	// The labels-related configuration to add/set on each Pod related object.
 	// +kubebuilder:pruning:PreserveUnknownFields
 	// +nullable
 	// +optional
-	Labels rookv1.Labels `json:"labels,omitempty"`
+	Labels rook.Labels `json:"labels,omitempty"`
 
 	// Resources set resource requests and limits
 	// +kubebuilder:pruning:PreserveUnknownFields
@@ -1384,7 +1384,17 @@ type GaneshaServerSpec struct {
 
 // NetworkSpec for Ceph includes backward compatibility code
 type NetworkSpec struct {
-	rookv1.NetworkSpec `json:",inline"`
+	// Provider is what provides network connectivity to the cluster e.g. "host" or "multus"
+	// +nullable
+	// +optional
+	Provider string `json:"provider,omitempty"`
+
+	// Selectors string values describe what networks will be used to connect the cluster.
+	// Meanwhile the keys describe each network respective responsibilities or any metadata
+	// storage provider decide.
+	// +nullable
+	// +optional
+	Selectors map[string]string `json:"selectors,omitempty"`
 
 	// HostNetwork to enable host network
 	// +optional
@@ -1551,19 +1561,19 @@ type RBDMirroringSpec struct {
 	// +kubebuilder:pruning:PreserveUnknownFields
 	// +nullable
 	// +optional
-	Placement rookv1.Placement `json:"placement,omitempty"`
+	Placement Placement `json:"placement,omitempty"`
 
 	// The annotations-related configuration to add/set on each Pod related object.
 	// +kubebuilder:pruning:PreserveUnknownFields
 	// +nullable
 	// +optional
-	Annotations rookv1.Annotations `json:"annotations,omitempty"`
+	Annotations rook.Annotations `json:"annotations,omitempty"`
 
 	// The labels-related configuration to add/set on each Pod related object.
 	// +kubebuilder:pruning:PreserveUnknownFields
 	// +nullable
 	// +optional
-	Labels rookv1.Labels `json:"labels,omitempty"`
+	Labels rook.Labels `json:"labels,omitempty"`
 
 	// The resource requirements for the rbd mirror pods
 	// +kubebuilder:pruning:PreserveUnknownFields
@@ -1611,17 +1621,17 @@ type FilesystemMirroringSpec struct {
 	// The affinity to place the rgw pods (default is to place on any available node)
 	// +nullable
 	// +optional
-	Placement rookv1.Placement `json:"placement,omitempty"`
+	Placement Placement `json:"placement,omitempty"`
 
 	// The annotations-related configuration to add/set on each Pod related object.
 	// +nullable
 	// +optional
-	Annotations rookv1.Annotations `json:"annotations,omitempty"`
+	Annotations rook.Annotations `json:"annotations,omitempty"`
 
 	// The labels-related configuration to add/set on each Pod related object.
 	// +nullable
 	// +optional
-	Labels rookv1.Labels `json:"labels,omitempty"`
+	Labels rook.Labels `json:"labels,omitempty"`
 
 	// The resource requirements for the cephfs-mirror pods
 	// +nullable
@@ -1642,3 +1652,150 @@ const (
 	// IPv4 internet protocol version
 	IPv4 IPFamilyType = "IPv4"
 )
+
+type StorageScopeSpec struct {
+	// +nullable
+	// +optional
+	Nodes []Node `json:"nodes,omitempty"`
+	// +optional
+	UseAllNodes bool `json:"useAllNodes,omitempty"`
+	// +kubebuilder:pruning:PreserveUnknownFields
+	// +nullable
+	// +optional
+	Config    map[string]string `json:"config,omitempty"`
+	Selection `json:",inline"`
+	// +nullable
+	// +optional
+	StorageClassDeviceSets []StorageClassDeviceSet `json:"storageClassDeviceSets,omitempty"`
+}
+
+// Node is a storage nodes
+// +nullable
+type Node struct {
+	// +optional
+	Name string `json:"name,omitempty"`
+	// +kubebuilder:pruning:PreserveUnknownFields
+	// +nullable
+	// +optional
+	Resources v1.ResourceRequirements `json:"resources,omitempty"`
+	// +kubebuilder:pruning:PreserveUnknownFields
+	// +nullable
+	// +optional
+	Config    map[string]string `json:"config,omitempty"`
+	Selection `json:",inline"`
+}
+
+// Device represents a disk to use in the cluster
+type Device struct {
+	// +optional
+	Name string `json:"name,omitempty"`
+	// +optional
+	FullPath string `json:"fullpath,omitempty"`
+	// +kubebuilder:pruning:PreserveUnknownFields
+	// +optional
+	Config map[string]string `json:"config,omitempty"`
+}
+
+type Selection struct {
+	// Whether to consume all the storage devices found on a machine
+	// +optional
+	UseAllDevices *bool `json:"useAllDevices,omitempty"`
+	// A regular expression to allow more fine-grained selection of devices on nodes across the cluster
+	// +optional
+	DeviceFilter string `json:"deviceFilter,omitempty"`
+	// A regular expression to allow more fine-grained selection of devices with path names
+	// +optional
+	DevicePathFilter string `json:"devicePathFilter,omitempty"`
+	// List of devices to use as storage devices
+	// +kubebuilder:pruning:PreserveUnknownFields
+	// +nullable
+	// +optional
+	Devices []Device `json:"devices,omitempty"`
+	// PersistentVolumeClaims to use as storage
+	// +optional
+	VolumeClaimTemplates []v1.PersistentVolumeClaim `json:"volumeClaimTemplates,omitempty"`
+}
+
+// PlacementSpec is the placement for core ceph daemons part of the CephCluster CRD
+type PlacementSpec map[rook.KeyType]Placement
+
+// Placement is the placement for an object
+type Placement struct {
+	// NodeAffinity is a group of node affinity scheduling rules
+	// +optional
+	NodeAffinity *v1.NodeAffinity `json:"nodeAffinity,omitempty"`
+	// PodAffinity is a group of inter pod affinity scheduling rules
+	// +optional
+	PodAffinity *v1.PodAffinity `json:"podAffinity,omitempty"`
+	// PodAntiAffinity is a group of inter pod anti affinity scheduling rules
+	// +optional
+	PodAntiAffinity *v1.PodAntiAffinity `json:"podAntiAffinity,omitempty"`
+	// The pod this Toleration is attached to tolerates any taint that matches
+	// the triple <key,value,effect> using the matching operator <operator>
+	// +optional
+	Tolerations []v1.Toleration `json:"tolerations,omitempty"`
+	// TopologySpreadConstraint specifies how to spread matching pods among the given topology
+	// +optional
+	TopologySpreadConstraints []v1.TopologySpreadConstraint `json:"topologySpreadConstraints,omitempty"`
+}
+
+// ResourceSpec is a collection of ResourceRequirements that describes the compute resource requirements
+type ResourceSpec map[string]v1.ResourceRequirements
+
+// ProbeSpec is a wrapper around Probe so it can be enabled or disabled for a Ceph daemon
+type ProbeSpec struct {
+	// Disabled determines whether probe is disable or not
+	// +optional
+	Disabled bool `json:"disabled,omitempty"`
+	// Probe describes a health check to be performed against a container to determine whether it is
+	// alive or ready to receive traffic.
+	// +optional
+	Probe *v1.Probe `json:"probe,omitempty"`
+}
+
+// PriorityClassNamesSpec is a map of priority class names to be assigned to components
+type PriorityClassNamesSpec map[rook.KeyType]string
+
+// StorageClassDeviceSet is a storage class device set
+// +nullable
+type StorageClassDeviceSet struct {
+	// Name is a unique identifier for the set
+	Name string `json:"name"`
+	// Count is the number of devices in this set
+	// +kubebuilder:validation:Minimum=1
+	Count int `json:"count"`
+	// +kubebuilder:pruning:PreserveUnknownFields
+	// +nullable
+	// +optional
+	Resources v1.ResourceRequirements `json:"resources,omitempty"` // Requests/limits for the devices
+	// +kubebuilder:pruning:PreserveUnknownFields
+	// +nullable
+	// +optional
+	Placement Placement `json:"placement,omitempty"` // Placement constraints for the device daemons
+	// +kubebuilder:pruning:PreserveUnknownFields
+	// +nullable
+	// +optional
+	PreparePlacement *Placement `json:"preparePlacement,omitempty"` // Placement constraints for the device preparation
+	// Provider-specific device configuration
+	// +kubebuilder:pruning:PreserveUnknownFields
+	// +nullable
+	// +optional
+	Config map[string]string `json:"config,omitempty"`
+	// VolumeClaimTemplates is a list of PVC templates for the underlying storage devices
+	VolumeClaimTemplates []v1.PersistentVolumeClaim `json:"volumeClaimTemplates"`
+	// Portable represents OSD portability across the hosts
+	// +optional
+	Portable bool `json:"portable,omitempty"`
+	// TuneSlowDeviceClass Tune the OSD when running on a slow Device Class
+	// +optional
+	TuneSlowDeviceClass bool `json:"tuneDeviceClass,omitempty"`
+	// TuneFastDeviceClass Tune the OSD when running on a fast Device Class
+	// +optional
+	TuneFastDeviceClass bool `json:"tuneFastDeviceClass,omitempty"`
+	// Scheduler name for OSD pod placement
+	// +optional
+	SchedulerName string `json:"schedulerName,omitempty"`
+	// Whether to encrypt the deviceSet
+	// +optional
+	Encrypted bool `json:"encrypted,omitempty"`
+}
diff --git a/pkg/apis/ceph.rook.io/v1/zz_generated.deepcopy.go b/pkg/apis/ceph.rook.io/v1/zz_generated.deepcopy.go
index 05ed60a56..19c21f5a8 100644
--- a/pkg/apis/ceph.rook.io/v1/zz_generated.deepcopy.go
+++ b/pkg/apis/ceph.rook.io/v1/zz_generated.deepcopy.go
@@ -21,19 +21,51 @@ limitations under the License.
 package v1
 
 import (
-	rookiov1 "github.com/rook/rook/pkg/apis/rook.io/v1"
+	rookio "github.com/rook/rook/pkg/apis/rook.io"
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	runtime "k8s.io/apimachinery/pkg/runtime"
 )
 
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in AnnotationsSpec) DeepCopyInto(out *AnnotationsSpec) {
+	{
+		in := &in
+		*out = make(AnnotationsSpec, len(*in))
+		for key, val := range *in {
+			var outVal map[string]string
+			if val == nil {
+				(*out)[key] = nil
+			} else {
+				in, out := &val, &outVal
+				*out = make(rookio.Annotations, len(*in))
+				for key, val := range *in {
+					(*out)[key] = val
+				}
+			}
+			(*out)[key] = outVal
+		}
+		return
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AnnotationsSpec.
+func (in AnnotationsSpec) DeepCopy() AnnotationsSpec {
+	if in == nil {
+		return nil
+	}
+	out := new(AnnotationsSpec)
+	in.DeepCopyInto(out)
+	return *out
+}
+
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *BucketHealthCheckSpec) DeepCopyInto(out *BucketHealthCheckSpec) {
 	*out = *in
 	in.Bucket.DeepCopyInto(&out.Bucket)
 	if in.LivenessProbe != nil {
 		in, out := &in.LivenessProbe, &out.LivenessProbe
-		*out = new(rookiov1.ProbeSpec)
+		*out = new(ProbeSpec)
 		(*in).DeepCopyInto(*out)
 	}
 	return
@@ -306,14 +338,14 @@ func (in *CephClusterHealthCheckSpec) DeepCopyInto(out *CephClusterHealthCheckSp
 	in.DaemonHealth.DeepCopyInto(&out.DaemonHealth)
 	if in.LivenessProbe != nil {
 		in, out := &in.LivenessProbe, &out.LivenessProbe
-		*out = make(map[rookiov1.KeyType]*rookiov1.ProbeSpec, len(*in))
+		*out = make(map[rookio.KeyType]*ProbeSpec, len(*in))
 		for key, val := range *in {
-			var outVal *rookiov1.ProbeSpec
+			var outVal *ProbeSpec
 			if val == nil {
 				(*out)[key] = nil
 			} else {
 				in, out := &val, &outVal
-				*out = new(rookiov1.ProbeSpec)
+				*out = new(ProbeSpec)
 				(*in).DeepCopyInto(*out)
 			}
 			(*out)[key] = outVal
@@ -1151,14 +1183,14 @@ func (in *ClusterSpec) DeepCopyInto(out *ClusterSpec) {
 	in.Storage.DeepCopyInto(&out.Storage)
 	if in.Annotations != nil {
 		in, out := &in.Annotations, &out.Annotations
-		*out = make(rookiov1.AnnotationsSpec, len(*in))
+		*out = make(AnnotationsSpec, len(*in))
 		for key, val := range *in {
 			var outVal map[string]string
 			if val == nil {
 				(*out)[key] = nil
 			} else {
 				in, out := &val, &outVal
-				*out = make(rookiov1.Annotations, len(*in))
+				*out = make(rookio.Annotations, len(*in))
 				for key, val := range *in {
 					(*out)[key] = val
 				}
@@ -1168,14 +1200,14 @@ func (in *ClusterSpec) DeepCopyInto(out *ClusterSpec) {
 	}
 	if in.Labels != nil {
 		in, out := &in.Labels, &out.Labels
-		*out = make(rookiov1.LabelsSpec, len(*in))
+		*out = make(LabelsSpec, len(*in))
 		for key, val := range *in {
 			var outVal map[string]string
 			if val == nil {
 				(*out)[key] = nil
 			} else {
 				in, out := &val, &outVal
-				*out = make(rookiov1.Labels, len(*in))
+				*out = make(rookio.Labels, len(*in))
 				for key, val := range *in {
 					(*out)[key] = val
 				}
@@ -1185,7 +1217,7 @@ func (in *ClusterSpec) DeepCopyInto(out *ClusterSpec) {
 	}
 	if in.Placement != nil {
 		in, out := &in.Placement, &out.Placement
-		*out = make(rookiov1.PlacementSpec, len(*in))
+		*out = make(PlacementSpec, len(*in))
 		for key, val := range *in {
 			(*out)[key] = *val.DeepCopy()
 		}
@@ -1193,14 +1225,14 @@ func (in *ClusterSpec) DeepCopyInto(out *ClusterSpec) {
 	in.Network.DeepCopyInto(&out.Network)
 	if in.Resources != nil {
 		in, out := &in.Resources, &out.Resources
-		*out = make(rookiov1.ResourceSpec, len(*in))
+		*out = make(ResourceSpec, len(*in))
 		for key, val := range *in {
 			(*out)[key] = *val.DeepCopy()
 		}
 	}
 	if in.PriorityClassNames != nil {
 		in, out := &in.PriorityClassNames, &out.PriorityClassNames
-		*out = make(rookiov1.PriorityClassNamesSpec, len(*in))
+		*out = make(PriorityClassNamesSpec, len(*in))
 		for key, val := range *in {
 			(*out)[key] = val
 		}
@@ -1352,6 +1384,29 @@ func (in *DashboardSpec) DeepCopy() *DashboardSpec {
 	return out
 }
 
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Device) DeepCopyInto(out *Device) {
+	*out = *in
+	if in.Config != nil {
+		in, out := &in.Config, &out.Config
+		*out = make(map[string]string, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Device.
+func (in *Device) DeepCopy() *Device {
+	if in == nil {
+		return nil
+	}
+	out := new(Device)
+	in.DeepCopyInto(out)
+	return out
+}
+
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *DeviceClasses) DeepCopyInto(out *DeviceClasses) {
 	*out = *in
@@ -1438,14 +1493,14 @@ func (in *FilesystemMirroringSpec) DeepCopyInto(out *FilesystemMirroringSpec) {
 	in.Placement.DeepCopyInto(&out.Placement)
 	if in.Annotations != nil {
 		in, out := &in.Annotations, &out.Annotations
-		*out = make(rookiov1.Annotations, len(*in))
+		*out = make(rookio.Annotations, len(*in))
 		for key, val := range *in {
 			(*out)[key] = val
 		}
 	}
 	if in.Labels != nil {
 		in, out := &in.Labels, &out.Labels
-		*out = make(rookiov1.Labels, len(*in))
+		*out = make(rookio.Labels, len(*in))
 		for key, val := range *in {
 			(*out)[key] = val
 		}
@@ -1512,14 +1567,14 @@ func (in *GaneshaServerSpec) DeepCopyInto(out *GaneshaServerSpec) {
 	in.Placement.DeepCopyInto(&out.Placement)
 	if in.Annotations != nil {
 		in, out := &in.Annotations, &out.Annotations
-		*out = make(rookiov1.Annotations, len(*in))
+		*out = make(rookio.Annotations, len(*in))
 		for key, val := range *in {
 			(*out)[key] = val
 		}
 	}
 	if in.Labels != nil {
 		in, out := &in.Labels, &out.Labels
-		*out = make(rookiov1.Labels, len(*in))
+		*out = make(rookio.Labels, len(*in))
 		for key, val := range *in {
 			(*out)[key] = val
 		}
@@ -1544,14 +1599,14 @@ func (in *GatewaySpec) DeepCopyInto(out *GatewaySpec) {
 	in.Placement.DeepCopyInto(&out.Placement)
 	if in.Annotations != nil {
 		in, out := &in.Annotations, &out.Annotations
-		*out = make(rookiov1.Annotations, len(*in))
+		*out = make(rookio.Annotations, len(*in))
 		for key, val := range *in {
 			(*out)[key] = val
 		}
 	}
 	if in.Labels != nil {
 		in, out := &in.Labels, &out.Labels
-		*out = make(rookiov1.Labels, len(*in))
+		*out = make(rookio.Labels, len(*in))
 		for key, val := range *in {
 			(*out)[key] = val
 		}
@@ -1626,6 +1681,38 @@ func (in *KeyManagementServiceSpec) DeepCopy() *KeyManagementServiceSpec {
 	return out
 }
 
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in LabelsSpec) DeepCopyInto(out *LabelsSpec) {
+	{
+		in := &in
+		*out = make(LabelsSpec, len(*in))
+		for key, val := range *in {
+			var outVal map[string]string
+			if val == nil {
+				(*out)[key] = nil
+			} else {
+				in, out := &val, &outVal
+				*out = make(rookio.Labels, len(*in))
+				for key, val := range *in {
+					(*out)[key] = val
+				}
+			}
+			(*out)[key] = outVal
+		}
+		return
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LabelsSpec.
+func (in LabelsSpec) DeepCopy() LabelsSpec {
+	if in == nil {
+		return nil
+	}
+	out := new(LabelsSpec)
+	in.DeepCopyInto(out)
+	return *out
+}
+
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *LogCollectorSpec) DeepCopyInto(out *LogCollectorSpec) {
 	*out = *in
@@ -1648,14 +1735,14 @@ func (in *MetadataServerSpec) DeepCopyInto(out *MetadataServerSpec) {
 	in.Placement.DeepCopyInto(&out.Placement)
 	if in.Annotations != nil {
 		in, out := &in.Annotations, &out.Annotations
-		*out = make(rookiov1.Annotations, len(*in))
+		*out = make(rookio.Annotations, len(*in))
 		for key, val := range *in {
 			(*out)[key] = val
 		}
 	}
 	if in.Labels != nil {
 		in, out := &in.Labels, &out.Labels
-		*out = make(rookiov1.Labels, len(*in))
+		*out = make(rookio.Labels, len(*in))
 		for key, val := range *in {
 			(*out)[key] = val
 		}
@@ -1857,7 +1944,13 @@ func (in *NFSGaneshaSpec) DeepCopy() *NFSGaneshaSpec {
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *NetworkSpec) DeepCopyInto(out *NetworkSpec) {
 	*out = *in
-	in.NetworkSpec.DeepCopyInto(&out.NetworkSpec)
+	if in.Selectors != nil {
+		in, out := &in.Selectors, &out.Selectors
+		*out = make(map[string]string, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val
+		}
+	}
 	return
 }
 
@@ -1871,6 +1964,53 @@ func (in *NetworkSpec) DeepCopy() *NetworkSpec {
 	return out
 }
 
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Node) DeepCopyInto(out *Node) {
+	*out = *in
+	in.Resources.DeepCopyInto(&out.Resources)
+	if in.Config != nil {
+		in, out := &in.Config, &out.Config
+		*out = make(map[string]string, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val
+		}
+	}
+	in.Selection.DeepCopyInto(&out.Selection)
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Node.
+func (in *Node) DeepCopy() *Node {
+	if in == nil {
+		return nil
+	}
+	out := new(Node)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in NodesByName) DeepCopyInto(out *NodesByName) {
+	{
+		in := &in
+		*out = make(NodesByName, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+		return
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodesByName.
+func (in NodesByName) DeepCopy() NodesByName {
+	if in == nil {
+		return nil
+	}
+	out := new(NodesByName)
+	in.DeepCopyInto(out)
+	return *out
+}
+
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *ObjectRealmSpec) DeepCopyInto(out *ObjectRealmSpec) {
 	*out = *in
@@ -2031,6 +2171,73 @@ func (in *PeersSpec) DeepCopy() *PeersSpec {
 	return out
 }
 
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Placement) DeepCopyInto(out *Placement) {
+	*out = *in
+	if in.NodeAffinity != nil {
+		in, out := &in.NodeAffinity, &out.NodeAffinity
+		*out = new(corev1.NodeAffinity)
+		(*in).DeepCopyInto(*out)
+	}
+	if in.PodAffinity != nil {
+		in, out := &in.PodAffinity, &out.PodAffinity
+		*out = new(corev1.PodAffinity)
+		(*in).DeepCopyInto(*out)
+	}
+	if in.PodAntiAffinity != nil {
+		in, out := &in.PodAntiAffinity, &out.PodAntiAffinity
+		*out = new(corev1.PodAntiAffinity)
+		(*in).DeepCopyInto(*out)
+	}
+	if in.Tolerations != nil {
+		in, out := &in.Tolerations, &out.Tolerations
+		*out = make([]corev1.Toleration, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	if in.TopologySpreadConstraints != nil {
+		in, out := &in.TopologySpreadConstraints, &out.TopologySpreadConstraints
+		*out = make([]corev1.TopologySpreadConstraint, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Placement.
+func (in *Placement) DeepCopy() *Placement {
+	if in == nil {
+		return nil
+	}
+	out := new(Placement)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in PlacementSpec) DeepCopyInto(out *PlacementSpec) {
+	{
+		in := &in
+		*out = make(PlacementSpec, len(*in))
+		for key, val := range *in {
+			(*out)[key] = *val.DeepCopy()
+		}
+		return
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PlacementSpec.
+func (in PlacementSpec) DeepCopy() PlacementSpec {
+	if in == nil {
+		return nil
+	}
+	out := new(PlacementSpec)
+	in.DeepCopyInto(out)
+	return *out
+}
+
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *PoolMirroringInfo) DeepCopyInto(out *PoolMirroringInfo) {
 	*out = *in
@@ -2118,6 +2325,49 @@ func (in *PoolSpec) DeepCopy() *PoolSpec {
 	return out
 }
 
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in PriorityClassNamesSpec) DeepCopyInto(out *PriorityClassNamesSpec) {
+	{
+		in := &in
+		*out = make(PriorityClassNamesSpec, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val
+		}
+		return
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PriorityClassNamesSpec.
+func (in PriorityClassNamesSpec) DeepCopy() PriorityClassNamesSpec {
+	if in == nil {
+		return nil
+	}
+	out := new(PriorityClassNamesSpec)
+	in.DeepCopyInto(out)
+	return *out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ProbeSpec) DeepCopyInto(out *ProbeSpec) {
+	*out = *in
+	if in.Probe != nil {
+		in, out := &in.Probe, &out.Probe
+		*out = new(corev1.Probe)
+		(*in).DeepCopyInto(*out)
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProbeSpec.
+func (in *ProbeSpec) DeepCopy() *ProbeSpec {
+	if in == nil {
+		return nil
+	}
+	out := new(ProbeSpec)
+	in.DeepCopyInto(out)
+	return out
+}
+
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *PullSpec) DeepCopyInto(out *PullSpec) {
 	*out = *in
@@ -2193,14 +2443,14 @@ func (in *RBDMirroringSpec) DeepCopyInto(out *RBDMirroringSpec) {
 	in.Placement.DeepCopyInto(&out.Placement)
 	if in.Annotations != nil {
 		in, out := &in.Annotations, &out.Annotations
-		*out = make(rookiov1.Annotations, len(*in))
+		*out = make(rookio.Annotations, len(*in))
 		for key, val := range *in {
 			(*out)[key] = val
 		}
 	}
 	if in.Labels != nil {
 		in, out := &in.Labels, &out.Labels
-		*out = make(rookiov1.Labels, len(*in))
+		*out = make(rookio.Labels, len(*in))
 		for key, val := range *in {
 			(*out)[key] = val
 		}
@@ -2224,7 +2474,7 @@ func (in *RGWServiceSpec) DeepCopyInto(out *RGWServiceSpec) {
 	*out = *in
 	if in.Annotations != nil {
 		in, out := &in.Annotations, &out.Annotations
-		*out = make(rookiov1.Annotations, len(*in))
+		*out = make(rookio.Annotations, len(*in))
 		for key, val := range *in {
 			(*out)[key] = val
 		}
@@ -2258,6 +2508,28 @@ func (in *ReplicatedSpec) DeepCopy() *ReplicatedSpec {
 	return out
 }
 
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in ResourceSpec) DeepCopyInto(out *ResourceSpec) {
+	{
+		in := &in
+		*out = make(ResourceSpec, len(*in))
+		for key, val := range *in {
+			(*out)[key] = *val.DeepCopy()
+		}
+		return
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceSpec.
+func (in ResourceSpec) DeepCopy() ResourceSpec {
+	if in == nil {
+		return nil
+	}
+	out := new(ResourceSpec)
+	in.DeepCopyInto(out)
+	return *out
+}
+
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *SanitizeDisksSpec) DeepCopyInto(out *SanitizeDisksSpec) {
 	*out = *in
@@ -2291,6 +2563,41 @@ func (in *SecuritySpec) DeepCopy() *SecuritySpec {
 	return out
 }
 
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Selection) DeepCopyInto(out *Selection) {
+	*out = *in
+	if in.UseAllDevices != nil {
+		in, out := &in.UseAllDevices, &out.UseAllDevices
+		*out = new(bool)
+		**out = **in
+	}
+	if in.Devices != nil {
+		in, out := &in.Devices, &out.Devices
+		*out = make([]Device, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	if in.VolumeClaimTemplates != nil {
+		in, out := &in.VolumeClaimTemplates, &out.VolumeClaimTemplates
+		*out = make([]corev1.PersistentVolumeClaim, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Selection.
+func (in *Selection) DeepCopy() *Selection {
+	if in == nil {
+		return nil
+	}
+	out := new(Selection)
+	in.DeepCopyInto(out)
+	return out
+}
+
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *SnapshotSchedule) DeepCopyInto(out *SnapshotSchedule) {
 	*out = *in
@@ -2399,6 +2706,81 @@ func (in *Status) DeepCopy() *Status {
 	return out
 }
 
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *StorageClassDeviceSet) DeepCopyInto(out *StorageClassDeviceSet) {
+	*out = *in
+	in.Resources.DeepCopyInto(&out.Resources)
+	in.Placement.DeepCopyInto(&out.Placement)
+	if in.PreparePlacement != nil {
+		in, out := &in.PreparePlacement, &out.PreparePlacement
+		*out = new(Placement)
+		(*in).DeepCopyInto(*out)
+	}
+	if in.Config != nil {
+		in, out := &in.Config, &out.Config
+		*out = make(map[string]string, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val
+		}
+	}
+	if in.VolumeClaimTemplates != nil {
+		in, out := &in.VolumeClaimTemplates, &out.VolumeClaimTemplates
+		*out = make([]corev1.PersistentVolumeClaim, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StorageClassDeviceSet.
+func (in *StorageClassDeviceSet) DeepCopy() *StorageClassDeviceSet {
+	if in == nil {
+		return nil
+	}
+	out := new(StorageClassDeviceSet)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *StorageScopeSpec) DeepCopyInto(out *StorageScopeSpec) {
+	*out = *in
+	if in.Nodes != nil {
+		in, out := &in.Nodes, &out.Nodes
+		*out = make([]Node, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	if in.Config != nil {
+		in, out := &in.Config, &out.Config
+		*out = make(map[string]string, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val
+		}
+	}
+	in.Selection.DeepCopyInto(&out.Selection)
+	if in.StorageClassDeviceSets != nil {
+		in, out := &in.StorageClassDeviceSets, &out.StorageClassDeviceSets
+		*out = make([]StorageClassDeviceSet, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StorageScopeSpec.
+func (in *StorageScopeSpec) DeepCopy() *StorageScopeSpec {
+	if in == nil {
+		return nil
+	}
+	out := new(StorageScopeSpec)
+	in.DeepCopyInto(out)
+	return out
+}
+
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *StretchClusterSpec) DeepCopyInto(out *StretchClusterSpec) {
 	*out = *in
diff --git a/pkg/apis/nfs.rook.io/v1alpha1/types.go b/pkg/apis/nfs.rook.io/v1alpha1/types.go
index a7f89bfaf..6aee04443 100644
--- a/pkg/apis/nfs.rook.io/v1alpha1/types.go
+++ b/pkg/apis/nfs.rook.io/v1alpha1/types.go
@@ -16,7 +16,6 @@ limitations under the License.
 package v1alpha1
 
 import (
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
 	v1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
@@ -83,7 +82,7 @@ type NFSServerList struct {
 // NFSServerSpec represents the spec of NFS daemon
 type NFSServerSpec struct {
 	// The annotations-related configuration to add/set on each Pod related object.
-	Annotations rookv1.Annotations `json:"annotations,omitempty"`
+	Annotations map[string]string `json:"annotations,omitempty"`
 
 	// Replicas of the NFS daemon
 	Replicas int `json:"replicas,omitempty"`
diff --git a/pkg/apis/nfs.rook.io/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/nfs.rook.io/v1alpha1/zz_generated.deepcopy.go
index d13b29bcc..7294f0cda 100644
--- a/pkg/apis/nfs.rook.io/v1alpha1/zz_generated.deepcopy.go
+++ b/pkg/apis/nfs.rook.io/v1alpha1/zz_generated.deepcopy.go
@@ -21,7 +21,6 @@ limitations under the License.
 package v1alpha1
 
 import (
-	v1 "github.com/rook/rook/pkg/apis/rook.io/v1"
 	runtime "k8s.io/apimachinery/pkg/runtime"
 )
 
@@ -130,7 +129,7 @@ func (in *NFSServerSpec) DeepCopyInto(out *NFSServerSpec) {
 	*out = *in
 	if in.Annotations != nil {
 		in, out := &in.Annotations, &out.Annotations
-		*out = make(v1.Annotations, len(*in))
+		*out = make(map[string]string, len(*in))
 		for key, val := range *in {
 			(*out)[key] = val
 		}
diff --git a/pkg/apis/rook.io/v1/annotations.go b/pkg/apis/rook.io/annotations.go
similarity index 79%
rename from pkg/apis/rook.io/v1/annotations.go
rename to pkg/apis/rook.io/annotations.go
index 774152139..2d24fd66b 100644
--- a/pkg/apis/rook.io/v1/annotations.go
+++ b/pkg/apis/rook.io/annotations.go
@@ -1,11 +1,11 @@
 /*
-Copyright 2019 The Rook Authors. All rights reserved.
+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
+    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,
@@ -14,15 +14,12 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-package v1
+package rook
 
-import (
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-)
+import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 
-func (a AnnotationsSpec) All() Annotations {
-	return a[KeyAll]
-}
+// Annotations are annotations
+type Annotations map[string]string
 
 // ApplyToObjectMeta adds annotations to object meta unless the keys are already defined.
 func (a Annotations) ApplyToObjectMeta(t *metav1.ObjectMeta) {
@@ -39,7 +36,7 @@ func (a Annotations) ApplyToObjectMeta(t *metav1.ObjectMeta) {
 // Merge returns an Annotations which results from merging the attributes of the
 // original Annotations with the attributes of the supplied one. The supplied
 // Placement's attributes will override the original ones if defined.
-func (a Annotations) Merge(with Annotations) Annotations {
+func (a Annotations) Merge(with map[string]string) Annotations {
 	ret := a
 	if ret == nil {
 		ret = map[string]string{}
diff --git a/pkg/apis/rook.io/v1/labels.go b/pkg/apis/rook.io/labels.go
similarity index 72%
rename from pkg/apis/rook.io/v1/labels.go
rename to pkg/apis/rook.io/labels.go
index dd62ae97d..85a6de000 100644
--- a/pkg/apis/rook.io/v1/labels.go
+++ b/pkg/apis/rook.io/labels.go
@@ -5,7 +5,7 @@ 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
+    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,
@@ -14,15 +14,23 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-package v1
+package rook
 
 import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
-func (a LabelsSpec) All() Labels {
-	return a[KeyAll]
-}
+// ***************************************************************************
+// IMPORTANT FOR CODE GENERATION
+// If the types in this file are updated, you will need to run
+// `make codegen` to generate the new types under the client/clientset folder.
+// ***************************************************************************
+
+// KeyType type safety
+type KeyType string
+
+// Labels are label for a given daemons
+type Labels map[string]string
 
 // ApplyToObjectMeta adds labels to object meta unless the keys are already defined.
 func (a Labels) ApplyToObjectMeta(t *metav1.ObjectMeta) {
diff --git a/pkg/apis/rook.io/register.go b/pkg/apis/rook.io/register.go
deleted file mode 100644
index ad4812857..000000000
--- a/pkg/apis/rook.io/register.go
+++ /dev/null
@@ -1,5 +0,0 @@
-package rookio
-
-const (
-	CustomResourceGroupName = "rook.io"
-)
diff --git a/pkg/apis/rook.io/v1/doc.go b/pkg/apis/rook.io/v1/doc.go
deleted file mode 100644
index 42fcf1d72..000000000
--- a/pkg/apis/rook.io/v1/doc.go
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
-Copyright 2018 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.
-*/
-
-// +k8s:deepcopy-gen=package,register
-
-// Package v1 is the v1 version of the rook.io API.
-// +groupName=rook.io
-package v1
diff --git a/pkg/apis/rook.io/v1/keys.go b/pkg/apis/rook.io/v1/keys.go
deleted file mode 100644
index 62d86d373..000000000
--- a/pkg/apis/rook.io/v1/keys.go
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
-Copyright 2018 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 v1
-
-const (
-	KeyAll = "all"
-)
diff --git a/pkg/apis/rook.io/v1/network.go b/pkg/apis/rook.io/v1/network.go
deleted file mode 100644
index b414f0aab..000000000
--- a/pkg/apis/rook.io/v1/network.go
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
-Copyright 2019 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 v1
-
-// IsHost get whether to use host network provider
-func (net *NetworkSpec) IsHost() bool {
-	return net.Provider == "host"
-}
-
-// IsMultus get whether to use multus network provider
-func (net *NetworkSpec) IsMultus() bool {
-	return net.Provider == "multus"
-}
diff --git a/pkg/apis/rook.io/v1/placement.go b/pkg/apis/rook.io/v1/placement.go
deleted file mode 100644
index 80bae3ba5..000000000
--- a/pkg/apis/rook.io/v1/placement.go
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
-Copyright 2018 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 v1
-
-import (
-	v1 "k8s.io/api/core/v1"
-)
-
-func (p PlacementSpec) All() Placement {
-	return p[KeyAll]
-}
-
-// ApplyToPodSpec adds placement to a pod spec
-func (p Placement) ApplyToPodSpec(t *v1.PodSpec) {
-	if t.Affinity == nil {
-		t.Affinity = &v1.Affinity{}
-	}
-	if p.NodeAffinity != nil {
-		t.Affinity.NodeAffinity = p.mergeNodeAffinity(t.Affinity.NodeAffinity)
-	}
-	if p.PodAffinity != nil {
-		t.Affinity.PodAffinity = p.PodAffinity.DeepCopy()
-	}
-	if p.PodAntiAffinity != nil {
-		t.Affinity.PodAntiAffinity = p.PodAntiAffinity.DeepCopy()
-	}
-	if p.Tolerations != nil {
-		t.Tolerations = p.Tolerations
-	}
-	if p.TopologySpreadConstraints != nil {
-		t.TopologySpreadConstraints = p.TopologySpreadConstraints
-	}
-}
-
-func (p Placement) mergeNodeAffinity(nodeAffinity *v1.NodeAffinity) *v1.NodeAffinity {
-	// no node affinity is specified yet, so return the placement's nodeAffinity
-	result := p.NodeAffinity.DeepCopy()
-	if nodeAffinity == nil {
-		return result
-	}
-
-	// merge the preferred node affinity that was already specified, and the placement's nodeAffinity
-	result.PreferredDuringSchedulingIgnoredDuringExecution = append(
-		nodeAffinity.PreferredDuringSchedulingIgnoredDuringExecution,
-		p.NodeAffinity.PreferredDuringSchedulingIgnoredDuringExecution...)
-
-	// nothing to merge if no affinity was passed in
-	if nodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution == nil {
-		return result
-	}
-	// take the desired affinity if there was none on the placement
-	if p.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution == nil {
-		result.RequiredDuringSchedulingIgnoredDuringExecution = nodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution
-		return result
-	}
-	// take the desired affinity node selectors without the need to merge
-	if len(nodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms) == 0 {
-		return result
-	}
-	// take the placement affinity node selectors without the need to merge
-	if len(p.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms) == 0 {
-		// take the placement from the first option since the second isn't specified
-		result.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms =
-			nodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms
-		return result
-	}
-
-	// merge the match expressions together since they are defined in both placements
-	// this will only work if we want an "and" between all the expressions, more complex conditions won't work with this merge
-	var nodeTerm v1.NodeSelectorTerm
-	nodeTerm.MatchExpressions = append(
-		nodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms[0].MatchExpressions,
-		p.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms[0].MatchExpressions...)
-	nodeTerm.MatchFields = append(
-		nodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms[0].MatchFields,
-		p.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms[0].MatchFields...)
-	result.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms[0] = nodeTerm
-
-	return result
-}
-
-// Merge returns a Placement which results from merging the attributes of the
-// original Placement with the attributes of the supplied one. The supplied
-// Placement's attributes will override the original ones if defined.
-func (p Placement) Merge(with Placement) Placement {
-	ret := p
-	if with.NodeAffinity != nil {
-		ret.NodeAffinity = with.NodeAffinity
-	}
-	if with.PodAffinity != nil {
-		ret.PodAffinity = with.PodAffinity
-	}
-	if with.PodAntiAffinity != nil {
-		ret.PodAntiAffinity = with.PodAntiAffinity
-	}
-	if with.Tolerations != nil {
-		ret.Tolerations = with.Tolerations
-	}
-	if with.TopologySpreadConstraints != nil {
-		ret.TopologySpreadConstraints = with.TopologySpreadConstraints
-	}
-	return ret
-}
diff --git a/pkg/apis/rook.io/v1/priorityclasses.go b/pkg/apis/rook.io/v1/priorityclasses.go
deleted file mode 100644
index 70a36364d..000000000
--- a/pkg/apis/rook.io/v1/priorityclasses.go
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
-Copyright 2019 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 v1
-
-// All returns the priority class name defined for 'all' daemons in the Ceph cluster CRD.
-func (p PriorityClassNamesSpec) All() string {
-	if val, ok := p[KeyAll]; ok {
-		return val
-	}
-	return ""
-}
diff --git a/pkg/apis/rook.io/v1/register.go b/pkg/apis/rook.io/v1/register.go
deleted file mode 100644
index 5e7774b44..000000000
--- a/pkg/apis/rook.io/v1/register.go
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
-Copyright 2016 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 v1
-
-import (
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	"k8s.io/apimachinery/pkg/runtime"
-	"k8s.io/apimachinery/pkg/runtime/schema"
-
-	rookio "github.com/rook/rook/pkg/apis/rook.io"
-)
-
-const (
-	Version = "v1"
-)
-
-// SchemeGroupVersion is group version used to register these objects
-var SchemeGroupVersion = schema.GroupVersion{Group: rookio.CustomResourceGroupName, Version: Version}
-
-// Resource takes an unqualified resource and returns a Group qualified GroupResource
-func Resource(resource string) schema.GroupResource {
-	return SchemeGroupVersion.WithResource(resource).GroupResource()
-}
-
-var (
-	// SchemeBuilder and AddToScheme will stay in k8s.io/kubernetes.
-	SchemeBuilder      runtime.SchemeBuilder
-	localSchemeBuilder = &SchemeBuilder
-	AddToScheme        = localSchemeBuilder.AddToScheme
-)
-
-func init() {
-	// We only register manually written functions here. The registration of the
-	// generated functions takes place in the generated files. The separation
-	// makes the code compile even when the generated files are missing.
-	localSchemeBuilder.Register(addKnownTypes)
-}
-
-// Adds the list of known types to api.Scheme.
-func addKnownTypes(scheme *runtime.Scheme) error {
-	scheme.AddKnownTypes(SchemeGroupVersion)
-	metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
-	return nil
-}
diff --git a/pkg/apis/rook.io/v1/types.go b/pkg/apis/rook.io/v1/types.go
deleted file mode 100644
index f1bac1007..000000000
--- a/pkg/apis/rook.io/v1/types.go
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
-Copyright 2018 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 v1
-
-import (
-	v1 "k8s.io/api/core/v1"
-)
-
-// ************************************************************************************
-// IMPORTANT FOR CODE GENERATION
-// If any of the types with codegen tags in this file are updated, you will need to run
-// `make codegen` to generate the new types under the client/clientset folder.
-// ************************************************************************************
-
-type StorageScopeSpec struct {
-	// +nullable
-	// +optional
-	Nodes []Node `json:"nodes,omitempty"`
-	// +optional
-	UseAllNodes bool `json:"useAllNodes,omitempty"`
-	// +kubebuilder:pruning:PreserveUnknownFields
-	// +nullable
-	// +optional
-	Config    map[string]string `json:"config,omitempty"`
-	Selection `json:",inline"`
-	// +nullable
-	// +optional
-	StorageClassDeviceSets []StorageClassDeviceSet `json:"storageClassDeviceSets,omitempty"`
-}
-
-// Node is a storage nodes
-// +nullable
-type Node struct {
-	// +optional
-	Name string `json:"name,omitempty"`
-	// +kubebuilder:pruning:PreserveUnknownFields
-	// +nullable
-	// +optional
-	Resources v1.ResourceRequirements `json:"resources,omitempty"`
-	// +kubebuilder:pruning:PreserveUnknownFields
-	// +nullable
-	// +optional
-	Config    map[string]string `json:"config,omitempty"`
-	Selection `json:",inline"`
-}
-
-// Device represents a disk to use in the cluster
-type Device struct {
-	// +optional
-	Name string `json:"name,omitempty"`
-	// +optional
-	FullPath string `json:"fullpath,omitempty"`
-	// +kubebuilder:pruning:PreserveUnknownFields
-	// +optional
-	Config map[string]string `json:"config,omitempty"`
-}
-
-type Selection struct {
-	// Whether to consume all the storage devices found on a machine
-	// +optional
-	UseAllDevices *bool `json:"useAllDevices,omitempty"`
-	// A regular expression to allow more fine-grained selection of devices on nodes across the cluster
-	// +optional
-	DeviceFilter string `json:"deviceFilter,omitempty"`
-	// A regular expression to allow more fine-grained selection of devices with path names
-	// +optional
-	DevicePathFilter string `json:"devicePathFilter,omitempty"`
-	// List of devices to use as storage devices
-	// +kubebuilder:pruning:PreserveUnknownFields
-	// +nullable
-	// +optional
-	Devices []Device `json:"devices,omitempty"`
-	// PersistentVolumeClaims to use as storage
-	// +optional
-	VolumeClaimTemplates []v1.PersistentVolumeClaim `json:"volumeClaimTemplates,omitempty"`
-}
-
-// PlacementSpec is the placement for core ceph daemons part of the CephCluster CRD
-type PlacementSpec map[KeyType]Placement
-
-// Placement is the placement for an object
-type Placement struct {
-	// NodeAffinity is a group of node affinity scheduling rules
-	// +optional
-	NodeAffinity *v1.NodeAffinity `json:"nodeAffinity,omitempty"`
-	// PodAffinity is a group of inter pod affinity scheduling rules
-	// +optional
-	PodAffinity *v1.PodAffinity `json:"podAffinity,omitempty"`
-	// PodAntiAffinity is a group of inter pod anti affinity scheduling rules
-	// +optional
-	PodAntiAffinity *v1.PodAntiAffinity `json:"podAntiAffinity,omitempty"`
-	// The pod this Toleration is attached to tolerates any taint that matches
-	// the triple <key,value,effect> using the matching operator <operator>
-	// +optional
-	Tolerations []v1.Toleration `json:"tolerations,omitempty"`
-	// TopologySpreadConstraint specifies how to spread matching pods among the given topology
-	// +optional
-	TopologySpreadConstraints []v1.TopologySpreadConstraint `json:"topologySpreadConstraints,omitempty"`
-}
-
-// ResourceSpec is a collection of ResourceRequirements that describes the compute resource requirements
-type ResourceSpec map[string]v1.ResourceRequirements
-
-// ProbeSpec is a wrapper around Probe so it can be enabled or disabled for a Ceph daemon
-type ProbeSpec struct {
-	// Disabled determines whether probe is disable or not
-	// +optional
-	Disabled bool `json:"disabled,omitempty"`
-	// Probe describes a health check to be performed against a container to determine whether it is
-	// alive or ready to receive traffic.
-	// +optional
-	Probe *v1.Probe `json:"probe,omitempty"`
-}
-
-// PriorityClassNamesSpec is a map of priority class names to be assigned to components
-type PriorityClassNamesSpec map[KeyType]string
-
-// NetworkSpec represents cluster network settings
-type NetworkSpec struct {
-	// Provider is what provides network connectivity to the cluster e.g. "host" or "multus"
-	// +nullable
-	// +optional
-	Provider string `json:"provider,omitempty"`
-
-	// Selectors string values describe what networks will be used to connect the cluster.
-	// Meanwhile the keys describe each network respective responsibilities or any metadata
-	// storage provider decide.
-	// +nullable
-	// +optional
-	Selectors map[string]string `json:"selectors,omitempty"`
-}
-
-// KeyType type safety
-type KeyType string
-
-// AnnotationsSpec is the main spec annotation for all daemons
-// +kubebuilder:pruning:PreserveUnknownFields
-// +nullable
-type AnnotationsSpec map[KeyType]Annotations
-
-// Annotations are annotations
-type Annotations map[string]string
-
-// LabelsSpec is the main spec label for all daemons
-type LabelsSpec map[KeyType]Labels
-
-// Labels are label for a given daemons
-type Labels map[string]string
-
-// StorageClassDeviceSet is a storage class device set
-// +nullable
-type StorageClassDeviceSet struct {
-	// Name is a unique identifier for the set
-	Name string `json:"name"`
-	// Count is the number of devices in this set
-	// +kubebuilder:validation:Minimum=1
-	Count int `json:"count"`
-	// +kubebuilder:pruning:PreserveUnknownFields
-	// +nullable
-	// +optional
-	Resources v1.ResourceRequirements `json:"resources,omitempty"` // Requests/limits for the devices
-	// +kubebuilder:pruning:PreserveUnknownFields
-	// +nullable
-	// +optional
-	Placement Placement `json:"placement,omitempty"` // Placement constraints for the device daemons
-	// +kubebuilder:pruning:PreserveUnknownFields
-	// +nullable
-	// +optional
-	PreparePlacement *Placement `json:"preparePlacement,omitempty"` // Placement constraints for the device preparation
-	// Provider-specific device configuration
-	// +kubebuilder:pruning:PreserveUnknownFields
-	// +nullable
-	// +optional
-	Config map[string]string `json:"config,omitempty"`
-	// VolumeClaimTemplates is a list of PVC templates for the underlying storage devices
-	VolumeClaimTemplates []v1.PersistentVolumeClaim `json:"volumeClaimTemplates"`
-	// Portable represents OSD portability across the hosts
-	// +optional
-	Portable bool `json:"portable,omitempty"`
-	// TuneSlowDeviceClass Tune the OSD when running on a slow Device Class
-	// +optional
-	TuneSlowDeviceClass bool `json:"tuneDeviceClass,omitempty"`
-	// TuneFastDeviceClass Tune the OSD when running on a fast Device Class
-	// +optional
-	TuneFastDeviceClass bool `json:"tuneFastDeviceClass,omitempty"`
-	// Scheduler name for OSD pod placement
-	// +optional
-	SchedulerName string `json:"schedulerName,omitempty"`
-	// Whether to encrypt the deviceSet
-	// +optional
-	Encrypted bool `json:"encrypted,omitempty"`
-}
diff --git a/pkg/apis/rook.io/v1/zz_generated.deepcopy.go b/pkg/apis/rook.io/v1/zz_generated.deepcopy.go
deleted file mode 100644
index 5a745d3b7..000000000
--- a/pkg/apis/rook.io/v1/zz_generated.deepcopy.go
+++ /dev/null
@@ -1,468 +0,0 @@
-// +build !ignore_autogenerated
-
-/*
-Copyright The Kubernetes Authors.
-
-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.
-*/
-
-// Code generated by deepcopy-gen. DO NOT EDIT.
-
-package v1
-
-import (
-	corev1 "k8s.io/api/core/v1"
-)
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in Annotations) DeepCopyInto(out *Annotations) {
-	{
-		in := &in
-		*out = make(Annotations, len(*in))
-		for key, val := range *in {
-			(*out)[key] = val
-		}
-		return
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Annotations.
-func (in Annotations) DeepCopy() Annotations {
-	if in == nil {
-		return nil
-	}
-	out := new(Annotations)
-	in.DeepCopyInto(out)
-	return *out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in AnnotationsSpec) DeepCopyInto(out *AnnotationsSpec) {
-	{
-		in := &in
-		*out = make(AnnotationsSpec, len(*in))
-		for key, val := range *in {
-			var outVal map[string]string
-			if val == nil {
-				(*out)[key] = nil
-			} else {
-				in, out := &val, &outVal
-				*out = make(Annotations, len(*in))
-				for key, val := range *in {
-					(*out)[key] = val
-				}
-			}
-			(*out)[key] = outVal
-		}
-		return
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AnnotationsSpec.
-func (in AnnotationsSpec) DeepCopy() AnnotationsSpec {
-	if in == nil {
-		return nil
-	}
-	out := new(AnnotationsSpec)
-	in.DeepCopyInto(out)
-	return *out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *Device) DeepCopyInto(out *Device) {
-	*out = *in
-	if in.Config != nil {
-		in, out := &in.Config, &out.Config
-		*out = make(map[string]string, len(*in))
-		for key, val := range *in {
-			(*out)[key] = val
-		}
-	}
-	return
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Device.
-func (in *Device) DeepCopy() *Device {
-	if in == nil {
-		return nil
-	}
-	out := new(Device)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in Labels) DeepCopyInto(out *Labels) {
-	{
-		in := &in
-		*out = make(Labels, len(*in))
-		for key, val := range *in {
-			(*out)[key] = val
-		}
-		return
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Labels.
-func (in Labels) DeepCopy() Labels {
-	if in == nil {
-		return nil
-	}
-	out := new(Labels)
-	in.DeepCopyInto(out)
-	return *out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in LabelsSpec) DeepCopyInto(out *LabelsSpec) {
-	{
-		in := &in
-		*out = make(LabelsSpec, len(*in))
-		for key, val := range *in {
-			var outVal map[string]string
-			if val == nil {
-				(*out)[key] = nil
-			} else {
-				in, out := &val, &outVal
-				*out = make(Labels, len(*in))
-				for key, val := range *in {
-					(*out)[key] = val
-				}
-			}
-			(*out)[key] = outVal
-		}
-		return
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LabelsSpec.
-func (in LabelsSpec) DeepCopy() LabelsSpec {
-	if in == nil {
-		return nil
-	}
-	out := new(LabelsSpec)
-	in.DeepCopyInto(out)
-	return *out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *NetworkSpec) DeepCopyInto(out *NetworkSpec) {
-	*out = *in
-	if in.Selectors != nil {
-		in, out := &in.Selectors, &out.Selectors
-		*out = make(map[string]string, len(*in))
-		for key, val := range *in {
-			(*out)[key] = val
-		}
-	}
-	return
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkSpec.
-func (in *NetworkSpec) DeepCopy() *NetworkSpec {
-	if in == nil {
-		return nil
-	}
-	out := new(NetworkSpec)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *Node) DeepCopyInto(out *Node) {
-	*out = *in
-	in.Resources.DeepCopyInto(&out.Resources)
-	if in.Config != nil {
-		in, out := &in.Config, &out.Config
-		*out = make(map[string]string, len(*in))
-		for key, val := range *in {
-			(*out)[key] = val
-		}
-	}
-	in.Selection.DeepCopyInto(&out.Selection)
-	return
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Node.
-func (in *Node) DeepCopy() *Node {
-	if in == nil {
-		return nil
-	}
-	out := new(Node)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in NodesByName) DeepCopyInto(out *NodesByName) {
-	{
-		in := &in
-		*out = make(NodesByName, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
-		return
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodesByName.
-func (in NodesByName) DeepCopy() NodesByName {
-	if in == nil {
-		return nil
-	}
-	out := new(NodesByName)
-	in.DeepCopyInto(out)
-	return *out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *Placement) DeepCopyInto(out *Placement) {
-	*out = *in
-	if in.NodeAffinity != nil {
-		in, out := &in.NodeAffinity, &out.NodeAffinity
-		*out = new(corev1.NodeAffinity)
-		(*in).DeepCopyInto(*out)
-	}
-	if in.PodAffinity != nil {
-		in, out := &in.PodAffinity, &out.PodAffinity
-		*out = new(corev1.PodAffinity)
-		(*in).DeepCopyInto(*out)
-	}
-	if in.PodAntiAffinity != nil {
-		in, out := &in.PodAntiAffinity, &out.PodAntiAffinity
-		*out = new(corev1.PodAntiAffinity)
-		(*in).DeepCopyInto(*out)
-	}
-	if in.Tolerations != nil {
-		in, out := &in.Tolerations, &out.Tolerations
-		*out = make([]corev1.Toleration, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
-	}
-	if in.TopologySpreadConstraints != nil {
-		in, out := &in.TopologySpreadConstraints, &out.TopologySpreadConstraints
-		*out = make([]corev1.TopologySpreadConstraint, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
-	}
-	return
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Placement.
-func (in *Placement) DeepCopy() *Placement {
-	if in == nil {
-		return nil
-	}
-	out := new(Placement)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in PlacementSpec) DeepCopyInto(out *PlacementSpec) {
-	{
-		in := &in
-		*out = make(PlacementSpec, len(*in))
-		for key, val := range *in {
-			(*out)[key] = *val.DeepCopy()
-		}
-		return
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PlacementSpec.
-func (in PlacementSpec) DeepCopy() PlacementSpec {
-	if in == nil {
-		return nil
-	}
-	out := new(PlacementSpec)
-	in.DeepCopyInto(out)
-	return *out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in PriorityClassNamesSpec) DeepCopyInto(out *PriorityClassNamesSpec) {
-	{
-		in := &in
-		*out = make(PriorityClassNamesSpec, len(*in))
-		for key, val := range *in {
-			(*out)[key] = val
-		}
-		return
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PriorityClassNamesSpec.
-func (in PriorityClassNamesSpec) DeepCopy() PriorityClassNamesSpec {
-	if in == nil {
-		return nil
-	}
-	out := new(PriorityClassNamesSpec)
-	in.DeepCopyInto(out)
-	return *out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *ProbeSpec) DeepCopyInto(out *ProbeSpec) {
-	*out = *in
-	if in.Probe != nil {
-		in, out := &in.Probe, &out.Probe
-		*out = new(corev1.Probe)
-		(*in).DeepCopyInto(*out)
-	}
-	return
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProbeSpec.
-func (in *ProbeSpec) DeepCopy() *ProbeSpec {
-	if in == nil {
-		return nil
-	}
-	out := new(ProbeSpec)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in ResourceSpec) DeepCopyInto(out *ResourceSpec) {
-	{
-		in := &in
-		*out = make(ResourceSpec, len(*in))
-		for key, val := range *in {
-			(*out)[key] = *val.DeepCopy()
-		}
-		return
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceSpec.
-func (in ResourceSpec) DeepCopy() ResourceSpec {
-	if in == nil {
-		return nil
-	}
-	out := new(ResourceSpec)
-	in.DeepCopyInto(out)
-	return *out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *Selection) DeepCopyInto(out *Selection) {
-	*out = *in
-	if in.UseAllDevices != nil {
-		in, out := &in.UseAllDevices, &out.UseAllDevices
-		*out = new(bool)
-		**out = **in
-	}
-	if in.Devices != nil {
-		in, out := &in.Devices, &out.Devices
-		*out = make([]Device, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
-	}
-	if in.VolumeClaimTemplates != nil {
-		in, out := &in.VolumeClaimTemplates, &out.VolumeClaimTemplates
-		*out = make([]corev1.PersistentVolumeClaim, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
-	}
-	return
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Selection.
-func (in *Selection) DeepCopy() *Selection {
-	if in == nil {
-		return nil
-	}
-	out := new(Selection)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *StorageClassDeviceSet) DeepCopyInto(out *StorageClassDeviceSet) {
-	*out = *in
-	in.Resources.DeepCopyInto(&out.Resources)
-	in.Placement.DeepCopyInto(&out.Placement)
-	if in.PreparePlacement != nil {
-		in, out := &in.PreparePlacement, &out.PreparePlacement
-		*out = new(Placement)
-		(*in).DeepCopyInto(*out)
-	}
-	if in.Config != nil {
-		in, out := &in.Config, &out.Config
-		*out = make(map[string]string, len(*in))
-		for key, val := range *in {
-			(*out)[key] = val
-		}
-	}
-	if in.VolumeClaimTemplates != nil {
-		in, out := &in.VolumeClaimTemplates, &out.VolumeClaimTemplates
-		*out = make([]corev1.PersistentVolumeClaim, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
-	}
-	return
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StorageClassDeviceSet.
-func (in *StorageClassDeviceSet) DeepCopy() *StorageClassDeviceSet {
-	if in == nil {
-		return nil
-	}
-	out := new(StorageClassDeviceSet)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *StorageScopeSpec) DeepCopyInto(out *StorageScopeSpec) {
-	*out = *in
-	if in.Nodes != nil {
-		in, out := &in.Nodes, &out.Nodes
-		*out = make([]Node, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
-	}
-	if in.Config != nil {
-		in, out := &in.Config, &out.Config
-		*out = make(map[string]string, len(*in))
-		for key, val := range *in {
-			(*out)[key] = val
-		}
-	}
-	in.Selection.DeepCopyInto(&out.Selection)
-	if in.StorageClassDeviceSets != nil {
-		in, out := &in.StorageClassDeviceSets, &out.StorageClassDeviceSets
-		*out = make([]StorageClassDeviceSet, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
-	}
-	return
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StorageScopeSpec.
-func (in *StorageScopeSpec) DeepCopy() *StorageScopeSpec {
-	if in == nil {
-		return nil
-	}
-	out := new(StorageScopeSpec)
-	in.DeepCopyInto(out)
-	return out
-}
diff --git a/pkg/apis/rook.io/v1alpha2/register.go b/pkg/apis/rook.io/v1alpha2/register.go
index 00eed21b5..408c1e0c8 100644
--- a/pkg/apis/rook.io/v1alpha2/register.go
+++ b/pkg/apis/rook.io/v1alpha2/register.go
@@ -19,16 +19,15 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime"
 	"k8s.io/apimachinery/pkg/runtime/schema"
-
-	rookio "github.com/rook/rook/pkg/apis/rook.io"
 )
 
 const (
-	Version = "v1alpha2"
+	Version                 = "v1alpha2"
+	CustomResourceGroupName = "rook.io"
 )
 
 // SchemeGroupVersion is group version used to register these objects
-var SchemeGroupVersion = schema.GroupVersion{Group: rookio.CustomResourceGroupName, Version: Version}
+var SchemeGroupVersion = schema.GroupVersion{Group: CustomResourceGroupName, Version: Version}
 
 // Resource takes an unqualified resource and returns a Group qualified GroupResource
 func Resource(resource string) schema.GroupResource {
diff --git a/pkg/client/clientset/versioned/clientset.go b/pkg/client/clientset/versioned/clientset.go
index e04076da4..dbc6b4c15 100644
--- a/pkg/client/clientset/versioned/clientset.go
+++ b/pkg/client/clientset/versioned/clientset.go
@@ -24,7 +24,6 @@ import (
 	cassandrav1alpha1 "github.com/rook/rook/pkg/client/clientset/versioned/typed/cassandra.rook.io/v1alpha1"
 	cephv1 "github.com/rook/rook/pkg/client/clientset/versioned/typed/ceph.rook.io/v1"
 	nfsv1alpha1 "github.com/rook/rook/pkg/client/clientset/versioned/typed/nfs.rook.io/v1alpha1"
-	rookv1 "github.com/rook/rook/pkg/client/clientset/versioned/typed/rook.io/v1"
 	rookv1alpha2 "github.com/rook/rook/pkg/client/clientset/versioned/typed/rook.io/v1alpha2"
 	discovery "k8s.io/client-go/discovery"
 	rest "k8s.io/client-go/rest"
@@ -36,7 +35,6 @@ type Interface interface {
 	CassandraV1alpha1() cassandrav1alpha1.CassandraV1alpha1Interface
 	CephV1() cephv1.CephV1Interface
 	NfsV1alpha1() nfsv1alpha1.NfsV1alpha1Interface
-	RookV1() rookv1.RookV1Interface
 	RookV1alpha2() rookv1alpha2.RookV1alpha2Interface
 }
 
@@ -47,7 +45,6 @@ type Clientset struct {
 	cassandraV1alpha1 *cassandrav1alpha1.CassandraV1alpha1Client
 	cephV1            *cephv1.CephV1Client
 	nfsV1alpha1       *nfsv1alpha1.NfsV1alpha1Client
-	rookV1            *rookv1.RookV1Client
 	rookV1alpha2      *rookv1alpha2.RookV1alpha2Client
 }
 
@@ -66,11 +63,6 @@ func (c *Clientset) NfsV1alpha1() nfsv1alpha1.NfsV1alpha1Interface {
 	return c.nfsV1alpha1
 }
 
-// RookV1 retrieves the RookV1Client
-func (c *Clientset) RookV1() rookv1.RookV1Interface {
-	return c.rookV1
-}
-
 // RookV1alpha2 retrieves the RookV1alpha2Client
 func (c *Clientset) RookV1alpha2() rookv1alpha2.RookV1alpha2Interface {
 	return c.rookV1alpha2
@@ -109,10 +101,6 @@ func NewForConfig(c *rest.Config) (*Clientset, error) {
 	if err != nil {
 		return nil, err
 	}
-	cs.rookV1, err = rookv1.NewForConfig(&configShallowCopy)
-	if err != nil {
-		return nil, err
-	}
 	cs.rookV1alpha2, err = rookv1alpha2.NewForConfig(&configShallowCopy)
 	if err != nil {
 		return nil, err
@@ -132,7 +120,6 @@ func NewForConfigOrDie(c *rest.Config) *Clientset {
 	cs.cassandraV1alpha1 = cassandrav1alpha1.NewForConfigOrDie(c)
 	cs.cephV1 = cephv1.NewForConfigOrDie(c)
 	cs.nfsV1alpha1 = nfsv1alpha1.NewForConfigOrDie(c)
-	cs.rookV1 = rookv1.NewForConfigOrDie(c)
 	cs.rookV1alpha2 = rookv1alpha2.NewForConfigOrDie(c)
 
 	cs.DiscoveryClient = discovery.NewDiscoveryClientForConfigOrDie(c)
@@ -145,7 +132,6 @@ func New(c rest.Interface) *Clientset {
 	cs.cassandraV1alpha1 = cassandrav1alpha1.New(c)
 	cs.cephV1 = cephv1.New(c)
 	cs.nfsV1alpha1 = nfsv1alpha1.New(c)
-	cs.rookV1 = rookv1.New(c)
 	cs.rookV1alpha2 = rookv1alpha2.New(c)
 
 	cs.DiscoveryClient = discovery.NewDiscoveryClient(c)
diff --git a/pkg/client/clientset/versioned/fake/clientset_generated.go b/pkg/client/clientset/versioned/fake/clientset_generated.go
index 084d6415b..9708881f5 100644
--- a/pkg/client/clientset/versioned/fake/clientset_generated.go
+++ b/pkg/client/clientset/versioned/fake/clientset_generated.go
@@ -26,8 +26,6 @@ import (
 	fakecephv1 "github.com/rook/rook/pkg/client/clientset/versioned/typed/ceph.rook.io/v1/fake"
 	nfsv1alpha1 "github.com/rook/rook/pkg/client/clientset/versioned/typed/nfs.rook.io/v1alpha1"
 	fakenfsv1alpha1 "github.com/rook/rook/pkg/client/clientset/versioned/typed/nfs.rook.io/v1alpha1/fake"
-	rookv1 "github.com/rook/rook/pkg/client/clientset/versioned/typed/rook.io/v1"
-	fakerookv1 "github.com/rook/rook/pkg/client/clientset/versioned/typed/rook.io/v1/fake"
 	rookv1alpha2 "github.com/rook/rook/pkg/client/clientset/versioned/typed/rook.io/v1alpha2"
 	fakerookv1alpha2 "github.com/rook/rook/pkg/client/clientset/versioned/typed/rook.io/v1alpha2/fake"
 	"k8s.io/apimachinery/pkg/runtime"
@@ -99,11 +97,6 @@ func (c *Clientset) NfsV1alpha1() nfsv1alpha1.NfsV1alpha1Interface {
 	return &fakenfsv1alpha1.FakeNfsV1alpha1{Fake: &c.Fake}
 }
 
-// RookV1 retrieves the RookV1Client
-func (c *Clientset) RookV1() rookv1.RookV1Interface {
-	return &fakerookv1.FakeRookV1{Fake: &c.Fake}
-}
-
 // RookV1alpha2 retrieves the RookV1alpha2Client
 func (c *Clientset) RookV1alpha2() rookv1alpha2.RookV1alpha2Interface {
 	return &fakerookv1alpha2.FakeRookV1alpha2{Fake: &c.Fake}
diff --git a/pkg/client/clientset/versioned/fake/register.go b/pkg/client/clientset/versioned/fake/register.go
index 9f8b8807f..a3a07b0fc 100644
--- a/pkg/client/clientset/versioned/fake/register.go
+++ b/pkg/client/clientset/versioned/fake/register.go
@@ -22,7 +22,6 @@ import (
 	cassandrav1alpha1 "github.com/rook/rook/pkg/apis/cassandra.rook.io/v1alpha1"
 	cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
 	nfsv1alpha1 "github.com/rook/rook/pkg/apis/nfs.rook.io/v1alpha1"
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
 	rookv1alpha2 "github.com/rook/rook/pkg/apis/rook.io/v1alpha2"
 	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	runtime "k8s.io/apimachinery/pkg/runtime"
@@ -38,7 +37,6 @@ var localSchemeBuilder = runtime.SchemeBuilder{
 	cassandrav1alpha1.AddToScheme,
 	cephv1.AddToScheme,
 	nfsv1alpha1.AddToScheme,
-	rookv1.AddToScheme,
 	rookv1alpha2.AddToScheme,
 }
 
diff --git a/pkg/client/clientset/versioned/scheme/register.go b/pkg/client/clientset/versioned/scheme/register.go
index ef495bb2b..1b4a713e4 100644
--- a/pkg/client/clientset/versioned/scheme/register.go
+++ b/pkg/client/clientset/versioned/scheme/register.go
@@ -22,7 +22,6 @@ import (
 	cassandrav1alpha1 "github.com/rook/rook/pkg/apis/cassandra.rook.io/v1alpha1"
 	cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
 	nfsv1alpha1 "github.com/rook/rook/pkg/apis/nfs.rook.io/v1alpha1"
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
 	rookv1alpha2 "github.com/rook/rook/pkg/apis/rook.io/v1alpha2"
 	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	runtime "k8s.io/apimachinery/pkg/runtime"
@@ -38,7 +37,6 @@ var localSchemeBuilder = runtime.SchemeBuilder{
 	cassandrav1alpha1.AddToScheme,
 	cephv1.AddToScheme,
 	nfsv1alpha1.AddToScheme,
-	rookv1.AddToScheme,
 	rookv1alpha2.AddToScheme,
 }
 
diff --git a/pkg/client/clientset/versioned/typed/rook.io/v1/doc.go b/pkg/client/clientset/versioned/typed/rook.io/v1/doc.go
deleted file mode 100644
index 3af5d054f..000000000
--- a/pkg/client/clientset/versioned/typed/rook.io/v1/doc.go
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
-Copyright The Kubernetes Authors.
-
-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.
-*/
-
-// Code generated by client-gen. DO NOT EDIT.
-
-// This package has the automatically generated typed clients.
-package v1
diff --git a/pkg/client/clientset/versioned/typed/rook.io/v1/fake/doc.go b/pkg/client/clientset/versioned/typed/rook.io/v1/fake/doc.go
deleted file mode 100644
index 16f443990..000000000
--- a/pkg/client/clientset/versioned/typed/rook.io/v1/fake/doc.go
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
-Copyright The Kubernetes Authors.
-
-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.
-*/
-
-// Code generated by client-gen. DO NOT EDIT.
-
-// Package fake has the automatically generated clients.
-package fake
diff --git a/pkg/client/clientset/versioned/typed/rook.io/v1/fake/fake_rook.io_client.go b/pkg/client/clientset/versioned/typed/rook.io/v1/fake/fake_rook.io_client.go
deleted file mode 100644
index cb4e281c2..000000000
--- a/pkg/client/clientset/versioned/typed/rook.io/v1/fake/fake_rook.io_client.go
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
-Copyright The Kubernetes Authors.
-
-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.
-*/
-
-// Code generated by client-gen. DO NOT EDIT.
-
-package fake
-
-import (
-	rest "k8s.io/client-go/rest"
-	testing "k8s.io/client-go/testing"
-)
-
-type FakeRookV1 struct {
-	*testing.Fake
-}
-
-// RESTClient returns a RESTClient that is used to communicate
-// with API server by this client implementation.
-func (c *FakeRookV1) RESTClient() rest.Interface {
-	var ret *rest.RESTClient
-	return ret
-}
diff --git a/pkg/client/clientset/versioned/typed/rook.io/v1/generated_expansion.go b/pkg/client/clientset/versioned/typed/rook.io/v1/generated_expansion.go
deleted file mode 100644
index 177209ec6..000000000
--- a/pkg/client/clientset/versioned/typed/rook.io/v1/generated_expansion.go
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
-Copyright The Kubernetes Authors.
-
-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.
-*/
-
-// Code generated by client-gen. DO NOT EDIT.
-
-package v1
diff --git a/pkg/client/clientset/versioned/typed/rook.io/v1/rook.io_client.go b/pkg/client/clientset/versioned/typed/rook.io/v1/rook.io_client.go
deleted file mode 100644
index f7b7b36f8..000000000
--- a/pkg/client/clientset/versioned/typed/rook.io/v1/rook.io_client.go
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
-Copyright The Kubernetes Authors.
-
-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.
-*/
-
-// Code generated by client-gen. DO NOT EDIT.
-
-package v1
-
-import (
-	v1 "github.com/rook/rook/pkg/apis/rook.io/v1"
-	"github.com/rook/rook/pkg/client/clientset/versioned/scheme"
-	rest "k8s.io/client-go/rest"
-)
-
-type RookV1Interface interface {
-	RESTClient() rest.Interface
-}
-
-// RookV1Client is used to interact with features provided by the rook.io group.
-type RookV1Client struct {
-	restClient rest.Interface
-}
-
-// NewForConfig creates a new RookV1Client for the given config.
-func NewForConfig(c *rest.Config) (*RookV1Client, error) {
-	config := *c
-	if err := setConfigDefaults(&config); err != nil {
-		return nil, err
-	}
-	client, err := rest.RESTClientFor(&config)
-	if err != nil {
-		return nil, err
-	}
-	return &RookV1Client{client}, nil
-}
-
-// NewForConfigOrDie creates a new RookV1Client for the given config and
-// panics if there is an error in the config.
-func NewForConfigOrDie(c *rest.Config) *RookV1Client {
-	client, err := NewForConfig(c)
-	if err != nil {
-		panic(err)
-	}
-	return client
-}
-
-// New creates a new RookV1Client for the given RESTClient.
-func New(c rest.Interface) *RookV1Client {
-	return &RookV1Client{c}
-}
-
-func setConfigDefaults(config *rest.Config) error {
-	gv := v1.SchemeGroupVersion
-	config.GroupVersion = &gv
-	config.APIPath = "/apis"
-	config.NegotiatedSerializer = scheme.Codecs.WithoutConversion()
-
-	if config.UserAgent == "" {
-		config.UserAgent = rest.DefaultKubernetesUserAgent()
-	}
-
-	return nil
-}
-
-// RESTClient returns a RESTClient that is used to communicate
-// with API server by this client implementation.
-func (c *RookV1Client) RESTClient() rest.Interface {
-	if c == nil {
-		return nil
-	}
-	return c.restClient
-}
diff --git a/pkg/daemon/ceph/agent/flexvolume/attachment/resource.go b/pkg/daemon/ceph/agent/flexvolume/attachment/resource.go
index 263de46b2..91fdc88e6 100644
--- a/pkg/daemon/ceph/agent/flexvolume/attachment/resource.go
+++ b/pkg/daemon/ceph/agent/flexvolume/attachment/resource.go
@@ -20,7 +20,7 @@ package attachment
 import (
 	"reflect"
 
-	rook "github.com/rook/rook/pkg/apis/rook.io"
+	rook "github.com/rook/rook/pkg/apis/rook.io/v1alpha2"
 	rookalpha "github.com/rook/rook/pkg/apis/rook.io/v1alpha2"
 	"github.com/rook/rook/pkg/operator/k8sutil"
 )
diff --git a/pkg/daemon/ceph/client/upgrade.go b/pkg/daemon/ceph/client/upgrade.go
index ecccc07f0..8128018c2 100644
--- a/pkg/daemon/ceph/client/upgrade.go
+++ b/pkg/daemon/ceph/client/upgrade.go
@@ -147,7 +147,7 @@ func OkToStop(context *clusterd.Context, clusterInfo *ClusterInfo, deployment, d
 			// now looping over a single element since we can't address the key directly (we don't know its name)
 			for _, monCount := range versions.Mon {
 				if monCount < 3 {
-					logger.Infof("the cluster has less than 3 monitors, not performing upgrade check, running in best-effort")
+					logger.Infof("the cluster has fewer than 3 monitors, not performing upgrade check, running in best-effort")
 					return nil
 				}
 			}
@@ -394,7 +394,7 @@ func osdDoNothing(context *clusterd.Context, clusterInfo *ClusterInfo) bool {
 		return false
 	}
 	if len(osds) < 3 {
-		logger.Warningf("the cluster has less than 3 osds, not performing upgrade check, running in best-effort")
+		logger.Warningf("the cluster has fewer than 3 osds, not performing upgrade check, running in best-effort")
 		return true
 	}
 
diff --git a/pkg/operator/ceph/cluster/cleanup.go b/pkg/operator/ceph/cluster/cleanup.go
index 93dd503ea..c0eaffedd 100644
--- a/pkg/operator/ceph/cluster/cleanup.go
+++ b/pkg/operator/ceph/cluster/cleanup.go
@@ -24,7 +24,6 @@ import (
 
 	"github.com/pkg/errors"
 	cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
 	"github.com/rook/rook/pkg/operator/ceph/cluster/mgr"
 	"github.com/rook/rook/pkg/operator/ceph/cluster/mon"
 	"github.com/rook/rook/pkg/operator/ceph/cluster/osd"
@@ -164,11 +163,11 @@ func (c *ClusterController) cleanUpJobTemplateSpec(cluster *cephv1.CephCluster,
 }
 
 // getCleanupPlacement returns the placement for the cleanup job
-func getCleanupPlacement(c cephv1.ClusterSpec) rookv1.Placement {
+func getCleanupPlacement(c cephv1.ClusterSpec) cephv1.Placement {
 	// The cleanup jobs are assigned by the operator to a specific node, so the
 	// node affinity and other affinity are not needed for scheduling.
 	// The only placement required for the cleanup daemons is the tolerations.
-	tolerations := c.Placement[rookv1.KeyAll].Tolerations
+	tolerations := c.Placement[cephv1.KeyAll].Tolerations
 	tolerations = append(tolerations, c.Placement[cephv1.KeyCleanup].Tolerations...)
 	tolerations = append(tolerations, c.Placement[cephv1.KeyMonArbiter].Tolerations...)
 	tolerations = append(tolerations, c.Placement[cephv1.KeyMon].Tolerations...)
@@ -179,7 +178,7 @@ func getCleanupPlacement(c cephv1.ClusterSpec) rookv1.Placement {
 	for _, deviceSet := range c.Storage.StorageClassDeviceSets {
 		tolerations = append(tolerations, deviceSet.Placement.Tolerations...)
 	}
-	return rookv1.Placement{Tolerations: tolerations}
+	return cephv1.Placement{Tolerations: tolerations}
 }
 
 func (c *ClusterController) waitForCephDaemonCleanUp(stopCleanupCh chan struct{}, cluster *cephv1.CephCluster, retryInterval time.Duration) error {
diff --git a/pkg/operator/ceph/cluster/mgr/spec.go b/pkg/operator/ceph/cluster/mgr/spec.go
index 33e58eb61..ded0b40b9 100644
--- a/pkg/operator/ceph/cluster/mgr/spec.go
+++ b/pkg/operator/ceph/cluster/mgr/spec.go
@@ -23,7 +23,7 @@ import (
 
 	"github.com/pkg/errors"
 	cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
+	"github.com/rook/rook/pkg/apis/rook.io"
 	"github.com/rook/rook/pkg/operator/ceph/cluster/mon"
 	"github.com/rook/rook/pkg/operator/ceph/config"
 	"github.com/rook/rook/pkg/operator/ceph/controller"
@@ -87,8 +87,8 @@ func (c *Cluster) makeDeployment(mgrConfig *mgrConfig) (*apps.Deployment, error)
 
 	if c.spec.Network.IsHost() {
 		podSpec.Spec.DNSPolicy = v1.DNSClusterFirstWithHostNet
-	} else if c.spec.Network.NetworkSpec.IsMultus() {
-		if err := k8sutil.ApplyMultus(c.spec.Network.NetworkSpec, &podSpec.ObjectMeta); err != nil {
+	} else if c.spec.Network.IsMultus() {
+		if err := k8sutil.ApplyMultus(c.spec.Network, &podSpec.ObjectMeta); err != nil {
 			return nil, err
 		}
 	}
@@ -315,7 +315,7 @@ func (c *Cluster) getPodLabels(daemonName string, includeNewLabels bool) map[str
 
 func (c *Cluster) applyPrometheusAnnotations(objectMeta *metav1.ObjectMeta) {
 	if len(cephv1.GetMgrAnnotations(c.spec.Annotations)) == 0 {
-		t := rookv1.Annotations{
+		t := rook.Annotations{
 			"prometheus.io/scrape": "true",
 			"prometheus.io/port":   strconv.Itoa(int(DefaultMetricsPort)),
 		}
diff --git a/pkg/operator/ceph/cluster/mon/mon.go b/pkg/operator/ceph/cluster/mon/mon.go
index 93ab03a1e..a9f732e44 100644
--- a/pkg/operator/ceph/cluster/mon/mon.go
+++ b/pkg/operator/ceph/cluster/mon/mon.go
@@ -33,7 +33,6 @@ import (
 	"github.com/coreos/pkg/capnslog"
 	"github.com/pkg/errors"
 	cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
 	"github.com/rook/rook/pkg/clusterd"
 	cephclient "github.com/rook/rook/pkg/daemon/ceph/client"
 	cephutil "github.com/rook/rook/pkg/daemon/ceph/util"
@@ -725,12 +724,12 @@ func scheduleMonitor(c *Cluster, mon *monConfig) (*apps.Deployment, error) {
 }
 
 // GetMonPlacement returns the placement for the MON service
-func (c *Cluster) getMonPlacement(zone string) rookv1.Placement {
+func (c *Cluster) getMonPlacement(zone string) cephv1.Placement {
 	// If the mon is the arbiter in a stretch cluster and its placement is specified, return it
 	// without merging with the "all" placement so it can be handled separately from all other daemons
 	if c.isArbiterZone(zone) {
 		p := cephv1.GetArbiterPlacement(c.spec.Placement)
-		noPlacement := rookv1.Placement{}
+		noPlacement := cephv1.Placement{}
 		if !reflect.DeepEqual(p, noPlacement) {
 			// If the arbiter placement was specified, go ahead and use it.
 			return p
diff --git a/pkg/operator/ceph/cluster/mon/spec.go b/pkg/operator/ceph/cluster/mon/spec.go
index dc27da50e..0586ad62d 100644
--- a/pkg/operator/ceph/cluster/mon/spec.go
+++ b/pkg/operator/ceph/cluster/mon/spec.go
@@ -212,8 +212,8 @@ func (c *Cluster) makeMonPod(monConfig *monConfig, canary bool) (*corev1.Pod, er
 
 	if c.spec.Network.IsHost() {
 		pod.Spec.DNSPolicy = corev1.DNSClusterFirstWithHostNet
-	} else if c.spec.Network.NetworkSpec.IsMultus() {
-		if err := k8sutil.ApplyMultus(c.spec.Network.NetworkSpec, &pod.ObjectMeta); err != nil {
+	} else if c.spec.Network.IsMultus() {
+		if err := k8sutil.ApplyMultus(c.spec.Network, &pod.ObjectMeta); err != nil {
 			return nil, err
 		}
 	}
diff --git a/pkg/operator/ceph/cluster/osd/create.go b/pkg/operator/ceph/cluster/osd/create.go
index dea15b408..54645ec32 100644
--- a/pkg/operator/ceph/cluster/osd/create.go
+++ b/pkg/operator/ceph/cluster/osd/create.go
@@ -21,7 +21,6 @@ import (
 
 	"github.com/pkg/errors"
 	cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
 	kms "github.com/rook/rook/pkg/daemon/ceph/osd/kms"
 	osdconfig "github.com/rook/rook/pkg/operator/ceph/cluster/osd/config"
 	opcontroller "github.com/rook/rook/pkg/operator/ceph/controller"
@@ -283,7 +282,7 @@ func (c *Cluster) startProvisioningOverNodes(config *provisionConfig, errs *prov
 		}
 		c.spec.Storage.Nodes = nil
 		for _, hostname := range hostnameMap {
-			storageNode := rookv1.Node{
+			storageNode := cephv1.Node{
 				Name: hostname,
 			}
 			c.spec.Storage.Nodes = append(c.spec.Storage.Nodes, storageNode)
diff --git a/pkg/operator/ceph/cluster/osd/deviceSet.go b/pkg/operator/ceph/cluster/osd/deviceSet.go
index 5e120fe4e..30fac5d46 100644
--- a/pkg/operator/ceph/cluster/osd/deviceSet.go
+++ b/pkg/operator/ceph/cluster/osd/deviceSet.go
@@ -24,7 +24,6 @@ import (
 
 	"github.com/pkg/errors"
 	cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
 	"github.com/rook/rook/pkg/clusterd"
 	"github.com/rook/rook/pkg/operator/ceph/controller"
 	"github.com/rook/rook/pkg/operator/k8sutil"
@@ -50,9 +49,9 @@ type deviceSet struct {
 	// Resources requests/limits for the devices
 	Resources v1.ResourceRequirements
 	// Placement constraints for the device daemons
-	Placement rookv1.Placement
+	Placement cephv1.Placement
 	// Placement constraints for the device preparation
-	PreparePlacement *rookv1.Placement
+	PreparePlacement *cephv1.Placement
 	// Provider-specific device configuration
 	Config map[string]string
 	// Portable represents OSD portability across the hosts
@@ -123,7 +122,7 @@ func (c *Cluster) prepareStorageClassDeviceSets(errs *provisionErrors) {
 	}
 }
 
-func (c *Cluster) createDeviceSetPVCsForIndex(newDeviceSet rookv1.StorageClassDeviceSet, existingPVCs map[string]*v1.PersistentVolumeClaim, setIndex int, errs *provisionErrors) deviceSet {
+func (c *Cluster) createDeviceSetPVCsForIndex(newDeviceSet cephv1.StorageClassDeviceSet, existingPVCs map[string]*v1.PersistentVolumeClaim, setIndex int, errs *provisionErrors) deviceSet {
 	// Create the PVC source for each of the data, metadata, and other types of templates if defined.
 	pvcSources := map[string]v1.PersistentVolumeClaimVolumeSource{}
 
diff --git a/pkg/operator/ceph/cluster/osd/osd.go b/pkg/operator/ceph/cluster/osd/osd.go
index b2da72963..b90d2c3ad 100644
--- a/pkg/operator/ceph/cluster/osd/osd.go
+++ b/pkg/operator/ceph/cluster/osd/osd.go
@@ -31,7 +31,6 @@ import (
 	"github.com/coreos/pkg/capnslog"
 	"github.com/pkg/errors"
 	cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
 	"github.com/rook/rook/pkg/clusterd"
 	cephclient "github.com/rook/rook/pkg/daemon/ceph/client"
 	osdconfig "github.com/rook/rook/pkg/operator/ceph/cluster/osd/config"
@@ -76,7 +75,7 @@ type Cluster struct {
 	clusterInfo  *cephclient.ClusterInfo
 	rookVersion  string
 	spec         cephv1.ClusterSpec
-	ValidStorage rookv1.StorageScopeSpec // valid subset of `Storage`, computed at runtime
+	ValidStorage cephv1.StorageScopeSpec // valid subset of `Storage`, computed at runtime
 	kv           *k8sutil.ConfigMapKVStore
 	deviceSets   []deviceSet
 }
@@ -122,16 +121,16 @@ type OrchestrationStatus struct {
 type osdProperties struct {
 	//crushHostname refers to the hostname or PVC name when the OSD is provisioned on Nodes or PVC block device, respectively.
 	crushHostname       string
-	devices             []rookv1.Device
+	devices             []cephv1.Device
 	pvc                 corev1.PersistentVolumeClaimVolumeSource
 	metadataPVC         corev1.PersistentVolumeClaimVolumeSource
 	walPVC              corev1.PersistentVolumeClaimVolumeSource
 	pvcSize             string
-	selection           rookv1.Selection
+	selection           cephv1.Selection
 	resources           corev1.ResourceRequirements
 	storeConfig         osdconfig.StoreConfig
-	placement           rookv1.Placement
-	preparePlacement    *rookv1.Placement
+	placement           cephv1.Placement
+	preparePlacement    *cephv1.Placement
 	metadataDevice      string
 	portable            bool
 	tuneSlowDeviceClass bool
@@ -153,7 +152,7 @@ func (osdProps osdProperties) onPVCWithWal() bool {
 	return osdProps.walPVC.ClaimName != ""
 }
 
-func (osdProps osdProperties) getPreparePlacement() rookv1.Placement {
+func (osdProps osdProperties) getPreparePlacement() cephv1.Placement {
 	// If the osd prepare placement is specified, use it
 	if osdProps.preparePlacement != nil {
 		return *osdProps.preparePlacement
@@ -306,7 +305,7 @@ func setOSDProperties(c *Cluster, osdProps osdProperties, osd OSDInfo) error {
 	return nil
 }
 
-func (c *Cluster) resolveNode(nodeName string) *rookv1.Node {
+func (c *Cluster) resolveNode(nodeName string) *cephv1.Node {
 	// fully resolve the storage config and resources for this node
 	rookNode := c.ValidStorage.ResolveNode(nodeName)
 	if rookNode == nil {
diff --git a/pkg/operator/ceph/cluster/osd/spec.go b/pkg/operator/ceph/cluster/osd/spec.go
index 2ff0d267d..2d32acb1e 100644
--- a/pkg/operator/ceph/cluster/osd/spec.go
+++ b/pkg/operator/ceph/cluster/osd/spec.go
@@ -26,7 +26,6 @@ import (
 	"github.com/libopenstorage/secrets"
 	"github.com/pkg/errors"
 	cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
 	kms "github.com/rook/rook/pkg/daemon/ceph/osd/kms"
 	opconfig "github.com/rook/rook/pkg/operator/ceph/config"
 	"github.com/rook/rook/pkg/operator/ceph/controller"
@@ -608,8 +607,8 @@ func (c *Cluster) makeDeployment(osdProps osdProperties, osd OSDInfo, provisionC
 
 	if c.spec.Network.IsHost() {
 		podTemplateSpec.Spec.DNSPolicy = v1.DNSClusterFirstWithHostNet
-	} else if c.spec.Network.NetworkSpec.IsMultus() {
-		if err := k8sutil.ApplyMultus(c.spec.Network.NetworkSpec, &podTemplateSpec.ObjectMeta); err != nil {
+	} else if c.spec.Network.IsMultus() {
+		if err := k8sutil.ApplyMultus(c.spec.Network, &podTemplateSpec.ObjectMeta); err != nil {
 			return nil, err
 		}
 	}
@@ -705,7 +704,7 @@ func applyTopologyAffinity(spec *v1.PodSpec, osd OSDInfo) error {
 		return errors.Wrapf(err, "failed to generate osd %d topology affinity", osd.ID)
 	}
 	// merge the node affinity for the topology with the existing affinity
-	p := rookv1.Placement{NodeAffinity: nodeAffinity}
+	p := cephv1.Placement{NodeAffinity: nodeAffinity}
 	p.ApplyToPodSpec(spec)
 
 	return nil
diff --git a/pkg/operator/ceph/cluster/rbd/spec.go b/pkg/operator/ceph/cluster/rbd/spec.go
index da5044fd8..7f47c16e4 100644
--- a/pkg/operator/ceph/cluster/rbd/spec.go
+++ b/pkg/operator/ceph/cluster/rbd/spec.go
@@ -63,7 +63,7 @@ func (r *ReconcileCephRBDMirror) makeDeployment(daemonConfig *daemonConfig, rbdM
 	if r.cephClusterSpec.Network.IsHost() {
 		podSpec.Spec.DNSPolicy = v1.DNSClusterFirstWithHostNet
 	} else if r.cephClusterSpec.Network.IsMultus() {
-		if err := k8sutil.ApplyMultus(r.cephClusterSpec.Network.NetworkSpec, &podSpec.ObjectMeta); err != nil {
+		if err := k8sutil.ApplyMultus(r.cephClusterSpec.Network, &podSpec.ObjectMeta); err != nil {
 			return nil, err
 		}
 	}
diff --git a/pkg/operator/ceph/config/livenessprobe.go b/pkg/operator/ceph/config/livenessprobe.go
index 62b7794c0..04a458324 100644
--- a/pkg/operator/ceph/config/livenessprobe.go
+++ b/pkg/operator/ceph/config/livenessprobe.go
@@ -20,16 +20,16 @@ package config
 
 import (
 	cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
+	"github.com/rook/rook/pkg/apis/rook.io"
 	v1 "k8s.io/api/core/v1"
 )
 
 type fn func(cephv1.CephClusterHealthCheckSpec) *v1.Probe
 
 // ConfigureLivenessProbe returns the desired liveness probe for a given daemon
-func ConfigureLivenessProbe(daemon rookv1.KeyType, container v1.Container, healthCheck cephv1.CephClusterHealthCheckSpec) v1.Container {
+func ConfigureLivenessProbe(daemon rook.KeyType, container v1.Container, healthCheck cephv1.CephClusterHealthCheckSpec) v1.Container {
 	// Map of functions
-	probeFnMap := map[rookv1.KeyType]fn{
+	probeFnMap := map[rook.KeyType]fn{
 		cephv1.KeyMon: cephv1.GetMonLivenessProbe,
 		cephv1.KeyMgr: cephv1.GetMgrLivenessProbe,
 		cephv1.KeyOSD: cephv1.GetOSDLivenessProbe,
diff --git a/pkg/operator/ceph/csi/spec.go b/pkg/operator/ceph/csi/spec.go
index e50c18bdc..223f09dc9 100644
--- a/pkg/operator/ceph/csi/spec.go
+++ b/pkg/operator/ceph/csi/spec.go
@@ -628,7 +628,7 @@ func applyCephClusterNetworkConfig(ctx context.Context, objectMeta *metav1.Objec
 	}
 	for _, cephCluster := range cephClusters.Items {
 		if cephCluster.Spec.Network.IsMultus() {
-			err = k8sutil.ApplyMultus(cephCluster.Spec.Network.NetworkSpec, objectMeta)
+			err = k8sutil.ApplyMultus(cephCluster.Spec.Network, objectMeta)
 			if err != nil {
 				return false, errors.Wrapf(err, "failed to apply multus configuration to CephCluster %q", cephCluster.Name)
 			}
diff --git a/pkg/operator/ceph/file/mds/mds.go b/pkg/operator/ceph/file/mds/mds.go
index 90833dae9..6baa9828d 100644
--- a/pkg/operator/ceph/file/mds/mds.go
+++ b/pkg/operator/ceph/file/mds/mds.go
@@ -243,7 +243,7 @@ func (c *Cluster) isCephUpgrade() (bool, error) {
 
 func (c *Cluster) upgradeMDS() error {
 
-	logger.Info("upgrading MDS cluster for filesystem %q", c.fs.Name)
+	logger.Infof("upgrading MDS cluster for filesystem %q", c.fs.Name)
 
 	// 1. set allow_standby_replay to false
 	if err := cephclient.AllowStandbyReplay(c.context, c.clusterInfo, c.fs.Name, false); err != nil {
diff --git a/pkg/operator/ceph/file/mds/spec.go b/pkg/operator/ceph/file/mds/spec.go
index f4f306d01..4c3243756 100644
--- a/pkg/operator/ceph/file/mds/spec.go
+++ b/pkg/operator/ceph/file/mds/spec.go
@@ -100,8 +100,8 @@ func (c *Cluster) makeDeployment(mdsConfig *mdsConfig, namespace string) (*apps.
 
 	if c.clusterSpec.Network.IsHost() {
 		d.Spec.Template.Spec.DNSPolicy = v1.DNSClusterFirstWithHostNet
-	} else if c.clusterSpec.Network.NetworkSpec.IsMultus() {
-		if err := k8sutil.ApplyMultus(c.clusterSpec.Network.NetworkSpec, &podSpec.ObjectMeta); err != nil {
+	} else if c.clusterSpec.Network.IsMultus() {
+		if err := k8sutil.ApplyMultus(c.clusterSpec.Network, &podSpec.ObjectMeta); err != nil {
 			return nil, err
 		}
 	}
diff --git a/pkg/operator/ceph/file/mirror/spec.go b/pkg/operator/ceph/file/mirror/spec.go
index b5c807109..b3bcccd0e 100644
--- a/pkg/operator/ceph/file/mirror/spec.go
+++ b/pkg/operator/ceph/file/mirror/spec.go
@@ -64,7 +64,7 @@ func (r *ReconcileFilesystemMirror) makeDeployment(daemonConfig *daemonConfig, f
 	if r.cephClusterSpec.Network.IsHost() {
 		podSpec.Spec.DNSPolicy = v1.DNSClusterFirstWithHostNet
 	} else if r.cephClusterSpec.Network.IsMultus() {
-		if err := k8sutil.ApplyMultus(r.cephClusterSpec.Network.NetworkSpec, &podSpec.ObjectMeta); err != nil {
+		if err := k8sutil.ApplyMultus(r.cephClusterSpec.Network, &podSpec.ObjectMeta); err != nil {
 			return nil, err
 		}
 	}
diff --git a/pkg/operator/ceph/nfs/spec.go b/pkg/operator/ceph/nfs/spec.go
index ae9897487..088542a5b 100644
--- a/pkg/operator/ceph/nfs/spec.go
+++ b/pkg/operator/ceph/nfs/spec.go
@@ -150,8 +150,8 @@ func (r *ReconcileCephNFS) makeDeployment(nfs *cephv1.CephNFS, cfg daemonConfig)
 
 	if r.cephClusterSpec.Network.IsHost() {
 		podSpec.DNSPolicy = v1.DNSClusterFirstWithHostNet
-	} else if r.cephClusterSpec.Network.NetworkSpec.IsMultus() {
-		if err := k8sutil.ApplyMultus(r.cephClusterSpec.Network.NetworkSpec, &podTemplateSpec.ObjectMeta); err != nil {
+	} else if r.cephClusterSpec.Network.IsMultus() {
+		if err := k8sutil.ApplyMultus(r.cephClusterSpec.Network, &podTemplateSpec.ObjectMeta); err != nil {
 			return nil, err
 		}
 	}
diff --git a/pkg/operator/ceph/object/spec.go b/pkg/operator/ceph/object/spec.go
index c6e175d43..203013929 100644
--- a/pkg/operator/ceph/object/spec.go
+++ b/pkg/operator/ceph/object/spec.go
@@ -161,7 +161,7 @@ func (c *clusterConfig) makeRGWPodSpec(rgwConfig *rgwConfig) (v1.PodTemplateSpec
 	if c.clusterSpec.Network.IsHost() {
 		podTemplateSpec.Spec.DNSPolicy = v1.DNSClusterFirstWithHostNet
 	} else if c.clusterSpec.Network.IsMultus() {
-		if err := k8sutil.ApplyMultus(c.clusterSpec.Network.NetworkSpec, &podTemplateSpec.ObjectMeta); err != nil {
+		if err := k8sutil.ApplyMultus(c.clusterSpec.Network, &podTemplateSpec.ObjectMeta); err != nil {
 			return podTemplateSpec, err
 		}
 	}
diff --git a/pkg/operator/discover/discover.go b/pkg/operator/discover/discover.go
index 4abb01edf..e46224f52 100644
--- a/pkg/operator/discover/discover.go
+++ b/pkg/operator/discover/discover.go
@@ -27,7 +27,7 @@ import (
 	"time"
 
 	"github.com/coreos/pkg/capnslog"
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
+	cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
 	"github.com/rook/rook/pkg/clusterd"
 	discoverDaemon "github.com/rook/rook/pkg/daemon/discover"
 	k8sutil "github.com/rook/rook/pkg/operator/k8sutil"
@@ -366,9 +366,9 @@ func matchDeviceFullPath(devLinks, fullpath string) bool {
 }
 
 // GetAvailableDevices conducts outer join using input filters with free devices that a node has. It marks the devices from join result as in-use.
-func GetAvailableDevices(clusterdContext *clusterd.Context, nodeName, clusterName string, devices []rookv1.Device, filter string, useAllDevices bool) ([]rookv1.Device, error) {
+func GetAvailableDevices(clusterdContext *clusterd.Context, nodeName, clusterName string, devices []cephv1.Device, filter string, useAllDevices bool) ([]cephv1.Device, error) {
 	ctx := context.TODO()
-	results := []rookv1.Device{}
+	results := []cephv1.Device{}
 	if len(devices) == 0 && len(filter) == 0 && !useAllDevices {
 		return results, nil
 	}
@@ -422,7 +422,7 @@ func GetAvailableDevices(clusterdContext *clusterd.Context, nodeName, clusterNam
 			//TODO support filter based on other keys
 			matched, err := regexp.Match(filter, []byte(nodeDevices[i].Name))
 			if err == nil && matched {
-				d := rookv1.Device{
+				d := cephv1.Device{
 					Name: nodeDevices[i].Name,
 				}
 				claimedDevices = append(claimedDevices, nodeDevices[i])
@@ -431,7 +431,7 @@ func GetAvailableDevices(clusterdContext *clusterd.Context, nodeName, clusterNam
 		}
 	} else if useAllDevices {
 		for i := range nodeDevices {
-			d := rookv1.Device{
+			d := cephv1.Device{
 				Name: nodeDevices[i].Name,
 			}
 			results = append(results, d)
diff --git a/pkg/operator/k8sutil/network.go b/pkg/operator/k8sutil/network.go
index cef68d9ce..023325352 100644
--- a/pkg/operator/k8sutil/network.go
+++ b/pkg/operator/k8sutil/network.go
@@ -22,7 +22,8 @@ import (
 	"strings"
 
 	netapi "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/apis/k8s.cni.cncf.io/v1"
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
+	cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
+	"github.com/rook/rook/pkg/apis/rook.io"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
@@ -64,7 +65,7 @@ type NetworkAttachmentConfig struct {
 
 // ApplyMultus apply multus selector to Pods
 // Multus supports short and json syntax, use only one kind at a time.
-func ApplyMultus(net rookv1.NetworkSpec, objectMeta *metav1.ObjectMeta) error {
+func ApplyMultus(net cephv1.NetworkSpec, objectMeta *metav1.ObjectMeta) error {
 	v := make([]string, 0, 2)
 	shortSyntax := false
 	jsonSyntax := false
@@ -101,7 +102,7 @@ func ApplyMultus(net rookv1.NetworkSpec, objectMeta *metav1.ObjectMeta) error {
 		networks = "[" + networks + "]"
 	}
 
-	t := rookv1.Annotations{
+	t := rook.Annotations{
 		"k8s.v1.cni.cncf.io/networks": networks,
 	}
 	t.ApplyToObjectMeta(objectMeta)
diff --git a/pkg/operator/k8sutil/node.go b/pkg/operator/k8sutil/node.go
index 94c4b55ad..284171c84 100644
--- a/pkg/operator/k8sutil/node.go
+++ b/pkg/operator/k8sutil/node.go
@@ -22,7 +22,7 @@ import (
 	"fmt"
 	"strings"
 
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
+	cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
 	v1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/labels"
@@ -34,7 +34,7 @@ import (
 // ValidNodeNoSched returns true if the node (1) meets Rook's placement terms,
 // and (2) is ready. Unlike ValidNode, this method will ignore the
 // Node.Spec.Unschedulable flag. False otherwise.
-func ValidNodeNoSched(node v1.Node, placement rookv1.Placement) (bool, error) {
+func ValidNodeNoSched(node v1.Node, placement cephv1.Placement) (bool, error) {
 	p, err := NodeMeetsPlacementTerms(node, placement, false)
 	if err != nil {
 		return false, fmt.Errorf("failed to check if node meets Rook placement terms. %+v", err)
@@ -52,7 +52,7 @@ func ValidNodeNoSched(node v1.Node, placement rookv1.Placement) (bool, error) {
 
 // ValidNode returns true if the node (1) is schedulable, (2) meets Rook's placement terms, and
 // (3) is ready. False otherwise.
-func ValidNode(node v1.Node, placement rookv1.Placement) (bool, error) {
+func ValidNode(node v1.Node, placement cephv1.Placement) (bool, error) {
 	if !GetNodeSchedulable(node) {
 		return false, nil
 	}
@@ -62,12 +62,12 @@ func ValidNode(node v1.Node, placement rookv1.Placement) (bool, error) {
 
 // GetValidNodes returns all nodes that (1) are not cordoned, (2) meet Rook's placement terms, and
 // (3) are ready.
-func GetValidNodes(rookStorage rookv1.StorageScopeSpec, clientset kubernetes.Interface, placement rookv1.Placement) []rookv1.Node {
+func GetValidNodes(rookStorage cephv1.StorageScopeSpec, clientset kubernetes.Interface, placement cephv1.Placement) []cephv1.Node {
 	matchingK8sNodes, err := GetKubernetesNodesMatchingRookNodes(rookStorage.Nodes, clientset)
 	if err != nil {
 		// cannot list nodes, return empty nodes
 		logger.Errorf("failed to list nodes: %+v", err)
-		return []rookv1.Node{}
+		return []cephv1.Node{}
 	}
 
 	validK8sNodes := []v1.Node{}
@@ -149,7 +149,7 @@ func GetNodeSchedulable(node v1.Node) bool {
 // and (2) its taints are tolerated by the placements tolerations.
 // There is the option to ignore well known taints defined in WellKnownTaints. See WellKnownTaints
 // for more information.
-func NodeMeetsPlacementTerms(node v1.Node, placement rookv1.Placement, ignoreWellKnownTaints bool) (bool, error) {
+func NodeMeetsPlacementTerms(node v1.Node, placement cephv1.Placement, ignoreWellKnownTaints bool) (bool, error) {
 	a, err := NodeMeetsAffinityTerms(node, placement.NodeAffinity)
 	if err != nil {
 		return false, fmt.Errorf("failed to check if node %s meets affinity terms. regarding as not match. %+v", node.Name, err)
@@ -253,7 +253,7 @@ func NodeIsReady(node v1.Node) bool {
 	return false
 }
 
-func rookNodeMatchesKubernetesNode(rookNode rookv1.Node, kubernetesNode v1.Node) bool {
+func rookNodeMatchesKubernetesNode(rookNode cephv1.Node, kubernetesNode v1.Node) bool {
 	hostname := normalizeHostname(kubernetesNode)
 	return rookNode.Name == hostname || rookNode.Name == kubernetesNode.Name
 }
@@ -269,7 +269,7 @@ func normalizeHostname(kubernetesNode v1.Node) string {
 
 // GetKubernetesNodesMatchingRookNodes lists all the nodes in Kubernetes and returns all the
 // Kubernetes nodes that have a corresponding match in the list of Rook nodes.
-func GetKubernetesNodesMatchingRookNodes(rookNodes []rookv1.Node, clientset kubernetes.Interface) ([]v1.Node, error) {
+func GetKubernetesNodesMatchingRookNodes(rookNodes []cephv1.Node, clientset kubernetes.Interface) ([]v1.Node, error) {
 	ctx := context.TODO()
 	nodes := []v1.Node{}
 	k8sNodes, err := clientset.CoreV1().Nodes().List(ctx, metav1.ListOptions{})
@@ -304,8 +304,8 @@ func GetNotReadyKubernetesNodes(clientset kubernetes.Interface) ([]v1.Node, erro
 
 // RookNodesMatchingKubernetesNodes returns only the given Rook nodes which have a corresponding
 // match in the list of Kubernetes nodes.
-func RookNodesMatchingKubernetesNodes(rookStorage rookv1.StorageScopeSpec, kubernetesNodes []v1.Node) []rookv1.Node {
-	nodes := []rookv1.Node{}
+func RookNodesMatchingKubernetesNodes(rookStorage cephv1.StorageScopeSpec, kubernetesNodes []v1.Node) []cephv1.Node {
+	nodes := []cephv1.Node{}
 	for _, kn := range kubernetesNodes {
 		for _, rn := range rookStorage.Nodes {
 			if rookNodeMatchesKubernetesNode(rn, kn) {


Test patch:
diff --git a/pkg/apis/ceph.rook.io/v1/annotations_test.go b/pkg/apis/ceph.rook.io/v1/annotations_test.go
index c217764a2..6ee49f967 100644
--- a/pkg/apis/ceph.rook.io/v1/annotations_test.go
+++ b/pkg/apis/ceph.rook.io/v1/annotations_test.go
@@ -17,20 +17,21 @@ limitations under the License.
 package v1
 
 import (
+	"encoding/json"
 	"testing"
 
-	rook "github.com/rook/rook/pkg/apis/rook.io/v1"
+	"github.com/ghodss/yaml"
 	"github.com/stretchr/testify/assert"
 )
 
-func TestAnnotationsMerge(t *testing.T) {
+func TestCephAnnotationsMerge(t *testing.T) {
 	// No annotations defined
-	testAnnotations := rook.AnnotationsSpec{}
+	testAnnotations := AnnotationsSpec{}
 	a := GetOSDAnnotations(testAnnotations)
 	assert.Nil(t, a)
 
 	// Only a specific component annotations without "all"
-	testAnnotations = rook.AnnotationsSpec{
+	testAnnotations = AnnotationsSpec{
 		"mgr":       {"mgrkey": "mgrval"},
 		"mon":       {"monkey": "monval"},
 		"osd":       {"osdkey": "osdval"},
@@ -48,14 +49,14 @@ func TestAnnotationsMerge(t *testing.T) {
 	assert.Equal(t, 1, len(a))
 
 	// No annotations matching the component
-	testAnnotations = rook.AnnotationsSpec{
+	testAnnotations = AnnotationsSpec{
 		"mgr": {"mgrkey": "mgrval"},
 	}
 	a = GetMonAnnotations(testAnnotations)
 	assert.Nil(t, a)
 
 	// Merge with "all"
-	testAnnotations = rook.AnnotationsSpec{
+	testAnnotations = AnnotationsSpec{
 		"all": {"allkey1": "allval1", "allkey2": "allval2"},
 		"mgr": {"mgrkey": "mgrval"},
 	}
@@ -69,3 +70,31 @@ func TestAnnotationsMerge(t *testing.T) {
 	assert.Equal(t, "allval2", a["allkey2"])
 	assert.Equal(t, 3, len(a))
 }
+
+func TestAnnotationsSpec(t *testing.T) {
+	specYaml := []byte(`
+mgr:
+  foo: bar
+  hello: world
+mon:
+`)
+
+	// convert the raw spec yaml into JSON
+	rawJSON, err := yaml.YAMLToJSON(specYaml)
+	assert.Nil(t, err)
+
+	// unmarshal the JSON into a strongly typed annotations spec object
+	var annotations AnnotationsSpec
+	err = json.Unmarshal(rawJSON, &annotations)
+	assert.Nil(t, err)
+
+	// the unmarshalled annotations spec should equal the expected spec below
+	expected := AnnotationsSpec{
+		"mgr": map[string]string{
+			"foo":   "bar",
+			"hello": "world",
+		},
+		"mon": nil,
+	}
+	assert.Equal(t, expected, annotations)
+}
diff --git a/pkg/apis/ceph.rook.io/v1/cluster_test.go b/pkg/apis/ceph.rook.io/v1/cluster_test.go
index ecc6cc53a..6fffb9ff9 100644
--- a/pkg/apis/ceph.rook.io/v1/cluster_test.go
+++ b/pkg/apis/ceph.rook.io/v1/cluster_test.go
@@ -19,7 +19,6 @@ package v1
 import (
 	"testing"
 
-	v1 "github.com/rook/rook/pkg/apis/rook.io/v1"
 	"github.com/stretchr/testify/assert"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
@@ -40,7 +39,7 @@ func Test_validateUpdatedCephCluster(t *testing.T) {
 		{"good mon count", args{&CephCluster{Spec: ClusterSpec{Mon: MonSpec{Count: 3}}}, &CephCluster{}}, false},
 		{"changed DataDirHostPath", args{&CephCluster{Spec: ClusterSpec{DataDirHostPath: "foo"}}, &CephCluster{Spec: ClusterSpec{DataDirHostPath: "bar"}}}, true},
 		{"changed HostNetwork", args{&CephCluster{Spec: ClusterSpec{Network: NetworkSpec{HostNetwork: false}}}, &CephCluster{Spec: ClusterSpec{Network: NetworkSpec{HostNetwork: true}}}}, true},
-		{"changed storageClassDeviceSet encryption", args{&CephCluster{Spec: ClusterSpec{Storage: v1.StorageScopeSpec{StorageClassDeviceSets: []v1.StorageClassDeviceSet{{Name: "foo", Encrypted: false}}}}}, &CephCluster{Spec: ClusterSpec{Storage: v1.StorageScopeSpec{StorageClassDeviceSets: []v1.StorageClassDeviceSet{{Name: "foo", Encrypted: true}}}}}}, true},
+		{"changed storageClassDeviceSet encryption", args{&CephCluster{Spec: ClusterSpec{Storage: StorageScopeSpec{StorageClassDeviceSets: []StorageClassDeviceSet{{Name: "foo", Encrypted: false}}}}}, &CephCluster{Spec: ClusterSpec{Storage: StorageScopeSpec{StorageClassDeviceSets: []StorageClassDeviceSet{{Name: "foo", Encrypted: true}}}}}}, true},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
diff --git a/pkg/apis/ceph.rook.io/v1/labels_test.go b/pkg/apis/ceph.rook.io/v1/labels_test.go
index fb3cf58a1..546f99962 100644
--- a/pkg/apis/ceph.rook.io/v1/labels_test.go
+++ b/pkg/apis/ceph.rook.io/v1/labels_test.go
@@ -17,20 +17,21 @@ limitations under the License.
 package v1
 
 import (
+	"encoding/json"
 	"testing"
 
-	rook "github.com/rook/rook/pkg/apis/rook.io/v1"
+	"github.com/ghodss/yaml"
 	"github.com/stretchr/testify/assert"
 )
 
-func TestLabelsMerge(t *testing.T) {
+func TestCephLabelsMerge(t *testing.T) {
 	// No Labels defined
-	testLabels := rook.LabelsSpec{}
+	testLabels := LabelsSpec{}
 	a := GetOSDLabels(testLabels)
 	assert.Nil(t, a)
 
 	// Only a specific component labels without "all"
-	testLabels = rook.LabelsSpec{
+	testLabels = LabelsSpec{
 		"mgr":       {"mgrkey": "mgrval"},
 		"mon":       {"monkey": "monval"},
 		"osd":       {"osdkey": "osdval"},
@@ -48,14 +49,14 @@ func TestLabelsMerge(t *testing.T) {
 	assert.Equal(t, 1, len(a))
 
 	// No Labels matching the component
-	testLabels = rook.LabelsSpec{
+	testLabels = LabelsSpec{
 		"mgr": {"mgrkey": "mgrval"},
 	}
 	a = GetMonLabels(testLabels)
 	assert.Nil(t, a)
 
 	// Merge with "all"
-	testLabels = rook.LabelsSpec{
+	testLabels = LabelsSpec{
 		"all": {"allkey1": "allval1", "allkey2": "allval2"},
 		"mgr": {"mgrkey": "mgrval"},
 	}
@@ -69,3 +70,31 @@ func TestLabelsMerge(t *testing.T) {
 	assert.Equal(t, "allval2", a["allkey2"])
 	assert.Equal(t, 3, len(a))
 }
+
+func TestLabelsSpec(t *testing.T) {
+	specYaml := []byte(`
+mgr:
+  foo: bar
+  hello: world
+mon:
+`)
+
+	// convert the raw spec yaml into JSON
+	rawJSON, err := yaml.YAMLToJSON(specYaml)
+	assert.Nil(t, err)
+
+	// unmarshal the JSON into a strongly typed Labels spec object
+	var Labels LabelsSpec
+	err = json.Unmarshal(rawJSON, &Labels)
+	assert.Nil(t, err)
+
+	// the unmarshalled Labels spec should equal the expected spec below
+	expected := LabelsSpec{
+		"mgr": map[string]string{
+			"foo":   "bar",
+			"hello": "world",
+		},
+		"mon": nil,
+	}
+	assert.Equal(t, expected, Labels)
+}
diff --git a/pkg/apis/ceph.rook.io/v1/network_test.go b/pkg/apis/ceph.rook.io/v1/network_test.go
index 8b3dda683..141fb88da 100644
--- a/pkg/apis/ceph.rook.io/v1/network_test.go
+++ b/pkg/apis/ceph.rook.io/v1/network_test.go
@@ -24,7 +24,7 @@ import (
 	"github.com/stretchr/testify/assert"
 )
 
-func TestNetworkCeph_SpecLegacy(t *testing.T) {
+func TestNetworkCephSpecLegacy(t *testing.T) {
 	netSpecYAML := []byte(`hostNetwork: true`)
 
 	rawJSON, err := yaml.YAMLToJSON(netSpecYAML)
@@ -40,8 +40,34 @@ func TestNetworkCeph_SpecLegacy(t *testing.T) {
 	assert.Equal(t, expected, net)
 }
 
-func TestNetworkCeph_IsHostLegacy(t *testing.T) {
+func TestNetworkCephIsHostLegacy(t *testing.T) {
 	net := NetworkSpec{HostNetwork: true}
 
 	assert.True(t, net.IsHost())
 }
+
+func TestNetworkSpec(t *testing.T) {
+	netSpecYAML := []byte(`
+provider: host
+selectors:
+  server: enp2s0f0
+  broker: enp2s0f0`)
+
+	rawJSON, err := yaml.YAMLToJSON(netSpecYAML)
+	assert.Nil(t, err)
+
+	var net NetworkSpec
+
+	err = json.Unmarshal(rawJSON, &net)
+	assert.Nil(t, err)
+
+	expected := NetworkSpec{
+		Provider: "host",
+		Selectors: map[string]string{
+			"server": "enp2s0f0",
+			"broker": "enp2s0f0",
+		},
+	}
+
+	assert.Equal(t, expected, net)
+}
diff --git a/pkg/apis/ceph.rook.io/v1/object_test.go b/pkg/apis/ceph.rook.io/v1/object_test.go
index b442bd7c5..889fa3b78 100644
--- a/pkg/apis/ceph.rook.io/v1/object_test.go
+++ b/pkg/apis/ceph.rook.io/v1/object_test.go
@@ -19,7 +19,7 @@ package v1
 import (
 	"testing"
 
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
+	rook "github.com/rook/rook/pkg/apis/rook.io"
 	"github.com/stretchr/testify/assert"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
@@ -88,7 +88,7 @@ func TestIsTLSEnabled(t *testing.T) {
 
 	// when service serving cert is used
 	objStore.Spec.Gateway.SSLCertificateRef = ""
-	objStore.Spec.Gateway.Service = &(RGWServiceSpec{Annotations: rookv1.Annotations{ServiceServingCertKey: "rgw-cert"}})
+	objStore.Spec.Gateway.Service = &(RGWServiceSpec{Annotations: rook.Annotations{ServiceServingCertKey: "rgw-cert"}})
 	IsTLS = objStore.Spec.IsTLSEnabled()
 	assert.True(t, IsTLS)
 
diff --git a/pkg/apis/ceph.rook.io/v1/spec_test.go b/pkg/apis/ceph.rook.io/v1/spec_test.go
index ed0127977..adab26e08 100644
--- a/pkg/apis/ceph.rook.io/v1/spec_test.go
+++ b/pkg/apis/ceph.rook.io/v1/spec_test.go
@@ -21,7 +21,6 @@ import (
 	"testing"
 
 	"github.com/ghodss/yaml"
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
 	"github.com/stretchr/testify/assert"
 )
 
@@ -69,9 +68,9 @@ storage:
 		Network: NetworkSpec{
 			HostNetwork: true,
 		},
-		Storage: rookv1.StorageScopeSpec{
+		Storage: StorageScopeSpec{
 			UseAllNodes: false,
-			Selection: rookv1.Selection{
+			Selection: Selection{
 				UseAllDevices:    &useAllDevices,
 				DeviceFilter:     "^sd.",
 				DevicePathFilter: "^/dev/disk/by-path/pci-.*",
@@ -81,10 +80,10 @@ storage:
 				"journalSizeMB":  "1024",
 				"databaseSizeMB": "1024",
 			},
-			Nodes: []rookv1.Node{
+			Nodes: []Node{
 				{
 					Name: "node2",
-					Selection: rookv1.Selection{
+					Selection: Selection{
 						DeviceFilter:     "^foo*",
 						DevicePathFilter: "^/dev/disk/by-id/.*foo.*",
 					},
diff --git a/pkg/apis/rook.io/annotations_test.go b/pkg/apis/rook.io/annotations_test.go
new file mode 100644
index 000000000..59997a610
--- /dev/null
+++ b/pkg/apis/rook.io/annotations_test.go
@@ -0,0 +1,62 @@
+/*
+Copyright 2021 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 rook
+
+import (
+	"testing"
+
+	"github.com/stretchr/testify/assert"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+)
+
+func TestAnnotationsApply(t *testing.T) {
+	objMeta := &metav1.ObjectMeta{}
+	testAnnotations := Annotations{
+		"foo":   "bar",
+		"hello": "world",
+	}
+	testAnnotations.ApplyToObjectMeta(objMeta)
+	assert.Equal(t, testAnnotations, Annotations(objMeta.Annotations))
+
+	testAnnotations["isthisatest"] = "test"
+	testAnnotations.ApplyToObjectMeta(objMeta)
+	assert.Equal(t, testAnnotations, Annotations(objMeta.Annotations))
+}
+
+func TestAnnotationsMerge(t *testing.T) {
+	testAnnotationsPart1 := Annotations{
+		"foo":   "bar",
+		"hello": "world",
+	}
+	testAnnotationsPart2 := Annotations{
+		"bar":   "foo",
+		"hello": "earth",
+	}
+	expected := map[string]string{
+		"foo":   "bar",
+		"bar":   "foo",
+		"hello": "world",
+	}
+	assert.Equal(t, expected, map[string]string(testAnnotationsPart1.Merge(testAnnotationsPart2)))
+
+	// Test that nil annotations can still be appended to
+	testAnnotationsPart3 := Annotations{
+		"hello": "world",
+	}
+	var empty Annotations
+	assert.Equal(t, map[string]string(testAnnotationsPart3), map[string]string(empty.Merge(testAnnotationsPart3)))
+}
diff --git a/pkg/apis/rook.io/v1/labels_test.go b/pkg/apis/rook.io/labels_spec.go
similarity index 65%
rename from pkg/apis/rook.io/v1/labels_test.go
rename to pkg/apis/rook.io/labels_spec.go
index cd84a0c6c..aec8ce641 100644
--- a/pkg/apis/rook.io/v1/labels_test.go
+++ b/pkg/apis/rook.io/labels_spec.go
@@ -14,45 +14,15 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-package v1
+package rook
 
 import (
-	"encoding/json"
 	"testing"
 
-	"github.com/ghodss/yaml"
 	"github.com/stretchr/testify/assert"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
-func TestLabelsSpec(t *testing.T) {
-	specYaml := []byte(`
-mgr:
-  foo: bar
-  hello: world
-mon:
-`)
-
-	// convert the raw spec yaml into JSON
-	rawJSON, err := yaml.YAMLToJSON(specYaml)
-	assert.Nil(t, err)
-
-	// unmarshal the JSON into a strongly typed Labels spec object
-	var Labels LabelsSpec
-	err = json.Unmarshal(rawJSON, &Labels)
-	assert.Nil(t, err)
-
-	// the unmarshalled Labels spec should equal the expected spec below
-	expected := LabelsSpec{
-		"mgr": map[string]string{
-			"foo":   "bar",
-			"hello": "world",
-		},
-		"mon": nil,
-	}
-	assert.Equal(t, expected, Labels)
-}
-
 func TestLabelsApply(t *testing.T) {
 	tcs := []struct {
 		name     string
@@ -103,7 +73,7 @@ func TestLabelsApply(t *testing.T) {
 
 	for _, tc := range tcs {
 		tc.input.ApplyToObjectMeta(tc.target)
-		assert.Equal(t, tc.expected.getMapStringString(), tc.target.Labels)
+		assert.Equal(t, map[string]string(tc.expected), tc.target.Labels)
 	}
 }
 
@@ -121,21 +91,12 @@ func TestLabelsMerge(t *testing.T) {
 		"bar":   "foo",
 		"hello": "world",
 	}
-	assert.Equal(t, expected, testLabelsPart1.Merge(testLabelsPart2).getMapStringString())
+	assert.Equal(t, expected, map[string]string(testLabelsPart1.Merge(testLabelsPart2)))
 
 	// Test that nil Labels can still be appended to
 	testLabelsPart3 := Labels{
 		"hello": "world",
 	}
 	var empty Labels
-	assert.Equal(t, map[string]string(testLabelsPart3), empty.Merge(testLabelsPart3).getMapStringString())
-}
-
-// getMapStringString return the Labels as a
-func (a Labels) getMapStringString() map[string]string {
-	res := map[string]string{}
-	for k, v := range a {
-		res[k] = v
-	}
-	return res
+	assert.Equal(t, map[string]string(testLabelsPart3), map[string]string(empty.Merge(testLabelsPart3)))
 }
diff --git a/pkg/apis/rook.io/v1/annotations_test.go b/pkg/apis/rook.io/v1/annotations_test.go
deleted file mode 100644
index ff0e7be78..000000000
--- a/pkg/apis/rook.io/v1/annotations_test.go
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
-Copyright 2019 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 v1
-
-import (
-	"encoding/json"
-	"testing"
-
-	"github.com/ghodss/yaml"
-	"github.com/stretchr/testify/assert"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-)
-
-func TestAnnotationsSpec(t *testing.T) {
-	specYaml := []byte(`
-mgr:
-  foo: bar
-  hello: world
-mon:
-`)
-
-	// convert the raw spec yaml into JSON
-	rawJSON, err := yaml.YAMLToJSON(specYaml)
-	assert.Nil(t, err)
-
-	// unmarshal the JSON into a strongly typed annotations spec object
-	var annotations AnnotationsSpec
-	err = json.Unmarshal(rawJSON, &annotations)
-	assert.Nil(t, err)
-
-	// the unmarshalled annotations spec should equal the expected spec below
-	expected := AnnotationsSpec{
-		"mgr": map[string]string{
-			"foo":   "bar",
-			"hello": "world",
-		},
-		"mon": nil,
-	}
-	assert.Equal(t, expected, annotations)
-}
-
-func TestAnnotationsApply(t *testing.T) {
-	objMeta := &metav1.ObjectMeta{}
-	testAnnotations := Annotations{
-		"foo":   "bar",
-		"hello": "world",
-	}
-	testAnnotations.ApplyToObjectMeta(objMeta)
-	assert.Equal(t, testAnnotations.getMapStringString(), objMeta.Annotations)
-
-	testAnnotations["isthisatest"] = "test"
-	testAnnotations.ApplyToObjectMeta(objMeta)
-	assert.Equal(t, testAnnotations.getMapStringString(), objMeta.Annotations)
-}
-
-func TestAnnotationsMerge(t *testing.T) {
-	testAnnotationsPart1 := Annotations{
-		"foo":   "bar",
-		"hello": "world",
-	}
-	testAnnotationsPart2 := Annotations{
-		"bar":   "foo",
-		"hello": "earth",
-	}
-	expected := map[string]string{
-		"foo":   "bar",
-		"bar":   "foo",
-		"hello": "world",
-	}
-	assert.Equal(t, expected, testAnnotationsPart1.Merge(testAnnotationsPart2).getMapStringString())
-
-	// Test that nil annotations can still be appended to
-	testAnnotationsPart3 := Annotations{
-		"hello": "world",
-	}
-	var empty Annotations
-	assert.Equal(t, map[string]string(testAnnotationsPart3), empty.Merge(testAnnotationsPart3).getMapStringString())
-}
-
-// getMapStringString return the Annotations as a
-func (a Annotations) getMapStringString() map[string]string {
-	res := map[string]string{}
-	for k, v := range a {
-		res[k] = v
-	}
-	return res
-}
diff --git a/pkg/apis/rook.io/v1/network_test.go b/pkg/apis/rook.io/v1/network_test.go
deleted file mode 100644
index 56ecafe04..000000000
--- a/pkg/apis/rook.io/v1/network_test.go
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
-Copyright 2019 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 v1
-
-import (
-	"encoding/json"
-	"testing"
-
-	"github.com/ghodss/yaml"
-	"github.com/stretchr/testify/assert"
-)
-
-func TestNetwork_Spec(t *testing.T) {
-	netSpecYAML := []byte(`
-provider: host
-selectors:
-  server: enp2s0f0
-  broker: enp2s0f0`)
-
-	rawJSON, err := yaml.YAMLToJSON(netSpecYAML)
-	assert.Nil(t, err)
-
-	var net NetworkSpec
-
-	err = json.Unmarshal(rawJSON, &net)
-	assert.Nil(t, err)
-
-	expected := NetworkSpec{
-		Provider: "host",
-		Selectors: map[string]string{
-			"server": "enp2s0f0",
-			"broker": "enp2s0f0",
-		},
-	}
-
-	assert.Equal(t, expected, net)
-}
diff --git a/pkg/daemon/ceph/client/pool_test.go b/pkg/daemon/ceph/client/pool_test.go
index 275d9388a..2e94dc126 100644
--- a/pkg/daemon/ceph/client/pool_test.go
+++ b/pkg/daemon/ceph/client/pool_test.go
@@ -23,7 +23,6 @@ import (
 
 	"github.com/pkg/errors"
 	cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
 	exectest "github.com/rook/rook/pkg/util/exec/test"
 	"github.com/stretchr/testify/assert"
 
@@ -174,7 +173,7 @@ func testCreateReplicaPool(t *testing.T, failureDomain, crushRoot, deviceClass,
 	if compressionMode != "" {
 		p.CompressionMode = compressionMode
 	}
-	clusterSpec := &cephv1.ClusterSpec{Storage: rookv1.StorageScopeSpec{Config: map[string]string{CrushRootConfigKey: "cluster-crush-root"}}}
+	clusterSpec := &cephv1.ClusterSpec{Storage: cephv1.StorageScopeSpec{Config: map[string]string{CrushRootConfigKey: "cluster-crush-root"}}}
 	err := CreateReplicatedPoolForApp(context, AdminClusterInfo("mycluster"), clusterSpec, "mypool", p, DefaultPGCount, "myapp")
 	assert.Nil(t, err)
 	assert.True(t, crushRuleCreated)
@@ -389,7 +388,7 @@ func testCreatePoolWithReplicasPerFailureDomain(t *testing.T, failureDomain, cru
 		return "", errors.Errorf("unexpected ceph command %q", args)
 	}
 	context := &clusterd.Context{Executor: executor}
-	clusterSpec := &cephv1.ClusterSpec{Storage: rookv1.StorageScopeSpec{Config: map[string]string{CrushRootConfigKey: "cluster-crush-root"}}}
+	clusterSpec := &cephv1.ClusterSpec{Storage: cephv1.StorageScopeSpec{Config: map[string]string{CrushRootConfigKey: "cluster-crush-root"}}}
 	err := CreateReplicatedPoolForApp(context, AdminClusterInfo("mycluster"), clusterSpec, poolName, poolSpec, DefaultPGCount, "myapp")
 	assert.Nil(t, err)
 	assert.True(t, poolRuleCreated)
diff --git a/pkg/operator/ceph/cluster/cleanup_test.go b/pkg/operator/ceph/cluster/cleanup_test.go
index 409a4f3a3..4f3876ae0 100644
--- a/pkg/operator/ceph/cluster/cleanup_test.go
+++ b/pkg/operator/ceph/cluster/cleanup_test.go
@@ -22,7 +22,6 @@ import (
 	"github.com/stretchr/testify/assert"
 
 	cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
 	rookfake "github.com/rook/rook/pkg/client/clientset/versioned/fake"
 	"github.com/rook/rook/pkg/clusterd"
 	"github.com/rook/rook/pkg/daemon/ceph/agent/flexvolume/attachment"
@@ -72,32 +71,32 @@ func TestCleanupPlacement(t *testing.T) {
 	// no tolerations end up in an empty list of tolerations
 	c := cephv1.ClusterSpec{}
 	p := getCleanupPlacement(c)
-	assert.Equal(t, rookv1.Placement{}, p)
+	assert.Equal(t, cephv1.Placement{}, p)
 
 	// add tolerations for each of the daemons
-	c.Placement = rookv1.PlacementSpec{}
-	c.Placement[rookv1.KeyAll] = rookv1.Placement{Tolerations: []v1.Toleration{{Key: "allToleration"}}}
+	c.Placement = cephv1.PlacementSpec{}
+	c.Placement[cephv1.KeyAll] = cephv1.Placement{Tolerations: []v1.Toleration{{Key: "allToleration"}}}
 	p = getCleanupPlacement(c)
-	assert.Equal(t, c.Placement[rookv1.KeyAll], p)
+	assert.Equal(t, c.Placement[cephv1.KeyAll], p)
 
-	c.Placement[cephv1.KeyMon] = rookv1.Placement{Tolerations: []v1.Toleration{{Key: "monToleration"}}}
+	c.Placement[cephv1.KeyMon] = cephv1.Placement{Tolerations: []v1.Toleration{{Key: "monToleration"}}}
 	p = getCleanupPlacement(c)
 	assert.Equal(t, 2, len(p.Tolerations))
 
-	c.Placement[cephv1.KeyMgr] = rookv1.Placement{Tolerations: []v1.Toleration{{Key: "mgrToleration"}}}
+	c.Placement[cephv1.KeyMgr] = cephv1.Placement{Tolerations: []v1.Toleration{{Key: "mgrToleration"}}}
 	p = getCleanupPlacement(c)
 	assert.Equal(t, 3, len(p.Tolerations))
 
-	c.Placement[cephv1.KeyMonArbiter] = rookv1.Placement{Tolerations: []v1.Toleration{{Key: "monArbiterToleration"}}}
+	c.Placement[cephv1.KeyMonArbiter] = cephv1.Placement{Tolerations: []v1.Toleration{{Key: "monArbiterToleration"}}}
 	p = getCleanupPlacement(c)
 	assert.Equal(t, 4, len(p.Tolerations))
 
-	c.Placement[cephv1.KeyOSD] = rookv1.Placement{Tolerations: []v1.Toleration{{Key: "osdToleration"}}}
+	c.Placement[cephv1.KeyOSD] = cephv1.Placement{Tolerations: []v1.Toleration{{Key: "osdToleration"}}}
 	p = getCleanupPlacement(c)
 	assert.Equal(t, 5, len(p.Tolerations))
 
-	c.Storage.StorageClassDeviceSets = []rookv1.StorageClassDeviceSet{
-		{Placement: rookv1.Placement{Tolerations: []v1.Toleration{{Key: "deviceSetToleration"}}}},
+	c.Storage.StorageClassDeviceSets = []cephv1.StorageClassDeviceSet{
+		{Placement: cephv1.Placement{Tolerations: []v1.Toleration{{Key: "deviceSetToleration"}}}},
 	}
 	p = getCleanupPlacement(c)
 	assert.Equal(t, 6, len(p.Tolerations))
diff --git a/pkg/operator/ceph/cluster/mgr/mgr_test.go b/pkg/operator/ceph/cluster/mgr/mgr_test.go
index 0e28cc100..58d8fd555 100644
--- a/pkg/operator/ceph/cluster/mgr/mgr_test.go
+++ b/pkg/operator/ceph/cluster/mgr/mgr_test.go
@@ -24,7 +24,7 @@ import (
 	"testing"
 
 	cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
+	"github.com/rook/rook/pkg/apis/rook.io"
 	"github.com/rook/rook/pkg/clusterd"
 	cephclient "github.com/rook/rook/pkg/daemon/ceph/client"
 	cephver "github.com/rook/rook/pkg/operator/ceph/version"
@@ -66,11 +66,11 @@ func TestStartMgr(t *testing.T) {
 	clusterInfo := &cephclient.ClusterInfo{Namespace: "ns", FSID: "myfsid", OwnerInfo: ownerInfo}
 	clusterInfo.SetName("test")
 	clusterSpec := cephv1.ClusterSpec{
-		Annotations:        map[rookv1.KeyType]rookv1.Annotations{cephv1.KeyMgr: {"my": "annotation"}},
-		Labels:             map[rookv1.KeyType]rookv1.Labels{cephv1.KeyMgr: {"my-label-key": "value"}},
+		Annotations:        map[rook.KeyType]rook.Annotations{cephv1.KeyMgr: {"my": "annotation"}},
+		Labels:             map[rook.KeyType]rook.Labels{cephv1.KeyMgr: {"my-label-key": "value"}},
 		Dashboard:          cephv1.DashboardSpec{Enabled: true, SSL: true},
 		Mgr:                cephv1.MgrSpec{Count: 1},
-		PriorityClassNames: map[rookv1.KeyType]string{cephv1.KeyMgr: "my-priority-class"},
+		PriorityClassNames: map[rook.KeyType]string{cephv1.KeyMgr: "my-priority-class"},
 		DataDirHostPath:    "/var/lib/rook/",
 	}
 	c := New(ctx, clusterInfo, clusterSpec, "myversion")
diff --git a/pkg/operator/ceph/cluster/mgr/spec_test.go b/pkg/operator/ceph/cluster/mgr/spec_test.go
index 0c7ed1a17..d91fc0c91 100644
--- a/pkg/operator/ceph/cluster/mgr/spec_test.go
+++ b/pkg/operator/ceph/cluster/mgr/spec_test.go
@@ -20,7 +20,7 @@ import (
 	"testing"
 
 	cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
+	"github.com/rook/rook/pkg/apis/rook.io"
 	"github.com/rook/rook/pkg/clusterd"
 	cephclient "github.com/rook/rook/pkg/daemon/ceph/client"
 	"github.com/rook/rook/pkg/operator/ceph/config"
@@ -40,9 +40,9 @@ func TestPodSpec(t *testing.T) {
 	clusterSpec := cephv1.ClusterSpec{
 		CephVersion:        cephv1.CephVersionSpec{Image: "ceph/ceph:myceph"},
 		Dashboard:          cephv1.DashboardSpec{Port: 1234},
-		PriorityClassNames: map[rookv1.KeyType]string{cephv1.KeyMgr: "my-priority-class"},
+		PriorityClassNames: map[rook.KeyType]string{cephv1.KeyMgr: "my-priority-class"},
 		DataDirHostPath:    "/var/lib/rook/",
-		Resources: rookv1.ResourceSpec{string(cephv1.KeyMgr): v1.ResourceRequirements{
+		Resources: cephv1.ResourceSpec{string(cephv1.KeyMgr): v1.ResourceRequirements{
 			Limits: v1.ResourceList{
 				v1.ResourceCPU:    *resource.NewQuantity(200.0, resource.BinarySI),
 				v1.ResourceMemory: *resource.NewQuantity(500.0, resource.BinarySI),
@@ -151,10 +151,10 @@ func TestApplyPrometheusAnnotations(t *testing.T) {
 	d, err = c.makeDeployment(&mgrTestConfig)
 	assert.NoError(t, err)
 
-	fakeAnnotations := rookv1.Annotations{
+	fakeAnnotations := rook.Annotations{
 		"foo.io/bar": "foobar",
 	}
-	c.spec.Annotations = map[rookv1.KeyType]rookv1.Annotations{cephv1.KeyMgr: fakeAnnotations}
+	c.spec.Annotations = map[rook.KeyType]rook.Annotations{cephv1.KeyMgr: fakeAnnotations}
 
 	c.applyPrometheusAnnotations(&d.ObjectMeta)
 	assert.Equal(t, 1, len(c.spec.Annotations))
diff --git a/pkg/operator/ceph/cluster/mon/mon_test.go b/pkg/operator/ceph/cluster/mon/mon_test.go
index 3df90b419..7743c9927 100644
--- a/pkg/operator/ceph/cluster/mon/mon_test.go
+++ b/pkg/operator/ceph/cluster/mon/mon_test.go
@@ -31,7 +31,6 @@ import (
 
 	"github.com/pkg/errors"
 	cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
 	"github.com/rook/rook/pkg/clusterd"
 	cephclient "github.com/rook/rook/pkg/daemon/ceph/client"
 	clienttest "github.com/rook/rook/pkg/daemon/ceph/client/test"
@@ -551,7 +550,7 @@ func TestStretchMonVolumeClaimTemplate(t *testing.T) {
 }
 
 func TestArbiterPlacement(t *testing.T) {
-	placement := rookv1.Placement{
+	placement := cephv1.Placement{
 		NodeAffinity: &v1.NodeAffinity{
 			RequiredDuringSchedulingIgnoredDuringExecution: &v1.NodeSelector{
 				NodeSelectorTerms: []v1.NodeSelectorTerm{
@@ -580,19 +579,19 @@ func TestArbiterPlacement(t *testing.T) {
 		},
 	}}
 
-	c.spec.Placement = rookv1.PlacementSpec{}
+	c.spec.Placement = cephv1.PlacementSpec{}
 	c.spec.Placement[cephv1.KeyMonArbiter] = placement
 
 	// No placement is found if not requesting the arbiter placement
 	result := c.getMonPlacement("c")
-	assert.Equal(t, rookv1.Placement{}, result)
+	assert.Equal(t, cephv1.Placement{}, result)
 
 	// Placement is found if requesting the arbiter
 	result = c.getMonPlacement("a")
 	assert.Equal(t, placement, result)
 
 	// Arbiter and all mons have the same placement if no arbiter placement is specified
-	c.spec.Placement = rookv1.PlacementSpec{}
+	c.spec.Placement = cephv1.PlacementSpec{}
 	c.spec.Placement[cephv1.KeyMon] = placement
 	result = c.getMonPlacement("a")
 	assert.Equal(t, placement, result)
diff --git a/pkg/operator/ceph/cluster/mon/node_test.go b/pkg/operator/ceph/cluster/mon/node_test.go
index 5e99ffba1..ec8eeb296 100644
--- a/pkg/operator/ceph/cluster/mon/node_test.go
+++ b/pkg/operator/ceph/cluster/mon/node_test.go
@@ -23,7 +23,7 @@ import (
 	"testing"
 
 	cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
+	"github.com/rook/rook/pkg/apis/rook.io"
 	"github.com/rook/rook/pkg/clusterd"
 	clienttest "github.com/rook/rook/pkg/daemon/ceph/client/test"
 	cephver "github.com/rook/rook/pkg/operator/ceph/version"
@@ -41,8 +41,8 @@ func TestNodeAffinity(t *testing.T) {
 	c := New(&clusterd.Context{Clientset: clientset}, "ns", cephv1.ClusterSpec{}, &k8sutil.OwnerInfo{}, &sync.Mutex{})
 	setCommonMonProperties(c, 0, cephv1.MonSpec{Count: 3, AllowMultiplePerNode: true}, "myversion")
 
-	c.spec.Placement = map[rookv1.KeyType]rookv1.Placement{}
-	c.spec.Placement[cephv1.KeyMon] = rookv1.Placement{NodeAffinity: &v1.NodeAffinity{
+	c.spec.Placement = map[rook.KeyType]cephv1.Placement{}
+	c.spec.Placement[cephv1.KeyMon] = cephv1.Placement{NodeAffinity: &v1.NodeAffinity{
 		RequiredDuringSchedulingIgnoredDuringExecution: &v1.NodeSelector{
 			NodeSelectorTerms: []v1.NodeSelectorTerm{
 				{
diff --git a/pkg/operator/ceph/cluster/mon/spec_test.go b/pkg/operator/ceph/cluster/mon/spec_test.go
index d7a49760a..4144d95a4 100644
--- a/pkg/operator/ceph/cluster/mon/spec_test.go
+++ b/pkg/operator/ceph/cluster/mon/spec_test.go
@@ -21,7 +21,7 @@ import (
 	"testing"
 
 	cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
+	"github.com/rook/rook/pkg/apis/rook.io"
 	"github.com/rook/rook/pkg/clusterd"
 	cephclient "github.com/rook/rook/pkg/daemon/ceph/client"
 	"github.com/rook/rook/pkg/operator/ceph/config"
@@ -64,7 +64,7 @@ func testPodSpec(t *testing.T, monID string, pvc bool) {
 			v1.ResourceMemory: *resource.NewQuantity(500.0, resource.BinarySI),
 		},
 	}
-	c.spec.PriorityClassNames = map[rookv1.KeyType]string{
+	c.spec.PriorityClassNames = map[rook.KeyType]string{
 		cephv1.KeyMon: "my-priority-class",
 	}
 	monConfig := testGenMonConfig(monID)
diff --git a/pkg/operator/ceph/cluster/osd/config_test.go b/pkg/operator/ceph/cluster/osd/config_test.go
index 6105b6c8d..5753d76f5 100644
--- a/pkg/operator/ceph/cluster/osd/config_test.go
+++ b/pkg/operator/ceph/cluster/osd/config_test.go
@@ -20,7 +20,6 @@ import (
 	"testing"
 
 	cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
 	"github.com/rook/rook/pkg/clusterd"
 	cephclient "github.com/rook/rook/pkg/daemon/ceph/client"
 	cephver "github.com/rook/rook/pkg/operator/ceph/version"
@@ -64,7 +63,7 @@ func TestClusterIsCephVolumeRAwModeSupported(t *testing.T) {
 		clusterInfo  *cephclient.ClusterInfo
 		rookVersion  string
 		spec         cephv1.ClusterSpec
-		ValidStorage rookv1.StorageScopeSpec
+		ValidStorage cephv1.StorageScopeSpec
 		kv           *k8sutil.ConfigMapKVStore
 	}
 	tests := []struct {
@@ -72,10 +71,10 @@ func TestClusterIsCephVolumeRAwModeSupported(t *testing.T) {
 		fields fields
 		want   bool
 	}{
-		{"nok-14.2.4", fields{&clusterd.Context{}, &cephclient.ClusterInfo{CephVersion: cephver.CephVersion{Major: 14, Minor: 2, Extra: 4}}, "", cephv1.ClusterSpec{}, rookv1.StorageScopeSpec{}, &k8sutil.ConfigMapKVStore{}}, false},
-		{"ok-14.2.11", fields{&clusterd.Context{}, &cephclient.ClusterInfo{CephVersion: cephver.CephVersion{Major: 14, Minor: 2, Extra: 11}}, "", cephv1.ClusterSpec{}, rookv1.StorageScopeSpec{}, &k8sutil.ConfigMapKVStore{}}, true},
-		{"nok-15.2.4", fields{&clusterd.Context{}, &cephclient.ClusterInfo{CephVersion: cephver.CephVersion{Major: 15, Minor: 2, Extra: 4}}, "", cephv1.ClusterSpec{}, rookv1.StorageScopeSpec{}, &k8sutil.ConfigMapKVStore{}}, false},
-		{"ok-15.2.5", fields{&clusterd.Context{}, &cephclient.ClusterInfo{CephVersion: cephver.CephVersion{Major: 15, Minor: 2, Extra: 5}}, "", cephv1.ClusterSpec{}, rookv1.StorageScopeSpec{}, &k8sutil.ConfigMapKVStore{}}, true},
+		{"nok-14.2.4", fields{&clusterd.Context{}, &cephclient.ClusterInfo{CephVersion: cephver.CephVersion{Major: 14, Minor: 2, Extra: 4}}, "", cephv1.ClusterSpec{}, cephv1.StorageScopeSpec{}, &k8sutil.ConfigMapKVStore{}}, false},
+		{"ok-14.2.11", fields{&clusterd.Context{}, &cephclient.ClusterInfo{CephVersion: cephver.CephVersion{Major: 14, Minor: 2, Extra: 11}}, "", cephv1.ClusterSpec{}, cephv1.StorageScopeSpec{}, &k8sutil.ConfigMapKVStore{}}, true},
+		{"nok-15.2.4", fields{&clusterd.Context{}, &cephclient.ClusterInfo{CephVersion: cephver.CephVersion{Major: 15, Minor: 2, Extra: 4}}, "", cephv1.ClusterSpec{}, cephv1.StorageScopeSpec{}, &k8sutil.ConfigMapKVStore{}}, false},
+		{"ok-15.2.5", fields{&clusterd.Context{}, &cephclient.ClusterInfo{CephVersion: cephver.CephVersion{Major: 15, Minor: 2, Extra: 5}}, "", cephv1.ClusterSpec{}, cephv1.StorageScopeSpec{}, &k8sutil.ConfigMapKVStore{}}, true},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
diff --git a/pkg/operator/ceph/cluster/osd/create_test.go b/pkg/operator/ceph/cluster/osd/create_test.go
index 20b4174af..e79938b1b 100644
--- a/pkg/operator/ceph/cluster/osd/create_test.go
+++ b/pkg/operator/ceph/cluster/osd/create_test.go
@@ -23,7 +23,6 @@ import (
 
 	"github.com/pkg/errors"
 	cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
 	"github.com/rook/rook/pkg/clusterd"
 	cephclient "github.com/rook/rook/pkg/daemon/ceph/client"
 	cephver "github.com/rook/rook/pkg/operator/ceph/version"
@@ -352,8 +351,8 @@ func Test_startProvisioningOverPVCs(t *testing.T) {
 
 	t.Run("do nothing if device set count is zero", func(t *testing.T) {
 		spec = cephv1.ClusterSpec{
-			Storage: rookv1.StorageScopeSpec{
-				StorageClassDeviceSets: []rookv1.StorageClassDeviceSet{
+			Storage: cephv1.StorageScopeSpec{
+				StorageClassDeviceSets: []cephv1.StorageClassDeviceSet{
 					{
 						Name:  "set1",
 						Count: 0,
@@ -377,8 +376,8 @@ func Test_startProvisioningOverPVCs(t *testing.T) {
 
 	t.Run("one device set with 2 PVCs", func(t *testing.T) {
 		spec = cephv1.ClusterSpec{
-			Storage: rookv1.StorageScopeSpec{
-				StorageClassDeviceSets: []rookv1.StorageClassDeviceSet{
+			Storage: cephv1.StorageScopeSpec{
+				StorageClassDeviceSets: []cephv1.StorageClassDeviceSet{
 					{
 						Name:  "set1",
 						Count: 2,
@@ -440,8 +439,8 @@ func Test_startProvisioningOverPVCs(t *testing.T) {
 
 	t.Run("error if no volume claim template", func(t *testing.T) {
 		spec = cephv1.ClusterSpec{
-			Storage: rookv1.StorageScopeSpec{
-				StorageClassDeviceSets: []rookv1.StorageClassDeviceSet{
+			Storage: cephv1.StorageScopeSpec{
+				StorageClassDeviceSets: []cephv1.StorageClassDeviceSet{
 					{
 						Name:                 "set1",
 						Count:                2,
@@ -521,9 +520,9 @@ func Test_startProvisioningOverNodes(t *testing.T) {
 		useAllDevices = true
 		spec = cephv1.ClusterSpec{
 			// this storage spec should cause prepare jobs to run on all (3) nodes
-			Storage: rookv1.StorageScopeSpec{
+			Storage: cephv1.StorageScopeSpec{
 				UseAllNodes: true,
-				Selection: rookv1.Selection{
+				Selection: cephv1.Selection{
 					UseAllDevices: &useAllDevices,
 				},
 			},
@@ -560,7 +559,7 @@ func Test_startProvisioningOverNodes(t *testing.T) {
 
 	t.Run("use all nodes and devices when useAllNodes and individual nodes are both set", func(t *testing.T) {
 		// this also tests that jobs that currently exist (created in previous test) are handled
-		spec.Storage.Nodes = []rookv1.Node{
+		spec.Storage.Nodes = []cephv1.Node{
 			{Name: "node0"}, {Name: "node2"},
 		}
 		doSetup()
@@ -577,14 +576,14 @@ func Test_startProvisioningOverNodes(t *testing.T) {
 		// this also tests that existing status configmaps (from the previous tests) don't affect the
 		// reported status configmaps from this run
 		spec = cephv1.ClusterSpec{
-			Storage: rookv1.StorageScopeSpec{
+			Storage: cephv1.StorageScopeSpec{
 				UseAllNodes: false,
-				Nodes: []rookv1.Node{
+				Nodes: []cephv1.Node{
 					// run on only node0 and node2
 					{Name: "node0"},
 					{Name: "node2"},
 				},
-				Selection: rookv1.Selection{
+				Selection: cephv1.Selection{
 					UseAllDevices: &useAllDevices,
 				},
 			},
@@ -612,12 +611,12 @@ func Test_startProvisioningOverNodes(t *testing.T) {
 
 	t.Run("use no nodes", func(t *testing.T) {
 		spec = cephv1.ClusterSpec{
-			Storage: rookv1.StorageScopeSpec{
+			Storage: cephv1.StorageScopeSpec{
 				UseAllNodes: false,
-				Nodes:       []rookv1.Node{
+				Nodes:       []cephv1.Node{
 					// empty
 				},
-				Selection: rookv1.Selection{
+				Selection: cephv1.Selection{
 					UseAllDevices: &useAllDevices,
 				},
 			},
@@ -632,14 +631,14 @@ func Test_startProvisioningOverNodes(t *testing.T) {
 
 	t.Run("failures running prepare jobs", func(t *testing.T) {
 		spec = cephv1.ClusterSpec{
-			Storage: rookv1.StorageScopeSpec{
+			Storage: cephv1.StorageScopeSpec{
 				UseAllNodes: false,
-				Nodes: []rookv1.Node{
+				Nodes: []cephv1.Node{
 					// run on only node0 and node2
 					{Name: "node0"},
 					{Name: "node2"},
 				},
-				Selection: rookv1.Selection{
+				Selection: cephv1.Selection{
 					UseAllDevices: &useAllDevices,
 				},
 			},
diff --git a/pkg/operator/ceph/cluster/osd/deviceset_test.go b/pkg/operator/ceph/cluster/osd/deviceset_test.go
index da5a15c8e..6bf7dd658 100644
--- a/pkg/operator/ceph/cluster/osd/deviceset_test.go
+++ b/pkg/operator/ceph/cluster/osd/deviceset_test.go
@@ -21,7 +21,6 @@ import (
 	"testing"
 
 	cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
 	"github.com/rook/rook/pkg/clusterd"
 	"github.com/rook/rook/pkg/daemon/ceph/client"
 	testexec "github.com/rook/rook/pkg/operator/test"
@@ -48,7 +47,7 @@ func testPrepareDeviceSets(t *testing.T, setTemplateName bool) {
 	if setTemplateName {
 		claim.Name = "randomname"
 	}
-	deviceSet := rookv1.StorageClassDeviceSet{
+	deviceSet := cephv1.StorageClassDeviceSet{
 		Name:                 "mydata",
 		Count:                1,
 		Portable:             true,
@@ -56,7 +55,7 @@ func testPrepareDeviceSets(t *testing.T, setTemplateName bool) {
 		SchedulerName:        "custom-scheduler",
 	}
 	spec := cephv1.ClusterSpec{
-		Storage: rookv1.StorageScopeSpec{StorageClassDeviceSets: []rookv1.StorageClassDeviceSet{deviceSet}},
+		Storage: cephv1.StorageScopeSpec{StorageClassDeviceSets: []cephv1.StorageClassDeviceSet{deviceSet}},
 	}
 	cluster := &Cluster{
 		context:     context,
@@ -93,7 +92,7 @@ func TestPrepareDeviceSetWithHolesInPVCs(t *testing.T) {
 		Clientset: clientset,
 	}
 
-	deviceSet := rookv1.StorageClassDeviceSet{
+	deviceSet := cephv1.StorageClassDeviceSet{
 		Name:                 "mydata",
 		Count:                1,
 		Portable:             true,
@@ -101,7 +100,7 @@ func TestPrepareDeviceSetWithHolesInPVCs(t *testing.T) {
 		SchedulerName:        "custom-scheduler",
 	}
 	spec := cephv1.ClusterSpec{
-		Storage: rookv1.StorageScopeSpec{StorageClassDeviceSets: []rookv1.StorageClassDeviceSet{deviceSet}},
+		Storage: cephv1.StorageScopeSpec{StorageClassDeviceSets: []cephv1.StorageClassDeviceSet{deviceSet}},
 	}
 	ns := "testns"
 	cluster := &Cluster{
@@ -239,7 +238,7 @@ func TestPrepareDeviceSetsWithCrushParams(t *testing.T) {
 	context := &clusterd.Context{
 		Clientset: clientset,
 	}
-	deviceSet := rookv1.StorageClassDeviceSet{
+	deviceSet := cephv1.StorageClassDeviceSet{
 		Name:                 "datawithcrushparams1",
 		Count:                1,
 		VolumeClaimTemplates: []corev1.PersistentVolumeClaim{testVolumeClaim("testwithcrushparams1")},
@@ -252,7 +251,7 @@ func TestPrepareDeviceSetsWithCrushParams(t *testing.T) {
 	}
 
 	spec := cephv1.ClusterSpec{
-		Storage: rookv1.StorageScopeSpec{StorageClassDeviceSets: []rookv1.StorageClassDeviceSet{deviceSet}},
+		Storage: cephv1.StorageScopeSpec{StorageClassDeviceSets: []cephv1.StorageClassDeviceSet{deviceSet}},
 	}
 	cluster := &Cluster{
 		context:     context,
diff --git a/pkg/operator/ceph/cluster/osd/integration_test.go b/pkg/operator/ceph/cluster/osd/integration_test.go
index b08c89ea6..18b7125d8 100644
--- a/pkg/operator/ceph/cluster/osd/integration_test.go
+++ b/pkg/operator/ceph/cluster/osd/integration_test.go
@@ -29,7 +29,6 @@ import (
 	"github.com/coreos/pkg/capnslog"
 	"github.com/pkg/errors"
 	cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
 	"github.com/rook/rook/pkg/clusterd"
 	cephclient "github.com/rook/rook/pkg/daemon/ceph/client"
 	cephclientfake "github.com/rook/rook/pkg/daemon/ceph/client/fake"
@@ -206,13 +205,13 @@ func testOSDIntegration(t *testing.T) {
 		},
 		DataDirHostPath: context.ConfigDir,
 		// This storage spec should... (see inline)
-		Storage: rookv1.StorageScopeSpec{
+		Storage: cephv1.StorageScopeSpec{
 			UseAllNodes: true,
-			Selection: rookv1.Selection{
+			Selection: cephv1.Selection{
 				// ... create 2 osd on each of the 3 nodes (6 total)
 				DeviceFilter: "vd[ab]",
 			},
-			StorageClassDeviceSets: []rookv1.StorageClassDeviceSet{
+			StorageClassDeviceSets: []cephv1.StorageClassDeviceSet{
 				// ... create 6 portable osds
 				newDummyStorageClassDeviceSet("portable-set", namespace, 6, true, "ec2"),
 				// ... create 3 local, non-portable osds, one on each node
@@ -448,7 +447,7 @@ func testOSDIntegration(t *testing.T) {
 	})
 
 	t.Run("failures from improperly formatted StorageClassDeviceSet", func(t *testing.T) {
-		newSCDS := rookv1.StorageClassDeviceSet{
+		newSCDS := cephv1.StorageClassDeviceSet{
 			Name:                 "new",
 			Count:                3,
 			Portable:             true,
@@ -599,8 +598,8 @@ func (g *osdIDGenerator) osdID(t *testing.T, namedResource string) int {
 
 func newDummyStorageClassDeviceSet(
 	name string, namespace string, count int, portable bool, storageClassName string,
-) rookv1.StorageClassDeviceSet {
-	return rookv1.StorageClassDeviceSet{
+) cephv1.StorageClassDeviceSet {
+	return cephv1.StorageClassDeviceSet{
 		Name:     name,
 		Count:    count,
 		Portable: portable,
diff --git a/pkg/operator/ceph/cluster/osd/osd_test.go b/pkg/operator/ceph/cluster/osd/osd_test.go
index 44f35f7ab..e98323eb5 100644
--- a/pkg/operator/ceph/cluster/osd/osd_test.go
+++ b/pkg/operator/ceph/cluster/osd/osd_test.go
@@ -23,7 +23,6 @@ import (
 
 	"github.com/pkg/errors"
 	cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
 	fakeclient "github.com/rook/rook/pkg/client/clientset/versioned/fake"
 	"github.com/rook/rook/pkg/clusterd"
 	cephclient "github.com/rook/rook/pkg/daemon/ceph/client"
@@ -171,12 +170,12 @@ func TestAddRemoveNode(t *testing.T) {
 	}
 	spec := cephv1.ClusterSpec{
 		DataDirHostPath: context.ConfigDir,
-		Storage: rookv1.StorageScopeSpec{
-			Nodes: []rookv1.Node{
+		Storage: cephv1.StorageScopeSpec{
+			Nodes: []cephv1.Node{
 				{
 					Name: nodeName,
-					Selection: rookv1.Selection{
-						Devices: []rookv1.Device{{Name: "sdx"}},
+					Selection: cephv1.Selection{
+						Devices: []cephv1.Device{{Name: "sdx"}},
 					},
 				},
 			},
@@ -269,7 +268,7 @@ func TestAddRemoveNode(t *testing.T) {
 	}
 
 	// modify the storage spec to remove the node from the cluster
-	spec.Storage.Nodes = []rookv1.Node{}
+	spec.Storage.Nodes = []cephv1.Node{}
 	c = New(context, clusterInfo, spec, "myversion")
 
 	// reset the orchestration status watcher
@@ -328,12 +327,12 @@ func TestAddNodeFailure(t *testing.T) {
 	context := &clusterd.Context{Clientset: clientset, ConfigDir: "/var/lib/rook", Executor: &exectest.MockExecutor{}, RequestCancelOrchestration: abool.New()}
 	spec := cephv1.ClusterSpec{
 		DataDirHostPath: context.ConfigDir,
-		Storage: rookv1.StorageScopeSpec{
-			Nodes: []rookv1.Node{
+		Storage: cephv1.StorageScopeSpec{
+			Nodes: []cephv1.Node{
 				{
 					Name: nodeName,
-					Selection: rookv1.Selection{
-						Devices: []rookv1.Device{{Name: "sdx"}},
+					Selection: cephv1.Selection{
+						Devices: []cephv1.Device{{Name: "sdx"}},
 					},
 				},
 			},
@@ -427,7 +426,7 @@ func TestGetOSDInfo(t *testing.T) {
 	osdProp := osdProperties{
 		crushHostname: node,
 		pvc:           corev1.PersistentVolumeClaimVolumeSource{ClaimName: "pvc"},
-		selection:     rookv1.Selection{},
+		selection:     cephv1.Selection{},
 		resources:     corev1.ResourceRequirements{},
 		storeConfig:   config.StoreConfig{},
 		portable:      true,
@@ -469,9 +468,9 @@ func TestGetOSDInfo(t *testing.T) {
 		osd5 := OSDInfo{ID: 3, UUID: "osd-uuid", BlockPath: "vg1/lv1", CVMode: "lvm"}
 		osdProp = osdProperties{
 			crushHostname: node,
-			devices:       []rookv1.Device{},
+			devices:       []cephv1.Device{},
 			pvc:           corev1.PersistentVolumeClaimVolumeSource{},
-			selection: rookv1.Selection{
+			selection: cephv1.Selection{
 				UseAllDevices: &useAllDevices,
 			},
 			resources:      corev1.ResourceRequirements{},
@@ -498,7 +497,7 @@ func TestOSDPlacement(t *testing.T) {
 	assert.Nil(t, result.NodeAffinity)
 
 	// the osd daemon placement is specified
-	prop.placement = rookv1.Placement{NodeAffinity: &corev1.NodeAffinity{
+	prop.placement = cephv1.Placement{NodeAffinity: &corev1.NodeAffinity{
 		RequiredDuringSchedulingIgnoredDuringExecution: &corev1.NodeSelector{
 			NodeSelectorTerms: []corev1.NodeSelectorTerm{
 				{
@@ -520,7 +519,7 @@ func TestOSDPlacement(t *testing.T) {
 	assert.Equal(t, "label1", result.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms[0].MatchExpressions[0].Key)
 
 	// The prepare placement is specified and takes precedence over the osd placement
-	prop.preparePlacement = &rookv1.Placement{NodeAffinity: &corev1.NodeAffinity{
+	prop.preparePlacement = &cephv1.Placement{NodeAffinity: &corev1.NodeAffinity{
 		RequiredDuringSchedulingIgnoredDuringExecution: &corev1.NodeSelector{
 			NodeSelectorTerms: []corev1.NodeSelectorTerm{
 				{
@@ -590,7 +589,7 @@ func TestGetOSDInfoWithCustomRoot(t *testing.T) {
 	context := &clusterd.Context{}
 	spec := cephv1.ClusterSpec{
 		DataDirHostPath: "/rook",
-		Storage: rookv1.StorageScopeSpec{
+		Storage: cephv1.StorageScopeSpec{
 			Config: map[string]string{
 				"crushRoot": "custom-root",
 			},
@@ -606,7 +605,7 @@ func TestGetOSDInfoWithCustomRoot(t *testing.T) {
 	osdProp := osdProperties{
 		crushHostname: node,
 		pvc:           corev1.PersistentVolumeClaimVolumeSource{ClaimName: "pvc"},
-		selection:     rookv1.Selection{},
+		selection:     cephv1.Selection{},
 		resources:     corev1.ResourceRequirements{},
 		storeConfig:   config.StoreConfig{},
 	}
diff --git a/pkg/operator/ceph/cluster/osd/spec_test.go b/pkg/operator/ceph/cluster/osd/spec_test.go
index 1c4e5851a..7123a15f2 100644
--- a/pkg/operator/ceph/cluster/osd/spec_test.go
+++ b/pkg/operator/ceph/cluster/osd/spec_test.go
@@ -21,7 +21,7 @@ import (
 	"testing"
 
 	cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
+	"github.com/rook/rook/pkg/apis/rook.io"
 	"github.com/rook/rook/pkg/clusterd"
 	cephclient "github.com/rook/rook/pkg/daemon/ceph/client"
 	"github.com/rook/rook/pkg/operator/ceph/cluster/osd/config"
@@ -42,7 +42,7 @@ func TestPodContainer(t *testing.T) {
 	cluster.clusterInfo.OwnerInfo = cephclient.NewMinimumOwnerInfo(t)
 	osdProps := osdProperties{
 		crushHostname: "node",
-		devices:       []rookv1.Device{},
+		devices:       []cephv1.Device{},
 		resources:     v1.ResourceRequirements{},
 		storeConfig:   config.StoreConfig{},
 		schedulerName: "custom-scheduler",
@@ -81,7 +81,7 @@ func TestDaemonset(t *testing.T) {
 }
 
 func testPodDevices(t *testing.T, dataDir, deviceName string, allDevices bool) {
-	devices := []rookv1.Device{
+	devices := []cephv1.Device{
 		{Name: deviceName},
 	}
 
@@ -95,14 +95,14 @@ func testPodDevices(t *testing.T, dataDir, deviceName string, allDevices bool) {
 	context := &clusterd.Context{Clientset: clientset, ConfigDir: "/var/lib/rook", Executor: &exectest.MockExecutor{}}
 	spec := cephv1.ClusterSpec{
 		CephVersion: cephv1.CephVersionSpec{Image: "ceph/ceph:v15"},
-		Storage: rookv1.StorageScopeSpec{
-			Selection: rookv1.Selection{UseAllDevices: &allDevices, DeviceFilter: deviceName},
-			Nodes:     []rookv1.Node{{Name: "node1"}},
+		Storage: cephv1.StorageScopeSpec{
+			Selection: cephv1.Selection{UseAllDevices: &allDevices, DeviceFilter: deviceName},
+			Nodes:     []cephv1.Node{{Name: "node1"}},
 		},
-		PriorityClassNames: map[rookv1.KeyType]string{
+		PriorityClassNames: map[rook.KeyType]string{
 			cephv1.KeyOSD: "my-priority-class",
 		},
-		Annotations: rookv1.AnnotationsSpec{
+		Annotations: cephv1.AnnotationsSpec{
 			"osd": map[string]string{
 				"TCMALLOC_MAX_TOTAL_THREAD_CACHE_BYTES": "134217728",
 			},
@@ -478,11 +478,11 @@ func TestStorageSpecConfig(t *testing.T) {
 	context := &clusterd.Context{Clientset: clientset, ConfigDir: "/var/lib/rook", Executor: &exectest.MockExecutor{}}
 	spec := cephv1.ClusterSpec{
 		DataDirHostPath: context.ConfigDir,
-		Storage: rookv1.StorageScopeSpec{
+		Storage: cephv1.StorageScopeSpec{
 			Config: map[string]string{
 				"crushRoot": "custom-root",
 			},
-			Nodes: []rookv1.Node{
+			Nodes: []cephv1.Node{
 				{
 					Name: "node1",
 					Config: map[string]string{
@@ -490,7 +490,7 @@ func TestStorageSpecConfig(t *testing.T) {
 						"walSizeMB":      "20",
 						"metadataDevice": "nvme093",
 					},
-					Selection: rookv1.Selection{},
+					Selection: cephv1.Selection{},
 					Resources: v1.ResourceRequirements{
 						Limits: v1.ResourceList{
 							v1.ResourceCPU:    *resource.NewQuantity(1024.0, resource.BinarySI),
@@ -539,8 +539,8 @@ func TestStorageSpecConfig(t *testing.T) {
 }
 
 func TestHostNetwork(t *testing.T) {
-	storageSpec := rookv1.StorageScopeSpec{
-		Nodes: []rookv1.Node{
+	storageSpec := cephv1.StorageScopeSpec{
+		Nodes: []cephv1.Node{
 			{
 				Name: "node1",
 				Config: map[string]string{
@@ -700,7 +700,7 @@ func getDummyDeploymentOnNode(clientset *fake.Clientset, c *Cluster, nodeName st
 		BlockPath: "/dev/vda",
 		CVMode:    "raw",
 	}
-	c.ValidStorage.Nodes = append(c.ValidStorage.Nodes, rookv1.Node{Name: nodeName})
+	c.ValidStorage.Nodes = append(c.ValidStorage.Nodes, cephv1.Node{Name: nodeName})
 	config := c.newProvisionConfig()
 	d, err := deploymentOnNode(c, osd, nodeName, config)
 	if err != nil {
diff --git a/pkg/operator/ceph/cluster/watcher_test.go b/pkg/operator/ceph/cluster/watcher_test.go
index 5609f8d32..711b0788d 100644
--- a/pkg/operator/ceph/cluster/watcher_test.go
+++ b/pkg/operator/ceph/cluster/watcher_test.go
@@ -23,7 +23,6 @@ import (
 	"github.com/coreos/pkg/capnslog"
 	"github.com/pkg/errors"
 	cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
 	"github.com/rook/rook/pkg/client/clientset/versioned/scheme"
 	"github.com/rook/rook/pkg/clusterd"
 	"github.com/rook/rook/pkg/operator/k8sutil"
@@ -54,7 +53,7 @@ func fakeCluster(ns string) *cephv1.CephCluster {
 			Phase: "",
 		},
 		Spec: cephv1.ClusterSpec{
-			Storage: rookv1.StorageScopeSpec{},
+			Storage: cephv1.StorageScopeSpec{},
 		},
 	}
 	return cephCluster
@@ -69,7 +68,7 @@ func TestCheckStorageForNode(t *testing.T) {
 	cephCluster.Spec.Storage.UseAllNodes = true
 	assert.True(t, checkStorageForNode(cephCluster))
 
-	fakeNodes := []rookv1.Node{
+	fakeNodes := []cephv1.Node{
 		{
 			Name: "nodeA",
 		},
@@ -77,7 +76,7 @@ func TestCheckStorageForNode(t *testing.T) {
 	cephCluster.Spec.Storage.Nodes = fakeNodes
 	assert.True(t, checkStorageForNode(cephCluster))
 
-	fakeDeviceSets := []rookv1.StorageClassDeviceSet{
+	fakeDeviceSets := []cephv1.StorageClassDeviceSet{
 		{
 			Name: "DeviceSet1",
 		},
@@ -121,12 +120,12 @@ func TestOnK8sNode(t *testing.T) {
 	}
 
 	// node will reconcile
-	fakeNodes := []rookv1.Node{
+	fakeNodes := []cephv1.Node{
 		{
 			Name: "nodeA",
 		},
 	}
-	fakeDeviceSets := []rookv1.StorageClassDeviceSet{
+	fakeDeviceSets := []cephv1.StorageClassDeviceSet{
 		{
 			Name: "DeviceSet1",
 		},
diff --git a/pkg/operator/ceph/config/livenessprobe_test.go b/pkg/operator/ceph/config/livenessprobe_test.go
index 14634f03d..e2430392e 100644
--- a/pkg/operator/ceph/config/livenessprobe_test.go
+++ b/pkg/operator/ceph/config/livenessprobe_test.go
@@ -23,14 +23,14 @@ import (
 	"testing"
 
 	cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
+	"github.com/rook/rook/pkg/apis/rook.io"
 	"github.com/stretchr/testify/assert"
 	v1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/util/intstr"
 )
 
 func TestConfigureLivenessProbe(t *testing.T) {
-	keyTypes := []rookv1.KeyType{
+	keyTypes := []rook.KeyType{
 		cephv1.KeyMds,
 		cephv1.KeyMon,
 		cephv1.KeyMgr,
@@ -42,7 +42,7 @@ func TestConfigureLivenessProbe(t *testing.T) {
 	}
 }
 
-func configLivenessProbeHelper(t *testing.T, keyType rookv1.KeyType) {
+func configLivenessProbeHelper(t *testing.T, keyType rook.KeyType) {
 	p := &v1.Probe{
 		Handler: v1.Handler{
 			HTTPGet: &v1.HTTPGetAction{
@@ -52,9 +52,9 @@ func configLivenessProbeHelper(t *testing.T, keyType rookv1.KeyType) {
 		},
 	}
 	container := v1.Container{LivenessProbe: p}
-	l := map[rookv1.KeyType]*rookv1.ProbeSpec{keyType: {Disabled: true}}
+	l := map[rook.KeyType]*cephv1.ProbeSpec{keyType: {Disabled: true}}
 	type args struct {
-		daemon      rookv1.KeyType
+		daemon      rook.KeyType
 		container   v1.Container
 		healthCheck cephv1.CephClusterHealthCheckSpec
 	}
diff --git a/pkg/operator/ceph/object/spec_test.go b/pkg/operator/ceph/object/spec_test.go
index 7f6de1b36..821c72925 100644
--- a/pkg/operator/ceph/object/spec_test.go
+++ b/pkg/operator/ceph/object/spec_test.go
@@ -23,7 +23,7 @@ import (
 
 	"github.com/pkg/errors"
 	cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
+	"github.com/rook/rook/pkg/apis/rook.io"
 	"github.com/rook/rook/pkg/clusterd"
 	"github.com/rook/rook/pkg/daemon/ceph/client"
 	clienttest "github.com/rook/rook/pkg/daemon/ceph/client/test"
@@ -142,7 +142,7 @@ func TestSSLPodSpec(t *testing.T) {
 
 	// Using service serving cert
 	c.store.Spec.Gateway.SSLCertificateRef = ""
-	c.store.Spec.Gateway.Service = &(cephv1.RGWServiceSpec{Annotations: rookv1.Annotations{cephv1.ServiceServingCertKey: "rgw-cert"}})
+	c.store.Spec.Gateway.Service = &(cephv1.RGWServiceSpec{Annotations: rook.Annotations{cephv1.ServiceServingCertKey: "rgw-cert"}})
 	secretVolSrc, _ = generateVolumeSourceWithTLSSecret(c.store.Spec)
 	assert.Equal(t, secretVolSrc.SecretName, "rgw-cert")
 	s, err = c.makeRGWPodSpec(rgwConfig)
diff --git a/pkg/operator/ceph/pool/controller_test.go b/pkg/operator/ceph/pool/controller_test.go
index 61d860800..be7dd863f 100644
--- a/pkg/operator/ceph/pool/controller_test.go
+++ b/pkg/operator/ceph/pool/controller_test.go
@@ -24,7 +24,6 @@ import (
 	"github.com/coreos/pkg/capnslog"
 	"github.com/pkg/errors"
 	cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
 	rookclient "github.com/rook/rook/pkg/client/clientset/versioned/fake"
 	"github.com/rook/rook/pkg/clusterd"
 	cephclient "github.com/rook/rook/pkg/daemon/ceph/client"
@@ -59,7 +58,7 @@ func TestCreatePool(t *testing.T) {
 	p.Spec.Replicated.Size = 1
 	p.Spec.Replicated.RequireSafeReplicaSize = false
 
-	clusterSpec := &cephv1.ClusterSpec{Storage: rookv1.StorageScopeSpec{Config: map[string]string{cephclient.CrushRootConfigKey: "cluster-crush-root"}}}
+	clusterSpec := &cephv1.ClusterSpec{Storage: cephv1.StorageScopeSpec{Config: map[string]string{cephclient.CrushRootConfigKey: "cluster-crush-root"}}}
 	err := createPool(context, clusterInfo, clusterSpec, p)
 	assert.Nil(t, err)
 
diff --git a/pkg/operator/discover/discover_test.go b/pkg/operator/discover/discover_test.go
index 34ff8ac98..92472548b 100644
--- a/pkg/operator/discover/discover_test.go
+++ b/pkg/operator/discover/discover_test.go
@@ -22,7 +22,7 @@ import (
 	"os"
 	"testing"
 
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
+	cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
 	"github.com/rook/rook/pkg/clusterd"
 	discoverDaemon "github.com/rook/rook/pkg/daemon/discover"
 	"github.com/rook/rook/pkg/operator/k8sutil"
@@ -120,7 +120,7 @@ func TestGetAvailableDevices(t *testing.T) {
 	context := &clusterd.Context{
 		Clientset: clientset,
 	}
-	d := []rookv1.Device{
+	d := []cephv1.Device{
 		{
 			Name: "sdc",
 		},
diff --git a/pkg/operator/k8sutil/network_test.go b/pkg/operator/k8sutil/network_test.go
index fec048710..1cc85b957 100644
--- a/pkg/operator/k8sutil/network_test.go
+++ b/pkg/operator/k8sutil/network_test.go
@@ -21,13 +21,13 @@ import (
 	"testing"
 
 	netapi "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/apis/k8s.cni.cncf.io/v1"
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
+	cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
 	"github.com/stretchr/testify/assert"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
 func TestNetwork_ApplyMultusShort(t *testing.T) {
-	net := rookv1.NetworkSpec{
+	net := cephv1.NetworkSpec{
 		Provider: "multus",
 		Selectors: map[string]string{
 			publicNetworkSelectorKeyName:  "macvlan@net1",
@@ -64,7 +64,7 @@ func TestNetwork_ApplyMultusShort(t *testing.T) {
 }
 
 func TestNetwork_ApplyMultusJSON(t *testing.T) {
-	net := rookv1.NetworkSpec{
+	net := cephv1.NetworkSpec{
 		Provider: "multus",
 		Selectors: map[string]string{
 			"server": `{"name": "macvlan", "interface": "net1"}`,
@@ -85,7 +85,7 @@ func TestNetwork_ApplyMultusJSON(t *testing.T) {
 }
 
 func TestNetwork_ApplyMultusMixedError(t *testing.T) {
-	net := rookv1.NetworkSpec{
+	net := cephv1.NetworkSpec{
 		Provider: "multus",
 		Selectors: map[string]string{
 			"server": `{"name": "macvlan", "interface": "net1"}`,
diff --git a/pkg/operator/k8sutil/node_test.go b/pkg/operator/k8sutil/node_test.go
index 1f185c3ff..9b98f6da4 100644
--- a/pkg/operator/k8sutil/node_test.go
+++ b/pkg/operator/k8sutil/node_test.go
@@ -22,7 +22,7 @@ import (
 	"reflect"
 	"testing"
 
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
+	cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
 	optest "github.com/rook/rook/pkg/operator/test"
 	"github.com/stretchr/testify/assert"
 	v1 "k8s.io/api/core/v1"
@@ -52,8 +52,8 @@ func TestValidNode(t *testing.T) {
 	nodeA := "nodeA"
 	nodeB := "nodeB"
 
-	storage := rookv1.StorageScopeSpec{
-		Nodes: []rookv1.Node{
+	storage := cephv1.StorageScopeSpec{
+		Nodes: []cephv1.Node{
 			{
 				Name: nodeA,
 			},
@@ -62,7 +62,7 @@ func TestValidNode(t *testing.T) {
 			},
 		},
 	}
-	var placement rookv1.Placement
+	var placement cephv1.Placement
 	// set up a fake k8s client set and watcher to generate events that the operator will listen to
 	clientset := fake.NewSimpleClientset()
 
@@ -205,7 +205,7 @@ func TestNodeIsReady(t *testing.T) {
 func TestGetRookNodesMatchingKubernetesNodes(t *testing.T) {
 	ctx := context.TODO()
 	clientset := optest.New(t, 3) // create nodes 0, 1, and 2
-	rookNodes := []rookv1.Node{}
+	rookNodes := []cephv1.Node{}
 
 	getNode := func(name string) v1.Node {
 		n, err := clientset.CoreV1().Nodes().Get(ctx, name, metav1.GetOptions{})
@@ -219,7 +219,7 @@ func TestGetRookNodesMatchingKubernetesNodes(t *testing.T) {
 	assert.Empty(t, nodes)
 
 	// more rook nodes specified than nodes exist
-	rookNodes = []rookv1.Node{
+	rookNodes = []cephv1.Node{
 		{Name: "node0"},
 		{Name: "node2"},
 		{Name: "node5"}}
@@ -230,7 +230,7 @@ func TestGetRookNodesMatchingKubernetesNodes(t *testing.T) {
 	assert.Contains(t, nodes, getNode("node2"))
 
 	// rook nodes match k8s nodes
-	rookNodes = []rookv1.Node{
+	rookNodes = []cephv1.Node{
 		{Name: "node0"},
 		{Name: "node1"},
 		{Name: "node2"}}
@@ -265,33 +265,33 @@ func TestRookNodesMatchingKubernetesNodes(t *testing.T) {
 	k8sNodes := []v1.Node{n0, n1, n2}
 
 	// no rook nodes specified for input
-	rookStorage := rookv1.StorageScopeSpec{
-		Nodes: []rookv1.Node{},
+	rookStorage := cephv1.StorageScopeSpec{
+		Nodes: []cephv1.Node{},
 	}
 	retNodes := RookNodesMatchingKubernetesNodes(rookStorage, k8sNodes)
 	assert.Len(t, retNodes, 0)
 
 	// all rook nodes specified
-	rookStorage.Nodes = []rookv1.Node{
+	rookStorage.Nodes = []cephv1.Node{
 		{Name: "node0"},
 		{Name: "node1"},
 		{Name: "node2"}}
 	retNodes = RookNodesMatchingKubernetesNodes(rookStorage, k8sNodes)
 	assert.Len(t, retNodes, 3)
 	// this should return nodes named by hostname if that is available
-	assert.Contains(t, retNodes, rookv1.Node{Name: "node0-hostname"})
-	assert.Contains(t, retNodes, rookv1.Node{Name: "node1"})
-	assert.Contains(t, retNodes, rookv1.Node{Name: "node2"})
+	assert.Contains(t, retNodes, cephv1.Node{Name: "node0-hostname"})
+	assert.Contains(t, retNodes, cephv1.Node{Name: "node1"})
+	assert.Contains(t, retNodes, cephv1.Node{Name: "node2"})
 
 	// more rook nodes specified than exist
-	rookStorage.Nodes = []rookv1.Node{
+	rookStorage.Nodes = []cephv1.Node{
 		{Name: "node0-hostname"},
 		{Name: "node2"},
 		{Name: "node5"}}
 	retNodes = RookNodesMatchingKubernetesNodes(rookStorage, k8sNodes)
 	assert.Len(t, retNodes, 2)
-	assert.Contains(t, retNodes, rookv1.Node{Name: "node0-hostname"})
-	assert.Contains(t, retNodes, rookv1.Node{Name: "node2"})
+	assert.Contains(t, retNodes, cephv1.Node{Name: "node0-hostname"})
+	assert.Contains(t, retNodes, cephv1.Node{Name: "node2"})
 
 	// no k8s nodes specified
 	retNodes = RookNodesMatchingKubernetesNodes(rookStorage, []v1.Node{})
diff --git a/pkg/operator/k8sutil/pod_test.go b/pkg/operator/k8sutil/pod_test.go
index 72cae6393..5bb8e9a56 100644
--- a/pkg/operator/k8sutil/pod_test.go
+++ b/pkg/operator/k8sutil/pod_test.go
@@ -21,9 +21,8 @@ import (
 	"os"
 	"testing"
 
-	rookv1 "github.com/rook/rook/pkg/apis/rook.io/v1"
+	cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
 	"github.com/rook/rook/pkg/operator/test"
-
 	"github.com/stretchr/testify/assert"
 	v1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -175,7 +174,7 @@ func TestAddUnreachableNodeToleration(t *testing.T) {
 
 }
 
-func testPodSpecPlacement(t *testing.T, requiredDuringScheduling bool, req, pref int, placement *rookv1.Placement) {
+func testPodSpecPlacement(t *testing.T, requiredDuringScheduling bool, req, pref int, placement *cephv1.Placement) {
 	spec := v1.PodSpec{
 		InitContainers: []v1.Container{},
 		Containers:     []v1.Container{},
@@ -191,8 +190,8 @@ func testPodSpecPlacement(t *testing.T, requiredDuringScheduling bool, req, pref
 		len(spec.Affinity.PodAntiAffinity.RequiredDuringSchedulingIgnoredDuringExecution))
 }
 
-func makePlacement() rookv1.Placement {
-	return rookv1.Placement{
+func makePlacement() cephv1.Placement {
+	return cephv1.Placement{
 		PodAntiAffinity: &v1.PodAntiAffinity{
 			RequiredDuringSchedulingIgnoredDuringExecution: []v1.PodAffinityTerm{
 				{
@@ -212,7 +211,7 @@ func makePlacement() rookv1.Placement {
 
 func TestPodSpecPlacement(t *testing.T) {
 	// no placement settings in the crd
-	p := rookv1.Placement{}
+	p := cephv1.Placement{}
 	testPodSpecPlacement(t, true, 1, 0, &p)
 	testPodSpecPlacement(t, false, 0, 1, &p)
 	testPodSpecPlacement(t, false, 0, 0, &p)