From 5a711ad9a2198329756c12867b245ab64268fb4e Mon Sep 17 00:00:00 2001 From: atulpatel261194 Date: Fri, 30 Aug 2024 02:53:12 -0700 Subject: [PATCH] fix: fix build issue Co-authored-by: Dimitrios Markou Co-authored-by: Saikumar Banoth Co-authored-by: Patel Atul Co-authored-by: Vemula Venkatesh Co-authored-by: Jambekar Vishakha Signed-off-by: atulpatel261194 --- Dockerfile | 5 +- Makefile | 4 +- README.md | 8 +- cmd/{main_evpn.go => evpn/main.go} | 1 + cmd/{main_storage.go => storage/main.go} | 0 config-intel-e2000.yaml | 91 ++- pkg/frontend/blk.go | 65 -- pkg/frontend/blk_test.go | 126 --- pkg/frontend/frontend.go | 50 -- pkg/frontend/frontend_test.go | 93 --- pkg/frontend/nvme.go | 304 ------- pkg/frontend/nvme_test.go | 999 ----------------------- pkg/frontend/spdk_test.go | 13 - pkg/models/spdk.go | 55 -- pkg/storage/frontend/blk_test.go | 2 +- pkg/tools/tools.go | 12 - 16 files changed, 56 insertions(+), 1772 deletions(-) rename cmd/{main_evpn.go => evpn/main.go} (99%) rename cmd/{main_storage.go => storage/main.go} (100%) delete mode 100644 pkg/frontend/blk.go delete mode 100644 pkg/frontend/blk_test.go delete mode 100644 pkg/frontend/frontend.go delete mode 100644 pkg/frontend/frontend_test.go delete mode 100644 pkg/frontend/nvme.go delete mode 100644 pkg/frontend/nvme_test.go delete mode 100644 pkg/frontend/spdk_test.go delete mode 100644 pkg/models/spdk.go delete mode 100644 pkg/tools/tools.go diff --git a/Dockerfile b/Dockerfile index d559ca29..9bde2744 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,9 +15,8 @@ ENV CGO_ENABLED=0 # build an app COPY cmd/ cmd/ COPY pkg/ pkg/ -RUN go build -v -o /opi-intel-bridge-storage ./cmd/main_storage.go -RUN go build -v -o /opi-intel-bridge-evpn ./cmd/main_evpn.go - +RUN go build -v -o /opi-intel-bridge-storage ./cmd/storage && \ + go build -v -o /opi-intel-bridge-evpn ./cmd/evpn # second stage to reduce image size FROM alpine:3.19@sha256:51b67269f354137895d43f3b3d810bfacd3945438e94dc5ac55fdac340352f48 RUN apk add --no-cache --no-check-certificate hwdata && rm -rf /var/cache/apk/* diff --git a/Makefile b/Makefile index 2870aab4..27db541d 100644 --- a/Makefile +++ b/Makefile @@ -12,11 +12,11 @@ compile: get build build: build-evpn build-storage build-evpn: @echo " > Building binaries..." - @CGO_ENABLED=0 go build -o ${PROJECTNAME}-evpn ./cmd/main_evpn.go + @CGO_ENABLED=0 go build -o ${PROJECTNAME}-evpn ./cmd/evpn build-storage: @echo " > Building binaries..." - @CGO_ENABLED=0 go build -o ${PROJECTNAME}-storage ./cmd/main_storage.go + @CGO_ENABLED=0 go build -o ${PROJECTNAME}-storage ./cmd/storage get: @echo " > Checking if there are any missing dependencies..." diff --git a/README.md b/README.md index 6038b2c3..059b9389 100644 --- a/README.md +++ b/README.md @@ -64,13 +64,13 @@ The following variables are used throughout this document: To build the solution execute ```bash -go build -v -o /opi-intel-bridge ./cmd/... +go build -v -o /opi-intel-bridge-storage ./cmd/storage ``` To import the bridge within another go package or module use ```go -import "github.com/opiproject/opi-intel-bridge/pkg/frontend" +import "github.com/opiproject/opi-intel-bridge-storage/pkg/frontend" ``` ### Usage @@ -86,7 +86,7 @@ Make sure `/var/tmp/spdk.sock` is created. On xPU run ```bash -$ docker run --rm -it -v /var/tmp/:/var/tmp/ -p $BRIDGE_PORT:$BRIDGE_PORT -p $BRIDGE_HTTP_PORT:$BRIDGE_HTTP_PORT ghcr.io/opiproject/opi-intel-bridge:main /opi-intel-bridge -grpc_port=$BRIDGE_PORT -http_port=$BRIDGE_HTTP_PORT +$ docker run --rm -it -v /var/tmp/:/var/tmp/ -p $BRIDGE_PORT:$BRIDGE_PORT -p $BRIDGE_HTTP_PORT:$BRIDGE_HTTP_PORT ghcr.io/opiproject/opi-intel-bridge:main /opi-intel-bridge-storage -grpc_port=$BRIDGE_PORT -http_port=$BRIDGE_HTTP_PORT 2023/09/12 20:29:05 TLS files are not specified. Use insecure connection. 2023/09/12 20:29:05 Connection to SPDK will be via: unix detected from /var/tmp/spdk.sock @@ -345,7 +345,7 @@ make sure to follow the principle of least privilege for access permissions and Run bridge binary specifying TLS-related server key/certificate and CA cert ```bash -./opi-intel-bridge -grpc_port=$BRIDGE_PORT -http_port=$BRIDGE_HTTP_PORT -tls $SERVER_CERT:$SERVER_KEY:$CA_CERT +./opi-intel-bridge-storage -grpc_port=$BRIDGE_PORT -http_port=$BRIDGE_HTTP_PORT -tls $SERVER_CERT:$SERVER_KEY:$CA_CERT ``` for container diff --git a/cmd/main_evpn.go b/cmd/evpn/main.go similarity index 99% rename from cmd/main_evpn.go rename to cmd/evpn/main.go index 4e564520..db0d152e 100644 --- a/cmd/main_evpn.go +++ b/cmd/evpn/main.go @@ -4,6 +4,7 @@ // Copyright (C) 2023 Nordix Foundation. // Package main is the main package of the application +//nolint:all package main import ( diff --git a/cmd/main_storage.go b/cmd/storage/main.go similarity index 100% rename from cmd/main_storage.go rename to cmd/storage/main.go diff --git a/config-intel-e2000.yaml b/config-intel-e2000.yaml index 5fa81f22..7488bfe0 100644 --- a/config-intel-e2000.yaml +++ b/config-intel-e2000.yaml @@ -1,3 +1,4 @@ +--- grpcport: 50151 httpport: 8082 tlsfiles: @@ -6,53 +7,53 @@ dbaddress: 127.0.0.1:6379 buildenv: intel_e2000 tracer: false subscribers: - - name: "lvm" - priority: 2 - events: ["vrf", "bridge-port"] - - name: "lgm" - priority: 1 - events: ["vrf", "svi", "logical-bridge"] - - name: "frr" - priority: 3 - events: ["vrf", "svi"] - - name: "intel_e2000" - priority: 4 - events: ["vrf", "logical-bridge", "bridge-port", "svi"] + - name: "lvm" + priority: 2 + events: ["vrf", "bridge-port"] + - name: "lgm" + priority: 1 + events: ["vrf", "svi", "logical-bridge"] + - name: "frr" + priority: 3 + events: ["vrf", "svi"] + - name: "intel_e2000" + priority: 4 + events: ["vrf", "logical-bridge", "bridge-port", "svi"] grpc: - server_addresses: - - 0.0.0.0 - server_port: 51703 - num_threads: 10 - static_external_macs: [] + server_addresses: + - 0.0.0.0 + server_port: 51703 + num_threads: 10 + static_external_macs: [] p4: - enabled: true - representors: - port_mux: "port-mux" - vrf_mux: "vrf-mux" - grpc_acc: "host" - grpc_host: "00:20:00:00:14:48" - phy0_rep: "port0" - phy1_rep: "port1" - config: - p4infofile: /root/p4files/opi_ln.p4info.txt - binfile: /root/p4files/opi_ln.pb.bin + enabled: true + representors: + port_mux: "port-mux" + vrf_mux: "vrf-mux" + grpc_acc: "host" + grpc_host: "00:20:00:00:14:48" + phy0_rep: "port0" + phy1_rep: "port1" + config: + p4infofile: /root/p4files/opi_ln.p4info.txt + binfile: /root/p4files/opi_ln.pb.bin linuxfrr: - enabled: true - defaultvtep: "vxlan-vtep" - portmux: "enp0s1f0d5" - vrfmux: "enp0s1f0d4" - ipmtu: 2962 + enabled: true + defaultvtep: "vxlan-vtep" + portmux: "enp0s1f0d5" + vrfmux: "enp0s1f0d4" + ipmtu: 2962 netlink: - enabled: true - pollinterval: 1 - phyports: - - name: "enp0s1f0d1" - vsi: 0 - - name: "enp0s1f0d2" - vsi: 1 + enabled: true + pollinterval: 1 + phyports: + - name: "enp0s1f0d1" + vsi: 0 + - name: "enp0s1f0d2" + vsi: 1 loglevel: - db: INFO - grpc: INFO - linux: INFO - netlink: INFO - p4: DEBUG + db: INFO + grpc: INFO + linux: INFO + netlink: INFO + p4: DEBUG diff --git a/pkg/frontend/blk.go b/pkg/frontend/blk.go deleted file mode 100644 index 05aa824d..00000000 --- a/pkg/frontend/blk.go +++ /dev/null @@ -1,65 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// Copyright (C) 2023 Intel Corporation - -// Package frontend implements the FrontEnd APIs (host facing) of the storage Server -package frontend - -import ( - "fmt" - - "github.com/opiproject/gospdk/spdk" - pb "github.com/opiproject/opi-api/storage/v1alpha1/gen/go" - "github.com/opiproject/opi-intel-bridge/pkg/models" - "github.com/opiproject/opi-spdk-bridge/pkg/frontend" -) - -const ( - blkTransport = "mev_blk_transport" -) - -type mevBlkTransport struct{} - -func (v mevBlkTransport) CreateParams(virtioBlk *pb.VirtioBlk) (any, error) { - ctrlr, err := v.getCtrlr(virtioBlk.PcieId) - if err != nil { - return nil, err - } - - vqCount := 1 - if virtioBlk.GetMaxIoQps() != 0 { - vqCount = int(virtioBlk.GetMaxIoQps()) - } - - return models.MevVhostCreateBlkControllerParams{ - Ctrlr: ctrlr, - DevName: virtioBlk.VolumeNameRef, - Transport: blkTransport, - VqCount: vqCount, - }, nil -} - -func (v mevBlkTransport) DeleteParams(virtioBlk *pb.VirtioBlk) (any, error) { - ctrlr, err := v.getCtrlr(virtioBlk.PcieId) - if err != nil { - return nil, err - } - - return spdk.VhostDeleteControllerParams{Ctrlr: ctrlr}, nil -} - -func (v mevBlkTransport) getCtrlr(pci *pb.PciEndpoint) (string, error) { - if pci.PortId.Value != 0 { - return "", fmt.Errorf("only port 0 is supported") - } - - if pci.VirtualFunction.Value != 0 { - return "", fmt.Errorf("virtual functions are not supported") - } - - return fmt.Sprintf("h0-pf%v-vf0-PF", pci.PhysicalFunction.Value), nil -} - -// NewMevBlkTransport creates an isntance of mevBlkTransport -func NewMevBlkTransport() frontend.VirtioBlkTransport { - return &mevBlkTransport{} -} diff --git a/pkg/frontend/blk_test.go b/pkg/frontend/blk_test.go deleted file mode 100644 index 73fb14f7..00000000 --- a/pkg/frontend/blk_test.go +++ /dev/null @@ -1,126 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// Copyright (C) 2023 Intel Corporation - -// Package frontend implements the FrontEnd APIs (host facing) of the storage Server -package frontend - -import ( - "reflect" - "testing" - - "github.com/opiproject/gospdk/spdk" - pb "github.com/opiproject/opi-api/storage/v1alpha1/gen/go" - "github.com/opiproject/opi-intel-bridge/pkg/models" - "google.golang.org/protobuf/types/known/wrapperspb" -) - -func TestFrontEnd_CreateBlkParams(t *testing.T) { - tests := map[string]struct { - in *pb.VirtioBlk - out any - expectErr bool - }{ - "fail on virtual function": { - in: &pb.VirtioBlk{ - PcieId: &pb.PciEndpoint{PhysicalFunction: wrapperspb.Int32(0), VirtualFunction: wrapperspb.Int32(1), PortId: wrapperspb.Int32(0)}, - }, - out: nil, - expectErr: true, - }, - "fail on non zero port": { - in: &pb.VirtioBlk{ - PcieId: &pb.PciEndpoint{PhysicalFunction: wrapperspb.Int32(0), VirtualFunction: wrapperspb.Int32(0), PortId: wrapperspb.Int32(1)}, - }, - out: nil, - expectErr: true, - }, - "valid pf": { - in: &pb.VirtioBlk{ - PcieId: &pb.PciEndpoint{PhysicalFunction: wrapperspb.Int32(1), VirtualFunction: wrapperspb.Int32(0), PortId: wrapperspb.Int32(0)}, - VolumeNameRef: "volume42", - MaxIoQps: 5, - }, - out: models.MevVhostCreateBlkControllerParams{ - Ctrlr: "h0-pf1-vf0-PF", - DevName: "volume42", - Transport: blkTransport, - VqCount: 5, - }, - expectErr: false, - }, - "empty max_io_qps": { - in: &pb.VirtioBlk{ - PcieId: &pb.PciEndpoint{PhysicalFunction: wrapperspb.Int32(3), VirtualFunction: wrapperspb.Int32(0), PortId: wrapperspb.Int32(0)}, - VolumeNameRef: "volume42", - }, - out: models.MevVhostCreateBlkControllerParams{ - Ctrlr: "h0-pf3-vf0-PF", - DevName: "volume42", - Transport: blkTransport, - VqCount: 1, - }, - expectErr: false, - }, - } - for testName, tt := range tests { - t.Run(testName, func(t *testing.T) { - transport := NewMevBlkTransport() - - params, err := transport.CreateParams(tt.in) - - if (err != nil) != tt.expectErr { - t.Errorf("Expected error: %v, received: %v", tt.expectErr, err) - } - if !reflect.DeepEqual(params, tt.out) { - t.Errorf("Expected params: %v, received %v", tt.out, params) - } - }) - } -} - -func TestFrontEnd_DeleteBlkParams(t *testing.T) { - tests := map[string]struct { - in *pb.VirtioBlk - out any - expectErr bool - }{ - "fail on virtual function": { - in: &pb.VirtioBlk{ - PcieId: &pb.PciEndpoint{PhysicalFunction: wrapperspb.Int32(0), VirtualFunction: wrapperspb.Int32(1), PortId: wrapperspb.Int32(0)}, - }, - out: nil, - expectErr: true, - }, - "fail on non zero port": { - in: &pb.VirtioBlk{ - PcieId: &pb.PciEndpoint{PhysicalFunction: wrapperspb.Int32(0), VirtualFunction: wrapperspb.Int32(0), PortId: wrapperspb.Int32(1)}, - }, - out: nil, - expectErr: true, - }, - "valid pf": { - in: &pb.VirtioBlk{ - PcieId: &pb.PciEndpoint{PhysicalFunction: wrapperspb.Int32(1), VirtualFunction: wrapperspb.Int32(0), PortId: wrapperspb.Int32(0)}, - VolumeNameRef: "volume42", - }, - out: spdk.VhostDeleteControllerParams{ - Ctrlr: "h0-pf1-vf0-PF", - }, - expectErr: false, - }, - } - for testName, tt := range tests { - t.Run(testName, func(t *testing.T) { - transport := NewMevBlkTransport() - - params, err := transport.DeleteParams(tt.in) - - if (err != nil) != tt.expectErr { - t.Errorf("Expected error: %v, received: %v", tt.expectErr, err) - } - if !reflect.DeepEqual(params, tt.out) { - t.Errorf("Expected params: %v, received %v", tt.out, params) - } - }) - } -} diff --git a/pkg/frontend/frontend.go b/pkg/frontend/frontend.go deleted file mode 100644 index 4031996e..00000000 --- a/pkg/frontend/frontend.go +++ /dev/null @@ -1,50 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// Copyright (c) 2022-2023 Dell Inc, or its subsidiaries. -// Copyright (C) 2023 Intel Corporation - -// Package frontend implements the FrontEnd APIs (host facing) of the storage Server -package frontend - -import ( - "log" - - "github.com/philippgille/gokv" - - "github.com/opiproject/gospdk/spdk" - pb "github.com/opiproject/opi-api/storage/v1alpha1/gen/go" - "github.com/opiproject/opi-spdk-bridge/pkg/frontend" -) - -// Server contains frontend related OPI services -type Server struct { - pb.FrontendNvmeServiceServer - pb.FrontendVirtioBlkServiceServer - - nvme *frontend.NvmeParameters - rpc spdk.JSONRPC - store gokv.Store -} - -// NewServer creates initialized instance of Nvme server -func NewServer(jsonRPC spdk.JSONRPC, store gokv.Store) *Server { - if jsonRPC == nil { - log.Panic("nil for JSONRPC is not allowed") - } - if store == nil { - log.Panic("nil for Store is not allowed") - } - opiSpdkServer := frontend.NewCustomizedServer( - jsonRPC, store, - map[pb.NvmeTransportType]frontend.NvmeTransport{ - pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE: NewNvmeNpiTransport(jsonRPC), - pb.NvmeTransportType_NVME_TRANSPORT_TYPE_TCP: frontend.NewNvmeTCPTransport(jsonRPC), - }, - NewMevBlkTransport()) - return &Server{ - opiSpdkServer, - opiSpdkServer, - &opiSpdkServer.Nvme, - jsonRPC, - store, - } -} diff --git a/pkg/frontend/frontend_test.go b/pkg/frontend/frontend_test.go deleted file mode 100644 index 95a482a1..00000000 --- a/pkg/frontend/frontend_test.go +++ /dev/null @@ -1,93 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// Copyright (C) 2023 Intel Corporation - -// Package frontend implements the FrontEnd APIs (host facing) of the storage Server -package frontend - -import ( - "context" - "log" - "net" - "os" - - "github.com/philippgille/gokv/gomap" - - "github.com/opiproject/gospdk/spdk" - pb "github.com/opiproject/opi-api/storage/v1alpha1/gen/go" - "github.com/opiproject/opi-spdk-bridge/pkg/utils" - - "google.golang.org/grpc" - "google.golang.org/grpc/credentials/insecure" - "google.golang.org/grpc/test/bufconn" -) - -var checkGlobalTestProtoObjectsNotChanged = utils.CheckTestProtoObjectsNotChanged( - &testPciEndpoint, - &testSubsystem, - &testControllerWithMaxQos, -) - -type frontendClient struct { - pb.FrontendNvmeServiceClient -} - -type testEnv struct { - opiSpdkServer *Server - client *frontendClient - ln net.Listener - testSocket string - ctx context.Context - conn *grpc.ClientConn - jsonRPC spdk.JSONRPC -} - -func (e *testEnv) Close() { - utils.CloseListener(e.ln) - if err := os.RemoveAll(e.testSocket); err != nil { - log.Fatal(err) - } - utils.CloseGrpcConnection(e.conn) -} - -func createTestEnvironment(spdkResponses []string) *testEnv { - env := &testEnv{} - env.testSocket = utils.GenerateSocketName("frontend") - env.ln, env.jsonRPC = utils.CreateTestSpdkServer(env.testSocket, spdkResponses) - options := gomap.DefaultOptions - options.Codec = utils.ProtoCodec{} - store := gomap.NewStore(options) - env.opiSpdkServer = NewServer(env.jsonRPC, store) - - ctx := context.Background() - conn, err := grpc.DialContext(ctx, - "", - grpc.WithTransportCredentials(insecure.NewCredentials()), - grpc.WithContextDialer(dialer(env.opiSpdkServer))) - if err != nil { - log.Fatal(err) - } - env.ctx = ctx - env.conn = conn - - env.client = &frontendClient{ - pb.NewFrontendNvmeServiceClient(env.conn), - } - - return env -} - -func dialer(opiSpdkServer *Server) func(context.Context, string) (net.Conn, error) { - listener := bufconn.Listen(1024 * 1024) - server := grpc.NewServer() - pb.RegisterFrontendNvmeServiceServer(server, opiSpdkServer) - - go func() { - if err := server.Serve(listener); err != nil { - log.Fatal(err) - } - }() - - return func(context.Context, string) (net.Conn, error) { - return listener.Dial() - } -} diff --git a/pkg/frontend/nvme.go b/pkg/frontend/nvme.go deleted file mode 100644 index c4dc5172..00000000 --- a/pkg/frontend/nvme.go +++ /dev/null @@ -1,304 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// Copyright (C) 2023 Intel Corporation - -// Package frontend implements the FrontEnd APIs (host facing) of the storage Server -package frontend - -import ( - "context" - "fmt" - "log" - "strconv" - - "github.com/opiproject/gospdk/spdk" - pb "github.com/opiproject/opi-api/storage/v1alpha1/gen/go" - "github.com/opiproject/opi-intel-bridge/pkg/models" - "github.com/opiproject/opi-spdk-bridge/pkg/frontend" - "github.com/opiproject/opi-spdk-bridge/pkg/utils" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" - "google.golang.org/protobuf/proto" -) - -type nvmeNpiTransport struct { - rpc spdk.JSONRPC -} - -// build time check that struct implements interface -var _ frontend.NvmeTransport = (*nvmeNpiTransport)(nil) - -// NewNvmeNpiTransport creates a new instance of a NvmeTransport for npi -func NewNvmeNpiTransport(rpc spdk.JSONRPC) frontend.NvmeTransport { - if rpc == nil { - log.Panicf("rpc cannot be nil") - } - - return &nvmeNpiTransport{ - rpc: rpc, - } -} - -func (c *nvmeNpiTransport) CreateController( - ctx context.Context, - ctrlr *pb.NvmeController, - subsys *pb.NvmeSubsystem, -) error { - if ctrlr.GetSpec().GetPcieId().GetPortId().GetValue() != 0 { - return status.Error(codes.InvalidArgument, "only port 0 is supported") - } - - if ctrlr.GetSpec().GetPcieId().GetPhysicalFunction().GetValue() != 0 { - return status.Error(codes.InvalidArgument, - "only physical_function 0 is supported") - } - - if subsys.GetSpec().GetHostnqn() != "" { - return status.Error(codes.InvalidArgument, - "hostnqn for subsystem is not supported for npi") - } - - maxNsq := ctrlr.GetSpec().GetMaxNsq() - maxNcq := ctrlr.GetSpec().GetMaxNcq() - if maxNsq != maxNcq { - return status.Error(codes.InvalidArgument, - "max_nsq and max_ncq must be equal") - } - - params := c.params(ctrlr, subsys) - if maxNsq > 0 { - params.MaxQPairs = int(maxNsq) + 1 // + 1 admin queue - } - var result spdk.NvmfSubsystemAddListenerResult - err := c.rpc.Call(ctx, "nvmf_subsystem_add_listener", ¶ms, &result) - if err != nil { - return status.Error(codes.Unknown, err.Error()) - } - log.Printf("Received from SPDK: %v", result) - if !result { - msg := fmt.Sprintf("Could not create CTRL: %s", ctrlr.Name) - return status.Errorf(codes.InvalidArgument, msg) - } - - return nil -} - -func (c *nvmeNpiTransport) DeleteController( - ctx context.Context, - ctrlr *pb.NvmeController, - subsys *pb.NvmeSubsystem, -) error { - params := c.params(ctrlr, subsys) - var result spdk.NvmfSubsystemAddListenerResult - err := c.rpc.Call(ctx, "nvmf_subsystem_remove_listener", ¶ms, &result) - if err != nil { - return err - } - log.Printf("Received from SPDK: %v", result) - if !result { - msg := fmt.Sprintf("Could not delete CTRL: %s", ctrlr.Name) - return status.Errorf(codes.InvalidArgument, msg) - } - - return nil -} - -func (c *nvmeNpiTransport) params( - ctrlr *pb.NvmeController, - subsys *pb.NvmeSubsystem, -) models.NpiNvmfSubsystemAddListenerParams { - result := models.NpiNvmfSubsystemAddListenerParams{} - result.Nqn = subsys.GetSpec().GetNqn() - result.ListenAddress.Trtype = "npi" - result.ListenAddress.Traddr = calculateTransportAddr(ctrlr.GetSpec().GetPcieId()) - - return result -} - -func calculateTransportAddr(pci *pb.PciEndpoint) string { - return strconv.Itoa(int(pci.PhysicalFunction.Value)) + - "." + strconv.Itoa(int(pci.VirtualFunction.Value)) -} - -// CreateNvmeController creates an Nvme controller -func (s *Server) CreateNvmeController(ctx context.Context, in *pb.CreateNvmeControllerRequest) (*pb.NvmeController, error) { - if err := s.verifyNvmeControllerOnCreate(in.NvmeController); err != nil { - return nil, status.Error(codes.InvalidArgument, err.Error()) - } - - log.Printf("Passing request to opi-spdk-bridge") - response, err := s.FrontendNvmeServiceServer.CreateNvmeController(ctx, in) - if err == nil && in.GetNvmeController().GetSpec().GetTrtype() == pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE { - // response contains different QoS limits. It is an indication that - // opi-spdk-bridge returned an already existing controller providing idempotence - if !proto.Equal(response.Spec.MaxLimit, in.NvmeController.Spec.MaxLimit) || - !proto.Equal(response.Spec.MinLimit, in.NvmeController.Spec.MinLimit) { - log.Printf("Existing NvmeController %v has different QoS limits", - in.NvmeController) - return nil, status.Errorf(codes.AlreadyExists, - "Controller %v exists with different QoS limits", in.NvmeController.Name) - } - - if qosErr := s.setNvmeQosLimit(ctx, in.NvmeController); qosErr != nil { - s.cleanupNvmeControllerCreation(in.NvmeController.Name) - return nil, qosErr - } - } - - return response, err -} - -// UpdateNvmeController updates an Nvme controller -func (s *Server) UpdateNvmeController(ctx context.Context, in *pb.UpdateNvmeControllerRequest) (*pb.NvmeController, error) { - if err := s.verifyNvmeControllerOnUpdate(in.NvmeController); err != nil { - return nil, status.Error(codes.InvalidArgument, err.Error()) - } - - originalNvmeController := s.nvme.Controllers[in.NvmeController.Name] - log.Printf("Passing request to opi-spdk-bridge") - response, err := s.FrontendNvmeServiceServer.UpdateNvmeController(ctx, in) - if err == nil && in.GetNvmeController().GetSpec().GetTrtype() == pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE { - if qosErr := s.setNvmeQosLimit(ctx, in.NvmeController); qosErr != nil { - log.Println("Failed to set qos settings:", qosErr) - log.Println("Restore original controller") - s.nvme.Controllers[in.NvmeController.Name] = originalNvmeController - return nil, qosErr - } - } - return response, err -} - -func (s *Server) verifyNvmeControllerOnCreate(controller *pb.NvmeController) error { - return s.verifyNvmeController(controller) -} - -func (s *Server) verifyNvmeControllerOnUpdate(controller *pb.NvmeController) error { - if err := s.verifyNvmeController(controller); err != nil { - return err - } - - // Name had to be assigned on create - if controller.Name == "" { - return fmt.Errorf("name cannot be empty on update") - } - return nil -} - -func (s *Server) verifyNvmeController(controller *pb.NvmeController) error { - maxLimit := controller.Spec.MaxLimit - if err := s.verifyNvmeControllerMaxLimits(maxLimit); err != nil { - return err - } - - minLimit := controller.Spec.MinLimit - if err := s.verifyNvmeControllerMinLimits(minLimit); err != nil { - return err - } - - return s.verifyNvmeControllerMinMaxLimitCorrespondence(minLimit, maxLimit) -} - -func (s *Server) verifyNvmeControllerMaxLimits(maxLimit *pb.QosLimit) error { - if maxLimit != nil { - if maxLimit.RwIopsKiops != 0 { - return fmt.Errorf("QoS max_limit rw_iops_kiops is not supported") - } - if maxLimit.RwBandwidthMbs != 0 { - return fmt.Errorf("QoS max_limit rw_bandwidth_mbs is not supported") - } - - if maxLimit.RdIopsKiops < 0 { - return fmt.Errorf("QoS max_limit rd_iops_kiops cannot be negative") - } - if maxLimit.WrIopsKiops < 0 { - return fmt.Errorf("QoS max_limit wr_iops_kiops cannot be negative") - } - if maxLimit.RdBandwidthMbs < 0 { - return fmt.Errorf("QoS max_limit rd_bandwidth_mbs cannot be negative") - } - if maxLimit.WrBandwidthMbs < 0 { - return fmt.Errorf("QoS max_limit wr_bandwidth_mbs cannot be negative") - } - } - return nil -} - -func (s *Server) verifyNvmeControllerMinLimits(minLimit *pb.QosLimit) error { - if minLimit != nil { - if minLimit.RwIopsKiops != 0 { - return fmt.Errorf("QoS min_limit rw_iops_kiops is not supported") - } - if minLimit.RwBandwidthMbs != 0 { - return fmt.Errorf("QoS min_limit rw_bandwidth_mbs is not supported") - } - if minLimit.RdIopsKiops != 0 { - return fmt.Errorf("QoS min_limit rd_iops_kiops is not supported") - } - if minLimit.WrIopsKiops != 0 { - return fmt.Errorf("QoS min_limit wr_iops_kiops is not supported") - } - - if minLimit.RdBandwidthMbs < 0 { - return fmt.Errorf("QoS min_limit rd_bandwidth_mbs cannot be negative") - } - if minLimit.WrBandwidthMbs < 0 { - return fmt.Errorf("QoS min_limit wr_bandwidth_mbs cannot be negative") - } - } - return nil -} - -func (s *Server) verifyNvmeControllerMinMaxLimitCorrespondence(minLimit *pb.QosLimit, maxLimit *pb.QosLimit) error { - if minLimit != nil && maxLimit != nil { - if maxLimit.RdBandwidthMbs != 0 && minLimit.RdBandwidthMbs > maxLimit.RdBandwidthMbs { - return fmt.Errorf("QoS min_limit rd_bandwidth_mbs cannot be greater than max_limit rd_bandwidth_mbs") - } - if maxLimit.WrBandwidthMbs != 0 && minLimit.WrBandwidthMbs > maxLimit.WrBandwidthMbs { - return fmt.Errorf("QoS min_limit wr_bandwidth_mbs cannot be greater than max_limit wr_bandwidth_mbs") - } - } - return nil -} - -func (s *Server) setNvmeQosLimit(ctx context.Context, controller *pb.NvmeController) error { - log.Printf("Setting QoS limits %v for %v", controller.Spec.MaxLimit, controller.Name) - subsysName := utils.ResourceIDToSubsystemName( - utils.GetSubsystemIDFromNvmeName(controller.Name), - ) - params := models.NpiQosBwIopsLimitParams{ - Nqn: s.nvme.Subsystems[subsysName].Spec.Nqn, - } - - maxLimit := controller.Spec.MaxLimit - if maxLimit != nil { - params.MaxReadIops = int(maxLimit.RdIopsKiops) - params.MaxWriteIops = int(maxLimit.WrIopsKiops) - params.MaxReadBw = int(maxLimit.RdBandwidthMbs) - params.MaxWriteBw = int(maxLimit.WrBandwidthMbs) - } - - minLimit := controller.Spec.MinLimit - if minLimit != nil { - params.MinReadBw = int(minLimit.RdBandwidthMbs) - params.MinWriteBw = int(minLimit.WrBandwidthMbs) - } - - var result models.NpiQosBwIopsLimitResult - err := s.rpc.Call(ctx, "npi_qos_bw_iops_limit", ¶ms, &result) - if err != nil { - log.Printf("error: %v", err) - return spdk.ErrFailedSpdkCall - } - log.Printf("Received from SPDK: %v", result) - if !result { - log.Println("Could not set QoS for", controller) - return spdk.ErrUnexpectedSpdkCallResult - } - return nil -} - -func (s *Server) cleanupNvmeControllerCreation(id string) { - log.Println("Cleanup failed Nvme controller creation for", id) - _, err := s.FrontendNvmeServiceServer.DeleteNvmeController(context.TODO(), - &pb.DeleteNvmeControllerRequest{Name: id}) - log.Println("Cleanup Nvme controller creation:", err) -} diff --git a/pkg/frontend/nvme_test.go b/pkg/frontend/nvme_test.go deleted file mode 100644 index e064d2fa..00000000 --- a/pkg/frontend/nvme_test.go +++ /dev/null @@ -1,999 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// Copyright (C) 2023 Intel Corporation - -// Package frontend implements the FrontEnd APIs (host facing) of the storage Server -package frontend - -import ( - "fmt" - "testing" - - "github.com/opiproject/gospdk/spdk" - pb "github.com/opiproject/opi-api/storage/v1alpha1/gen/go" - "github.com/opiproject/opi-spdk-bridge/pkg/utils" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" - "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/types/known/wrapperspb" -) - -var ( - testPciEndpoint = pb.PciEndpoint{ - PhysicalFunction: wrapperspb.Int32(0), - VirtualFunction: wrapperspb.Int32(2), - PortId: wrapperspb.Int32(0), - } - testSubsystemID = "subsystem-test" - testSubsystem = pb.NvmeSubsystem{ - Name: utils.ResourceIDToSubsystemName(testSubsystemID), - Spec: &pb.NvmeSubsystemSpec{ - Nqn: "nqn.2022-09.io.spdk:opi3", - }, - } - testControllerID = "controller-test" - testControllerName = utils.ResourceIDToControllerName( - testSubsystemID, testControllerID, - ) - testControllerWithMaxQos = pb.NvmeController{ - Spec: &pb.NvmeControllerSpec{ - Endpoint: &pb.NvmeControllerSpec_PcieId{ - PcieId: &testPciEndpoint, - }, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - MaxLimit: &pb.QosLimit{ - RdIopsKiops: 1, - WrIopsKiops: 1, - RdBandwidthMbs: 1, - WrBandwidthMbs: 1, - }, - }, - } -) - -func TestFrontEnd_CreateNvmeController(t *testing.T) { - t.Cleanup(checkGlobalTestProtoObjectsNotChanged(t, t.Name())) - tests := map[string]struct { - in *pb.NvmeController - out *pb.NvmeController - spdk []string - errCode codes.Code - errMsg string - existingController *pb.NvmeController - hostnqn string - }{ - "max_limit rw_iops_kiops is not supported": { - in: &pb.NvmeController{ - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - MaxLimit: &pb.QosLimit{RwIopsKiops: 1}, - }, - }, - out: nil, - spdk: []string{}, - errCode: codes.InvalidArgument, - errMsg: "QoS max_limit rw_iops_kiops is not supported", - existingController: nil, - }, - "max_limit rw_bandwidth_mbs is not supported": { - in: &pb.NvmeController{ - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - MaxLimit: &pb.QosLimit{RwBandwidthMbs: 1}, - }, - }, - out: nil, - spdk: []string{}, - errCode: codes.InvalidArgument, - errMsg: "QoS max_limit rw_bandwidth_mbs is not supported", - existingController: nil, - }, - "set qos SPDK call failed": { - in: &testControllerWithMaxQos, - out: nil, - spdk: []string{ - `{"id":%d,"error":{"code":0,"message":""},"result":true}`, - `{"id":%d,"error":{"code":-1,"message":"some internal error"},"result":true}`, - `{"id":%d,"error":{"code":0,"message":""},"result":true}`}, - errCode: status.Convert(spdk.ErrFailedSpdkCall).Code(), - errMsg: status.Convert(spdk.ErrFailedSpdkCall).Message(), - existingController: nil, - }, - "set qos SPDK call result false": { - in: &testControllerWithMaxQos, - out: nil, - spdk: []string{ - `{"id":%d,"error":{"code":0,"message":""},"result":true}`, - `{"id":%d,"error":{"code":0,"message":""},"result":false}`, - `{"id":%d,"error":{"code":0,"message":""},"result":true}`}, - errCode: status.Convert(spdk.ErrUnexpectedSpdkCallResult).Code(), - errMsg: status.Convert(spdk.ErrUnexpectedSpdkCallResult).Message(), - existingController: nil, - }, - "allowed max qos limits": { - in: &testControllerWithMaxQos, - out: &pb.NvmeController{ - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(-1), - MaxLimit: &pb.QosLimit{RdIopsKiops: 1, WrIopsKiops: 1, RdBandwidthMbs: 1, WrBandwidthMbs: 1}, - }, - Status: &pb.NvmeControllerStatus{Active: true}, - }, - spdk: []string{ - `{"id":%d,"error":{"code":0,"message":""},"result":true}`, - `{"id":%d,"error":{"code":0,"message":""},"result":true}`}, - errCode: codes.OK, - errMsg: "", - existingController: nil, - }, - "no qos limits are specified": { - in: &pb.NvmeController{ - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - }, - }, - out: &pb.NvmeController{ - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(-1), - }, - Status: &pb.NvmeControllerStatus{Active: true}, - }, - spdk: []string{ - `{"id":%d,"error":{"code":0,"message":""},"result":true}`, - `{"id":%d,"error":{"code":0,"message":""},"result":true}`}, - errCode: codes.OK, - errMsg: "", - existingController: nil, - }, - "controller with the same qos limits exists": { - in: &pb.NvmeController{ - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - MinLimit: &pb.QosLimit{RdBandwidthMbs: 1, WrBandwidthMbs: 1}, - MaxLimit: &pb.QosLimit{RdIopsKiops: 1, WrIopsKiops: 1, RdBandwidthMbs: 1, WrBandwidthMbs: 1}, - }, - }, - out: &pb.NvmeController{ - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(-1), - MinLimit: &pb.QosLimit{RdBandwidthMbs: 1, WrBandwidthMbs: 1}, - MaxLimit: &pb.QosLimit{RdIopsKiops: 1, WrIopsKiops: 1, RdBandwidthMbs: 1, WrBandwidthMbs: 1}, - }, - Status: &pb.NvmeControllerStatus{Active: true}, - }, - spdk: []string{`{"id":%d,"error":{"code":0,"message":""},"result":true}`}, - errCode: codes.OK, - errMsg: "", - existingController: &pb.NvmeController{ - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(-1), - MinLimit: &pb.QosLimit{RdBandwidthMbs: 1, WrBandwidthMbs: 1}, - MaxLimit: &pb.QosLimit{RdIopsKiops: 1, WrIopsKiops: 1, RdBandwidthMbs: 1, WrBandwidthMbs: 1}, - }, - Status: &pb.NvmeControllerStatus{Active: true}, - }, - }, - "controller with different max qos limits exists": { - in: &pb.NvmeController{ - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - MaxLimit: &pb.QosLimit{RdIopsKiops: 12321, WrIopsKiops: 1, RdBandwidthMbs: 1, WrBandwidthMbs: 1}, - }, - }, - out: nil, - spdk: []string{}, - errCode: codes.AlreadyExists, - errMsg: fmt.Sprintf("Controller %v exists with different QoS limits", testControllerName), - existingController: &pb.NvmeController{ - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(-1), - MaxLimit: &pb.QosLimit{RdIopsKiops: 1, WrIopsKiops: 1, RdBandwidthMbs: 1, WrBandwidthMbs: 1}, - }, - Status: &pb.NvmeControllerStatus{Active: true}, - }, - }, - "controller with different min qos limits exists": { - in: &pb.NvmeController{ - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - MinLimit: &pb.QosLimit{RdBandwidthMbs: 12321, WrBandwidthMbs: 1}, - }, - }, - out: nil, - spdk: []string{}, - errCode: codes.AlreadyExists, - errMsg: fmt.Sprintf("Controller %v exists with different QoS limits", testControllerName), - existingController: &pb.NvmeController{ - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(-1), - MinLimit: &pb.QosLimit{RdBandwidthMbs: 1, WrBandwidthMbs: 1}, - }, - Status: &pb.NvmeControllerStatus{Active: true}, - }, - }, - "min_limit rw_bandwidth_mbs is not supported": { - in: &pb.NvmeController{ - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - MinLimit: &pb.QosLimit{RwBandwidthMbs: 1}, - }, - }, - out: nil, - spdk: []string{}, - errCode: codes.InvalidArgument, - errMsg: "QoS min_limit rw_bandwidth_mbs is not supported", - existingController: nil, - }, - "min_limit rw_iops_kiops is not supported": { - in: &pb.NvmeController{ - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - MinLimit: &pb.QosLimit{RwIopsKiops: 1}, - }, - }, - out: nil, - spdk: []string{}, - errCode: codes.InvalidArgument, - errMsg: "QoS min_limit rw_iops_kiops is not supported", - existingController: nil, - }, - "min_limit rd_iops_kiops is not supported": { - in: &pb.NvmeController{ - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - MinLimit: &pb.QosLimit{RdIopsKiops: 1}, - }, - }, - out: nil, - spdk: []string{}, - errCode: codes.InvalidArgument, - errMsg: "QoS min_limit rd_iops_kiops is not supported", - existingController: nil, - }, - "min_limit wr_iops_kiops is not supported": { - in: &pb.NvmeController{ - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - MinLimit: &pb.QosLimit{WrIopsKiops: 1}, - }, - }, - out: nil, - spdk: []string{}, - errCode: codes.InvalidArgument, - errMsg: "QoS min_limit wr_iops_kiops is not supported", - existingController: nil, - }, - "allowed min qos limits": { - in: &pb.NvmeController{ - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - MinLimit: &pb.QosLimit{RdBandwidthMbs: 1, WrBandwidthMbs: 1}, - MaxLimit: &pb.QosLimit{}, - }, - }, - out: &pb.NvmeController{ - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(-1), - MinLimit: &pb.QosLimit{RdBandwidthMbs: 1, WrBandwidthMbs: 1}, - MaxLimit: &pb.QosLimit{}, - }, - Status: &pb.NvmeControllerStatus{Active: true}, - }, - spdk: []string{ - `{"id":%d,"error":{"code":0,"message":""},"result":true}`, - `{"id":%d,"error":{"code":0,"message":""},"result":true}`}, - errCode: codes.OK, - errMsg: "", - existingController: nil, - }, - "min_limit rd_bandwidth_mbs cannot be greater than max_limit rd_bandwidth_mbs": { - in: &pb.NvmeController{ - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - MinLimit: &pb.QosLimit{RdBandwidthMbs: 2}, - MaxLimit: &pb.QosLimit{RdBandwidthMbs: 1}, - }, - }, - out: nil, - spdk: []string{}, - errCode: codes.InvalidArgument, - errMsg: "QoS min_limit rd_bandwidth_mbs cannot be greater than max_limit rd_bandwidth_mbs", - existingController: nil, - }, - "min_limit wr_bandwidth_mbs cannot be greater than max_limit wr_bandwidth_mbs": { - in: &pb.NvmeController{ - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - MinLimit: &pb.QosLimit{WrBandwidthMbs: 2}, - MaxLimit: &pb.QosLimit{WrBandwidthMbs: 1}, - }, - }, - out: nil, - spdk: []string{}, - errCode: codes.InvalidArgument, - errMsg: "QoS min_limit wr_bandwidth_mbs cannot be greater than max_limit wr_bandwidth_mbs", - existingController: nil, - }, - "allowed min and max qos limits": { - in: &pb.NvmeController{ - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - MaxLimit: &pb.QosLimit{RdIopsKiops: 2, WrIopsKiops: 2, RdBandwidthMbs: 2, WrBandwidthMbs: 2}, - MinLimit: &pb.QosLimit{RdBandwidthMbs: 1, WrBandwidthMbs: 1}, - }, - }, - out: &pb.NvmeController{ - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(-1), - MaxLimit: &pb.QosLimit{RdIopsKiops: 2, WrIopsKiops: 2, RdBandwidthMbs: 2, WrBandwidthMbs: 2}, - MinLimit: &pb.QosLimit{RdBandwidthMbs: 1, WrBandwidthMbs: 1}, - }, - Status: &pb.NvmeControllerStatus{Active: true}, - }, - spdk: []string{ - `{"id":%d,"error":{"code":0,"message":""},"result":true}`, - `{"id":%d,"error":{"code":0,"message":""},"result":true}`}, - errCode: codes.OK, - errMsg: "", - existingController: nil, - }, - "max_limit rd_iops_kiops is negative": { - in: &pb.NvmeController{ - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - MaxLimit: &pb.QosLimit{RdIopsKiops: -1}, - }, - }, - out: nil, - spdk: []string{}, - errCode: codes.InvalidArgument, - errMsg: "QoS max_limit rd_iops_kiops cannot be negative", - existingController: nil, - }, - "max_limit wr_iops_kiops is negative": { - in: &pb.NvmeController{ - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - MaxLimit: &pb.QosLimit{WrIopsKiops: -1}, - }, - }, - out: nil, - spdk: []string{}, - errCode: codes.InvalidArgument, - errMsg: "QoS max_limit wr_iops_kiops cannot be negative", - existingController: nil, - }, - "max_limit rd_bandwidth_mbs is negative": { - in: &pb.NvmeController{ - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - MaxLimit: &pb.QosLimit{RdBandwidthMbs: -1}, - }, - }, - out: nil, - spdk: []string{}, - errCode: codes.InvalidArgument, - errMsg: "QoS max_limit rd_bandwidth_mbs cannot be negative", - existingController: nil, - }, - "max_limit wr_bandwidth_mbs is negative": { - in: &pb.NvmeController{ - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - MaxLimit: &pb.QosLimit{WrBandwidthMbs: -1}, - }, - }, - out: nil, - spdk: []string{}, - errCode: codes.InvalidArgument, - errMsg: "QoS max_limit wr_bandwidth_mbs cannot be negative", - existingController: nil, - }, - "min_limit rd_bandwidth_mbs is negative": { - in: &pb.NvmeController{ - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - MinLimit: &pb.QosLimit{RdBandwidthMbs: -1}, - }, - }, - out: nil, - spdk: []string{}, - errCode: codes.InvalidArgument, - errMsg: "QoS min_limit rd_bandwidth_mbs cannot be negative", - existingController: nil, - }, - "min_limit wr_bandwidth_mbs is negative": { - in: &pb.NvmeController{ - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - MinLimit: &pb.QosLimit{WrBandwidthMbs: -1}, - }, - }, - out: nil, - spdk: []string{}, - errCode: codes.InvalidArgument, - errMsg: "QoS min_limit wr_bandwidth_mbs cannot be negative", - existingController: nil, - }, - "non 0 port id": { - in: &pb.NvmeController{ - Spec: &pb.NvmeControllerSpec{ - Endpoint: &pb.NvmeControllerSpec_PcieId{ - PcieId: &pb.PciEndpoint{ - PortId: wrapperspb.Int32(1), - PhysicalFunction: wrapperspb.Int32(0), - VirtualFunction: wrapperspb.Int32(0), - }, - }, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - }, - }, - out: nil, - spdk: []string{}, - errCode: codes.InvalidArgument, - errMsg: "only port 0 is supported", - existingController: nil, - }, - "non 0 physical_function": { - in: &pb.NvmeController{ - Spec: &pb.NvmeControllerSpec{ - Endpoint: &pb.NvmeControllerSpec_PcieId{ - PcieId: &pb.PciEndpoint{ - PortId: wrapperspb.Int32(0), - PhysicalFunction: wrapperspb.Int32(1), - VirtualFunction: wrapperspb.Int32(0), - }, - }, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - }, - }, - out: nil, - spdk: []string{}, - errCode: codes.InvalidArgument, - errMsg: "only physical_function 0 is supported", - existingController: nil, - }, - "non-empty hostnqn": { - in: &pb.NvmeController{ - Spec: &pb.NvmeControllerSpec{ - Endpoint: &pb.NvmeControllerSpec_PcieId{ - PcieId: &pb.PciEndpoint{ - PortId: wrapperspb.Int32(0), - PhysicalFunction: wrapperspb.Int32(0), - VirtualFunction: wrapperspb.Int32(0), - }, - }, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - }, - }, - out: nil, - spdk: []string{}, - errCode: codes.InvalidArgument, - errMsg: "hostnqn for subsystem is not supported for npi", - existingController: nil, - hostnqn: "nqn.2014-08.org.nvmexpress:uuid:feb98abe-d51f-40c8-b348-2753f3571d3c", - }, - "valid request with empty SPDK response": { - in: &testControllerWithMaxQos, - out: nil, - spdk: []string{""}, - errCode: codes.Unknown, - errMsg: fmt.Sprintf("nvmf_subsystem_add_listener: %v", "EOF"), - existingController: nil, - hostnqn: "", - }, - "valid request with invalid SPDK response": { - in: &testControllerWithMaxQos, - out: nil, - spdk: []string{`{"id":%d,"error":{"code":0,"message":""},"result":false}`}, - errCode: codes.InvalidArgument, - errMsg: fmt.Sprintf("Could not create CTRL: %v", testControllerName), - existingController: nil, - hostnqn: "", - }, - "non-equal max_nsq and max_ncq": { - in: &pb.NvmeController{ - Spec: &pb.NvmeControllerSpec{ - Endpoint: &pb.NvmeControllerSpec_PcieId{ - PcieId: &pb.PciEndpoint{ - PortId: wrapperspb.Int32(0), - PhysicalFunction: wrapperspb.Int32(0), - VirtualFunction: wrapperspb.Int32(0), - }, - }, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - MaxNsq: 17, - MaxNcq: 18, - }, - }, - out: nil, - spdk: []string{}, - errCode: codes.InvalidArgument, - errMsg: "max_nsq and max_ncq must be equal", - existingController: nil, - hostnqn: "", - }, - "non-zero max_nsq and max_ncq": { - in: &pb.NvmeController{ - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - MaxNsq: 17, - MaxNcq: 17, - }, - }, - out: &pb.NvmeController{ - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(-1), - MaxNsq: 17, - MaxNcq: 17, - }, - Status: &pb.NvmeControllerStatus{Active: true}, - }, - spdk: []string{ - `{"id":%d,"error":{"code":0,"message":""},"result":true}`, - `{"id":%d,"error":{"code":0,"message":""},"result":true}`}, - errCode: codes.OK, - errMsg: "", - existingController: nil, - }, - } - - for testName, tt := range tests { - t.Run(testName, func(t *testing.T) { - tt.in = utils.ProtoClone(tt.in) - testEnv := createTestEnvironment(tt.spdk) - defer testEnv.Close() - testEnv.opiSpdkServer.nvme.Subsystems[testSubsystem.Name] = utils.ProtoClone(&testSubsystem) - testEnv.opiSpdkServer.nvme.Subsystems[testSubsystem.Name].Spec.Hostnqn = tt.hostnqn - if tt.existingController != nil { - tt.existingController = utils.ProtoClone(tt.existingController) - tt.existingController.Name = testControllerName - testEnv.opiSpdkServer.nvme.Controllers[tt.existingController.Name] = tt.existingController - } - if tt.out != nil { - tt.out = utils.ProtoClone(tt.out) - tt.out.Name = testControllerName - } - - response, err := testEnv.opiSpdkServer.CreateNvmeController(testEnv.ctx, - &pb.CreateNvmeControllerRequest{ - Parent: testSubsystem.Name, - NvmeController: tt.in, - NvmeControllerId: testControllerID}) - - if !proto.Equal(response, tt.out) { - t.Error("response: expected", tt.out, "received", response) - } - - if er, ok := status.FromError(err); ok { - if er.Code() != tt.errCode { - t.Error("error code: expected", tt.errCode, "received", er.Code()) - } - if er.Message() != tt.errMsg { - t.Error("error message: expected", tt.errMsg, "received", er.Message()) - } - } else { - t.Errorf("expect grpc error status, received %v", err) - } - - controller := testEnv.opiSpdkServer.nvme.Controllers[testControllerName] - if tt.existingController != nil { - if !proto.Equal(tt.existingController, controller) { - t.Errorf("expect %v exists", tt.existingController) - } - } else { - if tt.errCode == codes.OK { - if !proto.Equal(tt.out, controller) { - t.Errorf("expect %v exists", tt.out) - } - } else { - if controller != nil { - t.Errorf("expect no controller exists") - } - } - } - }) - } -} - -func TestFrontEnd_UpdateNvmeController(t *testing.T) { - t.Cleanup(checkGlobalTestProtoObjectsNotChanged(t, t.Name())) - tests := map[string]struct { - in *pb.NvmeController - out *pb.NvmeController - spdk []string - errCode codes.Code - errMsg string - existingController *pb.NvmeController - }{ - "max_limit rw_iops_kiops is not supported": { - in: &pb.NvmeController{ - Name: testControllerName, - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - MaxLimit: &pb.QosLimit{RwIopsKiops: 1}, - }, - }, - out: nil, - spdk: []string{}, - errCode: codes.InvalidArgument, - errMsg: "QoS max_limit rw_iops_kiops is not supported", - existingController: nil, - }, - "max_limit rw_bandwidth_mbs is not supported": { - in: &pb.NvmeController{ - Name: testControllerName, - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - MaxLimit: &pb.QosLimit{RwBandwidthMbs: 1}, - }, - }, - out: nil, - spdk: []string{}, - errCode: codes.InvalidArgument, - errMsg: "QoS max_limit rw_bandwidth_mbs is not supported", - existingController: &testControllerWithMaxQos, - }, - "min_limit rw_bandwidth_mbs is not supported": { - in: &pb.NvmeController{ - Name: testControllerName, - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - MinLimit: &pb.QosLimit{RwBandwidthMbs: 1}, - }, - }, - out: nil, - spdk: []string{}, - errCode: codes.InvalidArgument, - errMsg: "QoS min_limit rw_bandwidth_mbs is not supported", - existingController: &testControllerWithMaxQos, - }, - "min_limit rw_iops_kiops is not supported": { - in: &pb.NvmeController{ - Name: testControllerName, - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - MinLimit: &pb.QosLimit{RwIopsKiops: 1}, - }, - }, - out: nil, - spdk: []string{}, - errCode: codes.InvalidArgument, - errMsg: "QoS min_limit rw_iops_kiops is not supported", - existingController: &testControllerWithMaxQos, - }, - "min_limit rd_iops_kiops is not supported": { - in: &pb.NvmeController{ - Name: testControllerName, - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - MinLimit: &pb.QosLimit{RdIopsKiops: 1}, - }, - }, - out: nil, - spdk: []string{}, - errCode: codes.InvalidArgument, - errMsg: "QoS min_limit rd_iops_kiops is not supported", - existingController: &testControllerWithMaxQos, - }, - "min_limit wr_iops_kiops is not supported": { - in: &pb.NvmeController{ - Name: testControllerName, - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - MinLimit: &pb.QosLimit{WrIopsKiops: 1}, - }, - }, - out: nil, - spdk: []string{}, - errCode: codes.InvalidArgument, - errMsg: "QoS min_limit wr_iops_kiops is not supported", - existingController: &testControllerWithMaxQos, - }, - "min_limit rd_bandwidth_mbs cannot be greater than max_limit rd_bandwidth_mbs": { - in: &pb.NvmeController{ - Name: testControllerName, - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - MinLimit: &pb.QosLimit{RdBandwidthMbs: 2}, - MaxLimit: &pb.QosLimit{RdBandwidthMbs: 1}, - }, - }, - out: nil, - spdk: []string{}, - errCode: codes.InvalidArgument, - errMsg: "QoS min_limit rd_bandwidth_mbs cannot be greater than max_limit rd_bandwidth_mbs", - existingController: &testControllerWithMaxQos, - }, - "min_limit wr_bandwidth_mbs cannot be greater than max_limit wr_bandwidth_mbs": { - in: &pb.NvmeController{ - Name: testControllerName, - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - MinLimit: &pb.QosLimit{WrBandwidthMbs: 2}, - MaxLimit: &pb.QosLimit{WrBandwidthMbs: 1}, - }, - }, - out: nil, - spdk: []string{}, - errCode: codes.InvalidArgument, - errMsg: "QoS min_limit wr_bandwidth_mbs cannot be greater than max_limit wr_bandwidth_mbs", - existingController: &testControllerWithMaxQos, - }, - "max_limit rd_iops_kiops is negative": { - in: &pb.NvmeController{ - Name: testControllerName, - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - MaxLimit: &pb.QosLimit{RdIopsKiops: -1}, - }, - }, - out: nil, - spdk: []string{}, - errCode: codes.InvalidArgument, - errMsg: "QoS max_limit rd_iops_kiops cannot be negative", - existingController: &testControllerWithMaxQos, - }, - "max_limit wr_iops_kiops is negative": { - in: &pb.NvmeController{ - Name: testControllerName, - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - MaxLimit: &pb.QosLimit{WrIopsKiops: -1}, - }, - }, - out: nil, - spdk: []string{}, - errCode: codes.InvalidArgument, - errMsg: "QoS max_limit wr_iops_kiops cannot be negative", - existingController: &testControllerWithMaxQos, - }, - "max_limit rd_bandwidth_mbs is negative": { - in: &pb.NvmeController{ - Name: testControllerName, - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - MaxLimit: &pb.QosLimit{RdBandwidthMbs: -1}, - }, - }, - out: nil, - spdk: []string{}, - errCode: codes.InvalidArgument, - errMsg: "QoS max_limit rd_bandwidth_mbs cannot be negative", - existingController: &testControllerWithMaxQos, - }, - "max_limit wr_bandwidth_mbs is negative": { - in: &pb.NvmeController{ - Name: testControllerName, - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - MaxLimit: &pb.QosLimit{WrBandwidthMbs: -1}, - }, - }, - out: nil, - spdk: []string{}, - errCode: codes.InvalidArgument, - errMsg: "QoS max_limit wr_bandwidth_mbs cannot be negative", - existingController: &testControllerWithMaxQos, - }, - "min_limit rd_bandwidth_mbs is negative": { - in: &pb.NvmeController{ - Name: testControllerName, - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - MinLimit: &pb.QosLimit{RdBandwidthMbs: -1}, - }, - }, - out: nil, - spdk: []string{}, - errCode: codes.InvalidArgument, - errMsg: "QoS min_limit rd_bandwidth_mbs cannot be negative", - existingController: &testControllerWithMaxQos, - }, - "min_limit wr_bandwidth_mbs is negative": { - in: &pb.NvmeController{ - Name: testControllerName, - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - MinLimit: &pb.QosLimit{WrBandwidthMbs: -1}, - }, - }, - out: nil, - spdk: []string{}, - errCode: codes.InvalidArgument, - errMsg: "QoS min_limit wr_bandwidth_mbs cannot be negative", - existingController: &testControllerWithMaxQos, - }, - "no qos limits are specified": { - in: &pb.NvmeController{ - Name: testControllerName, - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - }, - }, - out: &pb.NvmeController{ - Name: testControllerName, - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - }, - Status: &pb.NvmeControllerStatus{Active: true}, - }, - spdk: []string{`{"id":%d,"error":{"code":0,"message":""},"result":true}`}, - errCode: codes.OK, - errMsg: "", - existingController: &testControllerWithMaxQos, - }, - "set qos SPDK call failed": { - in: &pb.NvmeController{ - Name: testControllerName, - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - MaxLimit: &pb.QosLimit{RdIopsKiops: 10}, - MinLimit: &pb.QosLimit{RdBandwidthMbs: 5}, - }, - }, - out: nil, - spdk: []string{`{"id":%d,"error":{"code":-1,"message":"some internal error"},"result":true}`}, - errCode: status.Convert(spdk.ErrFailedSpdkCall).Code(), - errMsg: status.Convert(spdk.ErrFailedSpdkCall).Message(), - existingController: &testControllerWithMaxQos, - }, - "set qos SPDK call result false": { - in: &pb.NvmeController{ - Name: testControllerName, - Spec: &pb.NvmeControllerSpec{ - Endpoint: testControllerWithMaxQos.Spec.Endpoint, - Trtype: pb.NvmeTransportType_NVME_TRANSPORT_TYPE_PCIE, - NvmeControllerId: proto.Int32(1), - MaxLimit: &pb.QosLimit{RdIopsKiops: 10}, - MinLimit: &pb.QosLimit{RdBandwidthMbs: 5}, - }, - }, - out: nil, - spdk: []string{`{"id":%d,"error":{"code":0,"message":""},"result":false}`}, - errCode: status.Convert(spdk.ErrUnexpectedSpdkCallResult).Code(), - errMsg: status.Convert(spdk.ErrUnexpectedSpdkCallResult).Message(), - existingController: &testControllerWithMaxQos, - }, - } - - for testName, tt := range tests { - t.Run(testName, func(t *testing.T) { - tt.in = utils.ProtoClone(tt.in) - testEnv := createTestEnvironment(tt.spdk) - defer testEnv.Close() - testEnv.opiSpdkServer.nvme.Subsystems[testSubsystem.Name] = &testSubsystem - if tt.existingController != nil { - tt.existingController = utils.ProtoClone(tt.existingController) - tt.existingController.Name = testControllerName - testEnv.opiSpdkServer.nvme.Controllers[tt.existingController.Name] = tt.existingController - } - - response, err := testEnv.opiSpdkServer.UpdateNvmeController(testEnv.ctx, - &pb.UpdateNvmeControllerRequest{NvmeController: tt.in}) - - if !proto.Equal(response, tt.out) { - t.Error("response: expected", tt.out, "received", response) - } - - if er, ok := status.FromError(err); ok { - if er.Code() != tt.errCode { - t.Error("error code: expected", tt.errCode, "received", er.Code()) - } - if er.Message() != tt.errMsg { - t.Error("error message: expected", tt.errMsg, "received", er.Message()) - } - } else { - t.Errorf("expect grpc error status, received %v", err) - } - - controller := testEnv.opiSpdkServer.nvme.Controllers[tt.in.Name] - if tt.errCode == codes.OK { - if !proto.Equal(tt.out, controller) { - t.Errorf("expect new %v exists, found %v", tt.out, controller) - } - } else { - if !proto.Equal(tt.existingController, controller) { - t.Errorf("expect original %v exists, found %v", tt.existingController, controller) - } - } - }) - } -} diff --git a/pkg/frontend/spdk_test.go b/pkg/frontend/spdk_test.go deleted file mode 100644 index fd08dd77..00000000 --- a/pkg/frontend/spdk_test.go +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// Copyright (c) 2022-2023 Dell Inc, or its subsidiaries. - -// Package frontend implememnts the FrontEnd APIs (host facing) of the storage Server -package frontend - -import ( - "testing" -) - -func TestSpdk_Call(_ *testing.T) { - -} diff --git a/pkg/models/spdk.go b/pkg/models/spdk.go deleted file mode 100644 index afe15487..00000000 --- a/pkg/models/spdk.go +++ /dev/null @@ -1,55 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// Copyright (C) 2023 Intel Corporation - -// Package models holds definitions for SPDK json RPC structs -package models - -import "github.com/opiproject/gospdk/spdk" - -// NpiNvmfSubsystemAddListenerParams holds the parameters required to Delete a NVMf subsystem -type NpiNvmfSubsystemAddListenerParams struct { - spdk.NvmfSubsystemAddListenerParams - MaxQPairs int `json:"max_qpairs,omitempty"` -} - -// NpiBdevSetKeysParams holds the parameters required to set crypto keys -type NpiBdevSetKeysParams struct { - UUID string `json:"uuid"` - Key string `json:"key"` - Key2 string `json:"key2"` - Cipher string `json:"cipher"` - Tweak string `json:"tweak"` -} - -// 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 - -// NpiQosBwIopsLimitParams holds the parameters required to set QoS limits -type NpiQosBwIopsLimitParams struct { - Nqn string `json:"nqn"` - MaxReadIops int `json:"max_read_iops"` - MaxWriteIops int `json:"max_write_iops"` - MaxReadBw int `json:"max_read_bw"` - MaxWriteBw int `json:"max_write_bw"` - MinReadBw int `json:"min_read_bw"` - MinWriteBw int `json:"min_write_bw"` -} - -// NpiQosBwIopsLimitResult is the result of setting QoS limits -type NpiQosBwIopsLimitResult bool - -// MevVhostCreateBlkControllerParams holds parameters to create a virtio-blk device -type MevVhostCreateBlkControllerParams struct { - Ctrlr string `json:"ctrlr"` - DevName string `json:"dev_name"` - Transport string `json:"transport"` - VqCount int `json:"vq_count,omitempty"` -} diff --git a/pkg/storage/frontend/blk_test.go b/pkg/storage/frontend/blk_test.go index 73fb14f7..f0bfd5da 100644 --- a/pkg/storage/frontend/blk_test.go +++ b/pkg/storage/frontend/blk_test.go @@ -10,7 +10,7 @@ import ( "github.com/opiproject/gospdk/spdk" pb "github.com/opiproject/opi-api/storage/v1alpha1/gen/go" - "github.com/opiproject/opi-intel-bridge/pkg/models" + "github.com/opiproject/opi-intel-bridge/pkg/storage/models" "google.golang.org/protobuf/types/known/wrapperspb" ) diff --git a/pkg/tools/tools.go b/pkg/tools/tools.go deleted file mode 100644 index 1386d516..00000000 --- a/pkg/tools/tools.go +++ /dev/null @@ -1,12 +0,0 @@ -//go:build tools -// +build tools - -package tools - -// this version locks the tooling to a release -import ( - _ "github.com/golangci/golangci-lint/cmd/golangci-lint" - _ "github.com/onsi/ginkgo/v2/ginkgo" - _ "github.com/vektra/mockery/v2/cmd" - _ "golang.org/x/tools/cmd/goimports" -)