unsigned int emulatorRequired : 1;
const char *defaultDiskDriverName;
const char *defaultDiskDriverType;
- int defaultConsoleTargetType;
+ int (*defaultConsoleTargetType)(const char *ostype);
void *(*privateDataAllocFunc)(void);
void (*privateDataFreeFunc)(void *);
int (*privateDataXMLFormat)(virBufferPtr, void *);
"serial",
"xen",
"uml",
- "virtio")
+ "virtio",
+ "lxc",
+ "openvz")
VIR_ENUM_IMPL(virDomainChrDevice, VIR_DOMAIN_CHR_DEVICE_TYPE_LAST,
"parallel",
}
static int
-virDomainChrDefaultTargetType(virCapsPtr caps, int devtype) {
+virDomainChrDefaultTargetType(virCapsPtr caps,
+ virDomainDefPtr def,
+ int devtype) {
int target = -1;
break;
case VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE:
- target = caps->defaultConsoleTargetType;
+ if (!caps->defaultConsoleTargetType) {
+ virDomainReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Driver does not have a default console type set"));
+ return -1;
+ }
+ target = caps->defaultConsoleTargetType(def->os.type);
break;
case VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL:
static int
virDomainChrTargetTypeFromString(virCapsPtr caps,
+ virDomainDefPtr def,
int devtype,
const char *targetType)
{
int target = 0;
if (!targetType) {
- target = virDomainChrDefaultTargetType(caps, devtype);
+ target = virDomainChrDefaultTargetType(caps, def, devtype);
goto out;
}
static int
virDomainChrDefParseTargetXML(virCapsPtr caps,
+ virDomainDefPtr vmdef,
virDomainChrDefPtr def,
xmlNodePtr cur)
{
const char *portStr = NULL;
if ((def->targetType =
- virDomainChrTargetTypeFromString(caps,
- def->deviceType, targetType)) < 0) {
+ virDomainChrTargetTypeFromString(caps, vmdef,
+ def->deviceType, targetType)) < 0) {
goto error;
}
*/
static virDomainChrDefPtr
virDomainChrDefParseXML(virCapsPtr caps,
+ virDomainDefPtr vmdef,
xmlNodePtr node,
unsigned int flags)
{
if (cur->type == XML_ELEMENT_NODE) {
if (xmlStrEqual(cur->name, BAD_CAST "target")) {
seenTarget = true;
- if (virDomainChrDefParseTargetXML(caps, def, cur) < 0) {
+ if (virDomainChrDefParseTargetXML(caps, vmdef, def, cur) < 0) {
goto error;
}
}
}
if (!seenTarget &&
- ((def->targetType = virDomainChrDefaultTargetType(caps, def->deviceType)) < 0))
+ ((def->targetType = virDomainChrDefaultTargetType(caps, vmdef, def->deviceType)) < 0))
goto cleanup;
if (def->source.type == VIR_DOMAIN_CHR_TYPE_SPICEVMC) {
for (i = 0 ; i < n ; i++) {
virDomainChrDefPtr chr = virDomainChrDefParseXML(caps,
+ def,
nodes[i],
flags);
if (!chr)
for (i = 0 ; i < n ; i++) {
virDomainChrDefPtr chr = virDomainChrDefParseXML(caps,
+ def,
nodes[i],
flags);
if (!chr)
for (i = 0 ; i < n ; i++) {
virDomainChrDefPtr chr = virDomainChrDefParseXML(caps,
+ def,
nodes[i],
flags);
if (!chr)
for (i = 0 ; i < n ; i++) {
virDomainChrDefPtr chr = virDomainChrDefParseXML(caps,
+ def,
nodes[i],
flags);
if (!chr)
VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_XEN,
VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_UML,
VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_VIRTIO,
+ VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_LXC,
+ VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_OPENVZ,
VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_LAST,
};
}
+static int esxDefaultConsoleType(const char *ostype ATTRIBUTE_UNUSED)
+{
+ return VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL;
+}
+
static virCapsPtr
esxCapsInit(esxPrivate *priv)
virCapabilitiesAddHostMigrateTransport(caps, "vpxmigr");
caps->hasWideScsiBus = true;
+ caps->defaultConsoleTargetType = esxDefaultConsoleType;
if (esxLookupHostSystemBiosUuid(priv, caps->host.host_uuid) < 0) {
goto failure;
return -1;
}
+
+static int libxlDefaultConsoleType(const char *ostype)
+{
+ if (STREQ(ostype, "hvm"))
+ return VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL;
+ else
+ return VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_XEN;
+}
+
static virCapsPtr
libxlBuildCapabilities(const char *hostmachine,
int host_pae,
}
}
- caps->defaultConsoleTargetType = VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_XEN;
+ caps->defaultConsoleTargetType = libxlDefaultConsoleType;
return caps;
#define VIR_FROM_THIS VIR_FROM_LXC
+static int lxcDefaultConsoleType(const char *ostype ATTRIBUTE_UNUSED)
+{
+ return VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_LXC;
+}
+
+
/* Functions */
virCapsPtr lxcCapsInit(void)
{
0, 0)) == NULL)
goto error;
+ caps->defaultConsoleTargetType = lxcDefaultConsoleType;
+
/* Some machines have problematic NUMA toplogy causing
* unexpected failures. We don't want to break the QEMU
* driver in this scenario, so log errors & carry on
}
+static int openvzDefaultConsoleType(const char *ostype ATTRIBUTE_UNUSED)
+{
+ return VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_OPENVZ;
+}
+
virCapsPtr openvzCapsInit(void)
{
struct utsname utsname;
goto no_memory;
caps->defaultInitPath = "/sbin/init";
+ caps->defaultConsoleTargetType = openvzDefaultConsoleType;
return caps;
no_memory:
return id;
}
+
+static int phypDefaultConsoleType(const char *ostype ATTRIBUTE_UNUSED)
+{
+ return VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL;
+}
+
+
static virCapsPtr
phypCapsInit(void)
{
"phyp", NULL, NULL, 0, NULL) == NULL)
goto no_memory;
+ caps->defaultConsoleTargetType = phypDefaultConsoleType;
+
return caps;
no_memory:
}
+static int qemuDefaultConsoleType(const char *ostype ATTRIBUTE_UNUSED)
+{
+ return VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL;
+}
+
+
virCapsPtr qemuCapsInit(virCapsPtr old_caps)
{
struct utsname utsname;
/* QEMU Requires an emulator in the XML */
virCapabilitiesSetEmulatorRequired(caps);
- caps->defaultConsoleTargetType = VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL;
+ caps->defaultConsoleTargetType = qemuDefaultConsoleType;
return caps;
}
+static int testDefaultConsoleType(const char *ostype ATTRIBUTE_UNUSED)
+{
+ return VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL;
+}
+
static virCapsPtr
testBuildCapabilities(virConnectPtr conn) {
testConnPtr privconn = conn->privateData;
if ((caps = virCapabilitiesNew(TEST_MODEL, 0, 0)) == NULL)
goto no_memory;
+ caps->defaultConsoleTargetType = testDefaultConsoleType;
+
if (virCapabilitiesAddHostFeature(caps, "pae") < 0)
goto no_memory;
if (virCapabilitiesAddHostFeature(caps ,"nonpae") < 0)
#define umlLog(level, msg, ...) \
virLogMessage(__FILE__, level, 0, msg, __VA_ARGS__)
+
+static int umlDefaultConsoleType(const char *ostype ATTRIBUTE_UNUSED)
+{
+ return VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_UML;
+}
+
+
virCapsPtr umlCapsInit(void) {
struct utsname utsname;
virCapsPtr caps;
NULL) == NULL)
goto error;
- caps->defaultConsoleTargetType = VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_UML;
+ caps->defaultConsoleTargetType = umlDefaultConsoleType;
return caps;
return result;
}
+
+static int vboxDefaultConsoleType(const char *ostype ATTRIBUTE_UNUSED)
+{
+ return VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL;
+}
+
+
static virCapsPtr vboxCapsInit(void) {
struct utsname utsname;
virCapsPtr caps;
0,
NULL) == NULL)
goto no_memory;
+
+ caps->defaultConsoleTargetType = vboxDefaultConsoleType;
+
return caps;
no_memory:
VIR_FREE(driver);
}
+
+static int vmwareDefaultConsoleType(const char *ostype ATTRIBUTE_UNUSED)
+{
+ return VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL;
+}
+
+
virCapsPtr
vmwareCapsInit(void)
{
goto error;
}
+ caps->defaultConsoleTargetType = vmwareDefaultConsoleType;
+
cleanup:
virCPUDefFree(cpu);
cpuDataFree(utsname.machine, data);
};
+static int xenDefaultConsoleType(const char *ostype)
+{
+ if (STREQ(ostype, "hvm"))
+ return VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL;
+ else
+ return VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_XEN;
+}
+
static virCapsPtr
xenHypervisorBuildCapabilities(virConnectPtr conn,
const char *hostmachine,
}
- caps->defaultConsoleTargetType = VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_XEN;
+ caps->defaultConsoleTargetType = xenDefaultConsoleType;
return caps;
virReportErrorHelper(VIR_FROM_THIS, code, __FILE__, \
__FUNCTION__, __LINE__, __VA_ARGS__)
+
+static int xenapiDefaultConsoleType(const char *ostype)
+{
+ if (STREQ(ostype, "hvm"))
+ return VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL;
+ else
+ return VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_XEN;
+}
+
+
/*
* getCapsObject
*
if (!domain2)
goto error_cleanup;
+ caps->defaultConsoleTargetType = xenapiDefaultConsoleType;
+
return caps;
error_cleanup:
return machines;
}
+static int testQemuDefaultConsoleType(const char *ostype ATTRIBUTE_UNUSED)
+{
+ return VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL;
+}
+
virCapsPtr testQemuCapsInit(void) {
virCapsPtr caps;
virCapsGuestPtr guest;
0, 0)) == NULL)
return NULL;
+ caps->defaultConsoleTargetType = testQemuDefaultConsoleType;
+
if ((caps->host.cpu = virCPUDefCopy(&host_cpu)) == NULL ||
(machines = testQemuAllocMachines(&nmachines)) == NULL)
goto cleanup;
#include <stdlib.h>
#include "testutilsxen.h"
+#include "domain_conf.h"
+
+static int testXenDefaultConsoleType(const char *ostype ATTRIBUTE_UNUSED)
+{
+ if (STREQ(ostype, "hvm"))
+ return VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL;
+ else
+ return VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_XEN;
+}
virCapsPtr testXenCapsInit(void) {
struct utsname utsname;
0, 0)) == NULL)
return NULL;
+ caps->defaultConsoleTargetType = testXenDefaultConsoleType;
+
nmachines = ARRAY_CARDINALITY(x86_machines);
if ((machines = virCapabilitiesAllocMachines(x86_machines, nmachines)) == NULL)
goto cleanup;
static virCapsPtr caps;
static virVMXContext ctx;
+static int testDefaultConsoleType(const char *ostype ATTRIBUTE_UNUSED)
+{
+ return VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL;
+}
+
static void
testCapsInit(void)
{
return;
}
+ caps->defaultConsoleTargetType = testDefaultConsoleType;
+
virCapabilitiesSetMacPrefix(caps, (unsigned char[]){ 0x00, 0x0c, 0x29 });
virCapabilitiesAddHostMigrateTransport(caps, "esx");
static virCapsPtr caps;
static virVMXContext ctx;
+static int testDefaultConsoleType(const char *ostype ATTRIBUTE_UNUSED)
+{
+ return VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL;
+}
+
static void
testCapsInit(void)
{
return;
}
+ caps->defaultConsoleTargetType = testDefaultConsoleType;
+
virCapabilitiesSetMacPrefix(caps, (unsigned char[]){ 0x00, 0x0c, 0x29 });
virCapabilitiesAddHostMigrateTransport(caps, "esx");