Skip to content

Commit 01adf24

Browse files
artek-koltunglimchb
authored andcommitted
feat(backend): psk is written to temporary file for spdk
Signed-off-by: Artsiom Koltun <artsiom.koltun@intel.com>
1 parent b6440ba commit 01adf24

File tree

3 files changed

+133
-2
lines changed

3 files changed

+133
-2
lines changed

pkg/backend/backend.go

+12
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
package backend
77

88
import (
9+
"os"
10+
911
"github.com/opiproject/gospdk/spdk"
1012
pb "github.com/opiproject/opi-api/storage/v1alpha1/gen/go"
1113
)
@@ -31,6 +33,12 @@ type Server struct {
3133
rpc spdk.JSONRPC
3234
Volumes VolumeParameters
3335
Pagination map[string]int
36+
psk psk
37+
}
38+
39+
type psk struct {
40+
createTempFile func(dir, pattern string) (*os.File, error)
41+
writeKey func(keyFile string, key []byte, perm os.FileMode) error
3442
}
3543

3644
// NewServer creates initialized instance of BackEnd server communicating
@@ -45,5 +53,9 @@ func NewServer(jsonRPC spdk.JSONRPC) *Server {
4553
NvmePaths: make(map[string]*pb.NvmePath),
4654
},
4755
Pagination: make(map[string]int),
56+
psk: psk{
57+
createTempFile: os.CreateTemp,
58+
writeKey: os.WriteFile,
59+
},
4860
}
4961
}

pkg/backend/nvme_path.go

+29-2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"context"
1010
"fmt"
1111
"log"
12+
"os"
1213
"path"
1314
"sort"
1415
"strings"
@@ -74,8 +75,16 @@ func (s *Server) CreateNvmePath(_ context.Context, in *pb.CreateNvmePathRequest)
7475
psk := ""
7576
if len(controller.Psk) > 0 {
7677
log.Printf("Notice, TLS is used to establish connection: to %v", in.NvmePath)
77-
// TODO: write controller.Psk to file /tmp/opikey.txt
78-
psk = "/tmp/opikey.txt"
78+
keyFile, err := s.keyToTemporaryFile(controller.Psk)
79+
if err != nil {
80+
return nil, err
81+
}
82+
defer func() {
83+
err := os.Remove(keyFile)
84+
log.Printf("Cleanup key file %v: %v", keyFile, err)
85+
}()
86+
87+
psk = keyFile
7988
}
8089
params := spdk.BdevNvmeAttachControllerParams{
8190
Name: path.Base(controller.Name),
@@ -330,3 +339,21 @@ func (s *Server) numberOfPathsForController(controllerName string) int {
330339
}
331340
return numberOfPaths
332341
}
342+
343+
func (s *Server) keyToTemporaryFile(pskKey []byte) (string, error) {
344+
keyFile, err := s.psk.createTempFile("", "opikey")
345+
if err != nil {
346+
log.Printf("error: failed to create file for key: %v", err)
347+
return "", status.Error(codes.Internal, "failed to handle key")
348+
}
349+
350+
const keyPermissions = 0600
351+
if err := s.psk.writeKey(keyFile.Name(), pskKey, keyPermissions); err != nil {
352+
log.Printf("error: failed to write to key file: %v", err)
353+
removeErr := os.Remove(keyFile.Name())
354+
log.Printf("Delete key file after key write: %v", removeErr)
355+
return "", status.Error(codes.Internal, "failed to handle key")
356+
}
357+
358+
return keyFile.Name(), nil
359+
}

pkg/backend/nvme_path_test.go

+92
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@
66
package backend
77

88
import (
9+
"errors"
910
"fmt"
11+
"os"
12+
"path/filepath"
1013
"reflect"
1114
"testing"
1215

@@ -155,6 +158,95 @@ func TestBackEnd_CreateNvmePath(t *testing.T) {
155158
}
156159
})
157160
}
161+
pskTests := map[string]struct {
162+
createErr error
163+
writeErr error
164+
spdk []string
165+
errCode codes.Code
166+
errMsg string
167+
}{
168+
"tmp key file creation failed": {
169+
createErr: errors.New("stub error"),
170+
writeErr: nil,
171+
spdk: []string{},
172+
errCode: codes.Internal,
173+
errMsg: "failed to handle key",
174+
},
175+
"tmp key file write failed": {
176+
createErr: nil,
177+
writeErr: errors.New("stub error"),
178+
spdk: []string{},
179+
errCode: codes.Internal,
180+
errMsg: "failed to handle key",
181+
},
182+
"tmp key file removed after successful call": {
183+
createErr: nil,
184+
writeErr: nil,
185+
spdk: []string{`{"id":%d,"error":{"code":0,"message":""},"result":["mytest"]}`},
186+
errCode: codes.OK,
187+
errMsg: "",
188+
},
189+
}
190+
191+
for name, tt := range pskTests {
192+
t.Run(name, func(t *testing.T) {
193+
testEnv := createTestEnvironment(tt.spdk)
194+
defer testEnv.Close()
195+
196+
const expectedKey = "NVMeTLSkey-1:01:MDAxMTIyMzM0NDU1NjY3Nzg4OTlhYWJiY2NkZGVlZmZwJEiQ:"
197+
testEnv.opiSpdkServer.Volumes.NvmeControllers[testNvmeCtrlName] =
198+
&pb.NvmeRemoteController{
199+
Hdgst: false, Ddgst: false, Multipath: pb.NvmeMultipath_NVME_MULTIPATH_MULTIPATH,
200+
Psk: []byte(expectedKey),
201+
}
202+
203+
createdKeyFile := ""
204+
origCreateTempFile := testEnv.opiSpdkServer.psk.createTempFile
205+
testEnv.opiSpdkServer.psk.createTempFile =
206+
func(dir, pattern string) (*os.File, error) {
207+
if tt.createErr == nil {
208+
keyFile, _ := origCreateTempFile(t.TempDir(), pattern)
209+
createdKeyFile = keyFile.Name()
210+
return keyFile, nil
211+
}
212+
return nil, tt.createErr
213+
}
214+
origWriteKey := testEnv.opiSpdkServer.psk.writeKey
215+
testEnv.opiSpdkServer.psk.writeKey =
216+
func(keyFile string, key []byte, perm os.FileMode) error {
217+
if createdKeyFile != keyFile {
218+
t.Errorf("Expected key is written to: %v, instead: %v", createdKeyFile, keyFile)
219+
}
220+
if _, err := os.Stat(createdKeyFile); err != nil {
221+
t.Errorf("Expected temporary key file %v exists", createdKeyFile)
222+
}
223+
_ = origWriteKey(keyFile, key, perm)
224+
written, _ := os.ReadFile(filepath.Clean(keyFile))
225+
if string(written) != expectedKey {
226+
t.Errorf("Expected psk key: %v is written, received: %v", expectedKey, key)
227+
}
228+
return tt.writeErr
229+
}
230+
231+
request := &pb.CreateNvmePathRequest{NvmePath: &testNvmePath, NvmePathId: "nvmetcppath0"}
232+
_, err := testEnv.client.CreateNvmePath(testEnv.ctx, request)
233+
234+
if er, ok := status.FromError(err); ok {
235+
if er.Code() != tt.errCode {
236+
t.Error("error code: expected", tt.errCode, "received", er.Code())
237+
}
238+
if er.Message() != tt.errMsg {
239+
t.Error("error message: expected", tt.errMsg, "received", er.Message())
240+
}
241+
} else {
242+
t.Error("expected grpc error status")
243+
}
244+
245+
if _, err := os.Stat(createdKeyFile); err == nil {
246+
t.Errorf("Expect temporary key file %v is removed", createdKeyFile)
247+
}
248+
})
249+
}
158250
}
159251

160252
func TestBackEnd_DeleteNvmePath(t *testing.T) {

0 commit comments

Comments
 (0)