mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-03 11:35:19 +00:00
domain: conf: Don't validate VM ostype/arch at daemon startup
When parsing XML, we validate the passed ostype + arch combo against
the detected hypervisor capabilities. This has led to the following
problem:
- Define x86 qemu guest
- qemu is inadvertently removed from the host
- libvirtd is restarted. fails to parse VM config since arch is removed
- 'virsh list --all' is now empty, user is wondering where their VMs went
Add a new internal flag VIR_DOMAIN_DEF_PARSE_SKIP_OSTYPE_CHECKS. Use
it when loading VM and snapshot configs from disk.
https://bugzilla.redhat.com/show_bug.cgi?id=1043572
(cherry picked from commit f1a89a8b6d
)
This commit is contained in:
parent
7d9739f26d
commit
55540339e2
@ -102,6 +102,7 @@ typedef enum {
|
||||
VIR_DOMAIN_XML_INTERNAL_CLOCK_ADJUST = 1 << 21,
|
||||
/* parse only source half of <disk> */
|
||||
VIR_DOMAIN_XML_INTERNAL_DISK_SOURCE = 1 << 22,
|
||||
VIR_DOMAIN_XML_INTERNAL_SKIP_OSTYPE_CHECKS = 1 << 23,
|
||||
} virDomainXMLInternalFlags;
|
||||
|
||||
#define DUMPXML_FLAGS \
|
||||
@ -116,7 +117,8 @@ verify(((VIR_DOMAIN_XML_INTERNAL_STATUS |
|
||||
VIR_DOMAIN_XML_INTERNAL_ALLOW_ROM |
|
||||
VIR_DOMAIN_XML_INTERNAL_ALLOW_BOOT |
|
||||
VIR_DOMAIN_XML_INTERNAL_CLOCK_ADJUST |
|
||||
VIR_DOMAIN_XML_INTERNAL_DISK_SOURCE)
|
||||
VIR_DOMAIN_XML_INTERNAL_DISK_SOURCE |
|
||||
VIR_DOMAIN_XML_INTERNAL_SKIP_OSTYPE_CHECKS)
|
||||
& DUMPXML_FLAGS) == 0);
|
||||
|
||||
VIR_ENUM_IMPL(virDomainTaint, VIR_DOMAIN_TAINT_LAST,
|
||||
@ -12941,17 +12943,8 @@ virDomainDefParseXML(xmlDocPtr xml,
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (!virCapabilitiesSupportsGuestOSType(caps, def->os.type)) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("no support found for os <type> '%s'"),
|
||||
def->os.type);
|
||||
goto error;
|
||||
}
|
||||
|
||||
tmp = virXPathString("string(./os/type[1]/@arch)", ctxt);
|
||||
if (tmp) {
|
||||
def->os.arch = virArchFromString(tmp);
|
||||
if (!def->os.arch) {
|
||||
if (tmp && !(def->os.arch = virArchFromString(tmp))) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("Unknown architecture %s"),
|
||||
tmp);
|
||||
@ -12959,6 +12952,17 @@ virDomainDefParseXML(xmlDocPtr xml,
|
||||
}
|
||||
VIR_FREE(tmp);
|
||||
|
||||
def->os.machine = virXPathString("string(./os/type[1]/@machine)", ctxt);
|
||||
|
||||
if (!(flags & VIR_DOMAIN_XML_INTERNAL_SKIP_OSTYPE_CHECKS)) {
|
||||
if (!virCapabilitiesSupportsGuestOSType(caps, def->os.type)) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("no support found for os <type> '%s'"),
|
||||
def->os.type);
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (def->os.arch) {
|
||||
if (!virCapabilitiesSupportsGuestArch(caps, def->os.arch)) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("No guest options available for arch '%s'"),
|
||||
@ -12987,7 +12991,6 @@ virDomainDefParseXML(xmlDocPtr xml,
|
||||
}
|
||||
}
|
||||
|
||||
def->os.machine = virXPathString("string(./os/type[1]/@machine)", ctxt);
|
||||
if (!def->os.machine) {
|
||||
const char *defaultMachine = virCapabilitiesDefaultGuestMachine(caps,
|
||||
def->os.type,
|
||||
@ -12996,6 +12999,8 @@ virDomainDefParseXML(xmlDocPtr xml,
|
||||
if (VIR_STRDUP(def->os.machine, defaultMachine) < 0)
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Booting options for different OS types....
|
||||
@ -19364,7 +19369,8 @@ virDomainObjListLoadConfig(virDomainObjListPtr doms,
|
||||
goto error;
|
||||
if (!(def = virDomainDefParseFile(configFile, caps, xmlopt,
|
||||
expectedVirtTypes,
|
||||
VIR_DOMAIN_XML_INACTIVE)))
|
||||
VIR_DOMAIN_XML_INACTIVE |
|
||||
VIR_DOMAIN_XML_INTERNAL_SKIP_OSTYPE_CHECKS)))
|
||||
goto error;
|
||||
|
||||
if ((autostartLink = virDomainConfigFile(autostartDir, name)) == NULL)
|
||||
@ -19414,7 +19420,8 @@ virDomainObjListLoadStatus(virDomainObjListPtr doms,
|
||||
VIR_DOMAIN_XML_INTERNAL_STATUS |
|
||||
VIR_DOMAIN_XML_INTERNAL_ACTUAL_NET |
|
||||
VIR_DOMAIN_XML_INTERNAL_PCI_ORIG_STATES |
|
||||
VIR_DOMAIN_XML_INTERNAL_CLOCK_ADJUST)))
|
||||
VIR_DOMAIN_XML_INTERNAL_CLOCK_ADJUST |
|
||||
VIR_DOMAIN_XML_INTERNAL_SKIP_OSTYPE_CHECKS)))
|
||||
goto error;
|
||||
|
||||
virUUIDFormat(obj->def->uuid, uuidstr);
|
||||
|
Loading…
Reference in New Issue
Block a user