diff --git a/internal/nvmeof/controller/controllerserver.go b/internal/nvmeof/controller/controllerserver.go index b77b387a212..0a7e847a9ac 100644 --- a/internal/nvmeof/controller/controllerserver.go +++ b/internal/nvmeof/controller/controllerserver.go @@ -122,7 +122,7 @@ func (cs *Server) CreateVolume( backend := res.GetVolume() volumeID := backend.GetVolumeId() - + volumeContext := backend.GetVolumeContext() defer func() { // skip cleanup if there was no error if err == nil { @@ -141,11 +141,13 @@ func (cs *Server) CreateVolume( } }() - rbdImageName := res.GetVolume().GetVolumeContext()["imageName"] - rbdPoolName := res.GetVolume().GetVolumeContext()["pool"] + rbdImageName := volumeContext["imageName"] + rbdPoolName := volumeContext["pool"] + // can be empty. if it was defined in config-map the rbd csi driver would have set it already + rbdRadosNameSpace := res.GetVolume().GetVolumeContext()["radosNamespace"] // Step 2: Setup NVMe-oF resources - nvmeofData, err := cs.createNVMeoFResources(ctx, req, rbdPoolName, rbdImageName) + nvmeofData, err := cs.createNVMeoFResources(ctx, req, rbdPoolName, rbdRadosNameSpace, rbdImageName) if err != nil { log.ErrorLog(ctx, "NVMe-oF resource setup failed for volumeID %s: %v", volumeID, err) @@ -628,6 +630,7 @@ func (cs *Server) createNVMeoFResources( ctx context.Context, req *csi.CreateVolumeRequest, rbdPoolName, + rbdRadosNameSpace, rbdImageName string, ) (*nvmeof.NVMeoFVolumeData, error) { // Step 1: Extract parameters (already validated) @@ -697,7 +700,7 @@ func (cs *Server) createNVMeoFResources( nvmeofData.ListenerInfo) // Step 4: Create namespace and set its uuid - nsid, err := gateway.CreateNamespace(ctx, nvmeofData.SubsystemNQN, rbdPoolName, rbdImageName) + nsid, err := gateway.CreateNamespace(ctx, nvmeofData.SubsystemNQN, rbdPoolName, rbdRadosNameSpace, rbdImageName) if err != nil { return nil, fmt.Errorf("namespace creation failed: %w", err) } diff --git a/internal/nvmeof/nvmeof.go b/internal/nvmeof/nvmeof.go index a814a7e5377..d18f15b03bd 100644 --- a/internal/nvmeof/nvmeof.go +++ b/internal/nvmeof/nvmeof.go @@ -104,7 +104,10 @@ func (c *GatewayRpcClient) Destroy() error { } // CreateNamespace creates a namespace in a subsystem. -func (gw *GatewayRpcClient) CreateNamespace(ctx context.Context, subsystemNQN, poolName, imageName string, +func (gw *GatewayRpcClient) CreateNamespace( + ctx context.Context, + subsystemNQN string, + poolName, radosNamespace, imageName string, ) (uint32, error) { log.DebugLog(ctx, "Creating namespace for RBD %s/%s in subsystem %s", poolName, imageName, subsystemNQN) @@ -125,7 +128,9 @@ func (gw *GatewayRpcClient) CreateNamespace(ctx context.Context, subsystemNQN, p // DisableAutoResize: nil, // ReadOnly: nil, } - + if radosNamespace != "" { + req.RadosNamespaceName = &radosNamespace + } resp, err := gw.client.NamespaceAdd(ctx, req) switch { case err != nil: diff --git a/internal/nvmeof/tests/nvmeof_test.go b/internal/nvmeof/tests/nvmeof_test.go index cdd3462438c..40fe4e0740b 100644 --- a/internal/nvmeof/tests/nvmeof_test.go +++ b/internal/nvmeof/tests/nvmeof_test.go @@ -148,7 +148,7 @@ func TestRealGateway(t *testing.T) { // Test create namespace // poolName := "mypool" // imageName := "test-image" - // nsID, err := client.CreateNamespace(ctx, testNQN, poolName, imageName) + // nsID, err := client.CreateNamespace(ctx, testNQN, poolName, radosNS, imageName) // require.NoError(t, err) // require.Greater(t, nsID, uint32(0), "Namespace ID should be greater than 0")