Merge "libvirt: Add typing information"
This commit is contained in:
commit
9cdf90add4
|
@ -1,2 +1,3 @@
|
||||||
nova/virt/hardware.py
|
nova/virt/hardware.py
|
||||||
nova/virt/libvirt/__init__.py
|
nova/virt/libvirt/__init__.py
|
||||||
|
nova/virt/libvirt/driver.py
|
||||||
|
|
|
@ -41,6 +41,7 @@ import random
|
||||||
import shutil
|
import shutil
|
||||||
import tempfile
|
import tempfile
|
||||||
import time
|
import time
|
||||||
|
import typing as ty
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
from castellan import key_manager
|
from castellan import key_manager
|
||||||
|
@ -76,6 +77,7 @@ from nova.api.metadata import base as instance_metadata
|
||||||
from nova.api.metadata import password
|
from nova.api.metadata import password
|
||||||
from nova import block_device
|
from nova import block_device
|
||||||
from nova.compute import power_state
|
from nova.compute import power_state
|
||||||
|
from nova.compute import provider_tree
|
||||||
from nova.compute import task_states
|
from nova.compute import task_states
|
||||||
from nova.compute import utils as compute_utils
|
from nova.compute import utils as compute_utils
|
||||||
from nova.compute import vm_states
|
from nova.compute import vm_states
|
||||||
|
@ -127,7 +129,7 @@ from nova.virt.libvirt.volume import remotefs
|
||||||
from nova.virt import netutils
|
from nova.virt import netutils
|
||||||
from nova.volume import cinder
|
from nova.volume import cinder
|
||||||
|
|
||||||
libvirt = None
|
libvirt: ty.Any = None
|
||||||
|
|
||||||
uefi_logged = False
|
uefi_logged = False
|
||||||
|
|
||||||
|
@ -389,7 +391,7 @@ class LibvirtDriver(driver.ComputeDriver):
|
||||||
}
|
}
|
||||||
|
|
||||||
self._sysinfo_serial_func = sysinfo_serial_funcs.get(
|
self._sysinfo_serial_func = sysinfo_serial_funcs.get(
|
||||||
CONF.libvirt.sysinfo_serial)
|
CONF.libvirt.sysinfo_serial, lambda: None)
|
||||||
|
|
||||||
self.job_tracker = instancejobtracker.InstanceJobTracker()
|
self.job_tracker = instancejobtracker.InstanceJobTracker()
|
||||||
self._remotefs = remotefs.RemoteFilesystem()
|
self._remotefs = remotefs.RemoteFilesystem()
|
||||||
|
@ -406,7 +408,7 @@ class LibvirtDriver(driver.ComputeDriver):
|
||||||
# every time update_provider_tree() is called.
|
# every time update_provider_tree() is called.
|
||||||
# NOTE(sbauza): We only want a read-only cache, this attribute is not
|
# NOTE(sbauza): We only want a read-only cache, this attribute is not
|
||||||
# intended to be updatable directly
|
# intended to be updatable directly
|
||||||
self.provider_tree = None
|
self.provider_tree: provider_tree.ProviderTree = None
|
||||||
|
|
||||||
# driver traits will not change during the runtime of the agent
|
# driver traits will not change during the runtime of the agent
|
||||||
# so calcuate them once and save them
|
# so calcuate them once and save them
|
||||||
|
@ -449,10 +451,12 @@ class LibvirtDriver(driver.ComputeDriver):
|
||||||
MIN_LIBVIRT_PMEM_SUPPORT)})
|
MIN_LIBVIRT_PMEM_SUPPORT)})
|
||||||
|
|
||||||
# vpmem keyed by name {name: objects.LibvirtVPMEMDevice,...}
|
# vpmem keyed by name {name: objects.LibvirtVPMEMDevice,...}
|
||||||
vpmems_by_name = {}
|
vpmems_by_name: ty.Dict[str, 'objects.LibvirtVPMEMDevice'] = {}
|
||||||
# vpmem list keyed by resource class
|
# vpmem list keyed by resource class
|
||||||
# {'RC_0': [objects.LibvirtVPMEMDevice, ...], 'RC_1': [...]}
|
# {'RC_0': [objects.LibvirtVPMEMDevice, ...], 'RC_1': [...]}
|
||||||
vpmems_by_rc = collections.defaultdict(list)
|
vpmems_by_rc: ty.Dict[str, ty.List['objects.LibvirtVPMEMDevice']] = (
|
||||||
|
collections.defaultdict(list)
|
||||||
|
)
|
||||||
|
|
||||||
vpmems_host = self._get_vpmems_on_host()
|
vpmems_host = self._get_vpmems_on_host()
|
||||||
for ns_conf in vpmem_conf:
|
for ns_conf in vpmem_conf:
|
||||||
|
@ -1054,10 +1058,10 @@ class LibvirtDriver(driver.ComputeDriver):
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _live_migration_uri(dest):
|
def _live_migration_uri(dest):
|
||||||
uris = {
|
uris = {
|
||||||
'kvm': 'qemu+%s://%s/system',
|
'kvm': 'qemu+%(scheme)s://%(dest)s/system',
|
||||||
'qemu': 'qemu+%s://%s/system',
|
'qemu': 'qemu+%(scheme)s://%(dest)s/system',
|
||||||
'xen': 'xenmigr://%s/system',
|
'xen': 'xenmigr://%(dest)s/system',
|
||||||
'parallels': 'parallels+tcp://%s/system',
|
'parallels': 'parallels+tcp://%(dest)s/system',
|
||||||
}
|
}
|
||||||
dest = oslo_netutils.escape_ipv6(dest)
|
dest = oslo_netutils.escape_ipv6(dest)
|
||||||
|
|
||||||
|
@ -1071,11 +1075,11 @@ class LibvirtDriver(driver.ComputeDriver):
|
||||||
if uri is None:
|
if uri is None:
|
||||||
raise exception.LiveMigrationURINotAvailable(virt_type=virt_type)
|
raise exception.LiveMigrationURINotAvailable(virt_type=virt_type)
|
||||||
|
|
||||||
str_format = (dest,)
|
str_format = {
|
||||||
if virt_type in ('kvm', 'qemu'):
|
'dest': dest,
|
||||||
scheme = CONF.libvirt.live_migration_scheme or 'tcp'
|
'scheme': CONF.libvirt.live_migration_scheme or 'tcp',
|
||||||
str_format = (scheme, dest)
|
}
|
||||||
return uris.get(virt_type) % str_format
|
return uri % str_format
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _migrate_uri(dest):
|
def _migrate_uri(dest):
|
||||||
|
@ -1462,9 +1466,9 @@ class LibvirtDriver(driver.ComputeDriver):
|
||||||
def _detach_encrypted_volumes(self, instance, block_device_info):
|
def _detach_encrypted_volumes(self, instance, block_device_info):
|
||||||
"""Detaches encrypted volumes attached to instance."""
|
"""Detaches encrypted volumes attached to instance."""
|
||||||
disks = self._get_instance_disk_info(instance, block_device_info)
|
disks = self._get_instance_disk_info(instance, block_device_info)
|
||||||
encrypted_volumes = filter(dmcrypt.is_encrypted,
|
for path in [
|
||||||
[disk['path'] for disk in disks])
|
d['path'] for d in disks if dmcrypt.is_encrypted(d['path'])
|
||||||
for path in encrypted_volumes:
|
]:
|
||||||
dmcrypt.delete_volume(path)
|
dmcrypt.delete_volume(path)
|
||||||
|
|
||||||
def _get_serial_ports_from_guest(self, guest, mode=None):
|
def _get_serial_ports_from_guest(self, guest, mode=None):
|
||||||
|
@ -2977,17 +2981,12 @@ class LibvirtDriver(driver.ComputeDriver):
|
||||||
raise exception.InstanceNotRunning(instance_id=instance.uuid)
|
raise exception.InstanceNotRunning(instance_id=instance.uuid)
|
||||||
|
|
||||||
# Find dev name
|
# Find dev name
|
||||||
my_dev = None
|
|
||||||
active_disk = None
|
|
||||||
|
|
||||||
xml = guest.get_xml_desc()
|
xml = guest.get_xml_desc()
|
||||||
xml_doc = etree.fromstring(xml)
|
xml_doc = etree.fromstring(xml)
|
||||||
|
|
||||||
device_info = vconfig.LibvirtConfigGuest()
|
device_info = vconfig.LibvirtConfigGuest()
|
||||||
device_info.parse_dom(xml_doc)
|
device_info.parse_dom(xml_doc)
|
||||||
|
|
||||||
active_disk_object = None
|
|
||||||
|
|
||||||
for guest_disk in device_info.devices:
|
for guest_disk in device_info.devices:
|
||||||
if (guest_disk.root_name != 'disk'):
|
if (guest_disk.root_name != 'disk'):
|
||||||
continue
|
continue
|
||||||
|
@ -2995,17 +2994,21 @@ class LibvirtDriver(driver.ComputeDriver):
|
||||||
if (guest_disk.target_dev is None or guest_disk.serial is None):
|
if (guest_disk.target_dev is None or guest_disk.serial is None):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
if (
|
||||||
|
guest_disk.source_path is None and
|
||||||
|
guest_disk.source_protocol is None
|
||||||
|
):
|
||||||
|
continue
|
||||||
|
|
||||||
if guest_disk.serial == volume_id:
|
if guest_disk.serial == volume_id:
|
||||||
my_dev = guest_disk.target_dev
|
my_dev = guest_disk.target_dev
|
||||||
|
|
||||||
active_disk = guest_disk.source_path
|
|
||||||
active_protocol = guest_disk.source_protocol
|
active_protocol = guest_disk.source_protocol
|
||||||
active_disk_object = guest_disk
|
active_disk_object = guest_disk
|
||||||
break
|
break
|
||||||
|
else:
|
||||||
if my_dev is None or (active_disk is None and active_protocol is None):
|
|
||||||
LOG.debug('Domain XML: %s', xml, instance=instance)
|
LOG.debug('Domain XML: %s', xml, instance=instance)
|
||||||
msg = (_('Disk with id: %s not found attached to instance.')
|
msg = (_("Disk with id '%s' not found attached to instance.")
|
||||||
% volume_id)
|
% volume_id)
|
||||||
raise exception.InternalError(msg)
|
raise exception.InternalError(msg)
|
||||||
|
|
||||||
|
@ -3881,15 +3884,13 @@ class LibvirtDriver(driver.ComputeDriver):
|
||||||
target_partition = None
|
target_partition = None
|
||||||
|
|
||||||
# Handles the key injection.
|
# Handles the key injection.
|
||||||
|
key = None
|
||||||
if CONF.libvirt.inject_key and instance.get('key_data'):
|
if CONF.libvirt.inject_key and instance.get('key_data'):
|
||||||
key = str(instance.key_data)
|
key = str(instance.key_data)
|
||||||
else:
|
|
||||||
key = None
|
|
||||||
|
|
||||||
# Handles the admin password injection.
|
# Handles the admin password injection.
|
||||||
if not CONF.libvirt.inject_password:
|
admin_pass = None
|
||||||
admin_pass = None
|
if CONF.libvirt.inject_password:
|
||||||
else:
|
|
||||||
admin_pass = injection_info.admin_pass
|
admin_pass = injection_info.admin_pass
|
||||||
|
|
||||||
# Handles the network injection.
|
# Handles the network injection.
|
||||||
|
@ -4874,7 +4875,7 @@ class LibvirtDriver(driver.ComputeDriver):
|
||||||
return idmaps
|
return idmaps
|
||||||
|
|
||||||
def _get_guest_idmaps(self):
|
def _get_guest_idmaps(self):
|
||||||
id_maps = []
|
id_maps: ty.List[vconfig.LibvirtConfigGuestIDMap] = []
|
||||||
if CONF.libvirt.virt_type == 'lxc' and CONF.libvirt.uid_maps:
|
if CONF.libvirt.virt_type == 'lxc' and CONF.libvirt.uid_maps:
|
||||||
uid_maps = self._create_idmaps(vconfig.LibvirtConfigGuestUIDMap,
|
uid_maps = self._create_idmaps(vconfig.LibvirtConfigGuestUIDMap,
|
||||||
CONF.libvirt.uid_maps)
|
CONF.libvirt.uid_maps)
|
||||||
|
@ -6500,7 +6501,7 @@ class LibvirtDriver(driver.ComputeDriver):
|
||||||
events = []
|
events = []
|
||||||
|
|
||||||
pause = bool(events)
|
pause = bool(events)
|
||||||
guest = None
|
guest: libvirt_guest.Guest = None
|
||||||
try:
|
try:
|
||||||
with self.virtapi.wait_for_instance_event(
|
with self.virtapi.wait_for_instance_event(
|
||||||
instance, events, deadline=timeout,
|
instance, events, deadline=timeout,
|
||||||
|
@ -6763,7 +6764,7 @@ class LibvirtDriver(driver.ComputeDriver):
|
||||||
mdev device handles for that GPU
|
mdev device handles for that GPU
|
||||||
"""
|
"""
|
||||||
|
|
||||||
counts_per_parent = collections.defaultdict(int)
|
counts_per_parent: ty.Dict[str, int] = collections.defaultdict(int)
|
||||||
mediated_devices = self._get_mediated_devices(types=enabled_vgpu_types)
|
mediated_devices = self._get_mediated_devices(types=enabled_vgpu_types)
|
||||||
for mdev in mediated_devices:
|
for mdev in mediated_devices:
|
||||||
parent_vgpu_type = self._get_vgpu_type_per_pgpu(mdev['parent'])
|
parent_vgpu_type = self._get_vgpu_type_per_pgpu(mdev['parent'])
|
||||||
|
@ -6785,7 +6786,7 @@ class LibvirtDriver(driver.ComputeDriver):
|
||||||
"""
|
"""
|
||||||
mdev_capable_devices = self._get_mdev_capable_devices(
|
mdev_capable_devices = self._get_mdev_capable_devices(
|
||||||
types=enabled_vgpu_types)
|
types=enabled_vgpu_types)
|
||||||
counts_per_dev = collections.defaultdict(int)
|
counts_per_dev: ty.Dict[str, int] = collections.defaultdict(int)
|
||||||
for dev in mdev_capable_devices:
|
for dev in mdev_capable_devices:
|
||||||
# dev_id is the libvirt name for the PCI device,
|
# dev_id is the libvirt name for the PCI device,
|
||||||
# eg. pci_0000_84_00_0 which matches a PCI address of 0000:84:00.0
|
# eg. pci_0000_84_00_0 which matches a PCI address of 0000:84:00.0
|
||||||
|
@ -7384,7 +7385,9 @@ class LibvirtDriver(driver.ComputeDriver):
|
||||||
return cell.get(page_size, 0)
|
return cell.get(page_size, 0)
|
||||||
|
|
||||||
def _get_physnet_numa_affinity():
|
def _get_physnet_numa_affinity():
|
||||||
affinities = {cell.id: set() for cell in topology.cells}
|
affinities: ty.Dict[int, ty.Set[str]] = {
|
||||||
|
cell.id: set() for cell in topology.cells
|
||||||
|
}
|
||||||
for physnet in CONF.neutron.physnets:
|
for physnet in CONF.neutron.physnets:
|
||||||
# This will error out if the group is not registered, which is
|
# This will error out if the group is not registered, which is
|
||||||
# exactly what we want as that would be a bug
|
# exactly what we want as that would be a bug
|
||||||
|
@ -7429,11 +7432,12 @@ class LibvirtDriver(driver.ComputeDriver):
|
||||||
cpuset = cpus & available_shared_cpus
|
cpuset = cpus & available_shared_cpus
|
||||||
pcpuset = cpus & available_dedicated_cpus
|
pcpuset = cpus & available_dedicated_cpus
|
||||||
|
|
||||||
siblings = sorted(map(set,
|
# de-duplicate and sort the list of CPU sibling sets
|
||||||
set(tuple(cpu.siblings)
|
siblings = sorted(
|
||||||
if cpu.siblings else ()
|
set(x) for x in set(
|
||||||
for cpu in cell.cpus)
|
tuple(cpu.siblings) or () for cpu in cell.cpus
|
||||||
))
|
)
|
||||||
|
)
|
||||||
|
|
||||||
cpus &= available_shared_cpus | available_dedicated_cpus
|
cpus &= available_shared_cpus | available_dedicated_cpus
|
||||||
siblings = [sib & cpus for sib in siblings]
|
siblings = [sib & cpus for sib in siblings]
|
||||||
|
@ -7593,7 +7597,9 @@ class LibvirtDriver(driver.ComputeDriver):
|
||||||
# otherwise.
|
# otherwise.
|
||||||
inv = provider_tree.data(nodename).inventory
|
inv = provider_tree.data(nodename).inventory
|
||||||
ratios = self._get_allocation_ratios(inv)
|
ratios = self._get_allocation_ratios(inv)
|
||||||
resources = collections.defaultdict(set)
|
resources: ty.Dict[str, ty.Set['objects.Resource']] = (
|
||||||
|
collections.defaultdict(set)
|
||||||
|
)
|
||||||
result = {
|
result = {
|
||||||
orc.MEMORY_MB: {
|
orc.MEMORY_MB: {
|
||||||
'total': memory_mb,
|
'total': memory_mb,
|
||||||
|
@ -7733,11 +7739,11 @@ class LibvirtDriver(driver.ComputeDriver):
|
||||||
return db_const.MAX_INT
|
return db_const.MAX_INT
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def static_traits(self):
|
def static_traits(self) -> ty.Dict[str, bool]:
|
||||||
if self._static_traits is not None:
|
if self._static_traits is not None:
|
||||||
return self._static_traits
|
return self._static_traits
|
||||||
|
|
||||||
traits = {}
|
traits: ty.Dict[str, bool] = {}
|
||||||
traits.update(self._get_cpu_traits())
|
traits.update(self._get_cpu_traits())
|
||||||
traits.update(self._get_storage_bus_traits())
|
traits.update(self._get_storage_bus_traits())
|
||||||
traits.update(self._get_video_model_traits())
|
traits.update(self._get_video_model_traits())
|
||||||
|
@ -7890,7 +7896,7 @@ class LibvirtDriver(driver.ComputeDriver):
|
||||||
:return: dict, keyed by PGPU device ID, to count of VGPUs on that
|
:return: dict, keyed by PGPU device ID, to count of VGPUs on that
|
||||||
device
|
device
|
||||||
"""
|
"""
|
||||||
vgpu_count_per_pgpu = collections.defaultdict(int)
|
vgpu_count_per_pgpu: ty.Dict[str, int] = collections.defaultdict(int)
|
||||||
for mdev_uuid in mdev_uuids:
|
for mdev_uuid in mdev_uuids:
|
||||||
# libvirt name is like mdev_00ead764_fdc0_46b6_8db9_2963f5c815b4
|
# libvirt name is like mdev_00ead764_fdc0_46b6_8db9_2963f5c815b4
|
||||||
dev_name = libvirt_utils.mdev_uuid2name(mdev_uuid)
|
dev_name = libvirt_utils.mdev_uuid2name(mdev_uuid)
|
||||||
|
@ -8393,7 +8399,7 @@ class LibvirtDriver(driver.ComputeDriver):
|
||||||
return migrate_data
|
return migrate_data
|
||||||
|
|
||||||
def _get_resources(self, instance, prefix=None):
|
def _get_resources(self, instance, prefix=None):
|
||||||
resources = []
|
resources: 'objects.ResourceList' = []
|
||||||
if prefix:
|
if prefix:
|
||||||
migr_context = instance.migration_context
|
migr_context = instance.migration_context
|
||||||
attr_name = prefix + 'resources'
|
attr_name = prefix + 'resources'
|
||||||
|
@ -9089,7 +9095,8 @@ class LibvirtDriver(driver.ComputeDriver):
|
||||||
recover_method, block_migration,
|
recover_method, block_migration,
|
||||||
migrate_data, finish_event,
|
migrate_data, finish_event,
|
||||||
disk_paths):
|
disk_paths):
|
||||||
on_migration_failure = deque()
|
|
||||||
|
on_migration_failure: ty.Deque[str] = deque()
|
||||||
data_gb = self._live_migration_data_gb(instance, disk_paths)
|
data_gb = self._live_migration_data_gb(instance, disk_paths)
|
||||||
downtime_steps = list(libvirt_migrate.downtime_steps(data_gb))
|
downtime_steps = list(libvirt_migrate.downtime_steps(data_gb))
|
||||||
migration = migrate_data.migration
|
migration = migrate_data.migration
|
||||||
|
@ -10401,7 +10408,7 @@ class LibvirtDriver(driver.ComputeDriver):
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _get_io_devices(xml_doc):
|
def _get_io_devices(xml_doc):
|
||||||
"""get the list of io devices from the xml document."""
|
"""get the list of io devices from the xml document."""
|
||||||
result = {"volumes": [], "ifaces": []}
|
result: ty.Dict[str, ty.List[str]] = {"volumes": [], "ifaces": []}
|
||||||
try:
|
try:
|
||||||
doc = etree.fromstring(xml_doc)
|
doc = etree.fromstring(xml_doc)
|
||||||
except Exception:
|
except Exception:
|
||||||
|
@ -10851,7 +10858,7 @@ class LibvirtDriver(driver.ComputeDriver):
|
||||||
nova.privsep.fs.FS_FORMAT_EXT4,
|
nova.privsep.fs.FS_FORMAT_EXT4,
|
||||||
nova.privsep.fs.FS_FORMAT_XFS]
|
nova.privsep.fs.FS_FORMAT_XFS]
|
||||||
|
|
||||||
def _get_vif_model_traits(self):
|
def _get_vif_model_traits(self) -> ty.Dict[str, bool]:
|
||||||
"""Get vif model traits based on the currently enabled virt_type.
|
"""Get vif model traits based on the currently enabled virt_type.
|
||||||
|
|
||||||
Not all traits generated by this function may be valid and the result
|
Not all traits generated by this function may be valid and the result
|
||||||
|
@ -10871,7 +10878,7 @@ class LibvirtDriver(driver.ComputeDriver):
|
||||||
in supported_models for model in all_models
|
in supported_models for model in all_models
|
||||||
}
|
}
|
||||||
|
|
||||||
def _get_storage_bus_traits(self):
|
def _get_storage_bus_traits(self) -> ty.Dict[str, bool]:
|
||||||
"""Get storage bus traits based on the currently enabled virt_type.
|
"""Get storage bus traits based on the currently enabled virt_type.
|
||||||
|
|
||||||
For QEMU and KVM this function uses the information returned by the
|
For QEMU and KVM this function uses the information returned by the
|
||||||
|
@ -10889,7 +10896,7 @@ class LibvirtDriver(driver.ComputeDriver):
|
||||||
|
|
||||||
if CONF.libvirt.virt_type in ('qemu', 'kvm'):
|
if CONF.libvirt.virt_type in ('qemu', 'kvm'):
|
||||||
dom_caps = self._host.get_domain_capabilities()
|
dom_caps = self._host.get_domain_capabilities()
|
||||||
supported_buses = set()
|
supported_buses: ty.Set[str] = set()
|
||||||
for arch_type in dom_caps:
|
for arch_type in dom_caps:
|
||||||
for machine_type in dom_caps[arch_type]:
|
for machine_type in dom_caps[arch_type]:
|
||||||
supported_buses.update(
|
supported_buses.update(
|
||||||
|
@ -10906,7 +10913,7 @@ class LibvirtDriver(driver.ComputeDriver):
|
||||||
supported_buses for bus in all_buses
|
supported_buses for bus in all_buses
|
||||||
}
|
}
|
||||||
|
|
||||||
def _get_video_model_traits(self):
|
def _get_video_model_traits(self) -> ty.Dict[str, bool]:
|
||||||
"""Get video model traits from libvirt.
|
"""Get video model traits from libvirt.
|
||||||
|
|
||||||
Not all traits generated by this function may be valid and the result
|
Not all traits generated by this function may be valid and the result
|
||||||
|
@ -10917,7 +10924,7 @@ class LibvirtDriver(driver.ComputeDriver):
|
||||||
all_models = fields.VideoModel.ALL
|
all_models = fields.VideoModel.ALL
|
||||||
|
|
||||||
dom_caps = self._host.get_domain_capabilities()
|
dom_caps = self._host.get_domain_capabilities()
|
||||||
supported_models = set()
|
supported_models: ty.Set[str] = set()
|
||||||
for arch_type in dom_caps:
|
for arch_type in dom_caps:
|
||||||
for machine_type in dom_caps[arch_type]:
|
for machine_type in dom_caps[arch_type]:
|
||||||
supported_models.update(
|
supported_models.update(
|
||||||
|
@ -10930,7 +10937,7 @@ class LibvirtDriver(driver.ComputeDriver):
|
||||||
in supported_models for model in all_models
|
in supported_models for model in all_models
|
||||||
}
|
}
|
||||||
|
|
||||||
def _get_cpu_traits(self):
|
def _get_cpu_traits(self) -> ty.Dict[str, bool]:
|
||||||
"""Get CPU-related traits to be set and unset on the host's resource
|
"""Get CPU-related traits to be set and unset on the host's resource
|
||||||
provider.
|
provider.
|
||||||
|
|
||||||
|
@ -10942,7 +10949,7 @@ class LibvirtDriver(driver.ComputeDriver):
|
||||||
|
|
||||||
return traits
|
return traits
|
||||||
|
|
||||||
def _get_cpu_feature_traits(self):
|
def _get_cpu_feature_traits(self) -> ty.Dict[str, bool]:
|
||||||
"""Get CPU traits of VMs based on guest CPU model config.
|
"""Get CPU traits of VMs based on guest CPU model config.
|
||||||
|
|
||||||
1. If mode is 'host-model' or 'host-passthrough', use host's
|
1. If mode is 'host-model' or 'host-passthrough', use host's
|
||||||
|
@ -10981,7 +10988,7 @@ class LibvirtDriver(driver.ComputeDriver):
|
||||||
feature_names = [f.name for f in cpu.features]
|
feature_names = [f.name for f in cpu.features]
|
||||||
return feature_names
|
return feature_names
|
||||||
|
|
||||||
features = set()
|
features: ty.Set[str] = set()
|
||||||
# Choose a default CPU model when cpu_mode is not specified
|
# Choose a default CPU model when cpu_mode is not specified
|
||||||
if cpu.mode is None:
|
if cpu.mode is None:
|
||||||
caps.host.cpu.model = libvirt_utils.get_cpu_model_from_arch(
|
caps.host.cpu.model = libvirt_utils.get_cpu_model_from_arch(
|
||||||
|
|
Loading…
Reference in New Issue