mirror of
https://github.com/retspen/webvirtcloud
synced 2026-11-10 04:06:47 +00:00
fix(instances): a new VM's CPU is a mode or a model the host offers, checked by libvirt
- A named CPU model is written without check='none' and with fallback='forbid': libvirt checks before the start that the host runs it, and it is not swapped for another model. - Mode maximum is written as that mode; it was written as a model named maximum. - Model names up to 64 characters: the -noTSX and -IBRS models, the ones a mixed set of hosts needs, were refused at 20. - The mode or model is checked against the host's capabilities when the VM is defined, from the page and the API alike; no CPU element (QEMU's oldest default CPU) is no longer offered. - The default CPU mode setting offers the modes the new VM dialog has; no-model and custom, which matched none of them, become host-model.
This commit is contained in:
parent
2a773f6ec0
commit
2e1f29961c
15 changed files with 139 additions and 19 deletions
|
|
@ -7,6 +7,15 @@ import pycdlib
|
|||
from vrtManager import util
|
||||
from vrtManager.connection import wvmConnect
|
||||
|
||||
# libvirt's CPU modes a new VM can have; any other value is a CPU model's name (mode custom)
|
||||
CPU_MODES = ("host-model", "host-passthrough", "maximum")
|
||||
|
||||
|
||||
def cpu_choices(dom_caps):
|
||||
"""The CPU modes and named models a new VM can have on a host, from its
|
||||
domain capabilities (get_dom_capabilities)."""
|
||||
return [mode for mode in dom_caps["cpu_modes"] if mode in CPU_MODES] + dom_caps.get("cpu_custom_models", [])
|
||||
|
||||
|
||||
def nocloud_seed(instance_id, hostname, user_data):
|
||||
"""A cloud-init NoCloud seed: an ISO labelled cidata with the VM's
|
||||
|
|
@ -240,14 +249,11 @@ class wvmCreate(wvmConnect):
|
|||
xml += """<smm state="on"/>"""
|
||||
xml += """</features>"""
|
||||
|
||||
if vcpu_mode == "host-model":
|
||||
xml += """<cpu mode='host-model'/>"""
|
||||
elif vcpu_mode == "host-passthrough":
|
||||
xml += """<cpu mode='host-passthrough'/>"""
|
||||
elif vcpu_mode != "":
|
||||
xml += f"""<cpu mode='custom' match='exact' check='none'>
|
||||
<model fallback='allow'>{vcpu_mode}</model>"""
|
||||
xml += """</cpu>"""
|
||||
# a named model is that model or none: libvirt checks before the start that the host runs it
|
||||
if vcpu_mode in CPU_MODES:
|
||||
xml += f"""<cpu mode='{vcpu_mode}'/>"""
|
||||
else:
|
||||
xml += f"""<cpu mode='custom' match='exact'><model fallback='forbid'>{vcpu_mode}</model></cpu>"""
|
||||
|
||||
xml += """
|
||||
<clock offset="utc"/>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue