]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
caps: Improve error if passed an unknown arch
authorCole Robinson <crobinso@redhat.com>
Mon, 20 Feb 2012 18:40:30 +0000 (13:40 -0500)
committerCole Robinson <crobinso@redhat.com>
Mon, 20 Feb 2012 18:41:43 +0000 (13:41 -0500)
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'"

src/conf/capabilities.c
src/conf/capabilities.h
src/conf/domain_conf.c

index d44ce1b6fa2fef0e8d7dcb0d81c90ca7a80ec56f..542bf03ad26a0e067af1b5bfca29b49d325e82ec 100644 (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++) {
index 38d07c4549baaeb5e737335c700924141e00db61..421030d9c2ea855b5f137260f7bac6056de4eae2 100644 (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 *
index 85a20580056d6763df5cc8820b098d3547e67ccb..b0c3fa67b7578b506474becaa23e27876bf60036 100644 (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;
         }