github.com/k8snetworkplumbingwg/sriov-network-operator@v1.2.1-0.20240408194816-2d2e5a45d453/pkg/host/internal/vdpa/vdpa_test.go (about)

     1  package vdpa
     2  
     3  import (
     4  	"fmt"
     5  	"syscall"
     6  
     7  	"github.com/golang/mock/gomock"
     8  	"github.com/vishvananda/netlink"
     9  
    10  	. "github.com/onsi/ginkgo/v2"
    11  	. "github.com/onsi/gomega"
    12  
    13  	"github.com/k8snetworkplumbingwg/sriov-network-operator/pkg/consts"
    14  	constants "github.com/k8snetworkplumbingwg/sriov-network-operator/pkg/consts"
    15  	netlinkMock "github.com/k8snetworkplumbingwg/sriov-network-operator/pkg/host/internal/lib/netlink/mock"
    16  	hostMock "github.com/k8snetworkplumbingwg/sriov-network-operator/pkg/host/mock"
    17  	"github.com/k8snetworkplumbingwg/sriov-network-operator/pkg/host/types"
    18  )
    19  
    20  var _ = Describe("VDPA", func() {
    21  	var (
    22  		v          types.VdpaInterface
    23  		libMock    *netlinkMock.MockNetlinkLib
    24  		kernelMock *hostMock.MockHostManagerInterface
    25  
    26  		testCtrl *gomock.Controller
    27  		testErr  = fmt.Errorf("test-error")
    28  	)
    29  	BeforeEach(func() {
    30  		testCtrl = gomock.NewController(GinkgoT())
    31  		libMock = netlinkMock.NewMockNetlinkLib(testCtrl)
    32  		kernelMock = hostMock.NewMockHostManagerInterface(testCtrl)
    33  		v = New(kernelMock, libMock)
    34  	})
    35  	AfterEach(func() {
    36  		testCtrl.Finish()
    37  	})
    38  	Context("CreateVDPADevice", func() {
    39  		callFunc := func() error {
    40  			return v.CreateVDPADevice("0000:d8:00.2", constants.VdpaTypeVhost)
    41  		}
    42  		It("Created", func() {
    43  			libMock.EXPECT().VDPAGetDevByName("vdpa:0000:d8:00.2").Return(nil, syscall.ENODEV)
    44  			libMock.EXPECT().VDPANewDev("vdpa:0000:d8:00.2", "pci", "0000:d8:00.2", netlink.VDPANewDevParams{MaxVQP: 32}).Return(nil)
    45  			kernelMock.EXPECT().BindDriverByBusAndDevice(consts.BusVdpa, "vdpa:0000:d8:00.2", "vhost_vdpa").Return(nil)
    46  			Expect(callFunc()).NotTo(HaveOccurred())
    47  		})
    48  		It("Created without MaxVQP", func() {
    49  			libMock.EXPECT().VDPAGetDevByName("vdpa:0000:d8:00.2").Return(nil, syscall.ENODEV)
    50  			libMock.EXPECT().VDPANewDev("vdpa:0000:d8:00.2", "pci", "0000:d8:00.2", netlink.VDPANewDevParams{MaxVQP: 32}).Return(syscall.ENOTSUP)
    51  			libMock.EXPECT().VDPANewDev("vdpa:0000:d8:00.2", "pci", "0000:d8:00.2", netlink.VDPANewDevParams{}).Return(nil)
    52  			kernelMock.EXPECT().BindDriverByBusAndDevice(consts.BusVdpa, "vdpa:0000:d8:00.2", "vhost_vdpa").Return(nil)
    53  			Expect(callFunc()).NotTo(HaveOccurred())
    54  		})
    55  		It("Already exist", func() {
    56  			libMock.EXPECT().VDPAGetDevByName("vdpa:0000:d8:00.2").Return(&netlink.VDPADev{}, nil)
    57  			kernelMock.EXPECT().BindDriverByBusAndDevice(consts.BusVdpa, "vdpa:0000:d8:00.2", "vhost_vdpa").Return(nil)
    58  			Expect(callFunc()).NotTo(HaveOccurred())
    59  		})
    60  		It("Fail to Get device", func() {
    61  			libMock.EXPECT().VDPAGetDevByName("vdpa:0000:d8:00.2").Return(nil, testErr)
    62  			Expect(callFunc()).To(MatchError(testErr))
    63  		})
    64  		It("Fail to Create device", func() {
    65  			libMock.EXPECT().VDPAGetDevByName("vdpa:0000:d8:00.2").Return(nil, syscall.ENODEV)
    66  			libMock.EXPECT().VDPANewDev("vdpa:0000:d8:00.2", "pci", "0000:d8:00.2", netlink.VDPANewDevParams{MaxVQP: 32}).Return(testErr)
    67  			Expect(callFunc()).To(MatchError(testErr))
    68  		})
    69  		It("Fail to Bind device", func() {
    70  			libMock.EXPECT().VDPAGetDevByName("vdpa:0000:d8:00.2").Return(&netlink.VDPADev{}, nil)
    71  			kernelMock.EXPECT().BindDriverByBusAndDevice(consts.BusVdpa, "vdpa:0000:d8:00.2", "vhost_vdpa").Return(testErr)
    72  			Expect(callFunc()).To(MatchError(testErr))
    73  		})
    74  	})
    75  	Context("DeleteVDPADevice", func() {
    76  		callFunc := func() error {
    77  			return v.DeleteVDPADevice("0000:d8:00.2")
    78  		}
    79  		It("Removed", func() {
    80  			libMock.EXPECT().VDPADelDev("vdpa:0000:d8:00.2").Return(nil)
    81  			Expect(callFunc()).NotTo(HaveOccurred())
    82  		})
    83  		It("Not found", func() {
    84  			libMock.EXPECT().VDPADelDev("vdpa:0000:d8:00.2").Return(syscall.ENODEV)
    85  			Expect(callFunc()).NotTo(HaveOccurred())
    86  		})
    87  		It("Fail to delete device", func() {
    88  			libMock.EXPECT().VDPADelDev("vdpa:0000:d8:00.2").Return(testErr)
    89  			Expect(callFunc()).To(MatchError(testErr))
    90  		})
    91  	})
    92  	Context("DiscoverVDPAType", func() {
    93  		callFunc := func() string {
    94  			return v.DiscoverVDPAType("0000:d8:00.2")
    95  		}
    96  		It("No device", func() {
    97  			libMock.EXPECT().VDPAGetDevByName("vdpa:0000:d8:00.2").Return(nil, syscall.ENODEV)
    98  			Expect(callFunc()).To(BeEmpty())
    99  		})
   100  		It("Fail to read device", func() {
   101  			libMock.EXPECT().VDPAGetDevByName("vdpa:0000:d8:00.2").Return(nil, testErr)
   102  			Expect(callFunc()).To(BeEmpty())
   103  		})
   104  		It("No driver", func() {
   105  			libMock.EXPECT().VDPAGetDevByName("vdpa:0000:d8:00.2").Return(&netlink.VDPADev{}, nil)
   106  			kernelMock.EXPECT().GetDriverByBusAndDevice(consts.BusVdpa, "vdpa:0000:d8:00.2").Return("", nil)
   107  			Expect(callFunc()).To(BeEmpty())
   108  		})
   109  		It("Unknown driver", func() {
   110  			libMock.EXPECT().VDPAGetDevByName("vdpa:0000:d8:00.2").Return(&netlink.VDPADev{}, nil)
   111  			kernelMock.EXPECT().GetDriverByBusAndDevice(consts.BusVdpa, "vdpa:0000:d8:00.2").Return("something", nil)
   112  			Expect(callFunc()).To(BeEmpty())
   113  		})
   114  		It("Vhost driver", func() {
   115  			libMock.EXPECT().VDPAGetDevByName("vdpa:0000:d8:00.2").Return(&netlink.VDPADev{}, nil)
   116  			kernelMock.EXPECT().GetDriverByBusAndDevice(consts.BusVdpa, "vdpa:0000:d8:00.2").Return("vhost_vdpa", nil)
   117  			Expect(callFunc()).To(Equal("vhost"))
   118  		})
   119  		It("Virtio driver", func() {
   120  			libMock.EXPECT().VDPAGetDevByName("vdpa:0000:d8:00.2").Return(&netlink.VDPADev{}, nil)
   121  			kernelMock.EXPECT().GetDriverByBusAndDevice(consts.BusVdpa, "vdpa:0000:d8:00.2").Return("virtio_vdpa", nil)
   122  			Expect(callFunc()).To(Equal("virtio"))
   123  		})
   124  		It("Fail to read driver", func() {
   125  			libMock.EXPECT().VDPAGetDevByName("vdpa:0000:d8:00.2").Return(&netlink.VDPADev{}, nil)
   126  			kernelMock.EXPECT().GetDriverByBusAndDevice(consts.BusVdpa, "vdpa:0000:d8:00.2").Return("", testErr)
   127  			Expect(callFunc()).To(BeEmpty())
   128  		})
   129  	})
   130  })