Skip to content

Commit

Permalink
Merge pull request ceph#282 from ceph/devel
Browse files Browse the repository at this point in the history
Sync 'odf/devel' into ds/sync/release-4.16
  • Loading branch information
openshift-merge-bot[bot] authored Mar 27, 2024
2 parents efa8aa2 + 063319f commit f3536d7
Show file tree
Hide file tree
Showing 8 changed files with 42 additions and 16 deletions.
4 changes: 3 additions & 1 deletion charts/ceph-csi-rbd/templates/storageclass.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,10 @@ metadata:
provisioner: {{ .Values.driverName }}
parameters:
clusterID: {{ .Values.storageClass.clusterID }}
pool: {{ .Values.storageClass.pool }}
imageFeatures: {{ .Values.storageClass.imageFeatures }}
{{- if .Values.storageClass.pool }}
pool: {{ .Values.storageClass.pool }}
{{- end }}
{{- if .Values.storageClass.tryOtherMounters }}
tryOtherMounters: {{ .Values.storageClass.tryOtherMounters | quote}}
{{- end }}
Expand Down
1 change: 1 addition & 0 deletions charts/ceph-csi-rbd/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -343,6 +343,7 @@ storageClass:
dataPool: ""

# (required) Ceph pool into which the RBD image shall be created
# (optional) if topologyConstrainedPools is provided
# eg: pool: replicapool
pool: replicapool

Expand Down
8 changes: 5 additions & 3 deletions e2e/rbd.go
Original file line number Diff line number Diff line change
Expand Up @@ -3043,19 +3043,21 @@ var _ = Describe("RBD", func() {
}

By("ensuring created PV has its CSI journal in the CSI journal specific pool")
err = checkPVCCSIJournalInPool(f, pvc, "replicapool")
err = checkPVCCSIJournalInPool(f, pvc, rbdTopologyPool)
if err != nil {
framework.Failf("failed to check csi journal in pool: %v", err)
}

err = deleteJournalInfoInPool(f, pvc, "replicapool")
err = deleteJournalInfoInPool(f, pvc, rbdTopologyPool)
if err != nil {
framework.Failf("failed to delete omap data: %v", err)
}

err = deletePVCAndApp("", f, pvc, app)
if err != nil {
framework.Failf("failed to delete PVC and application: %v", err)
}

validateRBDImageCount(f, 0, defaultRBDPool)
validateOmapCount(f, 0, rbdType, defaultRBDPool, volumesType)

Expand Down Expand Up @@ -3092,7 +3094,7 @@ var _ = Describe("RBD", func() {
framework.Failf("failed to check data pool for image: %v", err)
}

err = deleteJournalInfoInPool(f, pvc, "replicapool")
err = deleteJournalInfoInPool(f, pvc, rbdTopologyPool)
if err != nil {
framework.Failf("failed to delete omap data: %v", err)
}
Expand Down
5 changes: 4 additions & 1 deletion e2e/rbd_helper.go
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,10 @@ func createRBDStorageClass(
if name != "" {
sc.Name = name
}
sc.Parameters["pool"] = defaultRBDPool
// add pool only if topologyConstrainedPools is not present
if _, ok := parameters["topologyConstrainedPools"]; !ok {
sc.Parameters["pool"] = defaultRBDPool
}
sc.Parameters["csi.storage.k8s.io/provisioner-secret-namespace"] = cephCSINamespace
sc.Parameters["csi.storage.k8s.io/provisioner-secret-name"] = rbdProvisionerSecretName

Expand Down
1 change: 1 addition & 0 deletions examples/rbd/storageclass.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ parameters:
# dataPool: <ec-data-pool>

# (required) Ceph pool into which the RBD image shall be created
# (optional) If the topologyConstrainedPools is provided
# eg: pool: rbdpool
pool: <rbd-pool-name>

Expand Down
21 changes: 17 additions & 4 deletions internal/rbd/controllerserver.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,12 +76,19 @@ func (cs *ControllerServer) validateVolumeReq(ctx context.Context, req *csi.Crea
}
options := req.GetParameters()
if value, ok := options["clusterID"]; !ok || value == "" {
return status.Error(codes.InvalidArgument, "missing or empty cluster ID to provision volume from")
return status.Error(codes.InvalidArgument, "empty cluster ID to provision volume from")
}
if value, ok := options["pool"]; !ok || value == "" {
poolValue, poolOK := options["pool"]
topologyConstrainedPoolsValue, topologyOK := options["topologyConstrainedPools"]
if !poolOK {
if topologyOK && topologyConstrainedPoolsValue == "" {
return status.Error(codes.InvalidArgument, "empty pool name or topologyConstrainedPools to provision volume")
} else if !topologyOK {
return status.Error(codes.InvalidArgument, "missing or empty pool name to provision volume from")
}
} else if poolValue == "" {
return status.Error(codes.InvalidArgument, "missing or empty pool name to provision volume from")
}

if value, ok := options["dataPool"]; ok && value == "" {
return status.Error(codes.InvalidArgument, "empty datapool name to provision volume from")
}
Expand Down Expand Up @@ -244,6 +251,7 @@ func buildCreateVolumeResponse(req *csi.CreateVolumeRequest, rbdVol *rbdVolume)
VolumeContext: volumeContext,
ContentSource: req.GetVolumeContentSource(),
}

if rbdVol.Topology != nil {
volume.AccessibleTopology = []*csi.Topology{
{
Expand Down Expand Up @@ -341,6 +349,11 @@ func (cs *ControllerServer) CreateVolume(
return nil, err
}

err = updateTopologyConstraints(rbdVol, rbdSnap)
if err != nil {
return nil, status.Error(codes.Internal, err.Error())
}

found, err := rbdVol.Exists(ctx, parentVol)
if err != nil {
return nil, getGRPCErrorForCreateVolume(err)
Expand All @@ -358,7 +371,7 @@ func (cs *ControllerServer) CreateVolume(
return nil, err
}

err = reserveVol(ctx, rbdVol, rbdSnap, cr)
err = reserveVol(ctx, rbdVol, cr)
if err != nil {
return nil, status.Error(codes.Internal, err.Error())
}
Expand Down
13 changes: 7 additions & 6 deletions internal/rbd/rbd_journal.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,10 @@ func validateRbdVol(rbdVol *rbdVolume) error {
return err
}

if err = validateNonEmptyField(rbdVol.JournalPool, "JournalPool", "rbdVolume"); err != nil {
return err
}

if err = validateNonEmptyField(rbdVol.ClusterID, "ClusterID", "rbdVolume"); err != nil {
return err
}
Expand Down Expand Up @@ -433,6 +437,7 @@ func updateTopologyConstraints(rbdVol *rbdVolume, rbdSnap *rbdSnapshot) error {
if rbdVol.Topology != nil {
rbdVol.Pool = poolName
rbdVol.DataPool = dataPoolName
rbdVol.JournalPool = poolName
}

return nil
Expand All @@ -446,21 +451,17 @@ func updateTopologyConstraints(rbdVol *rbdVolume, rbdSnap *rbdSnapshot) error {
rbdVol.Pool = poolName
rbdVol.DataPool = dataPoolName
rbdVol.Topology = topology
rbdVol.JournalPool = poolName
}

return nil
}

// reserveVol is a helper routine to request a rbdVolume name reservation and generate the
// volume ID for the generated name.
func reserveVol(ctx context.Context, rbdVol *rbdVolume, rbdSnap *rbdSnapshot, cr *util.Credentials) error {
func reserveVol(ctx context.Context, rbdVol *rbdVolume, cr *util.Credentials) error {
var err error

err = updateTopologyConstraints(rbdVol, rbdSnap)
if err != nil {
return err
}

journalPoolID, imagePoolID, err := util.GetPoolIDs(ctx, rbdVol.Monitors, rbdVol.JournalPool, rbdVol.Pool, cr)
if err != nil {
return err
Expand Down
5 changes: 4 additions & 1 deletion internal/rbd/rbd_util.go
Original file line number Diff line number Diff line change
Expand Up @@ -1270,9 +1270,12 @@ func genVolFromVolumeOptions(
)

rbdVol := &rbdVolume{}

rbdVol.Pool, ok = volOptions["pool"]
if !ok {
return nil, errors.New("missing required parameter pool")
if _, ok = volOptions["topologyConstrainedPools"]; !ok {
return nil, errors.New("empty pool name or topologyConstrainedPools to provision volume")
}
}

rbdVol.DataPool = volOptions["dataPool"]
Expand Down

0 comments on commit f3536d7

Please sign in to comment.