caps: Improve error if passed an unknown arch

Previously we would have:

"os type 'hvm' & arch 'idontexist' combination is not supported"

Now we get

"No guest options available for arch 'idontexist'"

or if options available but guest OS type not applicable:

"No os type 'xen' available for arch 'x86_64'"
This commit is contained in:
Cole Robinson 2012-02-20 13:40:30 -05:00
parent cb8b9963fe
commit e1ecba4669
3 changed files with 41 additions and 9 deletions

View File

@ -497,6 +497,26 @@ virCapabilitiesAddGuestFeature(virCapsGuestPtr guest,
return NULL;
}
/**
* virCapabilitiesSupportsGuestArch:
* @caps: capabilities to query
* @arch: Architecture to search for (eg, 'i686', 'x86_64')
*
* Returns non-zero if the capabilities support the
* requested architecture
*/
extern int
virCapabilitiesSupportsGuestArch(virCapsPtr caps,
const char *arch)
{
int i;
for (i = 0 ; i < caps->nguests ; i++) {
if (STREQ(caps->guests[i]->arch.name, arch))
return 1;
}
return 0;
}
/**
* virCapabilitiesSupportsGuestOSType:
@ -520,7 +540,7 @@ virCapabilitiesSupportsGuestOSType(virCapsPtr caps,
/**
* virCapabilitiesSupportsGuestOSType:
* virCapabilitiesSupportsGuestOSTypeArch:
* @caps: capabilities to query
* @ostype: OS type to search for (eg 'hvm', 'xen')
* @arch: Architecture to search for (eg, 'i686', 'x86_64')
@ -529,9 +549,9 @@ virCapabilitiesSupportsGuestOSType(virCapsPtr caps,
* requested operating system type
*/
extern int
virCapabilitiesSupportsGuestArch(virCapsPtr caps,
const char *ostype,
const char *arch)
virCapabilitiesSupportsGuestOSTypeArch(virCapsPtr caps,
const char *ostype,
const char *arch)
{
int i;
for (i = 0 ; i < caps->nguests ; i++) {

View File

@ -237,12 +237,15 @@ virCapabilitiesAddGuestFeature(virCapsGuestPtr guest,
int toggle);
extern int
virCapabilitiesSupportsGuestArch(virCapsPtr caps,
const char *arch);
extern int
virCapabilitiesSupportsGuestOSType(virCapsPtr caps,
const char *ostype);
extern int
virCapabilitiesSupportsGuestArch(virCapsPtr caps,
const char *ostype,
const char *arch);
virCapabilitiesSupportsGuestOSTypeArch(virCapsPtr caps,
const char *ostype,
const char *arch);
extern const char *

View File

@ -7581,9 +7581,18 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
def->os.arch = virXPathString("string(./os/type[1]/@arch)", ctxt);
if (def->os.arch) {
if (!virCapabilitiesSupportsGuestArch(caps, def->os.type, def->os.arch)) {
if (!virCapabilitiesSupportsGuestArch(caps, def->os.arch)) {
virDomainReportError(VIR_ERR_INTERNAL_ERROR,
_("os type '%s' & arch '%s' combination is not supported"),
_("No guest options available for arch '%s'"),
def->os.arch);
goto error;
}
if (!virCapabilitiesSupportsGuestOSTypeArch(caps,
def->os.type,
def->os.arch)) {
virDomainReportError(VIR_ERR_INTERNAL_ERROR,
_("No os type '%s' available for arch '%s'"),
def->os.type, def->os.arch);
goto error;
}