mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
qemu: domain: Add support for modifying qemu capability list via qemu namespace
For testing purposes it's sometimes desired to be able to control the presence of capabilities of qemu. This adds the possibility to do this via the qemu namespace. Signed-off-by: Peter Krempa <pkrempa@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
parent
c6da5913d9
commit
3616ec3927
@ -8320,6 +8320,7 @@ void qemuDomainObjCheckTaint(virQEMUDriverPtr driver,
|
||||
size_t i;
|
||||
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
|
||||
qemuDomainObjPrivatePtr priv = obj->privateData;
|
||||
bool custom_hypervisor_feat = false;
|
||||
|
||||
if (virQEMUDriverIsPrivileged(driver) &&
|
||||
(!cfg->clearEmulatorCapabilities ||
|
||||
@ -8334,6 +8335,13 @@ void qemuDomainObjCheckTaint(virQEMUDriverPtr driver,
|
||||
qemuDomainXmlNsDefPtr qemuxmlns = obj->def->namespaceData;
|
||||
if (qemuxmlns->num_args || qemuxmlns->num_env)
|
||||
qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_CUSTOM_ARGV, logCtxt);
|
||||
if (qemuxmlns->ncapsadd > 0 || qemuxmlns->ncapsdel > 0)
|
||||
custom_hypervisor_feat = true;
|
||||
}
|
||||
|
||||
if (custom_hypervisor_feat) {
|
||||
qemuDomainObjTaint(driver, obj,
|
||||
VIR_DOMAIN_TAINT_CUSTOM_HYPERVISOR_FEATURE, logCtxt);
|
||||
}
|
||||
|
||||
if (obj->def->cpu && obj->def->cpu->mode == VIR_CPU_MODE_HOST_PASSTHROUGH)
|
||||
|
@ -5448,6 +5448,42 @@ qemuProcessStartValidate(virQEMUDriverPtr driver,
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
qemuProcessStartUpdateCustomCaps(virDomainObjPtr vm)
|
||||
{
|
||||
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||
qemuDomainXmlNsDefPtr nsdef = vm->def->namespaceData;
|
||||
int tmp;
|
||||
size_t i;
|
||||
|
||||
if (nsdef) {
|
||||
for (i = 0; i < nsdef->ncapsadd; i++) {
|
||||
if ((tmp = virQEMUCapsTypeFromString(nsdef->capsadd[i])) < 0) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("invalid qemu namespace capability '%s'"),
|
||||
nsdef->capsadd[i]);
|
||||
return -1;
|
||||
}
|
||||
|
||||
virQEMUCapsSet(priv->qemuCaps, tmp);
|
||||
}
|
||||
|
||||
for (i = 0; i < nsdef->ncapsdel; i++) {
|
||||
if ((tmp = virQEMUCapsTypeFromString(nsdef->capsdel[i])) < 0) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("invalid qemu namespace capability '%s'"),
|
||||
nsdef->capsdel[i]);
|
||||
return -1;
|
||||
}
|
||||
|
||||
virQEMUCapsClear(priv->qemuCaps, tmp);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* qemuProcessInit:
|
||||
*
|
||||
@ -5518,6 +5554,10 @@ qemuProcessInit(virQEMUDriverPtr driver,
|
||||
if (virDomainObjSetDefTransient(caps, driver->xmlopt, vm) < 0)
|
||||
goto cleanup;
|
||||
|
||||
/* Update qemu capabilities according to lists passed in via namespace */
|
||||
if (qemuProcessStartUpdateCustomCaps(vm) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (flags & VIR_QEMU_PROCESS_START_PRETEND) {
|
||||
if (qemuDomainSetPrivatePaths(driver, vm) < 0) {
|
||||
virDomainObjRemoveTransientDef(vm);
|
||||
|
Loading…
x
Reference in New Issue
Block a user