mirror of
https://github.com/aljazceru/kata-containers.git
synced 2025-12-22 16:54:25 +01:00
Fixes #50 Previously the devices are created with device manager and laterly attached to hypervisor with "device.Attach()", this could work, but there's no way to remember the reference count for every device, which means if we plug one device to hypervisor twice, it's truly inserted twice, but actually we only need to insert once but use it in many places. Use device manager as a consolidated entrypoint of device management can give us a way to handle many "references" to single device, because it can save all devices and remember it's use count. Signed-off-by: Wei Zhang <zhangwei555@huawei.com>
81 lines
2.5 KiB
Go
81 lines
2.5 KiB
Go
// Copyright (c) 2017-2018 Intel Corporation
|
|
// Copyright (c) 2018 Huawei Corporation
|
|
//
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
//
|
|
|
|
package api
|
|
|
|
import (
|
|
"github.com/sirupsen/logrus"
|
|
|
|
"github.com/kata-containers/runtime/virtcontainers/device/config"
|
|
)
|
|
|
|
var devLogger = logrus.FieldLogger(logrus.New())
|
|
|
|
// SetLogger sets the logger for device api package.
|
|
func SetLogger(logger logrus.FieldLogger) {
|
|
devLogger = logger
|
|
}
|
|
|
|
// DeviceLogger returns logger for device management
|
|
func DeviceLogger() *logrus.Entry {
|
|
return devLogger.WithField("subsystem", "device")
|
|
}
|
|
|
|
// DeviceReceiver is an interface used for accepting devices
|
|
// a device should be attached/added/plugged to a DeviceReceiver
|
|
type DeviceReceiver interface {
|
|
// these are for hotplug/hot-unplug devices to/from hypervisor
|
|
HotplugAddDevice(Device, config.DeviceType) error
|
|
HotplugRemoveDevice(Device, config.DeviceType) error
|
|
|
|
// this is only for virtio-blk and virtio-scsi support
|
|
GetAndSetSandboxBlockIndex() (int, error)
|
|
DecrementSandboxBlockIndex() error
|
|
|
|
// this is for vhost_user devices
|
|
AddVhostUserDevice(VhostUserDevice, config.DeviceType) error
|
|
}
|
|
|
|
// VhostUserDevice represents a vhost-user device. Shared
|
|
// attributes of a vhost-user device can be retrieved using
|
|
// the Attrs() method. Unique data can be obtained by casting
|
|
// the object to the proper type.
|
|
type VhostUserDevice interface {
|
|
Attrs() *config.VhostUserDeviceAttrs
|
|
Type() config.DeviceType
|
|
}
|
|
|
|
// Device is the virtcontainers device interface.
|
|
type Device interface {
|
|
Attach(DeviceReceiver) error
|
|
Detach(DeviceReceiver) error
|
|
// ID returns device identifier
|
|
DeviceID() string
|
|
// DeviceType indicates which kind of device it is
|
|
// e.g. block, vfio or vhost user
|
|
DeviceType() config.DeviceType
|
|
// GetDeviceInfo returns device information that the device is created based on
|
|
GetDeviceInfo() *config.DeviceInfo
|
|
// GetDeviceDrive returns device specific data used for hotplugging by hypervisor
|
|
// Caller could cast the return value to device specific struct
|
|
// e.g. Block device returns *config.BlockDrive and
|
|
// vfio device returns *config.VFIODrive
|
|
GetDeviceDrive() interface{}
|
|
// IsAttached checks if the device is attached
|
|
IsAttached() bool
|
|
}
|
|
|
|
// DeviceManager can be used to create a new device, this can be used as single
|
|
// device management object.
|
|
type DeviceManager interface {
|
|
NewDevice(config.DeviceInfo) (Device, error)
|
|
AttachDevice(string, DeviceReceiver) error
|
|
DetachDevice(string, DeviceReceiver) error
|
|
IsDeviceAttached(string) bool
|
|
GetDeviceByID(string) Device
|
|
GetAllDevices() []Device
|
|
}
|