diff --git a/internal/cephfs/controllerserver.go b/internal/cephfs/controllerserver.go index e6de82ea541..28e3837e2be 100644 --- a/internal/cephfs/controllerserver.go +++ b/internal/cephfs/controllerserver.go @@ -256,6 +256,31 @@ func checkValidCreateVolumeRequest( return nil } +func buildCreateVolumeResponse( + req *csi.CreateVolumeRequest, + volOptions *store.VolumeOptions, + vID *store.VolumeIdentifier, +) *csi.CreateVolumeResponse { + volumeContext := util.GetVolumeContext(req.GetParameters()) + volumeContext["subvolumeName"] = vID.FsSubvolName + volumeContext["subvolumePath"] = volOptions.RootPath + volume := &csi.Volume{ + VolumeId: vID.VolumeID, + CapacityBytes: volOptions.Size, + ContentSource: req.GetVolumeContentSource(), + VolumeContext: volumeContext, + } + if volOptions.Topology != nil { + volume.AccessibleTopology = []*csi.Topology{ + { + Segments: volOptions.Topology, + }, + } + } + + return &csi.CreateVolumeResponse{Volume: volume} +} + // CreateVolume creates a reservation and the volume in backend, if it is not already present. // //nolint:gocognit,gocyclo,nestif,cyclop // TODO: reduce complexity @@ -376,25 +401,7 @@ func (cs *ControllerServer) CreateVolume( } } - // remove kubernetes csi prefixed parameters. - volumeContext := k8s.RemoveCSIPrefixedParameters(req.GetParameters()) - volumeContext["subvolumeName"] = vID.FsSubvolName - volumeContext["subvolumePath"] = volOptions.RootPath - volume := &csi.Volume{ - VolumeId: vID.VolumeID, - CapacityBytes: volOptions.Size, - ContentSource: req.GetVolumeContentSource(), - VolumeContext: volumeContext, - } - if volOptions.Topology != nil { - volume.AccessibleTopology = []*csi.Topology{ - { - Segments: volOptions.Topology, - }, - } - } - - return &csi.CreateVolumeResponse{Volume: volume}, nil + return buildCreateVolumeResponse(req, volOptions, vID), nil } // Reservation @@ -467,25 +474,8 @@ func (cs *ControllerServer) CreateVolume( log.DebugLog(ctx, "cephfs: successfully created backing volume named %s for request name %s", vID.FsSubvolName, requestName) - // remove kubernetes csi prefixed parameters. - volumeContext := k8s.RemoveCSIPrefixedParameters(req.GetParameters()) - volumeContext["subvolumeName"] = vID.FsSubvolName - volumeContext["subvolumePath"] = volOptions.RootPath - volume := &csi.Volume{ - VolumeId: vID.VolumeID, - CapacityBytes: volOptions.Size, - ContentSource: req.GetVolumeContentSource(), - VolumeContext: volumeContext, - } - if volOptions.Topology != nil { - volume.AccessibleTopology = []*csi.Topology{ - { - Segments: volOptions.Topology, - }, - } - } - return &csi.CreateVolumeResponse{Volume: volume}, nil + return buildCreateVolumeResponse(req, volOptions, vID), nil } // DeleteVolume deletes the volume in backend and its reservation. diff --git a/internal/rbd/controllerserver.go b/internal/rbd/controllerserver.go index 29e4af59933..e82f1e894ef 100644 --- a/internal/rbd/controllerserver.go +++ b/internal/rbd/controllerserver.go @@ -240,8 +240,7 @@ func (cs *ControllerServer) parseVolCreateRequest( } func buildCreateVolumeResponse(req *csi.CreateVolumeRequest, rbdVol *rbdVolume) *csi.CreateVolumeResponse { - // remove kubernetes csi prefixed parameters. - volumeContext := k8s.RemoveCSIPrefixedParameters(req.GetParameters()) + volumeContext := util.GetVolumeContext(req.GetParameters()) volumeContext["pool"] = rbdVol.Pool volumeContext["journalPool"] = rbdVol.JournalPool volumeContext["imageName"] = rbdVol.RbdImageName diff --git a/internal/rbd/rbd_attach.go b/internal/rbd/rbd_attach.go index 54025eface8..fbac9a3f767 100644 --- a/internal/rbd/rbd_attach.go +++ b/internal/rbd/rbd_attach.go @@ -21,6 +21,7 @@ import ( "encoding/json" "fmt" "os" + "slices" "strings" "time" @@ -353,7 +354,6 @@ func attachRBDImage(ctx context.Context, volOptions *rbdVolume, device string, c } err = waitForrbdImage(ctx, backoff, volOptions) - if err != nil { return "", err } @@ -364,7 +364,7 @@ func attachRBDImage(ctx context.Context, volOptions *rbdVolume, device string, c } func appendNbdDeviceTypeAndOptions(cmdArgs []string, userOptions, cookie string) []string { - isUnmap := CheckSliceContains(cmdArgs, "unmap") + isUnmap := slices.Contains(cmdArgs, "unmap") if !isUnmap { if !strings.Contains(userOptions, useNbdNetlink) { cmdArgs = append(cmdArgs, "--"+useNbdNetlink) diff --git a/internal/rbd/rbd_util.go b/internal/rbd/rbd_util.go index c50ebedd2c9..ae0ea389f60 100644 --- a/internal/rbd/rbd_util.go +++ b/internal/rbd/rbd_util.go @@ -2071,17 +2071,6 @@ func getCephClientLogFileName(id, logDir, prefix string) string { return fmt.Sprintf("%s/%s-%s.log", logDir, prefix, id) } -// CheckSliceContains checks the slice for string. -func CheckSliceContains(options []string, opt string) bool { - for _, o := range options { - if o == opt { - return true - } - } - - return false -} - // strategicActionOnLogFile act on log file based on cephLogStrategy. func strategicActionOnLogFile(ctx context.Context, logStrategy, logFile string) { var err error diff --git a/internal/util/topology.go b/internal/util/topology.go index 1f08ca6ff04..e24a05aca02 100644 --- a/internal/util/topology.go +++ b/internal/util/topology.go @@ -30,6 +30,9 @@ import ( const ( keySeparator rune = '/' labelSeparator string = "," + + // topologyPoolsParam is the parameter name used to pass topology constrained pools. + topologyPoolsParam = "topologyConstrainedPools" ) // GetTopologyFromDomainLabels returns the CSI topology map, determined from @@ -129,7 +132,7 @@ func GetTopologyFromRequest( var topologyPools []TopologyConstrainedPool // check if parameters have pool configuration pertaining to topology - topologyPoolsStr := req.GetParameters()["topologyConstrainedPools"] + topologyPoolsStr := req.GetParameters()[topologyPoolsParam] if topologyPoolsStr == "" { return nil, nil, nil } diff --git a/internal/util/util.go b/internal/util/util.go index 76607f9db49..65909a2c106 100644 --- a/internal/util/util.go +++ b/internal/util/util.go @@ -27,6 +27,7 @@ import ( "strings" "time" + "github.com/ceph/ceph-csi/internal/util/k8s" "github.com/ceph/ceph-csi/internal/util/log" "golang.org/x/sys/unix" @@ -381,3 +382,23 @@ func CallStack() string { return string(stack) } + +// GetVolumeContext filters out parameters that are not required in volume context. +func GetVolumeContext(parameters map[string]string) map[string]string { + volumeContext := map[string]string{} + + // parameters that are not required in the volume context + notRequiredParams := []string{ + topologyPoolsParam, + } + for k, v := range parameters { + if !slices.Contains(notRequiredParams, k) { + volumeContext[k] = v + } + } + + // remove kubernetes csi prefixed parameters. + volumeContext = k8s.RemoveCSIPrefixedParameters(volumeContext) + + return volumeContext +}