diff --git a/Documentation/CRDs/specification.md b/Documentation/CRDs/specification.md index 4283a8f9e..b48d2bfbf 100644 --- a/Documentation/CRDs/specification.md +++ b/Documentation/CRDs/specification.md @@ -206,6 +206,18 @@ CephBlockPoolRadosNamespaceSpec + + + + + + + +
+name
+ +string + +
+(Optional) +

The name of the CephBlockPoolRadosNamespaceSpec namespace. If not set, the default is the name of the CR.

+
blockPoolName
string @@ -2972,6 +2984,18 @@ string
+name
+ +string + +
+(Optional) +

The name of the CephBlockPoolRadosNamespaceSpec namespace. If not set, the default is the name of the CR.

+
blockPoolName
string diff --git a/deploy/charts/rook-ceph/templates/resources.yaml b/deploy/charts/rook-ceph/templates/resources.yaml index e13a005cd..0ce8c226d 100644 --- a/deploy/charts/rook-ceph/templates/resources.yaml +++ b/deploy/charts/rook-ceph/templates/resources.yaml @@ -36,6 +36,9 @@ spec: blockPoolName: description: BlockPoolName is the name of Ceph BlockPool. Typically it's the name of the CephBlockPool CR. type: string + name: + description: The name of the CephBlockPoolRadosNamespaceSpec namespace. If not set, the default is the name of the CR. + type: string required: - blockPoolName type: object diff --git a/deploy/examples/crds.yaml b/deploy/examples/crds.yaml index da0e5adaa..760e0ae71 100644 --- a/deploy/examples/crds.yaml +++ b/deploy/examples/crds.yaml @@ -39,6 +39,9 @@ spec: blockPoolName: description: BlockPoolName is the name of Ceph BlockPool. Typically it's the name of the CephBlockPool CR. type: string + name: + description: The name of the CephBlockPoolRadosNamespaceSpec namespace. If not set, the default is the name of the CR. + type: string required: - blockPoolName type: object diff --git a/deploy/examples/radosnamespace.yaml b/deploy/examples/radosnamespace.yaml index bea531cb6..80230947d 100644 --- a/deploy/examples/radosnamespace.yaml +++ b/deploy/examples/radosnamespace.yaml @@ -5,5 +5,7 @@ metadata: name: namespace-a namespace: rook-ceph # namespace:cluster spec: + # The name of the RADOS namespace. If not set, the default is the name of the CR. + # name: namespace-a # blockPoolName is the name of the CephBlockPool CR where the namespace will be created. blockPoolName: replicapool diff --git a/pkg/apis/ceph.rook.io/v1/types.go b/pkg/apis/ceph.rook.io/v1/types.go index 89bc399a9..ea09a5a97 100755 --- a/pkg/apis/ceph.rook.io/v1/types.go +++ b/pkg/apis/ceph.rook.io/v1/types.go @@ -2960,6 +2960,9 @@ type CephBlockPoolRadosNamespaceList struct { // CephBlockPoolRadosNamespaceSpec represents the specification of a CephBlockPool Rados Namespace type CephBlockPoolRadosNamespaceSpec struct { + // The name of the CephBlockPoolRadosNamespaceSpec namespace. If not set, the default is the name of the CR. + // +optional + Name string `json:"name,omitempty"` // BlockPoolName is the name of Ceph BlockPool. Typically it's the name of // the CephBlockPool CR. BlockPoolName string `json:"blockPoolName"` diff --git a/pkg/operator/ceph/pool/radosnamespace/controller.go b/pkg/operator/ceph/pool/radosnamespace/controller.go index 04f30d4f0..726aa63f1 100644 --- a/pkg/operator/ceph/pool/radosnamespace/controller.go +++ b/pkg/operator/ceph/pool/radosnamespace/controller.go @@ -253,6 +253,13 @@ func (r *ReconcileCephBlockPoolRadosNamespace) reconcile(request reconcile.Reque return reconcile.Result{}, nil } +func getRadosNamespaceName(cephBlockPoolRadosNamespace *cephv1.CephBlockPoolRadosNamespace) string { + if cephBlockPoolRadosNamespace.Spec.Name != "" { + return cephBlockPoolRadosNamespace.Spec.Name + } + return cephBlockPoolRadosNamespace.Name +} + func (r *ReconcileCephBlockPoolRadosNamespace) updateClusterConfig(cephBlockPoolRadosNamespace *cephv1.CephBlockPoolRadosNamespace, cephCluster cephv1.CephCluster) error { // Update CSI config map // If the mon endpoints change, the mon health check go routine will take care of updating the @@ -261,9 +268,9 @@ func (r *ReconcileCephBlockPoolRadosNamespace) updateClusterConfig(cephBlockPool Namespace: r.clusterInfo.Namespace, Monitors: csi.MonEndpoints(r.clusterInfo.Monitors, cephCluster.Spec.RequireMsgr2()), RBD: &csi.CsiRBDSpec{ - RadosNamespace: cephBlockPoolRadosNamespace.Name, + RadosNamespace: getRadosNamespaceName(cephBlockPoolRadosNamespace), }, - RadosNamespace: cephBlockPoolRadosNamespace.Name, + RadosNamespace: getRadosNamespaceName(cephBlockPoolRadosNamespace), CephFS: &csi.CsiCephFSSpec{ KernelMountOptions: r.clusterInfo.CSIDriverSpec.CephFS.KernelMountOptions, FuseMountOptions: r.clusterInfo.CSIDriverSpec.CephFS.FuseMountOptions, @@ -294,7 +301,7 @@ func (r *ReconcileCephBlockPoolRadosNamespace) createOrUpdateRadosNamespace(ceph namespacedName := fmt.Sprintf("%s/%s", cephBlockPoolRadosNamespace.Namespace, cephBlockPoolRadosNamespace.Name) logger.Infof("creating ceph blockpool rados namespace %q", namespacedName) - err := cephclient.CreateRadosNamespace(r.context, r.clusterInfo, cephBlockPoolRadosNamespace.Spec.BlockPoolName, cephBlockPoolRadosNamespace.Name) + err := cephclient.CreateRadosNamespace(r.context, r.clusterInfo, cephBlockPoolRadosNamespace.Spec.BlockPoolName, getRadosNamespaceName(cephBlockPoolRadosNamespace)) if err != nil { return errors.Wrapf(err, "failed to create ceph blockpool rados namespace %q", cephBlockPoolRadosNamespace.Name) } @@ -307,7 +314,7 @@ func (r *ReconcileCephBlockPoolRadosNamespace) deleteRadosNamespace(cephBlockPoo namespacedName := fmt.Sprintf("%s/%s", cephBlockPoolRadosNamespace.Namespace, cephBlockPoolRadosNamespace.Name) logger.Infof("deleting ceph blockpool rados namespace object %q", namespacedName) - if err := cephclient.DeleteRadosNamespace(r.context, r.clusterInfo, cephBlockPoolRadosNamespace.Spec.BlockPoolName, cephBlockPoolRadosNamespace.Name); err != nil { + if err := cephclient.DeleteRadosNamespace(r.context, r.clusterInfo, cephBlockPoolRadosNamespace.Spec.BlockPoolName, getRadosNamespaceName(cephBlockPoolRadosNamespace)); err != nil { return errors.Wrapf(err, "failed to delete ceph blockpool rados namespace %q", cephBlockPoolRadosNamespace.Name) } @@ -340,6 +347,6 @@ func (r *ReconcileCephBlockPoolRadosNamespace) updateStatus(client client.Client } func buildClusterID(cephBlockPoolRadosNamespace *cephv1.CephBlockPoolRadosNamespace) string { - clusterID := fmt.Sprintf("%s-%s-block-%s", cephBlockPoolRadosNamespace.Namespace, cephBlockPoolRadosNamespace.Spec.BlockPoolName, cephBlockPoolRadosNamespace.Name) + clusterID := fmt.Sprintf("%s-%s-block-%s", cephBlockPoolRadosNamespace.Namespace, cephBlockPoolRadosNamespace.Spec.BlockPoolName, getRadosNamespaceName(cephBlockPoolRadosNamespace)) return k8sutil.Hash(clusterID) }