Skip to content

Commit 72b5d9d

Browse files
han-minheeartek-koltun
authored andcommitted
feat: complete ListNvmePaths and GetNvmePath
Signed-off-by: Minhee Han <minhee.han@mangoboost.io>
1 parent ed3e9b1 commit 72b5d9d

File tree

2 files changed

+84
-9
lines changed

2 files changed

+84
-9
lines changed

pkg/backend/nvme_path.go

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -210,13 +210,30 @@ func (s *Server) ListNvmePaths(ctx context.Context, in *pb.ListNvmePathsRequest)
210210
token = uuid.New().String()
211211
s.Pagination[token] = offset + size
212212
}
213-
Blobarray := make([]*pb.NvmePath, len(result))
214-
for i := range result {
215-
r := &result[i]
216-
Blobarray[i] = &pb.NvmePath{Name: r.Name /* TODO: fill this */}
213+
Blobarray := make([]*pb.NvmePath, 0, len(result))
214+
for _, r := range result {
215+
for _, c := range r.Ctrlrs {
216+
path := &pb.NvmePath{
217+
Name: r.Name,
218+
Trtype: utils.ParseOpiTransportType(c.Trid.Trtype),
219+
Traddr: c.Trid.Traddr,
220+
Fabrics: &pb.FabricsPath{
221+
Trsvcid: utils.ParseTrsvcid(c.Trid.Trsvcid),
222+
Subnqn: c.Trid.Subnqn,
223+
Adrfam: utils.SpdkAddressFamilyToOpi(c.Trid.Adrfam),
224+
SourceTraddr: c.Host.Addr,
225+
SourceTrsvcid: utils.ParseTrsvcid(c.Host.Svcid),
226+
Hostnqn: c.Host.Nqn,
227+
},
228+
}
229+
Blobarray = append(Blobarray, path)
230+
}
217231
}
218232
sortNvmePaths(Blobarray)
219-
return &pb.ListNvmePathsResponse{NvmePaths: Blobarray, NextPageToken: token}, nil
233+
return &pb.ListNvmePathsResponse{
234+
NvmePaths: Blobarray,
235+
NextPageToken: token,
236+
}, nil
220237
}
221238

222239
// GetNvmePath gets Nvme path
@@ -239,10 +256,23 @@ func (s *Server) GetNvmePath(ctx context.Context, in *pb.GetNvmePathRequest) (*p
239256
}
240257
log.Printf("Received from SPDK: %v", result)
241258

242-
for i := range result {
243-
r := &result[i]
244-
if r.Name != "" {
245-
return &pb.NvmePath{ /* TODO: fill this */ }, nil
259+
for _, r := range result {
260+
for _, c := range r.Ctrlrs {
261+
if c.Trid.Subnqn == path.Fabrics.Subnqn {
262+
return &pb.NvmePath{
263+
Name: r.Name,
264+
Trtype: utils.ParseOpiTransportType(c.Trid.Trtype),
265+
Traddr: c.Trid.Traddr,
266+
Fabrics: &pb.FabricsPath{
267+
Trsvcid: utils.ParseTrsvcid(c.Trid.Trsvcid),
268+
Subnqn: c.Trid.Subnqn,
269+
Adrfam: utils.SpdkAddressFamilyToOpi(c.Trid.Adrfam),
270+
SourceTraddr: c.Host.Addr,
271+
SourceTrsvcid: utils.ParseTrsvcid(c.Host.Svcid),
272+
Hostnqn: c.Host.Nqn,
273+
},
274+
}, nil
275+
}
246276
}
247277
}
248278
msg := fmt.Sprintf("Could not find NQN: %s", path.Fabrics.Subnqn)

pkg/utils/server.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"net"
1414
"os"
1515
"path/filepath"
16+
"strconv"
1617
"strings"
1718

1819
"google.golang.org/grpc"
@@ -150,3 +151,47 @@ func OpiAdressFamilyToSpdk(adrfam pb.NvmeAddressFamily) string {
150151

151152
return strings.ReplaceAll(adrfam.String(), "NVME_ADDRESS_FAMILY_", "")
152153
}
154+
155+
// SpdkAddressFamilyToOpi converts a SPDK address family string to the corresponding OPI NvmeAddressFamily enum.
156+
func SpdkAddressFamilyToOpi(adrfam string) pb.NvmeAddressFamily {
157+
switch strings.ToLower(adrfam) {
158+
case "ipv4":
159+
return pb.NvmeAddressFamily_NVME_ADDRESS_FAMILY_IPV4
160+
case "ipv6":
161+
return pb.NvmeAddressFamily_NVME_ADDRESS_FAMILY_IPV6
162+
case "ib":
163+
return pb.NvmeAddressFamily_NVME_ADDRESS_FAMILY_IB
164+
case "fc":
165+
return pb.NvmeAddressFamily_NVME_ADDRESS_FAMILY_FC
166+
case "intra_host":
167+
return pb.NvmeAddressFamily_NVME_ADDRESS_FAMILY_INTRA_HOST
168+
default:
169+
return pb.NvmeAddressFamily_NVME_ADDRESS_FAMILY_UNSPECIFIED
170+
}
171+
}
172+
173+
// ParseOpiTransportType parses a string to the corresponding OPI TransportType enum.
174+
func ParseOpiTransportType(t string) pb.NvmeTransportType {
175+
switch strings.ToLower(t) {
176+
case "fc":
177+
return pb.NvmeTransportType_NVME_TRANSPORT_TYPE_FC
178+
case "pcie":
179+
return pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE
180+
case "rdma":
181+
return pb.NvmeTransportType_NVME_TRANSPORT_TYPE_RDMA
182+
case "tcp":
183+
return pb.NvmeTransportType_NVME_TRANSPORT_TYPE_TCP
184+
default:
185+
return pb.NvmeTransportType_NVME_TRANSPORT_TYPE_UNSPECIFIED
186+
}
187+
}
188+
189+
// ParseTrsvcid parses a string into int64, returning -1 on failure.
190+
func ParseTrsvcid(s string) int64 {
191+
// if it fails, it just returns -1
192+
i, err := strconv.ParseInt(s, 10, 64)
193+
if err != nil {
194+
return -1
195+
}
196+
return i
197+
}

0 commit comments

Comments
 (0)