The strange logic here is just to duplicate the previous behavior, which parts of the test suite are currently relying on. --- src/conf/capabilities.c | 68 ------------------------------------------------- src/conf/capabilities.h | 11 -------- src/conf/domain_conf.c | 61 ++++++++++++++------------------------------ 3 files changed, 19 insertions(+), 121 deletions(-) diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c index 8d3d2a3..a2b6451 100644 --- a/src/conf/capabilities.c +++ b/src/conf/capabilities.c @@ -730,74 +730,6 @@ virCapabilitiesDomainDataLookup(virCapsPtr caps, } /** - * virCapabilitiesSupportsGuestArch: - * @caps: capabilities to query - * @arch: Architecture to search for - * - * Returns non-zero if the capabilities support the - * requested architecture - */ -extern int -virCapabilitiesSupportsGuestArch(virCapsPtr caps, - virArch arch) -{ - size_t i; - for (i = 0; i < caps->nguests; i++) { - if (caps->guests[i]->arch.id == arch) - return 1; - } - return 0; -} - - -/** - * virCapabilitiesSupportsGuestOSType: - * @caps: capabilities to query - * @ostype: guest operating system type, of enum VIR_DOMAIN_OSTYPE - * - * Returns non-zero if the capabilities support the - * requested operating system type - */ -extern int -virCapabilitiesSupportsGuestOSType(virCapsPtr caps, - int ostype) -{ - size_t i; - - for (i = 0; i < caps->nguests; i++) { - if (caps->guests[i]->ostype == ostype) - return 1; - } - return 0; -} - - -/** - * virCapabilitiesSupportsGuestOSTypeArch: - * @caps: capabilities to query - * @ostype: guest operating system type, of enum VIR_DOMAIN_OSTYPE - * @arch: Architecture to search for - * - * Returns non-zero if the capabilities support the - * requested operating system type - */ -extern int -virCapabilitiesSupportsGuestOSTypeArch(virCapsPtr caps, - int ostype, - virArch arch) -{ - size_t i; - - for (i = 0; i < caps->nguests; i++) { - if (caps->guests[i]->ostype == ostype && - caps->guests[i]->arch.id == arch) - return 1; - } - return 0; -} - - -/** * virCapabilitiesDefaultGuestArch: * @caps: capabilities to query * @ostype: guest operating system type, of enum VIR_DOMAIN_OSTYPE diff --git a/src/conf/capabilities.h b/src/conf/capabilities.h index 87acf39..948a1a5 100644 --- a/src/conf/capabilities.h +++ b/src/conf/capabilities.h @@ -280,17 +280,6 @@ virCapabilitiesDomainDataLookup(virCapsPtr caps, const char *emulator, const char *machinetype); -extern int -virCapabilitiesSupportsGuestArch(virCapsPtr caps, - virArch arch); -extern int -virCapabilitiesSupportsGuestOSType(virCapsPtr caps, - int ostype); -extern int -virCapabilitiesSupportsGuestOSTypeArch(virCapsPtr caps, - int ostype, - virArch arch); - void virCapabilitiesClearHostNUMACellCPUTopology(virCapsHostNUMACellCPUPtr cpu, size_t ncpus); diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index db0079b..4d9d4b5 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -13729,51 +13729,28 @@ virDomainDefParseXML(xmlDocPtr xml, def->emulator = virXPathString("string(./devices/emulator[1])", ctxt); if (!(flags & VIR_DOMAIN_DEF_PARSE_SKIP_OSTYPE_CHECKS)) { - if (!virCapabilitiesSupportsGuestOSType(caps, def->os.type)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("no support found for os <type> '%s'"), - virDomainOSTypeToString(def->os.type)); - goto error; - } + /* If the logic here seems fairly arbitrary, that's because it is :) + * This is duplicating how the code worked before + * CapabilitiesDomainDataLookup was added. We can simplify this, + * but it would take a bit of work because the test suite fails + * in numerous minor ways. */ + bool use_virttype = ((def->os.arch == VIR_ARCH_NONE) || + !def->os.machine); + virCapsDomainDataPtr capsdata = NULL; - if (def->os.arch) { - if (!virCapabilitiesSupportsGuestArch(caps, def->os.arch)) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("No guest options available for arch '%s'"), - virArchToString(def->os.arch)); - goto error; - } - - if (!virCapabilitiesSupportsGuestOSTypeArch(caps, - def->os.type, - def->os.arch)) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("No os type '%s' available for arch '%s'"), - virDomainOSTypeToString(def->os.type), - virArchToString(def->os.arch)); - goto error; - } - } else { - def->os.arch = - virCapabilitiesDefaultGuestArch(caps, - def->os.type, - def->virtType); - if (!def->os.arch) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("no supported architecture for os type '%s'"), - virDomainOSTypeToString(def->os.type)); - goto error; - } - } + if (!(capsdata = virCapabilitiesDomainDataLookup(caps, def->os.type, + def->os.arch, use_virttype ? def->virtType : -1, + NULL, NULL))) + goto error; - if (!def->os.machine) { - const char *defaultMachine = virCapabilitiesDefaultGuestMachine(caps, - def->os.type, - def->os.arch, - def->virtType); - if (VIR_STRDUP(def->os.machine, defaultMachine) < 0) - goto error; + if (!def->os.arch) + def->os.arch = capsdata->arch; + if ((!def->os.machine && + VIR_STRDUP(def->os.machine, capsdata->machinetype) < 0)) { + VIR_FREE(capsdata); + goto error; } + VIR_FREE(capsdata); } /* Extract domain name */ -- 2.3.5 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list