Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add DeletEncryptedVolume OPI call #84

Merged
merged 2 commits into from
Apr 12, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions pkg/middleend/middleend.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"log"
"runtime"
"runtime/debug"
"strings"

pc "github.com/opiproject/opi-api/common/v1/gen/go"
pb "github.com/opiproject/opi-api/storage/v1alpha1/gen/go"
Expand All @@ -19,6 +20,7 @@ import (
"github.com/opiproject/opi-spdk-bridge/pkg/server"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
"google.golang.org/protobuf/types/known/emptypb"
)

var (
Expand Down Expand Up @@ -139,6 +141,40 @@ func verifyCreateEncryptedVolumeRequestArgs(in *pb.CreateEncryptedVolumeRequest)
return nil
}

// DeleteEncryptedVolume deletes an encrypted volume
func (s *Server) DeleteEncryptedVolume(_ context.Context, in *pb.DeleteEncryptedVolumeRequest) (*emptypb.Empty, error) {
log.Printf("DeleteEncryptedVolume: Received from client: %v", in)
if in == nil {
log.Println("request cannot be empty")
return nil, errMissingArgument
}

bdevUUID, err := s.getBdevUUIDByName(in.Name)
if err != nil {
log.Println("Failed to find UUID for bdev", in.Name)
return nil, err
}
params := intelmodels.NpiBdevClearKeysParams{
UUID: bdevUUID,
}
var result intelmodels.NpiBdevClearKeysResult
err = s.rpc.Call("npi_bdev_clear_keys", params, &result)
if err != nil {
cryptoObjMissingErrMsg := "Could not find a crypto object for a given bdev"
if in.AllowMissing &&
strings.Contains(err.Error(), cryptoObjMissingErrMsg) {
return &emptypb.Empty{}, nil
}
log.Println(err)
return nil, server.ErrFailedSpdkCall
}
if !result {
log.Println("Failed result on SPDK call:", result)
return nil, server.ErrUnexpectedSpdkCallResult
}
return &emptypb.Empty{}, nil
}

func (s *Server) getBdevUUIDByName(name string) (string, error) {
params := spdkmodels.BdevGetBdevsParams{Name: name}
var result []spdkmodels.BdevGetBdevsResult
Expand Down
67 changes: 67 additions & 0 deletions pkg/middleend/middleend_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -387,3 +387,70 @@ func TestMiddleEnd_CreateEncryptedVolume(t *testing.T) {
})
}
}

func TestMiddleEnd_DeleteEncryptedVolume(t *testing.T) {
tests := map[string]struct {
in *pb.DeleteEncryptedVolumeRequest
spdk []string
expectedErr error
start bool
}{

"nil request": {
in: nil,
spdk: []string{},
expectedErr: errMissingArgument,
start: false,
},
"valid delete encrypted volume request": {
in: &pb.DeleteEncryptedVolumeRequest{Name: bdevName},
spdk: []string{foundBdevResponse, `{"id":%d,"error":{"code":0,"message":""},"result":true}`},
expectedErr: nil,
start: true,
},
"find bdev uuid by name internal SPDK failure": {
in: &pb.DeleteEncryptedVolumeRequest{Name: bdevName},
spdk: []string{`{"id":%d,"error":{"code":-19,"message":"No such device"},"result":null}`},
expectedErr: server.ErrFailedSpdkCall,
start: true,
},
"find no bdev uuid by name": {
in: &pb.DeleteEncryptedVolumeRequest{Name: bdevName},
spdk: []string{`{"id":%d,"error":{"code":0,"message":""},"result":[]}`},
expectedErr: server.ErrUnexpectedSpdkCallResult,
start: true,
},
"internal SPDK failure": {
in: &pb.DeleteEncryptedVolumeRequest{Name: bdevName},
spdk: []string{foundBdevResponse, `{"id":%d,"error":{"code":1,"message":"some internal error"},"result":true}`},
expectedErr: server.ErrFailedSpdkCall,
start: true,
},
"SPDK result false": {
in: &pb.DeleteEncryptedVolumeRequest{Name: bdevName},
spdk: []string{foundBdevResponse, `{"id":%d,"error":{"code":0,"message":""},"result":false}`},
expectedErr: server.ErrUnexpectedSpdkCallResult,
start: true,
},
"delete non-existing encrypted volume with missing allowed": {
in: &pb.DeleteEncryptedVolumeRequest{Name: bdevName, AllowMissing: true},
spdk: []string{foundBdevResponse,
`{"id":%d,"error":{"code":-32603,"message":"Could not find a crypto object for a given bdev, set using npi_bdev_set_keys"},"result":null}`},
expectedErr: nil,
start: true,
},
}

for testName, test := range tests {
t.Run(testName, func(t *testing.T) {
testEnv := createTestEnvironment(test.start, test.spdk)
defer testEnv.Close()

_, err := testEnv.opiSpdkServer.DeleteEncryptedVolume(testEnv.ctx, test.in)

if err != test.expectedErr {
t.Error("error: expected", test.expectedErr, "received", err)
}
})
}
}
8 changes: 8 additions & 0 deletions pkg/models/spdk.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,11 @@ type NpiBdevSetKeysParams struct {

// NpiBdevSetKeysResult is the result of setting crypto keys
type NpiBdevSetKeysResult bool

// NpiBdevClearKeysParams holds the parameters required to clear crypto keys
type NpiBdevClearKeysParams struct {
UUID string `json:"uuid"`
}

// NpiBdevClearKeysResult is the result of clearing crypto keys
type NpiBdevClearKeysResult bool