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.
---
src/conf/capabilities.c | 10 ----------
src/conf/capabilities.h | 7 -------
src/conf/domain_conf.c | 16 ++++++----------
src/conf/domain_conf.h | 2 ++
src/libvirt_private.syms | 3 +--
src/lxc/lxc_conf.c | 7 +++----
src/lxc/lxc_domain.c | 17 +++++++++++++++++
src/lxc/lxc_domain.h | 1 +
src/qemu/qemu_capabilities.c | 3 ---
src/qemu/qemu_domain.c | 15 +++++++++++++++
tests/lxcxml2xmldata/lxc-hostdev.xml | 1 +
tests/lxcxml2xmldata/lxc-systemd.xml | 1 +
12 files changed, 47 insertions(+), 36 deletions(-)
diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c
index d53d5a3..1d29ce6 100644
--- a/src/conf/capabilities.c
+++ b/src/conf/capabilities.c
@@ -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;
-}
diff --git a/src/conf/capabilities.h b/src/conf/capabilities.h
index 5fd1bb5..dcf38a8 100644
--- a/src/conf/capabilities.h
+++ b/src/conf/capabilities.h
@@ -163,7 +163,6 @@ struct _virCaps {
/* Move to virDomainXMLConf 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);
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 1cdd9e5..fbdab9a 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -9079,8 +9079,9 @@ virDomainLeaseRemove(virDomainDefPtr def,
}
-static char *virDomainDefDefaultEmulator(virDomainDefPtr def,
- virCapsPtr caps) {
+char *
+virDomainDefDefaultEmulator(virDomainDefPtr def,
+ virCapsPtr caps) {
const char *type;
const char *emulator;
char *retemu;
@@ -9099,13 +9100,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;
@@ -10263,11 +10264,6 @@ virDomainDefParseXML(virCapsPtr caps,
}
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)
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index ab66707..0dac95e 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -2471,4 +2471,6 @@ int virDomainObjListExport(virDomainObjListPtr doms,
virDomainVcpuPinDefPtr virDomainLookupVcpuPin(virDomainDefPtr def,
int vcpuid);
+char *virDomainDefDefaultEmulator(virDomainDefPtr def, virCapsPtr caps);
+
#endif /* __DOMAIN_CONF_H */
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index c9995d7..af1d0cf 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -21,9 +21,7 @@ virCapabilitiesFormatXML;
virCapabilitiesFreeMachines;
virCapabilitiesFreeNUMAInfo;
virCapabilitiesGenerateMac;
-virCapabilitiesIsEmulatorRequired;
virCapabilitiesNew;
-virCapabilitiesSetEmulatorRequired;
virCapabilitiesSetHostCPU;
virCapabilitiesSetMacPrefix;
@@ -114,6 +112,7 @@ virDomainDefClearDeviceAliases;
virDomainDefClearPCIAddresses;
virDomainDefCompatibleDevice;
virDomainDefCopy;
+virDomainDefDefaultEmulator;
virDomainDefFormat;
virDomainDefFormatInternal;
virDomainDefFree;
diff --git a/src/lxc/lxc_conf.c b/src/lxc/lxc_conf.c
index 4e2306d..4c17e21 100644
--- a/src/lxc/lxc_conf.c
+++ b/src/lxc/lxc_conf.c
@@ -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,7 +156,9 @@ error:
virDomainXMLConfPtr
lxcDomainXMLConfInit(void)
{
- return virDomainXMLConfNew(&virLXCDriverPrivateDataCallbacks, NULL, NULL);
+ return virDomainXMLConfNew(&virLXCDriverPrivateDataCallbacks,
+ &virLXCDriverDomainDefAdjustCallbacks,
+ NULL);
}
int lxcLoadDriverConfig(virLXCDriverPtr driver)
diff --git a/src/lxc/lxc_domain.c b/src/lxc/lxc_domain.c
index 08cf8f6..e9041b2 100644
--- a/src/lxc/lxc_domain.c
+++ b/src/lxc/lxc_domain.c
@@ -79,3 +79,20 @@ virDomainXMLPrivateDataCallbacks virLXCDriverPrivateDataCallbacks = {
.format = virLXCDomainObjPrivateXMLFormat,
.parse = virLXCDomainObjPrivateXMLParse,
};
+
+static int
+virLXCDomainDefAdjust(virDomainDefPtr def,
+ virCapsPtr caps,
+ void *opaque ATTRIBUTE_UNUSED)
+{
+ /* check for emulator and create a default one if needed */
+ if (!def->emulator &&
+ !(def->emulator = virDomainDefDefaultEmulator(def, caps)))
+ return -1;
+
+ return 0;
+}
+
+virDomainDefAdjustCallbacks virLXCDriverDomainDefAdjustCallbacks = {
+ .domainBeforeDevices = virLXCDomainDefAdjust,
+};
diff --git a/src/lxc/lxc_domain.h b/src/lxc/lxc_domain.h
index 007ea84..831358f 100644
--- a/src/lxc/lxc_domain.h
+++ b/src/lxc/lxc_domain.h
@@ -39,5 +39,6 @@ struct _virLXCDomainObjPrivate {
};
extern virDomainXMLPrivateDataCallbacks virLXCDriverPrivateDataCallbacks;
+extern virDomainDefAdjustCallbacks virLXCDriverDomainDefAdjustCallbacks;
#endif /* __LXC_DOMAIN_H__ */
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 40022c1..9051df8 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -903,9 +903,6 @@ virCapsPtr virQEMUCapsInit(virQEMUCapsCachePtr cache)
i) < 0)
goto error;
- /* QEMU Requires an emulator in the XML */
- virCapabilitiesSetEmulatorRequired(caps);
-
caps->defaultConsoleTargetType = virQEMUCapsDefaultConsoleType;
return caps;
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index d7b9b5f..7e56242 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -663,6 +663,20 @@ virDomainXMLNamespace virQEMUDriverDomainXMLNamespace = {
static int
+qemuDomainDefAdjust(virDomainDefPtr def,
+ virCapsPtr caps,
+ void *opaque ATTRIBUTE_UNUSED)
+{
+ /* check for emulator and create a default one if needed */
+ if (!def->emulator &&
+ !(def->emulator = virDomainDefDefaultEmulator(def, caps)))
+ return -1;
+
+ return 0;
+}
+
+
+static int
qemuDomainDeviceDefAdjust(virDomainDeviceDefPtr dev,
virDomainDefPtr def ATTRIBUTE_UNUSED,
virCapsPtr caps ATTRIBUTE_UNUSED,
@@ -702,6 +716,7 @@ no_memory:
virDomainDefAdjustCallbacks virQEMUDriverDomainDefAdjustCallbacks = {
+ .domainBeforeDevices = qemuDomainDefAdjust,
.devices = qemuDomainDeviceDefAdjust,
};
diff --git a/tests/lxcxml2xmldata/lxc-hostdev.xml b/tests/lxcxml2xmldata/lxc-hostdev.xml
index 02a87a7..b022cc7 100644
--- a/tests/lxcxml2xmldata/lxc-hostdev.xml
+++ b/tests/lxcxml2xmldata/lxc-hostdev.xml
@@ -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='/'/>
diff --git a/tests/lxcxml2xmldata/lxc-systemd.xml b/tests/lxcxml2xmldata/lxc-systemd.xml
index 2f36eee..fd3a606 100644
--- a/tests/lxcxml2xmldata/lxc-systemd.xml
+++ b/tests/lxcxml2xmldata/lxc-systemd.xml
@@ -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='/'/>
--
1.8.1.5