libxl exposes a setting for specifying a device model version. The default
is LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN, aka upstream qemu. But users can
specify LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL if they are using
the old forked qemu, aka qemu-dm. libvirt only supports specifying an
emulator by name, specifying a version is not supported.
Prior to this change libvirt would invoke the specified emulator with
'--help' option in an attempt to determine the version. If the help output
included the string "Options specific to the Xen version:" it was assumed
the emulator was the old forked qemu-dm. This approach works well when
creating libxl_domain_config to start a VM, but is problematic when simply
creating libxl_domain_config for unit test purposes. Build/development
systems running unit tests may not have the emulator installed. Even if
installed, invoking the emulator during unit tests is bad form.
This change takes the simple-minded approach of determining the device
model version based on the emulator name. If it contains "qemu-dm" it is
assumed to be LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL, otherwise
LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN.
Signed-off-by: Jim Fehlig <jfehlig(a)suse.com>
---
src/libxl/libxl_capabilities.c | 37 +++++++++++++++----------------------
1 file changed, 15 insertions(+), 22 deletions(-)
diff --git a/src/libxl/libxl_capabilities.c b/src/libxl/libxl_capabilities.c
index 2bbd2d1b4..7ad8e7b57 100644
--- a/src/libxl/libxl_capabilities.c
+++ b/src/libxl/libxl_capabilities.c
@@ -723,35 +723,28 @@ libxlMakeDomainCapabilities(virDomainCapsPtr domCaps,
return 0;
}
-#define LIBXL_QEMU_DM_STR "Options specific to the Xen version:"
+#define LIBXL_QEMU_DM_STR "qemu-dm"
+
+/*
+ * libxl exposes a setting for specifying a device model version. The default
+ * is LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN (aka upstream qemu). But users can
+ * specify LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL if they are using
+ * the old, forked qemu (aka qemu-dm). libvirt only supports specifying an
+ * emulator. This function makes a poor attempt at determining the device
+ * model version based on the emulator name. If the emulator name contains
+ * "qemu-dm", it is assumed to be a
+ * LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL emulator.
+ */
int
libxlDomainGetEmulatorType(const virDomainDef *def)
{
- int ret = LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN;
- virCommandPtr cmd = NULL;
- char *output = NULL;
-
if (def->os.type == VIR_DOMAIN_OSTYPE_HVM) {
if (def->emulator) {
- if (!virFileExists(def->emulator))
- goto cleanup;
-
- cmd = virCommandNew(def->emulator);
-
- virCommandAddArgList(cmd, "-help", NULL);
- virCommandSetOutputBuffer(cmd, &output);
-
- if (virCommandRun(cmd, NULL) < 0)
- goto cleanup;
-
- if (strstr(output, LIBXL_QEMU_DM_STR))
- ret = LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL;
+ if (strstr(def->emulator, LIBXL_QEMU_DM_STR))
+ return LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL;
}
}
- cleanup:
- VIR_FREE(output);
- virCommandFree(cmd);
- return ret;
+ return LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN;
}
--
2.11.0