Skip to content

Commit 7c305ee

Browse files
committed
feat(backend): replace Nvme path map with gokv.Store abstraction
Signed-off-by: Boris Glimcher <Boris.Glimcher@emc.com>
1 parent 414ab88 commit 7c305ee

File tree

3 files changed

+72
-48
lines changed

3 files changed

+72
-48
lines changed

pkg/backend/backend.go

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,6 @@ import (
1515
pb "github.com/opiproject/opi-api/storage/v1alpha1/gen/go"
1616
)
1717

18-
// TODO: can we combine all of volume types into a single list?
19-
// maybe create a volume abstraction like bdev in SPDK?
20-
21-
// VolumeParameters contains all BackEnd volume related structures
22-
type VolumeParameters struct {
23-
NvmePaths map[string]*pb.NvmePath
24-
}
25-
2618
// Server contains backend related OPI services
2719
type Server struct {
2820
pb.UnimplementedNvmeRemoteControllerServiceServer
@@ -31,7 +23,6 @@ type Server struct {
3123

3224
rpc spdk.JSONRPC
3325
store gokv.Store
34-
Volumes VolumeParameters
3526
Pagination map[string]int
3627
psk psk
3728
}
@@ -51,11 +42,8 @@ func NewServer(jsonRPC spdk.JSONRPC, store gokv.Store) *Server {
5142
log.Panic("nil for Store is not allowed")
5243
}
5344
return &Server{
54-
rpc: jsonRPC,
55-
store: store,
56-
Volumes: VolumeParameters{
57-
NvmePaths: make(map[string]*pb.NvmePath),
58-
},
45+
rpc: jsonRPC,
46+
store: store,
5947
Pagination: make(map[string]int),
6048
psk: psk{
6149
createTempFile: os.CreateTemp,

pkg/backend/nvme_path.go

Lines changed: 56 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,19 @@ func (s *Server) CreateNvmePath(_ context.Context, in *pb.CreateNvmePathRequest)
4949
}
5050
in.NvmePath.Name = server.ResourceIDToVolumeName(resourceID)
5151

52-
nvmePath, ok := s.Volumes.NvmePaths[in.NvmePath.Name]
53-
if ok {
52+
nvmePath := new(pb.NvmePath)
53+
found, err := s.store.Get(in.NvmePath.Name, nvmePath)
54+
if err != nil {
55+
fmt.Printf("Failed to interact with store: %v", err)
56+
return nil, err
57+
}
58+
if found {
5459
log.Printf("Already existing NvmePath with id %v", in.NvmePath.Name)
5560
return nvmePath, nil
5661
}
5762

5863
controller := new(pb.NvmeRemoteController)
59-
found, err := s.store.Get(in.NvmePath.ControllerNameRef, controller)
64+
found, err = s.store.Get(in.NvmePath.ControllerNameRef, controller)
6065
if err != nil {
6166
fmt.Printf("Failed to interact with store: %v", err)
6267
return nil, err
@@ -115,7 +120,10 @@ func (s *Server) CreateNvmePath(_ context.Context, in *pb.CreateNvmePathRequest)
115120
log.Printf("Received from SPDK: %v", result)
116121

117122
response := server.ProtoClone(in.NvmePath)
118-
s.Volumes.NvmePaths[in.NvmePath.Name] = response
123+
err = s.store.Set(in.NvmePath.Name, response)
124+
if err != nil {
125+
return nil, err
126+
}
119127
log.Printf("CreateNvmePath: Sending to client: %v", response)
120128
return response, nil
121129
}
@@ -128,8 +136,13 @@ func (s *Server) DeleteNvmePath(_ context.Context, in *pb.DeleteNvmePathRequest)
128136
log.Printf("error: %v", err)
129137
return nil, err
130138
}
131-
nvmePath, ok := s.Volumes.NvmePaths[in.Name]
132-
if !ok {
139+
nvmePath := new(pb.NvmePath)
140+
found, err := s.store.Get(in.Name, nvmePath)
141+
if err != nil {
142+
fmt.Printf("Failed to interact with store: %v", err)
143+
return nil, err
144+
}
145+
if !found {
133146
if in.AllowMissing {
134147
return &emptypb.Empty{}, nil
135148
}
@@ -138,7 +151,7 @@ func (s *Server) DeleteNvmePath(_ context.Context, in *pb.DeleteNvmePathRequest)
138151
return nil, err
139152
}
140153
controller := new(pb.NvmeRemoteController)
141-
found, err := s.store.Get(nvmePath.ControllerNameRef, controller)
154+
found, err = s.store.Get(nvmePath.ControllerNameRef, controller)
142155
if err != nil {
143156
fmt.Printf("Failed to interact with store: %v", err)
144157
return nil, err
@@ -171,7 +184,10 @@ func (s *Server) DeleteNvmePath(_ context.Context, in *pb.DeleteNvmePathRequest)
171184
return nil, status.Errorf(codes.InvalidArgument, msg)
172185
}
173186

174-
delete(s.Volumes.NvmePaths, in.Name)
187+
err = s.store.Delete(nvmePath.Name)
188+
if err != nil {
189+
return nil, err
190+
}
175191

176192
return &emptypb.Empty{}, nil
177193
}
@@ -185,8 +201,13 @@ func (s *Server) UpdateNvmePath(_ context.Context, in *pb.UpdateNvmePathRequest)
185201
return nil, err
186202
}
187203
// fetch object from the database
188-
volume, ok := s.Volumes.NvmePaths[in.NvmePath.Name]
189-
if !ok {
204+
volume := new(pb.NvmePath)
205+
found, err := s.store.Get(in.NvmePath.Name, volume)
206+
if err != nil {
207+
fmt.Printf("Failed to interact with store: %v", err)
208+
return nil, err
209+
}
210+
if !found {
190211
if in.AllowMissing {
191212
log.Printf("TODO: in case of AllowMissing, create a new resource, don;t return error")
192213
}
@@ -202,7 +223,10 @@ func (s *Server) UpdateNvmePath(_ context.Context, in *pb.UpdateNvmePathRequest)
202223
}
203224
log.Printf("TODO: use resourceID=%v", resourceID)
204225
response := server.ProtoClone(in.NvmePath)
205-
// s.Volumes.NvmePaths[in.NvmePath.Name] = response
226+
// err = s.store.Set(in.NvmePath.Name, response)
227+
// if err != nil {
228+
// return nil, err
229+
// }
206230
return response, nil
207231
}
208232

@@ -252,15 +276,20 @@ func (s *Server) GetNvmePath(_ context.Context, in *pb.GetNvmePathRequest) (*pb.
252276
return nil, err
253277
}
254278
// fetch object from the database
255-
path, ok := s.Volumes.NvmePaths[in.Name]
256-
if !ok {
279+
path := new(pb.NvmePath)
280+
found, err := s.store.Get(in.Name, path)
281+
if err != nil {
282+
fmt.Printf("Failed to interact with store: %v", err)
283+
return nil, err
284+
}
285+
if !found {
257286
err := status.Errorf(codes.NotFound, "unable to find key %s", in.Name)
258287
log.Printf("error: %v", err)
259288
return nil, err
260289
}
261290

262291
var result []spdk.BdevNvmeGetControllerResult
263-
err := s.rpc.Call("bdev_nvme_get_controllers", nil, &result)
292+
err = s.rpc.Call("bdev_nvme_get_controllers", nil, &result)
264293
if err != nil {
265294
log.Printf("error: %v", err)
266295
return nil, err
@@ -287,16 +316,21 @@ func (s *Server) StatsNvmePath(_ context.Context, in *pb.StatsNvmePathRequest) (
287316
return nil, err
288317
}
289318
// fetch object from the database
290-
volume, ok := s.Volumes.NvmePaths[in.Name]
291-
if !ok {
319+
volume := new(pb.NvmePath)
320+
found, err := s.store.Get(in.Name, volume)
321+
if err != nil {
322+
fmt.Printf("Failed to interact with store: %v", err)
323+
return nil, err
324+
}
325+
if !found {
292326
err := status.Errorf(codes.NotFound, "unable to find key %s", in.Name)
293327
log.Printf("error: %v", err)
294328
return nil, err
295329
}
296330
resourceID := path.Base(volume.Name)
297331
log.Printf("TODO: send name to SPDK and get back stats: %v", resourceID)
298332
var result spdk.NvmfGetSubsystemStatsResult
299-
err := s.rpc.Call("nvmf_get_stats", nil, &result)
333+
err = s.rpc.Call("nvmf_get_stats", nil, &result)
300334
if err != nil {
301335
log.Printf("error: %v", err)
302336
return nil, err
@@ -325,11 +359,11 @@ func (s *Server) opiMultipathToSpdk(multipath pb.NvmeMultipath) string {
325359

326360
func (s *Server) numberOfPathsForController(controllerName string) int {
327361
numberOfPaths := 0
328-
for _, path := range s.Volumes.NvmePaths {
329-
if path.ControllerNameRef == controllerName {
330-
numberOfPaths++
331-
}
332-
}
362+
// for _, path := range s.Volumes.NvmePaths {
363+
// if path.ControllerNameRef == controllerName {
364+
// numberOfPaths++
365+
// }
366+
// }
333367
return numberOfPaths
334368
}
335369

pkg/backend/nvme_path_test.go

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,13 @@ var (
3838
Trsvcid: 4444,
3939
},
4040
}
41+
testNvmePathWithName = pb.NvmePath{
42+
Name: testNvmePathName,
43+
Trtype: testNvmePath.Trtype,
44+
Traddr: testNvmePath.Traddr,
45+
ControllerNameRef: testNvmePath.ControllerNameRef,
46+
Fabrics: testNvmePath.Fabrics,
47+
}
4148
)
4249

4350
func TestBackEnd_CreateNvmePath(t *testing.T) {
@@ -225,8 +232,7 @@ func TestBackEnd_CreateNvmePath(t *testing.T) {
225232
testEnv.opiSpdkServer.store.Set(testNvmeCtrlName, server.ProtoClone(tt.controller))
226233

227234
if tt.exist {
228-
testEnv.opiSpdkServer.Volumes.NvmePaths[testNvmePathName] = server.ProtoClone(&testNvmePath)
229-
testEnv.opiSpdkServer.Volumes.NvmePaths[testNvmePathName].Name = testNvmePathName
235+
testEnv.opiSpdkServer.store.Set(testNvmePathName, &testNvmePathWithName)
230236
}
231237
if tt.out != nil {
232238
tt.out = server.ProtoClone(tt.out)
@@ -445,7 +451,7 @@ func TestBackEnd_DeleteNvmePath(t *testing.T) {
445451
testEnv := createTestEnvironment(tt.spdk)
446452
defer testEnv.Close()
447453

448-
testEnv.opiSpdkServer.Volumes.NvmePaths[testNvmePathName] = server.ProtoClone(&testNvmePath)
454+
testEnv.opiSpdkServer.store.Set(testNvmePathName, &testNvmePathWithName)
449455
testEnv.opiSpdkServer.store.Set(testNvmeCtrlName, &testNvmeCtrlWithName)
450456

451457
request := &pb.DeleteNvmePathRequest{Name: tt.in, AllowMissing: tt.missing}
@@ -470,9 +476,7 @@ func TestBackEnd_DeleteNvmePath(t *testing.T) {
470476
}
471477

472478
func TestBackEnd_UpdateNvmePath(t *testing.T) {
473-
testNvmePathWithName := server.ProtoClone(&testNvmePath)
474-
testNvmePathWithName.Name = testNvmePathName
475-
t.Cleanup(server.CheckTestProtoObjectsNotChanged(testNvmePathWithName)(t, t.Name()))
479+
t.Cleanup(server.CheckTestProtoObjectsNotChanged(&testNvmePathWithName)(t, t.Name()))
476480
t.Cleanup(checkGlobalTestProtoObjectsNotChanged(t, t.Name()))
477481

478482
tests := map[string]struct {
@@ -486,7 +490,7 @@ func TestBackEnd_UpdateNvmePath(t *testing.T) {
486490
}{
487491
"invalid fieldmask": {
488492
mask: &fieldmaskpb.FieldMask{Paths: []string{"*", "author"}},
489-
in: testNvmePathWithName,
493+
in: &testNvmePathWithName,
490494
out: nil,
491495
spdk: []string{},
492496
errCode: codes.Unknown,
@@ -634,8 +638,7 @@ func TestBackEnd_UpdateNvmePath(t *testing.T) {
634638
testEnv := createTestEnvironment(tt.spdk)
635639
defer testEnv.Close()
636640

637-
testEnv.opiSpdkServer.Volumes.NvmePaths[testNvmePathName] = server.ProtoClone(&testNvmePath)
638-
testEnv.opiSpdkServer.Volumes.NvmePaths[testNvmePathName].Name = testNvmePathName
641+
testEnv.opiSpdkServer.store.Set(testNvmePathName, &testNvmePathWithName)
639642

640643
request := &pb.UpdateNvmePathRequest{NvmePath: tt.in, UpdateMask: tt.mask, AllowMissing: tt.missing}
641644
response, err := testEnv.client.UpdateNvmePath(testEnv.ctx, request)
@@ -948,7 +951,7 @@ func TestBackEnd_GetNvmePath(t *testing.T) {
948951
testEnv := createTestEnvironment(tt.spdk)
949952
defer testEnv.Close()
950953

951-
testEnv.opiSpdkServer.Volumes.NvmePaths[testNvmePathID] = server.ProtoClone(&testNvmePath)
954+
testEnv.opiSpdkServer.store.Set(testNvmePathID, &testNvmePathWithName)
952955

953956
request := &pb.GetNvmePathRequest{Name: tt.in}
954957
response, err := testEnv.client.GetNvmePath(testEnv.ctx, request)
@@ -1051,8 +1054,7 @@ func TestBackEnd_StatsNvmePath(t *testing.T) {
10511054
testEnv := createTestEnvironment(tt.spdk)
10521055
defer testEnv.Close()
10531056

1054-
testEnv.opiSpdkServer.Volumes.NvmePaths[testNvmePathID] = server.ProtoClone(&testNvmePath)
1055-
testEnv.opiSpdkServer.Volumes.NvmePaths[testNvmePathID].Name = testNvmePathName
1057+
testEnv.opiSpdkServer.store.Set(testNvmePathID, &testNvmePathWithName)
10561058

10571059
request := &pb.StatsNvmePathRequest{Name: tt.in}
10581060
response, err := testEnv.client.StatsNvmePath(testEnv.ctx, request)

0 commit comments

Comments
 (0)