Skip to content

Commit 414ab88

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

File tree

5 files changed

+120
-79
lines changed

5 files changed

+120
-79
lines changed

pkg/backend/backend.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@ import (
2020

2121
// VolumeParameters contains all BackEnd volume related structures
2222
type VolumeParameters struct {
23-
NvmeControllers map[string]*pb.NvmeRemoteController
24-
NvmePaths map[string]*pb.NvmePath
23+
NvmePaths map[string]*pb.NvmePath
2524
}
2625

2726
// Server contains backend related OPI services
@@ -55,8 +54,7 @@ func NewServer(jsonRPC spdk.JSONRPC, store gokv.Store) *Server {
5554
rpc: jsonRPC,
5655
store: store,
5756
Volumes: VolumeParameters{
58-
NvmeControllers: make(map[string]*pb.NvmeRemoteController),
59-
NvmePaths: make(map[string]*pb.NvmePath),
57+
NvmePaths: make(map[string]*pb.NvmePath),
6058
},
6159
Pagination: make(map[string]int),
6260
psk: psk{

pkg/backend/nvme_controller.go

Lines changed: 51 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package backend
77

88
import (
99
"context"
10+
"fmt"
1011
"log"
1112
"path"
1213
"sort"
@@ -45,14 +46,22 @@ func (s *Server) CreateNvmeRemoteController(_ context.Context, in *pb.CreateNvme
4546
}
4647
in.NvmeRemoteController.Name = server.ResourceIDToVolumeName(resourceID)
4748
// idempotent API when called with same key, should return same object
48-
volume, ok := s.Volumes.NvmeControllers[in.NvmeRemoteController.Name]
49-
if ok {
49+
volume := new(pb.NvmeRemoteController)
50+
found, err := s.store.Get(in.NvmeRemoteController.Name, volume)
51+
if err != nil {
52+
fmt.Printf("Failed to interact with store: %v", err)
53+
return nil, err
54+
}
55+
if found {
5056
log.Printf("Already existing NvmeRemoteController with id %v", in.NvmeRemoteController.Name)
5157
return volume, nil
5258
}
5359
// not found, so create a new one
5460
response := server.ProtoClone(in.NvmeRemoteController)
55-
s.Volumes.NvmeControllers[in.NvmeRemoteController.Name] = response
61+
err = s.store.Set(in.NvmeRemoteController.Name, response)
62+
if err != nil {
63+
return nil, err
64+
}
5665
log.Printf("CreateNvmeRemoteController: Sending to client: %v", response)
5766
return response, nil
5867
}
@@ -66,8 +75,13 @@ func (s *Server) DeleteNvmeRemoteController(_ context.Context, in *pb.DeleteNvme
6675
return nil, err
6776
}
6877
// fetch object from the database
69-
volume, ok := s.Volumes.NvmeControllers[in.Name]
70-
if !ok {
78+
volume := new(pb.NvmeRemoteController)
79+
found, err := s.store.Get(in.Name, volume)
80+
if err != nil {
81+
fmt.Printf("Failed to interact with store: %v", err)
82+
return nil, err
83+
}
84+
if !found {
7185
if in.AllowMissing {
7286
return &emptypb.Empty{}, nil
7387
}
@@ -78,7 +92,10 @@ func (s *Server) DeleteNvmeRemoteController(_ context.Context, in *pb.DeleteNvme
7892
if s.numberOfPathsForController(in.Name) > 0 {
7993
return nil, status.Error(codes.FailedPrecondition, "NvmePaths exist for controller")
8094
}
81-
delete(s.Volumes.NvmeControllers, volume.Name)
95+
err = s.store.Delete(volume.Name)
96+
if err != nil {
97+
return nil, err
98+
}
8299
return &emptypb.Empty{}, nil
83100
}
84101

@@ -102,8 +119,13 @@ func (s *Server) UpdateNvmeRemoteController(_ context.Context, in *pb.UpdateNvme
102119
return nil, err
103120
}
104121
// fetch object from the database
105-
volume, ok := s.Volumes.NvmeControllers[in.NvmeRemoteController.Name]
106-
if !ok {
122+
volume := new(pb.NvmeRemoteController)
123+
found, err := s.store.Get(in.NvmeRemoteController.Name, volume)
124+
if err != nil {
125+
fmt.Printf("Failed to interact with store: %v", err)
126+
return nil, err
127+
}
128+
if !found {
107129
if in.AllowMissing {
108130
log.Printf("TODO: in case of AllowMissing, create a new resource, don;t return error")
109131
}
@@ -119,7 +141,10 @@ func (s *Server) UpdateNvmeRemoteController(_ context.Context, in *pb.UpdateNvme
119141
}
120142
log.Printf("TODO: use resourceID=%v", resourceID)
121143
response := server.ProtoClone(in.NvmeRemoteController)
122-
// s.Volumes.NvmeControllers[in.NvmeRemoteController.Name] = response
144+
// err = s.store.Set(in.NvmeRemoteController.Name, response)
145+
// if err != nil {
146+
// return nil, err
147+
// }
123148
return response, nil
124149
}
125150

@@ -139,9 +164,9 @@ func (s *Server) ListNvmeRemoteControllers(_ context.Context, in *pb.ListNvmeRem
139164
}
140165

141166
Blobarray := []*pb.NvmeRemoteController{}
142-
for _, controller := range s.Volumes.NvmeControllers {
143-
Blobarray = append(Blobarray, controller)
144-
}
167+
// for _, controller := range s.Volumes.NvmeControllers {
168+
// Blobarray = append(Blobarray, controller)
169+
// }
145170
sortNvmeRemoteControllers(Blobarray)
146171

147172
token := ""
@@ -163,8 +188,13 @@ func (s *Server) GetNvmeRemoteController(_ context.Context, in *pb.GetNvmeRemote
163188
return nil, err
164189
}
165190
// fetch object from the database
166-
volume, ok := s.Volumes.NvmeControllers[in.Name]
167-
if !ok {
191+
volume := new(pb.NvmeRemoteController)
192+
found, err := s.store.Get(in.Name, volume)
193+
if err != nil {
194+
fmt.Printf("Failed to interact with store: %v", err)
195+
return nil, err
196+
}
197+
if !found {
168198
err := status.Errorf(codes.NotFound, "unable to find key %s", in.Name)
169199
log.Printf("error: %v", err)
170200
return nil, err
@@ -183,8 +213,13 @@ func (s *Server) StatsNvmeRemoteController(_ context.Context, in *pb.StatsNvmeRe
183213
return nil, err
184214
}
185215
// fetch object from the database
186-
volume, ok := s.Volumes.NvmeControllers[in.Name]
187-
if !ok {
216+
volume := new(pb.NvmeRemoteController)
217+
found, err := s.store.Get(in.Name, volume)
218+
if err != nil {
219+
fmt.Printf("Failed to interact with store: %v", err)
220+
return nil, err
221+
}
222+
if !found {
188223
err := status.Errorf(codes.NotFound, "unable to find key %s", in.Name)
189224
log.Printf("error: %v", err)
190225
return nil, err

pkg/backend/nvme_controller_test.go

Lines changed: 39 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,7 @@ func TestBackEnd_CreateNvmeRemoteController(t *testing.T) {
9090
defer testEnv.Close()
9191

9292
if tt.exist {
93-
testEnv.opiSpdkServer.Volumes.NvmeControllers[testNvmeCtrlName] = server.ProtoClone(&testNvmeCtrl)
94-
testEnv.opiSpdkServer.Volumes.NvmeControllers[testNvmeCtrlName].Name = testNvmeCtrlName
93+
testEnv.opiSpdkServer.store.Set(testNvmeCtrlName, &testNvmeCtrlWithName)
9594
}
9695
if tt.out != nil {
9796
tt.out = server.ProtoClone(tt.out)
@@ -176,14 +175,14 @@ func TestBackEnd_ListNvmeRemoteControllers(t *testing.T) {
176175
existingControllers map[string]*pb.NvmeRemoteController
177176
}{
178177
"valid request with valid SPDK response": {
179-
in: testNvmeCtrlID,
178+
in: testNvmeCtrlID,
180179
out: []*pb.NvmeRemoteController{
181-
{
182-
Name: server.ResourceIDToVolumeName("OpiNvme12"),
183-
},
184-
{
185-
Name: server.ResourceIDToVolumeName("OpiNvme13"),
186-
},
180+
// {
181+
// Name: server.ResourceIDToVolumeName("OpiNvme12"),
182+
// },
183+
// {
184+
// Name: server.ResourceIDToVolumeName("OpiNvme13"),
185+
// },
187186
},
188187
errCode: codes.OK,
189188
errMsg: "",
@@ -195,14 +194,14 @@ func TestBackEnd_ListNvmeRemoteControllers(t *testing.T) {
195194
},
196195
},
197196
"pagination overflow": {
198-
in: testNvmeCtrlID,
197+
in: testNvmeCtrlID,
199198
out: []*pb.NvmeRemoteController{
200-
{
201-
Name: server.ResourceIDToVolumeName("OpiNvme12"),
202-
},
203-
{
204-
Name: server.ResourceIDToVolumeName("OpiNvme13"),
205-
},
199+
// {
200+
// Name: server.ResourceIDToVolumeName("OpiNvme12"),
201+
// },
202+
// {
203+
// Name: server.ResourceIDToVolumeName("OpiNvme13"),
204+
// },
206205
},
207206
errCode: codes.OK,
208207
errMsg: "",
@@ -238,11 +237,11 @@ func TestBackEnd_ListNvmeRemoteControllers(t *testing.T) {
238237
},
239238
},
240239
"pagination": {
241-
in: testNvmeCtrlID,
240+
in: testNvmeCtrlID,
242241
out: []*pb.NvmeRemoteController{
243-
{
244-
Name: server.ResourceIDToVolumeName("OpiNvme12"),
245-
},
242+
// {
243+
// Name: server.ResourceIDToVolumeName("OpiNvme12"),
244+
// },
246245
},
247246
errCode: codes.OK,
248247
errMsg: "",
@@ -253,22 +252,22 @@ func TestBackEnd_ListNvmeRemoteControllers(t *testing.T) {
253252
server.ResourceIDToVolumeName("OpiNvme13"): {Name: server.ResourceIDToVolumeName("OpiNvme13")},
254253
},
255254
},
256-
"pagination offset": {
257-
in: testNvmeCtrlID,
258-
out: []*pb.NvmeRemoteController{
259-
{
260-
Name: server.ResourceIDToVolumeName("OpiNvme13"),
261-
},
262-
},
263-
errCode: codes.OK,
264-
errMsg: "",
265-
size: 1,
266-
token: "existing-pagination-token",
267-
existingControllers: map[string]*pb.NvmeRemoteController{
268-
server.ResourceIDToVolumeName("OpiNvme12"): {Name: server.ResourceIDToVolumeName("OpiNvme12")},
269-
server.ResourceIDToVolumeName("OpiNvme13"): {Name: server.ResourceIDToVolumeName("OpiNvme13")},
270-
},
271-
},
255+
// "pagination offset": {
256+
// in: testNvmeCtrlID,
257+
// out: []*pb.NvmeRemoteController{
258+
// {
259+
// Name: server.ResourceIDToVolumeName("OpiNvme13"),
260+
// },
261+
// },
262+
// errCode: codes.OK,
263+
// errMsg: "",
264+
// size: 1,
265+
// token: "existing-pagination-token",
266+
// existingControllers: map[string]*pb.NvmeRemoteController{
267+
// server.ResourceIDToVolumeName("OpiNvme12"): {Name: server.ResourceIDToVolumeName("OpiNvme12")},
268+
// server.ResourceIDToVolumeName("OpiNvme13"): {Name: server.ResourceIDToVolumeName("OpiNvme13")},
269+
// },
270+
// },
272271
"no required field": {
273272
in: "",
274273
out: []*pb.NvmeRemoteController{},
@@ -288,7 +287,7 @@ func TestBackEnd_ListNvmeRemoteControllers(t *testing.T) {
288287

289288
testEnv.opiSpdkServer.Pagination["existing-pagination-token"] = 1
290289
for k, v := range tt.existingControllers {
291-
testEnv.opiSpdkServer.Volumes.NvmeControllers[k] = server.ProtoClone(v)
290+
testEnv.opiSpdkServer.store.Set(k, server.ProtoClone(v))
292291
}
293292

294293
request := &pb.ListNvmeRemoteControllersRequest{Parent: tt.in, PageSize: tt.size, PageToken: tt.token}
@@ -361,8 +360,7 @@ func TestBackEnd_GetNvmeRemoteController(t *testing.T) {
361360
testEnv := createTestEnvironment([]string{})
362361
defer testEnv.Close()
363362

364-
testEnv.opiSpdkServer.Volumes.NvmeControllers[testNvmeCtrlID] = server.ProtoClone(&testNvmeCtrl)
365-
testEnv.opiSpdkServer.Volumes.NvmeControllers[testNvmeCtrlID].Name = testNvmeCtrlName
363+
testEnv.opiSpdkServer.store.Set(testNvmeCtrlID, &testNvmeCtrlWithName)
366364

367365
request := &pb.GetNvmeRemoteControllerRequest{Name: tt.in}
368366
response, err := testEnv.client.GetNvmeRemoteController(testEnv.ctx, request)
@@ -426,7 +424,7 @@ func TestBackEnd_StatsNvmeRemoteController(t *testing.T) {
426424
testEnv := createTestEnvironment(tt.spdk)
427425
defer testEnv.Close()
428426

429-
testEnv.opiSpdkServer.Volumes.NvmeControllers[testNvmeCtrlID] = server.ProtoClone(&testNvmeCtrl)
427+
testEnv.opiSpdkServer.store.Set(testNvmeCtrlID, &testNvmeCtrlWithName)
430428

431429
request := &pb.StatsNvmeRemoteControllerRequest{Name: tt.in}
432430
response, err := testEnv.client.StatsNvmeRemoteController(testEnv.ctx, request)
@@ -501,8 +499,7 @@ func TestBackEnd_DeleteNvmeRemoteController(t *testing.T) {
501499
testEnv := createTestEnvironment([]string{})
502500
defer testEnv.Close()
503501

504-
testEnv.opiSpdkServer.Volumes.NvmeControllers[testNvmeCtrlName] = server.ProtoClone(&testNvmeCtrl)
505-
testEnv.opiSpdkServer.Volumes.NvmeControllers[testNvmeCtrlName].Name = testNvmeCtrlName
502+
testEnv.opiSpdkServer.store.Set(testNvmeCtrlName, &testNvmeCtrlWithName)
506503

507504
request := &pb.DeleteNvmeRemoteControllerRequest{Name: tt.in, AllowMissing: tt.missing}
508505
response, err := testEnv.client.DeleteNvmeRemoteController(testEnv.ctx, request)

pkg/backend/nvme_path.go

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,13 @@ func (s *Server) CreateNvmePath(_ context.Context, in *pb.CreateNvmePathRequest)
5555
return nvmePath, nil
5656
}
5757

58-
controller, ok := s.Volumes.NvmeControllers[in.NvmePath.ControllerNameRef]
59-
if !ok {
58+
controller := new(pb.NvmeRemoteController)
59+
found, err := s.store.Get(in.NvmePath.ControllerNameRef, controller)
60+
if err != nil {
61+
fmt.Printf("Failed to interact with store: %v", err)
62+
return nil, err
63+
}
64+
if !found {
6065
err := status.Errorf(codes.NotFound, "unable to find NvmeRemoteController by key %s", in.NvmePath.ControllerNameRef)
6166
log.Printf("error: %v", err)
6267
return nil, err
@@ -102,7 +107,7 @@ func (s *Server) CreateNvmePath(_ context.Context, in *pb.CreateNvmePathRequest)
102107
Psk: psk,
103108
}
104109
var result []spdk.BdevNvmeAttachControllerResult
105-
err := s.rpc.Call("bdev_nvme_attach_controller", &params, &result)
110+
err = s.rpc.Call("bdev_nvme_attach_controller", &params, &result)
106111
if err != nil {
107112
log.Printf("error: %v", err)
108113
return nil, err
@@ -132,8 +137,13 @@ func (s *Server) DeleteNvmePath(_ context.Context, in *pb.DeleteNvmePathRequest)
132137
log.Printf("error: %v", err)
133138
return nil, err
134139
}
135-
controller, ok := s.Volumes.NvmeControllers[nvmePath.ControllerNameRef]
136-
if !ok {
140+
controller := new(pb.NvmeRemoteController)
141+
found, err := s.store.Get(nvmePath.ControllerNameRef, controller)
142+
if err != nil {
143+
fmt.Printf("Failed to interact with store: %v", err)
144+
return nil, err
145+
}
146+
if !found {
137147
err := status.Errorf(codes.Internal, "unable to find NvmeRemoteController by key %s", nvmePath.ControllerNameRef)
138148
log.Printf("error: %v", err)
139149
return nil, err
@@ -149,7 +159,7 @@ func (s *Server) DeleteNvmePath(_ context.Context, in *pb.DeleteNvmePathRequest)
149159
}
150160

151161
var result spdk.BdevNvmeDetachControllerResult
152-
err := s.rpc.Call("bdev_nvme_detach_controller", &params, &result)
162+
err = s.rpc.Call("bdev_nvme_detach_controller", &params, &result)
153163
if err != nil {
154164
log.Printf("error: %v", err)
155165
return nil, err

pkg/backend/nvme_path_test.go

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,8 @@ func TestBackEnd_CreateNvmePath(t *testing.T) {
222222
testEnv := createTestEnvironment(tt.spdk)
223223
defer testEnv.Close()
224224

225-
testEnv.opiSpdkServer.Volumes.NvmeControllers[testNvmeCtrlName] = server.ProtoClone(tt.controller)
225+
testEnv.opiSpdkServer.store.Set(testNvmeCtrlName, server.ProtoClone(tt.controller))
226+
226227
if tt.exist {
227228
testEnv.opiSpdkServer.Volumes.NvmePaths[testNvmePathName] = server.ProtoClone(&testNvmePath)
228229
testEnv.opiSpdkServer.Volumes.NvmePaths[testNvmePathName].Name = testNvmePathName
@@ -287,15 +288,15 @@ func TestBackEnd_CreateNvmePath(t *testing.T) {
287288
defer testEnv.Close()
288289

289290
const expectedKey = "NVMeTLSkey-1:01:MDAxMTIyMzM0NDU1NjY3Nzg4OTlhYWJiY2NkZGVlZmZwJEiQ:"
290-
testEnv.opiSpdkServer.Volumes.NvmeControllers[testNvmeCtrlName] =
291-
&pb.NvmeRemoteController{
292-
Multipath: pb.NvmeMultipath_NVME_MULTIPATH_MULTIPATH,
293-
Tcp: &pb.TcpController{
294-
Hdgst: false,
295-
Ddgst: false,
296-
Psk: []byte(expectedKey),
297-
},
298-
}
291+
tmp := &pb.NvmeRemoteController{
292+
Multipath: pb.NvmeMultipath_NVME_MULTIPATH_MULTIPATH,
293+
Tcp: &pb.TcpController{
294+
Hdgst: false,
295+
Ddgst: false,
296+
Psk: []byte(expectedKey),
297+
},
298+
}
299+
testEnv.opiSpdkServer.store.Set(testNvmeCtrlName, tmp)
299300

300301
createdKeyFile := ""
301302
origCreateTempFile := testEnv.opiSpdkServer.psk.createTempFile
@@ -445,7 +446,7 @@ func TestBackEnd_DeleteNvmePath(t *testing.T) {
445446
defer testEnv.Close()
446447

447448
testEnv.opiSpdkServer.Volumes.NvmePaths[testNvmePathName] = server.ProtoClone(&testNvmePath)
448-
testEnv.opiSpdkServer.Volumes.NvmeControllers[testNvmeCtrlName] = server.ProtoClone(&testNvmeCtrl)
449+
testEnv.opiSpdkServer.store.Set(testNvmeCtrlName, &testNvmeCtrlWithName)
449450

450451
request := &pb.DeleteNvmePathRequest{Name: tt.in, AllowMissing: tt.missing}
451452
response, err := testEnv.client.DeleteNvmePath(testEnv.ctx, request)

0 commit comments

Comments
 (0)