diff --git a/virtcontainers/device/api/interface.go b/virtcontainers/device/api/interface.go index b290b4189c..fab203624a 100644 --- a/virtcontainers/device/api/interface.go +++ b/virtcontainers/device/api/interface.go @@ -57,6 +57,5 @@ type Device interface { // DeviceManager can be used to create a new device, this can be used as single // device management object. type DeviceManager interface { - CreateDevice(devInfo config.DeviceInfo) Device NewDevices(devInfos []config.DeviceInfo) ([]Device, error) } diff --git a/virtcontainers/device/manager/manager.go b/virtcontainers/device/manager/manager.go index 2c04d6a881..851fe13659 100644 --- a/virtcontainers/device/manager/manager.go +++ b/virtcontainers/device/manager/manager.go @@ -29,21 +29,25 @@ func deviceLogger() *logrus.Entry { return api.DeviceLogger().WithField("subsystem", "device") } -// CreateDevice creates one device based on DeviceInfo -func (dm *deviceManager) CreateDevice(devInfo config.DeviceInfo) api.Device { - path := devInfo.HostPath +// createDevice creates one device based on DeviceInfo +func (dm *deviceManager) createDevice(devInfo config.DeviceInfo) (api.Device, error) { + path, err := config.GetHostPathFunc(devInfo) + if err != nil { + return nil, err + } + devInfo.HostPath = path if isVFIO(path) { - return drivers.NewVFIODevice(devInfo) + return drivers.NewVFIODevice(devInfo), nil } else if isBlock(devInfo) { if devInfo.DriverOptions == nil { devInfo.DriverOptions = make(map[string]string) } devInfo.DriverOptions["block-driver"] = dm.blockDriver - return drivers.NewBlockDevice(devInfo) + return drivers.NewBlockDevice(devInfo), nil } else { deviceLogger().WithField("device", path).Info("Device has not been passed to the container") - return drivers.NewGenericDevice(devInfo) + return drivers.NewGenericDevice(devInfo), nil } } @@ -52,13 +56,10 @@ func (dm *deviceManager) NewDevices(devInfos []config.DeviceInfo) ([]api.Device, var devices []api.Device for _, devInfo := range devInfos { - hostPath, err := config.GetHostPathFunc(devInfo) + device, err := dm.createDevice(devInfo) if err != nil { return nil, err } - - devInfo.HostPath = hostPath - device := dm.CreateDevice(devInfo) devices = append(devices, device) } diff --git a/virtcontainers/device/manager/manager_test.go b/virtcontainers/device/manager/manager_test.go index 3f43a77e80..3b2fc57688 100644 --- a/virtcontainers/device/manager/manager_test.go +++ b/virtcontainers/device/manager/manager_test.go @@ -25,31 +25,6 @@ const fileMode0640 = os.FileMode(0640) // dirMode is the permission bits used for creating a directory const dirMode = os.FileMode(0750) | os.ModeDir -func TestCreateDevice(t *testing.T) { - dm := &deviceManager{ - blockDriver: VirtioBlock, - } - devInfo := config.DeviceInfo{ - HostPath: "/dev/vfio/8", - DevType: "b", - } - - device := dm.CreateDevice(devInfo) - _, ok := device.(*drivers.VFIODevice) - assert.True(t, ok) - - devInfo.HostPath = "/dev/sda" - device = dm.CreateDevice(devInfo) - _, ok = device.(*drivers.BlockDevice) - assert.True(t, ok) - - devInfo.HostPath = "/dev/tty" - devInfo.DevType = "c" - device = dm.CreateDevice(devInfo) - _, ok = device.(*drivers.GenericDevice) - assert.True(t, ok) -} - func TestNewDevices(t *testing.T) { dm := &deviceManager{ blockDriver: VirtioBlock, @@ -153,7 +128,8 @@ func TestAttachVFIODevice(t *testing.T) { DevType: "c", } - device := dm.CreateDevice(deviceInfo) + device, err := dm.createDevice(deviceInfo) + assert.Nil(t, err) _, ok := device.(*drivers.VFIODevice) assert.True(t, ok) @@ -176,12 +152,13 @@ func TestAttachGenericDevice(t *testing.T) { DevType: "c", } - device := dm.CreateDevice(deviceInfo) + device, err := dm.createDevice(deviceInfo) + assert.Nil(t, err) _, ok := device.(*drivers.GenericDevice) assert.True(t, ok) devReceiver := &api.MockDeviceReceiver{} - err := device.Attach(devReceiver) + err = device.Attach(devReceiver) assert.Nil(t, err) err = device.Detach(devReceiver) @@ -200,11 +177,12 @@ func TestAttachBlockDevice(t *testing.T) { } devReceiver := &api.MockDeviceReceiver{} - device := dm.CreateDevice(deviceInfo) + device, err := dm.createDevice(deviceInfo) + assert.Nil(t, err) _, ok := device.(*drivers.BlockDevice) assert.True(t, ok) - err := device.Attach(devReceiver) + err = device.Attach(devReceiver) assert.Nil(t, err) err = device.Detach(devReceiver) @@ -212,7 +190,8 @@ func TestAttachBlockDevice(t *testing.T) { // test virtio SCSI driver dm.blockDriver = VirtioSCSI - device = dm.CreateDevice(deviceInfo) + device, err = dm.createDevice(deviceInfo) + assert.Nil(t, err) err = device.Attach(devReceiver) assert.Nil(t, err) diff --git a/virtcontainers/sandbox_test.go b/virtcontainers/sandbox_test.go index b405e3b68f..eec5a0d2aa 100644 --- a/virtcontainers/sandbox_test.go +++ b/virtcontainers/sandbox_test.go @@ -1588,7 +1588,9 @@ func TestAttachBlockDevice(t *testing.T) { } dm := manager.NewDeviceManager(VirtioBlock) - device := dm.CreateDevice(deviceInfo) + devices, err := dm.NewDevices([]config.DeviceInfo{deviceInfo}) + assert.Nil(t, err) + device := devices[0] _, ok := device.(*drivers.BlockDevice) assert.True(t, ok)