diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c index 234924b1c4..f817ace986 100644 --- a/src/conf/capabilities.c +++ b/src/conf/capabilities.c @@ -729,74 +729,6 @@ virCapabilitiesDomainDataLookup(virCapsPtr caps, return ret; } -/** - * 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 diff --git a/src/conf/capabilities.h b/src/conf/capabilities.h index 61cd84a0d6..40221f4c58 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 db0079ba0d..4d9d4b5c4a 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 '%s'"), - virDomainOSTypeToString(def->os.type)); + /* 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 (!(capsdata = virCapabilitiesDomainDataLookup(caps, def->os.type, + def->os.arch, use_virttype ? def->virtType : -1, + NULL, NULL))) + 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; } - - 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 (!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; - } + VIR_FREE(capsdata); } /* Extract domain name */