You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

129 lines
3.9 KiB

9 months ago
from leapp.models import fields, Model
from leapp.topics import SystemInfoTopic
class PCIDevice(Model):
"""
Model to represent a PCI Device.
There is the following match between model parameters and
the fields of the output of a shell command `lspci -vmmk`
slot - 'Slot',
dev_cls - 'Class',
vendor - 'Vendor',
name - 'Device',
subsystem_vendor - 'SVendor',
subsystem_name - 'SDevice',
physical_slot - 'PhySlot',
rev - 'Rev',
progif - 'ProgIf',
driver - 'Driver',
modules - 'Module',
numa_node - 'NUMANode',
pci_id - represents the numeric identification of the device, formed as
string concatenating of the numeric device identifiers for fields
Vendor, Device, SVendor, SDevice (output
of a shell command `lspci -vmmkn`) with the `:` delimiter.
For example:
one device from output of `lspci -vmmkn` is:
```
Slot: 04:00.0
Class: 0880
Vendor: 8086
Device: 15bf
SVendor: 17aa
SDevice: 2279
Rev: 01
Driver: thunderbolt
Module: thunderbolt
```
then
pci_id == "8086:15bf:17aa:2279"
"""
topic = SystemInfoTopic
slot = fields.String()
dev_cls = fields.String()
vendor = fields.String()
name = fields.String()
subsystem_vendor = fields.Nullable(fields.String())
subsystem_name = fields.Nullable(fields.String())
physical_slot = fields.Nullable(fields.String())
rev = fields.Nullable(fields.String())
progif = fields.Nullable(fields.String())
driver = fields.Nullable(fields.String())
modules = fields.Nullable(fields.List(fields.String()))
numa_node = fields.Nullable(fields.String())
pci_id = fields.String()
class PCIDevices(Model):
topic = SystemInfoTopic
devices = fields.List(fields.Model(PCIDevice))
class RestrictedPCIDevice(Model):
"""
Model to represent known restrictions of the given PCI devices.
pci_id - unsupported pci_ids. It has the following
structure: {Vendor}:{Device}:{SVendor}:{SDevice}, where all these 4
parameters are numeric ids (see shell command spci -vmmkn). If SVendor
and SDevice fields do not exist, then pci_id has the following structure:
{Vendor}:{Device}.
driver_name - the name of restricted driver
device_name - the name of restricted device
supported_{rhel_version} - 1 is supported on the given RHEL, 0 - not
supported
available_{rhel_version} - 1 is available on the given RHEL, 0 - not
available. it could be the driver is available, but not supported
comments - the field for comments
"""
topic = SystemInfoTopic
pci_id = fields.Nullable(fields.String())
driver_name = fields.Nullable(fields.String())
device_name = fields.Nullable(fields.String())
available_rhel7 = fields.Integer()
supported_rhel7 = fields.Integer()
available_rhel8 = fields.Integer()
supported_rhel8 = fields.Integer()
available_rhel9 = fields.Integer()
supported_rhel9 = fields.Integer()
comment = fields.Nullable(fields.String())
class RestrictedPCIDevices(Model):
"""
Model to represent all known restricted PCI devices.
Restricted devices might be restricted based on either
- pci id (each particular device)
- driver name (all the family of the devices being served by the
particular driver).
However the data type, which represents how the pci id or driver name is
restricted is identical.
Thus both attributes has the same data type.
driver_names - is a container with the devices, which are restricted by
the driver name identifier
pci_ids - is a container with the devices, which are restricted by
the pci_id identifier
"""
topic = SystemInfoTopic
driver_names = fields.List(
fields.Model(RestrictedPCIDevice),
)
pci_ids = fields.List(
fields.Model(RestrictedPCIDevice),
)