domain: conf: Use CapabilitiesDomainDataLookup for caps validation

The strange logic here is just to duplicate the previous behavior,
which parts of the test suite are currently relying on.
This commit is contained in:
Cole Robinson 2015-04-17 19:38:04 -04:00
parent 4c96e682ec
commit 3f9868a57e
3 changed files with 20 additions and 122 deletions

View File

@ -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

View File

@ -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);

View File

@ -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));
/* 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 */