]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
virCaps: get rid of emulatorRequired
authorPeter Krempa <pkrempa@redhat.com>
Mon, 11 Mar 2013 11:12:08 +0000 (12:12 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Thu, 4 Apr 2013 20:42:38 +0000 (22:42 +0200)
This patch removes the emulatorRequired field and associated
infrastructure from the virCaps object. Instead the driver specific
callbacks are used as this field isn't enforced by all drivers.

This patch implements the appropriate callbacks in the qemu and lxc
driver and moves to check to that location.

12 files changed:
src/conf/capabilities.c
src/conf/capabilities.h
src/conf/domain_conf.c
src/conf/domain_conf.h
src/libvirt_private.syms
src/lxc/lxc_conf.c
src/lxc/lxc_domain.c
src/lxc/lxc_domain.h
src/qemu/qemu_capabilities.c
src/qemu/qemu_domain.c
tests/lxcxml2xmldata/lxc-hostdev.xml
tests/lxcxml2xmldata/lxc-systemd.xml

index d53d5a3b440dca0d20045d9f72353f541c822c1a..1d29ce642a2be60b57696d830a93e5b814929fc3 100644 (file)
@@ -935,13 +935,3 @@ virCapabilitiesGenerateMac(virCapsPtr caps,
 {
     virMacAddrGenerate(caps->macPrefix, mac);
 }
-
-extern void
-virCapabilitiesSetEmulatorRequired(virCapsPtr caps) {
-    caps->emulatorRequired = 1;
-}
-
-extern unsigned int
-virCapabilitiesIsEmulatorRequired(virCapsPtr caps) {
-    return caps->emulatorRequired;
-}
index a3838e61a6917d2c2758175f6c07c514241d73bf..5e7a5f6a779ffd5bb3d9dfdd80efc0f9bbc85268 100644 (file)
@@ -163,7 +163,6 @@ struct _virCaps {
 
     /* Move to virDomainXMLOption later */
     unsigned char macPrefix[VIR_MAC_PREFIX_BUFLEN];
-    unsigned int emulatorRequired : 1;
     int defaultDiskDriverType; /* enum virStorageFileFormat */
     int (*defaultConsoleTargetType)(const char *ostype, virArch guestarch);
     bool hasWideScsiBus;
@@ -186,12 +185,6 @@ extern void
 virCapabilitiesGenerateMac(virCapsPtr caps,
                            virMacAddrPtr mac);
 
-extern void
-virCapabilitiesSetEmulatorRequired(virCapsPtr caps);
-
-extern unsigned int
-virCapabilitiesIsEmulatorRequired(virCapsPtr caps);
-
 extern int
 virCapabilitiesAddHostFeature(virCapsPtr caps,
                               const char *name);
index 3237fb1e9a769d0eedb72018e46b4c73d04765ad..062469635a27844d64ddc1b9cb1ae348e74c23cc 100644 (file)
@@ -9165,8 +9165,10 @@ virDomainLeaseRemove(virDomainDefPtr def,
 }
 
 
-static char *virDomainDefDefaultEmulator(virDomainDefPtr def,
-                                         virCapsPtr caps) {
+char *
+virDomainDefGetDefaultEmulator(virDomainDefPtr def,
+                               virCapsPtr caps)
+{
     const char *type;
     const char *emulator;
     char *retemu;
@@ -9185,13 +9187,13 @@ static char *virDomainDefDefaultEmulator(virDomainDefPtr def,
 
     if (!emulator) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
-                       _("no emulator for domain %s os type %s on architecture %s"),
+                       _("no emulator for domain %s os type %s "
+                         "on architecture %s"),
                        type, def->os.type, virArchToString(def->os.arch));
         return NULL;
     }
 
-    retemu = strdup(emulator);
-    if (!retemu)
+    if (!(retemu = strdup(emulator)))
         virReportOOMError();
 
     return retemu;
@@ -10385,11 +10387,6 @@ virDomainDefParseXML(xmlDocPtr xml,
     }
 
     def->emulator = virXPathString("string(./devices/emulator[1])", ctxt);
-    if (!def->emulator && virCapabilitiesIsEmulatorRequired(caps)) {
-        def->emulator = virDomainDefDefaultEmulator(def, caps);
-        if (!def->emulator)
-            goto error;
-    }
 
     /* analysis of the disk devices */
     if ((n = virXPathNodeSet("./devices/disk", ctxt, &nodes)) < 0)
index e54dadc9bdcf99fd8d260d92f167bf8ee35b6cc5..19a66ed1abb5d2f0ef89020356fc0502c3fe2d9b 100644 (file)
@@ -2476,4 +2476,6 @@ int virDomainObjListExport(virDomainObjListPtr doms,
 virDomainVcpuPinDefPtr virDomainLookupVcpuPin(virDomainDefPtr def,
                                               int vcpuid);
 
+char *virDomainDefGetDefaultEmulator(virDomainDefPtr def, virCapsPtr caps);
+
 #endif /* __DOMAIN_CONF_H */
index 2930104da33859bb86db4f761e6a98e381af819f..36e4ee06f784d67ec8fa0f1bb2162568140c5e42 100644 (file)
@@ -21,9 +21,7 @@ virCapabilitiesFormatXML;
 virCapabilitiesFreeMachines;
 virCapabilitiesFreeNUMAInfo;
 virCapabilitiesGenerateMac;
-virCapabilitiesIsEmulatorRequired;
 virCapabilitiesNew;
-virCapabilitiesSetEmulatorRequired;
 virCapabilitiesSetHostCPU;
 virCapabilitiesSetMacPrefix;
 
@@ -118,6 +116,7 @@ virDomainDefFormat;
 virDomainDefFormatInternal;
 virDomainDefFree;
 virDomainDefGenSecurityLabelDef;
+virDomainDefGetDefaultEmulator;
 virDomainDefGetSecurityLabelDef;
 virDomainDefParseFile;
 virDomainDefParseNode;
index 377d8af117c296d633d129dc33d95965e0850163..ce8c2b5b6ebfd37d7239286020d8c4e408f86f2e 100644 (file)
@@ -119,9 +119,6 @@ virCapsPtr lxcCapsInit(virLXCDriverPtr driver)
             goto error;
     }
 
-    /* LXC Requires an emulator in the XML */
-    virCapabilitiesSetEmulatorRequired(caps);
-
     if (driver) {
         /* Security driver data */
         const char *doi, *model;
@@ -159,11 +156,12 @@ error:
 virDomainXMLOptionPtr
 lxcDomainXMLConfInit(void)
 {
-    return virDomainXMLOptionNew(NULL,
+    return virDomainXMLOptionNew(&virLXCDriverDomainDefParserConfig,
                                  &virLXCDriverPrivateDataCallbacks,
                                  NULL);
 }
 
+
 int lxcLoadDriverConfig(virLXCDriverPtr driver)
 {
     char *filename;
index 08cf8f6b34d858e60f8b38a7c5c4ac9cc9ab09b6..80907895c9abaad1cf0798b47f3a9b39e7dfbbaf 100644 (file)
@@ -79,3 +79,20 @@ virDomainXMLPrivateDataCallbacks virLXCDriverPrivateDataCallbacks = {
     .format = virLXCDomainObjPrivateXMLFormat,
     .parse  = virLXCDomainObjPrivateXMLParse,
 };
+
+static int
+virLXCDomainDefPostParse(virDomainDefPtr def,
+                         virCapsPtr caps,
+                         void *opaque ATTRIBUTE_UNUSED)
+{
+    /* check for emulator and create a default one if needed */
+    if (!def->emulator &&
+        !(def->emulator = virDomainDefGetDefaultEmulator(def, caps)))
+        return -1;
+
+    return 0;
+}
+
+virDomainDefParserConfig virLXCDriverDomainDefParserConfig = {
+    .domainPostParseCallback = virLXCDomainDefPostParse,
+};
index 007ea84e68948e7ffc676f366b4c272b59fdb638..12753aadbd355353295bc582a15a32b480500056 100644 (file)
@@ -39,5 +39,6 @@ struct _virLXCDomainObjPrivate {
 };
 
 extern virDomainXMLPrivateDataCallbacks virLXCDriverPrivateDataCallbacks;
+extern virDomainDefParserConfig virLXCDriverDomainDefParserConfig;
 
 #endif /* __LXC_DOMAIN_H__ */
index aa381b4ea77adef0e38ee190206d0ee6b3d36f3a..748fd408a0497602fad17b1b6c49177d1897b638 100644 (file)
@@ -909,9 +909,6 @@ virCapsPtr virQEMUCapsInit(virQEMUCapsCachePtr cache)
                                  i) < 0)
             goto error;
 
-    /* QEMU Requires an emulator in the XML */
-    virCapabilitiesSetEmulatorRequired(caps);
-
     caps->defaultConsoleTargetType = virQEMUCapsDefaultConsoleType;
 
     return caps;
index 2e7a98612e53d9cb8c42fb5e575f2ff43709fa75..30732578a67cfa01df3a957df26be408c34effe8 100644 (file)
@@ -662,6 +662,20 @@ virDomainXMLNamespace virQEMUDriverDomainXMLNamespace = {
 };
 
 
+static int
+qemuDomainDefPostParse(virDomainDefPtr def,
+                       virCapsPtr caps,
+                       void *opaque ATTRIBUTE_UNUSED)
+{
+    /* check for emulator and create a default one if needed */
+    if (!def->emulator &&
+        !(def->emulator = virDomainDefGetDefaultEmulator(def, caps)))
+        return -1;
+
+    return 0;
+}
+
+
 static int
 qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
                              virDomainDefPtr def ATTRIBUTE_UNUSED,
@@ -703,6 +717,7 @@ no_memory:
 
 virDomainDefParserConfig virQEMUDriverDomainDefParserConfig = {
     .devicesPostParseCallback = qemuDomainDeviceDefPostParse,
+    .domainPostParseCallback = qemuDomainDefPostParse,
 };
 
 
index 02a87a7b13a0a813226c55f67adf0bc390e094b1..b022cc714bde0f128d25eb5c12bde796fa5333e4 100644 (file)
@@ -13,6 +13,7 @@
   <on_reboot>restart</on_reboot>
   <on_crash>destroy</on_crash>
   <devices>
+    <emulator>/usr/libexec/libvirt_lxc</emulator>
     <filesystem type='mount' accessmode='passthrough'>
       <source dir='/root/container'/>
       <target dir='/'/>
index 2f36eeeeee8645575cd88369cebc12c2b50d22c3..fd3a606d7e16fc9ab1a84c73188ff8ec0240603f 100644 (file)
@@ -15,6 +15,7 @@
   <on_reboot>restart</on_reboot>
   <on_crash>destroy</on_crash>
   <devices>
+    <emulator>/usr/libexec/libvirt_lxc</emulator>
     <filesystem type='mount' accessmode='passthrough'>
       <source dir='/root/container'/>
       <target dir='/'/>