2007-04-04 14:19:49 +00:00
|
|
|
/*
|
|
|
|
* xen_unified.c: Unified Xen driver.
|
|
|
|
*
|
|
|
|
* Copyright (C) 2007 Red Hat, Inc.
|
|
|
|
*
|
|
|
|
* See COPYING.LIB for the License of this software
|
|
|
|
*
|
|
|
|
* Richard W.M. Jones <rjones@redhat.com>
|
|
|
|
*/
|
|
|
|
|
2008-01-29 18:15:54 +00:00
|
|
|
#include <config.h>
|
Wed Dec 5 13:48:00 UTC 2007 Richard W.M. Jones <rjones@redhat.com>
* python/libvir.c, python/libvirt_wrap.h, qemud/qemud.c,
qemud/remote.c, src/internal.h, src/openvz_conf.c,
src/openvz_driver.c, src/proxy_internal.h, src/qemu_conf.c,
src/qemu_driver.c, src/remote_internal.h, src/test.h, src/util.c,
src/xen_unified.c, src/xen_unified.h, tests/nodeinfotest.c,
tests/qemuxml2argvtest.c, tests/qemuxml2xmltest.c, tests/reconnect.c,
tests/sexpr2xmltest.c, tests/virshtest.c, tests/xencapstest.c,
tests/xmconfigtest.c, tests/xml2sexprtest.c:
Change #include <> to #include "" for local includes.
Removed many includes from src/internal.h and put them in
the C files which actually use them.
Removed <ansidecl.h> - unused.
Added a comment around __func__.
Removed a clashing redefinition of VERSION symbol.
All limits (PATH_MAX etc) now done in src/internal.h, so we
don't need to include those headers in other files.
2007-12-05 13:56:22 +00:00
|
|
|
|
2007-04-04 14:19:49 +00:00
|
|
|
#ifdef WITH_XEN
|
|
|
|
|
|
|
|
/* Note:
|
|
|
|
*
|
|
|
|
* This driver provides a unified interface to the five
|
|
|
|
* separate underlying Xen drivers (xen_internal, proxy_internal,
|
|
|
|
* xend_internal, xs_internal and xm_internal). Historically
|
|
|
|
* the body of libvirt.c handled the five Xen drivers,
|
|
|
|
* and contained Xen-specific code.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <unistd.h>
|
2007-06-15 15:24:20 +00:00
|
|
|
#include <string.h>
|
2007-06-26 11:42:46 +00:00
|
|
|
#include <errno.h>
|
2007-04-04 14:19:49 +00:00
|
|
|
#include <sys/types.h>
|
|
|
|
#include <xen/dom0_ops.h>
|
2007-06-20 10:01:14 +00:00
|
|
|
#include <libxml/uri.h>
|
2007-04-04 14:19:49 +00:00
|
|
|
|
|
|
|
#include "internal.h"
|
|
|
|
|
|
|
|
#include "xen_unified.h"
|
|
|
|
|
|
|
|
#include "xen_internal.h"
|
|
|
|
#include "proxy_internal.h"
|
|
|
|
#include "xend_internal.h"
|
|
|
|
#include "xs_internal.h"
|
|
|
|
#include "xm_internal.h"
|
2007-10-31 09:39:13 +00:00
|
|
|
#include "xml.h"
|
2008-02-26 07:05:18 +00:00
|
|
|
#include "util.h"
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2008-01-19 18:36:01 +00:00
|
|
|
#define DEBUG(fmt,...) VIR_DEBUG(__FILE__, fmt,__VA_ARGS__)
|
2008-03-17 17:30:48 +00:00
|
|
|
#define DEBUG0(msg) VIR_DEBUG(__FILE__, "%s", msg)
|
2008-01-19 18:36:01 +00:00
|
|
|
|
2007-10-22 20:28:55 +00:00
|
|
|
static int
|
|
|
|
xenUnifiedNodeGetInfo (virConnectPtr conn, virNodeInfoPtr info);
|
2007-10-31 09:39:13 +00:00
|
|
|
static int
|
|
|
|
xenUnifiedDomainGetMaxVcpus (virDomainPtr dom);
|
|
|
|
static int
|
|
|
|
xenUnifiedDomainGetVcpus (virDomainPtr dom,
|
|
|
|
virVcpuInfoPtr info, int maxinfo,
|
|
|
|
unsigned char *cpumaps, int maplen);
|
2007-10-22 20:28:55 +00:00
|
|
|
|
2007-04-04 14:19:49 +00:00
|
|
|
/* The five Xen drivers below us. */
|
Fri Jul 6 16:08:00 BST 2007 Richard W.M. Jones <rjones@redhat.com>
* src/proxy_internal.c, src/proxy_internal.h,
src.xen_internal.c, src/xen_internal.h,
src/xen_unified.c, src/xen_unified.h,
src/xend_internal.c, src/xend_internal.h,
src/xm_internal.c, src/xm_internal.h,
src/xs_internal.c, src/xs_internal.h: The interface
between xen_unified.c and its underlying driver now uses
a custom structure (struct xenUnifiedDriver) instead
of reusing virDriver.
* src/xen_unified.c: virDomainLookup* functions in Xen
now throw VIR_ERR_NO_DOMAIN if the domain does not exist.
* src/xs_internal.c: Fix indentation.
2007-07-06 15:11:22 +00:00
|
|
|
static struct xenUnifiedDriver *drivers[XEN_UNIFIED_NR_DRIVERS] = {
|
|
|
|
[XEN_UNIFIED_HYPERVISOR_OFFSET] = &xenHypervisorDriver,
|
|
|
|
[XEN_UNIFIED_PROXY_OFFSET] = &xenProxyDriver,
|
|
|
|
[XEN_UNIFIED_XEND_OFFSET] = &xenDaemonDriver,
|
|
|
|
[XEN_UNIFIED_XS_OFFSET] = &xenStoreDriver,
|
|
|
|
[XEN_UNIFIED_XM_OFFSET] = &xenXMDriver,
|
2007-04-04 14:19:49 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* xenUnifiedError:
|
|
|
|
* @conn: the connection
|
|
|
|
* @error: the error number
|
|
|
|
* @info: extra information string
|
|
|
|
*
|
|
|
|
* Handle an error at the xend daemon interface
|
|
|
|
*/
|
|
|
|
static void
|
|
|
|
xenUnifiedError (virConnectPtr conn, virErrorNumber error, const char *info)
|
|
|
|
{
|
|
|
|
const char *errmsg;
|
|
|
|
|
|
|
|
errmsg = __virErrorMsg (error, info);
|
|
|
|
__virRaiseError (conn, NULL, NULL, VIR_FROM_XEN, error, VIR_ERR_ERROR,
|
2007-04-10 11:17:34 +00:00
|
|
|
errmsg, info, NULL, 0, 0, errmsg, info);
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
2007-10-22 20:28:55 +00:00
|
|
|
/*
|
|
|
|
* Helper functions currently used in the NUMA code
|
2008-02-05 19:27:37 +00:00
|
|
|
* Those variables should not be accessed directly but through helper
|
|
|
|
* functions xenNbCells() and xenNbCpu() available to all Xen backends
|
2007-10-22 20:28:55 +00:00
|
|
|
*/
|
|
|
|
static int nbNodeCells = -1;
|
|
|
|
static int nbNodeCpus = -1;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* xenNumaInit:
|
|
|
|
* @conn: pointer to the hypervisor connection
|
|
|
|
*
|
|
|
|
* Initializer for previous variables. We currently assume that
|
2008-02-27 10:37:19 +00:00
|
|
|
* the number of physical CPU and the number of NUMA cell is fixed
|
2007-10-22 20:28:55 +00:00
|
|
|
* until reboot which might be false in future Xen implementations.
|
|
|
|
*/
|
|
|
|
static void
|
|
|
|
xenNumaInit(virConnectPtr conn) {
|
|
|
|
virNodeInfo nodeInfo;
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
ret = xenUnifiedNodeGetInfo(conn, &nodeInfo);
|
|
|
|
if (ret < 0)
|
|
|
|
return;
|
|
|
|
nbNodeCells = nodeInfo.nodes;
|
|
|
|
nbNodeCpus = nodeInfo.cpus;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* xenNbCells:
|
|
|
|
* @conn: pointer to the hypervisor connection
|
|
|
|
*
|
2008-02-27 10:37:19 +00:00
|
|
|
* Number of NUMA cells present in the actual Node
|
2007-10-22 20:28:55 +00:00
|
|
|
*
|
|
|
|
* Returns the number of NUMA cells available on that Node
|
|
|
|
*/
|
|
|
|
int xenNbCells(virConnectPtr conn) {
|
|
|
|
if (nbNodeCells < 0)
|
|
|
|
xenNumaInit(conn);
|
|
|
|
return(nbNodeCells);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* xenNbCpus:
|
|
|
|
* @conn: pointer to the hypervisor connection
|
|
|
|
*
|
2007-10-31 09:39:13 +00:00
|
|
|
* Number of CPUs present in the actual Node
|
2007-10-22 20:28:55 +00:00
|
|
|
*
|
2007-10-31 09:39:13 +00:00
|
|
|
* Returns the number of CPUs available on that Node
|
2007-10-22 20:28:55 +00:00
|
|
|
*/
|
|
|
|
int xenNbCpus(virConnectPtr conn) {
|
|
|
|
if (nbNodeCpus < 0)
|
|
|
|
xenNumaInit(conn);
|
|
|
|
return(nbNodeCpus);
|
|
|
|
}
|
|
|
|
|
2007-10-31 09:39:13 +00:00
|
|
|
/**
|
|
|
|
* xenDomainUsedCpus:
|
|
|
|
* @dom: the domain
|
|
|
|
*
|
|
|
|
* Analyze which set of CPUs are used by the domain and
|
|
|
|
* return a string providing the ranges.
|
|
|
|
*
|
|
|
|
* Returns the string which needs to be freed by the caller or
|
|
|
|
* NULL if the domain uses all CPU or in case of error.
|
|
|
|
*/
|
|
|
|
char *
|
|
|
|
xenDomainUsedCpus(virDomainPtr dom)
|
|
|
|
{
|
|
|
|
char *res = NULL;
|
|
|
|
int nb_cpu, ncpus;
|
|
|
|
int nb_vcpu;
|
|
|
|
char *cpulist = NULL;
|
|
|
|
unsigned char *cpumap = NULL;
|
|
|
|
size_t cpumaplen;
|
|
|
|
int nb = 0;
|
|
|
|
int n, m;
|
|
|
|
virVcpuInfoPtr cpuinfo = NULL;
|
|
|
|
virNodeInfo nodeinfo;
|
|
|
|
|
|
|
|
if (!VIR_IS_CONNECTED_DOMAIN(dom))
|
|
|
|
return (NULL);
|
|
|
|
|
|
|
|
nb_cpu = xenNbCpus(dom->conn);
|
|
|
|
if (nb_cpu <= 0)
|
|
|
|
return(NULL);
|
|
|
|
nb_vcpu = xenUnifiedDomainGetMaxVcpus(dom);
|
|
|
|
if (nb_vcpu <= 0)
|
|
|
|
return(NULL);
|
|
|
|
if (xenUnifiedNodeGetInfo(dom->conn, &nodeinfo) < 0)
|
|
|
|
return(NULL);
|
|
|
|
|
2007-12-11 21:57:29 +00:00
|
|
|
cpulist = calloc(nb_cpu, sizeof(*cpulist));
|
2007-10-31 09:39:13 +00:00
|
|
|
if (cpulist == NULL)
|
|
|
|
goto done;
|
2007-12-11 21:57:29 +00:00
|
|
|
cpuinfo = malloc(sizeof(*cpuinfo) * nb_vcpu);
|
2007-10-31 09:39:13 +00:00
|
|
|
if (cpuinfo == NULL)
|
|
|
|
goto done;
|
|
|
|
cpumaplen = VIR_CPU_MAPLEN(VIR_NODEINFO_MAXCPUS(nodeinfo));
|
|
|
|
cpumap = (unsigned char *) calloc(nb_vcpu, cpumaplen);
|
|
|
|
if (cpumap == NULL)
|
|
|
|
goto done;
|
|
|
|
|
|
|
|
if ((ncpus = xenUnifiedDomainGetVcpus(dom, cpuinfo, nb_vcpu,
|
|
|
|
cpumap, cpumaplen)) >= 0) {
|
|
|
|
for (n = 0 ; n < ncpus ; n++) {
|
|
|
|
for (m = 0 ; m < nb_cpu; m++) {
|
|
|
|
if ((cpulist[m] == 0) &&
|
|
|
|
(VIR_CPU_USABLE(cpumap, cpumaplen, n, m))) {
|
|
|
|
cpulist[m] = 1;
|
|
|
|
nb++;
|
|
|
|
/* if all CPU are used just return NULL */
|
2008-02-05 19:27:37 +00:00
|
|
|
if (nb == nb_cpu)
|
2007-10-31 09:39:13 +00:00
|
|
|
goto done;
|
2008-02-05 19:27:37 +00:00
|
|
|
|
2007-10-31 09:39:13 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
res = virSaveCpuSet(dom->conn, cpulist, nb_cpu);
|
|
|
|
}
|
|
|
|
|
|
|
|
done:
|
2008-01-29 17:41:07 +00:00
|
|
|
free(cpulist);
|
|
|
|
free(cpumap);
|
|
|
|
free(cpuinfo);
|
2007-10-31 09:39:13 +00:00
|
|
|
return(res);
|
|
|
|
}
|
|
|
|
|
2007-04-04 14:19:49 +00:00
|
|
|
/*----- Dispatch functions. -----*/
|
|
|
|
|
|
|
|
/* These dispatch functions follow the model used historically
|
|
|
|
* by libvirt.c -- trying each low-level Xen driver in turn
|
|
|
|
* until one succeeds. However since we know what low-level
|
|
|
|
* drivers can perform which functions, it is probably better
|
|
|
|
* in future to optimise these dispatch functions to just call
|
|
|
|
* the single function (or small number of appropriate functions)
|
|
|
|
* in the low level drivers directly.
|
|
|
|
*/
|
|
|
|
|
2008-02-26 07:05:18 +00:00
|
|
|
static const char *
|
|
|
|
xenUnifiedProbe (void)
|
|
|
|
{
|
|
|
|
#ifdef __linux__
|
|
|
|
if (virFileExists("/proc/xen"))
|
|
|
|
return("xen:///");
|
|
|
|
#endif
|
|
|
|
#ifdef __sun__
|
|
|
|
FILE *fh;
|
|
|
|
|
|
|
|
if (fh = fopen("/dev/xen/domcaps", "r")) {
|
|
|
|
fclose(fh);
|
|
|
|
return("xen:///");
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
return(NULL);
|
|
|
|
}
|
|
|
|
|
2007-04-04 14:19:49 +00:00
|
|
|
static int
|
2007-12-05 18:28:05 +00:00
|
|
|
xenUnifiedOpen (virConnectPtr conn, xmlURIPtr uri, virConnectAuthPtr auth, int flags)
|
2007-04-04 14:19:49 +00:00
|
|
|
{
|
2008-03-17 17:30:48 +00:00
|
|
|
int i;
|
2007-04-10 11:17:34 +00:00
|
|
|
xenUnifiedPrivatePtr priv;
|
2007-06-20 10:01:14 +00:00
|
|
|
|
2007-06-20 17:25:39 +00:00
|
|
|
/* Refuse any scheme which isn't "xen://" or "http://". */
|
2007-06-20 10:01:14 +00:00
|
|
|
if (uri->scheme &&
|
|
|
|
strcasecmp(uri->scheme, "xen") != 0 &&
|
2007-11-14 11:40:57 +00:00
|
|
|
strcasecmp(uri->scheme, "http") != 0)
|
2007-06-20 17:25:39 +00:00
|
|
|
return VIR_DRV_OPEN_DECLINED;
|
|
|
|
|
|
|
|
/* xmlParseURI will parse a naked string like "foo" as a URI with
|
|
|
|
* a NULL scheme. That's not useful for us because we want to only
|
|
|
|
* allow full pathnames (eg. ///var/lib/xen/xend-socket). Decline
|
|
|
|
* anything else.
|
|
|
|
*/
|
2007-11-14 11:40:57 +00:00
|
|
|
if (!uri->scheme && (!uri->path || uri->path[0] != '/'))
|
2007-04-10 11:17:34 +00:00
|
|
|
return VIR_DRV_OPEN_DECLINED;
|
2007-06-20 10:01:14 +00:00
|
|
|
|
|
|
|
/* Refuse any xen:// URI with a server specified - allow remote to do it */
|
2007-11-14 11:40:57 +00:00
|
|
|
if (uri->scheme && strcasecmp(uri->scheme, "xen") == 0 && uri->server)
|
2007-06-20 10:01:14 +00:00
|
|
|
return VIR_DRV_OPEN_DECLINED;
|
2007-04-10 11:17:34 +00:00
|
|
|
|
|
|
|
/* Allocate per-connection private data. */
|
2007-06-26 11:42:46 +00:00
|
|
|
priv = calloc (1, sizeof *priv);
|
2007-04-10 11:17:34 +00:00
|
|
|
if (!priv) {
|
2007-05-02 17:36:25 +00:00
|
|
|
xenUnifiedError (NULL, VIR_ERR_NO_MEMORY, "allocating private data");
|
2007-04-10 11:17:34 +00:00
|
|
|
return VIR_DRV_OPEN_ERROR;
|
|
|
|
}
|
|
|
|
conn->privateData = priv;
|
|
|
|
|
|
|
|
priv->handle = -1;
|
|
|
|
priv->xendConfigVersion = -1;
|
|
|
|
priv->type = -1;
|
|
|
|
priv->len = -1;
|
|
|
|
priv->addr = NULL;
|
|
|
|
priv->xshandle = NULL;
|
|
|
|
priv->proxy = -1;
|
|
|
|
|
|
|
|
|
2008-03-17 17:30:48 +00:00
|
|
|
/* Hypervisor is only run as root & required to succeed */
|
|
|
|
if (getuid() == 0) {
|
|
|
|
DEBUG0("Trying hypervisor sub-driver");
|
|
|
|
if (drivers[XEN_UNIFIED_HYPERVISOR_OFFSET]->open(conn, uri, auth, flags) ==
|
|
|
|
VIR_DRV_OPEN_SUCCESS) {
|
|
|
|
DEBUG0("Activated hypervisor sub-driver");
|
|
|
|
priv->opened[XEN_UNIFIED_HYPERVISOR_OFFSET] = 1;
|
2007-07-12 08:34:51 +00:00
|
|
|
}
|
2008-03-17 17:30:48 +00:00
|
|
|
}
|
2007-04-10 11:17:34 +00:00
|
|
|
|
2008-03-17 17:30:48 +00:00
|
|
|
/* XenD is required to suceed if root.
|
|
|
|
* If it fails as non-root, then the proxy driver may take over
|
|
|
|
*/
|
|
|
|
DEBUG0("Trying XenD sub-driver");
|
|
|
|
if (drivers[XEN_UNIFIED_XEND_OFFSET]->open(conn, uri, auth, flags) ==
|
|
|
|
VIR_DRV_OPEN_SUCCESS) {
|
|
|
|
DEBUG0("Activated XenD sub-driver");
|
|
|
|
priv->opened[XEN_UNIFIED_XEND_OFFSET] = 1;
|
|
|
|
|
|
|
|
/* XenD is active, so try the xm & xs drivers too, both requird to
|
|
|
|
* succeed if root, optional otherwise */
|
|
|
|
if (priv->xendConfigVersion <= 2) {
|
|
|
|
DEBUG0("Trying XM sub-driver");
|
|
|
|
if (drivers[XEN_UNIFIED_XM_OFFSET]->open(conn, uri, auth, flags) ==
|
|
|
|
VIR_DRV_OPEN_SUCCESS) {
|
|
|
|
DEBUG0("Activated XM sub-driver");
|
|
|
|
priv->opened[XEN_UNIFIED_XM_OFFSET] = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
DEBUG0("Trying XS sub-driver");
|
|
|
|
if (drivers[XEN_UNIFIED_XS_OFFSET]->open(conn, uri, auth, flags) ==
|
|
|
|
VIR_DRV_OPEN_SUCCESS) {
|
|
|
|
DEBUG0("Activated XS sub-driver");
|
|
|
|
priv->opened[XEN_UNIFIED_XS_OFFSET] = 1;
|
|
|
|
} else {
|
|
|
|
if (getuid() == 0)
|
|
|
|
goto fail; /* XS is mandatory as root */
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (getuid() == 0) {
|
|
|
|
goto fail; /* XenD is mandatory as root */
|
|
|
|
} else {
|
|
|
|
#if WITH_PROXY
|
|
|
|
DEBUG0("Trying proxy sub-driver");
|
|
|
|
if (drivers[XEN_UNIFIED_PROXY_OFFSET]->open(conn, uri, auth, flags) ==
|
|
|
|
VIR_DRV_OPEN_SUCCESS) {
|
|
|
|
DEBUG0("Activated proxy sub-driver");
|
|
|
|
priv->opened[XEN_UNIFIED_PROXY_OFFSET] = 1;
|
|
|
|
} else {
|
|
|
|
goto fail; /* Proxy is mandatory if XenD failed */
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
DEBUG0("Handing off for remote driver");
|
|
|
|
return VIR_DRV_OPEN_DECLINED; /* Let remote_driver try instead */
|
|
|
|
#endif
|
2007-04-10 11:17:34 +00:00
|
|
|
}
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
return VIR_DRV_OPEN_SUCCESS;
|
2008-03-17 17:30:48 +00:00
|
|
|
|
|
|
|
fail:
|
|
|
|
DEBUG0("Failed to activate a mandatory sub-driver");
|
|
|
|
for (i = 0 ; i < XEN_UNIFIED_NR_DRIVERS ; i++)
|
|
|
|
if (priv->opened[i]) drivers[i]->close(conn);
|
|
|
|
free(priv);
|
|
|
|
return VIR_DRV_OPEN_ERROR;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
2007-04-30 16:57:15 +00:00
|
|
|
#define GET_PRIVATE(conn) \
|
|
|
|
xenUnifiedPrivatePtr priv = (xenUnifiedPrivatePtr) (conn)->privateData
|
|
|
|
|
2007-04-04 14:19:49 +00:00
|
|
|
static int
|
|
|
|
xenUnifiedClose (virConnectPtr conn)
|
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(conn);
|
2007-04-10 11:17:34 +00:00
|
|
|
int i;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-30 16:57:15 +00:00
|
|
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
|
|
|
|
if (priv->opened[i] && drivers[i]->close)
|
2007-04-10 11:17:34 +00:00
|
|
|
(void) drivers[i]->close (conn);
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
free (conn->privateData);
|
|
|
|
conn->privateData = NULL;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
return 0;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static const char *
|
|
|
|
xenUnifiedType (virConnectPtr conn)
|
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(conn);
|
2007-04-10 11:17:34 +00:00
|
|
|
int i;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-30 16:57:15 +00:00
|
|
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
|
2007-12-03 09:34:38 +00:00
|
|
|
if (priv->opened[i])
|
|
|
|
return "Xen";
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
return NULL;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
2007-08-21 09:31:12 +00:00
|
|
|
/* Which features are supported by this driver? */
|
|
|
|
static int
|
|
|
|
xenUnifiedSupportsFeature (virConnectPtr conn ATTRIBUTE_UNUSED, int feature)
|
|
|
|
{
|
|
|
|
switch (feature) {
|
|
|
|
case VIR_DRV_FEATURE_MIGRATION_V1: return 1;
|
|
|
|
default: return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-04-04 14:19:49 +00:00
|
|
|
static int
|
|
|
|
xenUnifiedVersion (virConnectPtr conn, unsigned long *hvVer)
|
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(conn);
|
2007-04-10 11:17:34 +00:00
|
|
|
int i;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-30 16:57:15 +00:00
|
|
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
|
|
|
|
if (priv->opened[i] &&
|
|
|
|
drivers[i]->version &&
|
2007-04-10 11:17:34 +00:00
|
|
|
drivers[i]->version (conn, hvVer) == 0)
|
|
|
|
return 0;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
return -1;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
2007-06-26 11:42:46 +00:00
|
|
|
/* NB: Even if connected to the proxy, we're still on the
|
|
|
|
* same machine.
|
|
|
|
*/
|
|
|
|
static char *
|
|
|
|
xenUnifiedGetHostname (virConnectPtr conn)
|
|
|
|
{
|
|
|
|
int r;
|
|
|
|
char hostname [HOST_NAME_MAX+1], *str;
|
|
|
|
|
|
|
|
r = gethostname (hostname, HOST_NAME_MAX+1);
|
|
|
|
if (r == -1) {
|
|
|
|
xenUnifiedError (conn, VIR_ERR_SYSTEM_ERROR, strerror (errno));
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
str = strdup (hostname);
|
|
|
|
if (str == NULL) {
|
|
|
|
xenUnifiedError (conn, VIR_ERR_SYSTEM_ERROR, strerror (errno));
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
return str;
|
|
|
|
}
|
|
|
|
|
2007-04-04 14:19:49 +00:00
|
|
|
static int
|
|
|
|
xenUnifiedGetMaxVcpus (virConnectPtr conn, const char *type)
|
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(conn);
|
2007-04-04 14:19:49 +00:00
|
|
|
|
Fri Jul 6 16:08:00 BST 2007 Richard W.M. Jones <rjones@redhat.com>
* src/proxy_internal.c, src/proxy_internal.h,
src.xen_internal.c, src/xen_internal.h,
src/xen_unified.c, src/xen_unified.h,
src/xend_internal.c, src/xend_internal.h,
src/xm_internal.c, src/xm_internal.h,
src/xs_internal.c, src/xs_internal.h: The interface
between xen_unified.c and its underlying driver now uses
a custom structure (struct xenUnifiedDriver) instead
of reusing virDriver.
* src/xen_unified.c: virDomainLookup* functions in Xen
now throw VIR_ERR_NO_DOMAIN if the domain does not exist.
* src/xs_internal.c: Fix indentation.
2007-07-06 15:11:22 +00:00
|
|
|
if (type && STRCASENEQ (type, "Xen")) {
|
|
|
|
xenUnifiedError (conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
|
|
|
|
return -1;
|
|
|
|
}
|
2007-04-04 14:19:49 +00:00
|
|
|
|
Fri Jul 6 16:08:00 BST 2007 Richard W.M. Jones <rjones@redhat.com>
* src/proxy_internal.c, src/proxy_internal.h,
src.xen_internal.c, src/xen_internal.h,
src/xen_unified.c, src/xen_unified.h,
src/xend_internal.c, src/xend_internal.h,
src/xm_internal.c, src/xm_internal.h,
src/xs_internal.c, src/xs_internal.h: The interface
between xen_unified.c and its underlying driver now uses
a custom structure (struct xenUnifiedDriver) instead
of reusing virDriver.
* src/xen_unified.c: virDomainLookup* functions in Xen
now throw VIR_ERR_NO_DOMAIN if the domain does not exist.
* src/xs_internal.c: Fix indentation.
2007-07-06 15:11:22 +00:00
|
|
|
if (priv->opened[XEN_UNIFIED_HYPERVISOR_OFFSET])
|
|
|
|
return xenHypervisorGetMaxVcpus (conn, type);
|
|
|
|
else {
|
|
|
|
xenUnifiedError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
|
|
|
|
return -1;
|
|
|
|
}
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
xenUnifiedNodeGetInfo (virConnectPtr conn, virNodeInfoPtr info)
|
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(conn);
|
2007-04-10 11:17:34 +00:00
|
|
|
int i;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-30 16:57:15 +00:00
|
|
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
|
|
|
|
if (priv->opened[i] &&
|
|
|
|
drivers[i]->nodeGetInfo &&
|
2007-04-10 11:17:34 +00:00
|
|
|
drivers[i]->nodeGetInfo (conn, info) == 0)
|
|
|
|
return 0;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
return -1;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static char *
|
|
|
|
xenUnifiedGetCapabilities (virConnectPtr conn)
|
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(conn);
|
2007-04-10 11:17:34 +00:00
|
|
|
int i;
|
|
|
|
char *ret;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-30 16:57:15 +00:00
|
|
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
|
|
|
|
if (priv->opened[i] && drivers[i]->getCapabilities) {
|
2007-04-10 11:17:34 +00:00
|
|
|
ret = drivers[i]->getCapabilities (conn);
|
|
|
|
if (ret) return ret;
|
|
|
|
}
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
return NULL;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
xenUnifiedListDomains (virConnectPtr conn, int *ids, int maxids)
|
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(conn);
|
2007-04-10 11:17:34 +00:00
|
|
|
int i, ret;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-30 16:57:15 +00:00
|
|
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
|
|
|
|
if (priv->opened[i] && drivers[i]->listDomains) {
|
2007-04-10 11:17:34 +00:00
|
|
|
ret = drivers[i]->listDomains (conn, ids, maxids);
|
|
|
|
if (ret >= 0) return ret;
|
|
|
|
}
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
return -1;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
xenUnifiedNumOfDomains (virConnectPtr conn)
|
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(conn);
|
2007-04-10 11:17:34 +00:00
|
|
|
int i, ret;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-30 16:57:15 +00:00
|
|
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
|
|
|
|
if (priv->opened[i] && drivers[i]->numOfDomains) {
|
2007-04-10 11:17:34 +00:00
|
|
|
ret = drivers[i]->numOfDomains (conn);
|
|
|
|
if (ret >= 0) return ret;
|
|
|
|
}
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
return -1;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static virDomainPtr
|
|
|
|
xenUnifiedDomainCreateLinux (virConnectPtr conn,
|
2007-04-10 11:17:34 +00:00
|
|
|
const char *xmlDesc, unsigned int flags)
|
2007-04-04 14:19:49 +00:00
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(conn);
|
2007-04-10 11:17:34 +00:00
|
|
|
int i;
|
|
|
|
virDomainPtr ret;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-30 16:57:15 +00:00
|
|
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
|
|
|
|
if (priv->opened[i] && drivers[i]->domainCreateLinux) {
|
2007-04-10 11:17:34 +00:00
|
|
|
ret = drivers[i]->domainCreateLinux (conn, xmlDesc, flags);
|
|
|
|
if (ret) return ret;
|
|
|
|
}
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
return NULL;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
Fri Jul 6 16:08:00 BST 2007 Richard W.M. Jones <rjones@redhat.com>
* src/proxy_internal.c, src/proxy_internal.h,
src.xen_internal.c, src/xen_internal.h,
src/xen_unified.c, src/xen_unified.h,
src/xend_internal.c, src/xend_internal.h,
src/xm_internal.c, src/xm_internal.h,
src/xs_internal.c, src/xs_internal.h: The interface
between xen_unified.c and its underlying driver now uses
a custom structure (struct xenUnifiedDriver) instead
of reusing virDriver.
* src/xen_unified.c: virDomainLookup* functions in Xen
now throw VIR_ERR_NO_DOMAIN if the domain does not exist.
* src/xs_internal.c: Fix indentation.
2007-07-06 15:11:22 +00:00
|
|
|
/* Assumption made in underlying drivers:
|
|
|
|
* If the domain is "not found" and there is no other error, then
|
|
|
|
* the Lookup* functions return a NULL but do not set virterror.
|
|
|
|
*/
|
2007-04-04 14:19:49 +00:00
|
|
|
static virDomainPtr
|
|
|
|
xenUnifiedDomainLookupByID (virConnectPtr conn, int id)
|
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(conn);
|
2007-04-10 11:17:34 +00:00
|
|
|
virDomainPtr ret;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
Fri Jul 6 16:08:00 BST 2007 Richard W.M. Jones <rjones@redhat.com>
* src/proxy_internal.c, src/proxy_internal.h,
src.xen_internal.c, src/xen_internal.h,
src/xen_unified.c, src/xen_unified.h,
src/xend_internal.c, src/xend_internal.h,
src/xm_internal.c, src/xm_internal.h,
src/xs_internal.c, src/xs_internal.h: The interface
between xen_unified.c and its underlying driver now uses
a custom structure (struct xenUnifiedDriver) instead
of reusing virDriver.
* src/xen_unified.c: virDomainLookup* functions in Xen
now throw VIR_ERR_NO_DOMAIN if the domain does not exist.
* src/xs_internal.c: Fix indentation.
2007-07-06 15:11:22 +00:00
|
|
|
/* Reset any connection-level errors in virterror first, in case
|
|
|
|
* there is one hanging around from a previous call.
|
|
|
|
*/
|
|
|
|
virConnResetLastError (conn);
|
|
|
|
|
2007-08-10 18:25:15 +00:00
|
|
|
/* Try hypervisor/xenstore combo. */
|
|
|
|
if (priv->opened[XEN_UNIFIED_HYPERVISOR_OFFSET]) {
|
|
|
|
ret = xenHypervisorLookupDomainByID (conn, id);
|
|
|
|
if (ret || conn->err.code != VIR_ERR_OK)
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
Fri Jul 6 16:08:00 BST 2007 Richard W.M. Jones <rjones@redhat.com>
* src/proxy_internal.c, src/proxy_internal.h,
src.xen_internal.c, src/xen_internal.h,
src/xen_unified.c, src/xen_unified.h,
src/xend_internal.c, src/xend_internal.h,
src/xm_internal.c, src/xm_internal.h,
src/xs_internal.c, src/xs_internal.h: The interface
between xen_unified.c and its underlying driver now uses
a custom structure (struct xenUnifiedDriver) instead
of reusing virDriver.
* src/xen_unified.c: virDomainLookup* functions in Xen
now throw VIR_ERR_NO_DOMAIN if the domain does not exist.
* src/xs_internal.c: Fix indentation.
2007-07-06 15:11:22 +00:00
|
|
|
/* Try proxy. */
|
|
|
|
if (priv->opened[XEN_UNIFIED_PROXY_OFFSET]) {
|
|
|
|
ret = xenProxyLookupByID (conn, id);
|
|
|
|
if (ret || conn->err.code != VIR_ERR_OK)
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Try xend. */
|
|
|
|
if (priv->opened[XEN_UNIFIED_XEND_OFFSET]) {
|
|
|
|
ret = xenDaemonLookupByID (conn, id);
|
|
|
|
if (ret || conn->err.code != VIR_ERR_OK)
|
|
|
|
return ret;
|
|
|
|
}
|
2007-04-04 14:19:49 +00:00
|
|
|
|
Fri Jul 6 16:08:00 BST 2007 Richard W.M. Jones <rjones@redhat.com>
* src/proxy_internal.c, src/proxy_internal.h,
src.xen_internal.c, src/xen_internal.h,
src/xen_unified.c, src/xen_unified.h,
src/xend_internal.c, src/xend_internal.h,
src/xm_internal.c, src/xm_internal.h,
src/xs_internal.c, src/xs_internal.h: The interface
between xen_unified.c and its underlying driver now uses
a custom structure (struct xenUnifiedDriver) instead
of reusing virDriver.
* src/xen_unified.c: virDomainLookup* functions in Xen
now throw VIR_ERR_NO_DOMAIN if the domain does not exist.
* src/xs_internal.c: Fix indentation.
2007-07-06 15:11:22 +00:00
|
|
|
/* Not found. */
|
|
|
|
xenUnifiedError (conn, VIR_ERR_NO_DOMAIN, __FUNCTION__);
|
2007-04-10 11:17:34 +00:00
|
|
|
return NULL;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static virDomainPtr
|
|
|
|
xenUnifiedDomainLookupByUUID (virConnectPtr conn,
|
2007-04-10 11:17:34 +00:00
|
|
|
const unsigned char *uuid)
|
2007-04-04 14:19:49 +00:00
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(conn);
|
2007-04-10 11:17:34 +00:00
|
|
|
virDomainPtr ret;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
Fri Jul 6 16:08:00 BST 2007 Richard W.M. Jones <rjones@redhat.com>
* src/proxy_internal.c, src/proxy_internal.h,
src.xen_internal.c, src/xen_internal.h,
src/xen_unified.c, src/xen_unified.h,
src/xend_internal.c, src/xend_internal.h,
src/xm_internal.c, src/xm_internal.h,
src/xs_internal.c, src/xs_internal.h: The interface
between xen_unified.c and its underlying driver now uses
a custom structure (struct xenUnifiedDriver) instead
of reusing virDriver.
* src/xen_unified.c: virDomainLookup* functions in Xen
now throw VIR_ERR_NO_DOMAIN if the domain does not exist.
* src/xs_internal.c: Fix indentation.
2007-07-06 15:11:22 +00:00
|
|
|
/* Reset any connection-level errors in virterror first, in case
|
|
|
|
* there is one hanging around from a previous call.
|
|
|
|
*/
|
|
|
|
virConnResetLastError (conn);
|
|
|
|
|
2007-08-10 18:25:15 +00:00
|
|
|
/* Try hypervisor/xenstore combo. */
|
|
|
|
if (priv->opened[XEN_UNIFIED_HYPERVISOR_OFFSET]) {
|
|
|
|
ret = xenHypervisorLookupDomainByUUID (conn, uuid);
|
|
|
|
if (ret || conn->err.code != VIR_ERR_OK)
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
Fri Jul 6 16:08:00 BST 2007 Richard W.M. Jones <rjones@redhat.com>
* src/proxy_internal.c, src/proxy_internal.h,
src.xen_internal.c, src/xen_internal.h,
src/xen_unified.c, src/xen_unified.h,
src/xend_internal.c, src/xend_internal.h,
src/xm_internal.c, src/xm_internal.h,
src/xs_internal.c, src/xs_internal.h: The interface
between xen_unified.c and its underlying driver now uses
a custom structure (struct xenUnifiedDriver) instead
of reusing virDriver.
* src/xen_unified.c: virDomainLookup* functions in Xen
now throw VIR_ERR_NO_DOMAIN if the domain does not exist.
* src/xs_internal.c: Fix indentation.
2007-07-06 15:11:22 +00:00
|
|
|
/* Try proxy. */
|
|
|
|
if (priv->opened[XEN_UNIFIED_PROXY_OFFSET]) {
|
|
|
|
ret = xenProxyLookupByUUID (conn, uuid);
|
|
|
|
if (ret || conn->err.code != VIR_ERR_OK)
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Try xend. */
|
|
|
|
if (priv->opened[XEN_UNIFIED_XEND_OFFSET]) {
|
|
|
|
ret = xenDaemonLookupByUUID (conn, uuid);
|
|
|
|
if (ret || conn->err.code != VIR_ERR_OK)
|
|
|
|
return ret;
|
|
|
|
}
|
2007-04-04 14:19:49 +00:00
|
|
|
|
Fri Jul 6 16:08:00 BST 2007 Richard W.M. Jones <rjones@redhat.com>
* src/proxy_internal.c, src/proxy_internal.h,
src.xen_internal.c, src/xen_internal.h,
src/xen_unified.c, src/xen_unified.h,
src/xend_internal.c, src/xend_internal.h,
src/xm_internal.c, src/xm_internal.h,
src/xs_internal.c, src/xs_internal.h: The interface
between xen_unified.c and its underlying driver now uses
a custom structure (struct xenUnifiedDriver) instead
of reusing virDriver.
* src/xen_unified.c: virDomainLookup* functions in Xen
now throw VIR_ERR_NO_DOMAIN if the domain does not exist.
* src/xs_internal.c: Fix indentation.
2007-07-06 15:11:22 +00:00
|
|
|
/* Try XM for inactive domains. */
|
|
|
|
if (priv->opened[XEN_UNIFIED_XM_OFFSET]) {
|
|
|
|
ret = xenXMDomainLookupByUUID (conn, uuid);
|
|
|
|
if (ret || conn->err.code != VIR_ERR_OK)
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Not found. */
|
|
|
|
xenUnifiedError (conn, VIR_ERR_NO_DOMAIN, __FUNCTION__);
|
2007-04-10 11:17:34 +00:00
|
|
|
return NULL;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static virDomainPtr
|
|
|
|
xenUnifiedDomainLookupByName (virConnectPtr conn,
|
2007-04-10 11:17:34 +00:00
|
|
|
const char *name)
|
2007-04-04 14:19:49 +00:00
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(conn);
|
2007-04-10 11:17:34 +00:00
|
|
|
virDomainPtr ret;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
Fri Jul 6 16:08:00 BST 2007 Richard W.M. Jones <rjones@redhat.com>
* src/proxy_internal.c, src/proxy_internal.h,
src.xen_internal.c, src/xen_internal.h,
src/xen_unified.c, src/xen_unified.h,
src/xend_internal.c, src/xend_internal.h,
src/xm_internal.c, src/xm_internal.h,
src/xs_internal.c, src/xs_internal.h: The interface
between xen_unified.c and its underlying driver now uses
a custom structure (struct xenUnifiedDriver) instead
of reusing virDriver.
* src/xen_unified.c: virDomainLookup* functions in Xen
now throw VIR_ERR_NO_DOMAIN if the domain does not exist.
* src/xs_internal.c: Fix indentation.
2007-07-06 15:11:22 +00:00
|
|
|
/* Reset any connection-level errors in virterror first, in case
|
|
|
|
* there is one hanging around from a previous call.
|
|
|
|
*/
|
|
|
|
virConnResetLastError (conn);
|
|
|
|
|
|
|
|
/* Try proxy. */
|
|
|
|
if (priv->opened[XEN_UNIFIED_PROXY_OFFSET]) {
|
|
|
|
ret = xenProxyLookupByName (conn, name);
|
|
|
|
if (ret || conn->err.code != VIR_ERR_OK)
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Try xend. */
|
|
|
|
if (priv->opened[XEN_UNIFIED_XEND_OFFSET]) {
|
|
|
|
ret = xenDaemonLookupByName (conn, name);
|
|
|
|
if (ret || conn->err.code != VIR_ERR_OK)
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Try xenstore for inactive domains. */
|
|
|
|
if (priv->opened[XEN_UNIFIED_XS_OFFSET]) {
|
|
|
|
ret = xenStoreLookupByName (conn, name);
|
|
|
|
if (ret || conn->err.code != VIR_ERR_OK)
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Try XM for inactive domains. */
|
|
|
|
if (priv->opened[XEN_UNIFIED_XM_OFFSET]) {
|
|
|
|
ret = xenXMDomainLookupByName (conn, name);
|
|
|
|
if (ret || conn->err.code != VIR_ERR_OK)
|
|
|
|
return ret;
|
|
|
|
}
|
2007-04-04 14:19:49 +00:00
|
|
|
|
Fri Jul 6 16:08:00 BST 2007 Richard W.M. Jones <rjones@redhat.com>
* src/proxy_internal.c, src/proxy_internal.h,
src.xen_internal.c, src/xen_internal.h,
src/xen_unified.c, src/xen_unified.h,
src/xend_internal.c, src/xend_internal.h,
src/xm_internal.c, src/xm_internal.h,
src/xs_internal.c, src/xs_internal.h: The interface
between xen_unified.c and its underlying driver now uses
a custom structure (struct xenUnifiedDriver) instead
of reusing virDriver.
* src/xen_unified.c: virDomainLookup* functions in Xen
now throw VIR_ERR_NO_DOMAIN if the domain does not exist.
* src/xs_internal.c: Fix indentation.
2007-07-06 15:11:22 +00:00
|
|
|
/* Not found. */
|
|
|
|
xenUnifiedError (conn, VIR_ERR_NO_DOMAIN, __FUNCTION__);
|
2007-04-10 11:17:34 +00:00
|
|
|
return NULL;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
xenUnifiedDomainSuspend (virDomainPtr dom)
|
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(dom->conn);
|
2007-04-10 11:17:34 +00:00
|
|
|
int i;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
/* Try non-hypervisor methods first, then hypervisor direct method
|
|
|
|
* as a last resort.
|
|
|
|
*/
|
2007-04-30 16:57:15 +00:00
|
|
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
|
Fri Jul 6 16:08:00 BST 2007 Richard W.M. Jones <rjones@redhat.com>
* src/proxy_internal.c, src/proxy_internal.h,
src.xen_internal.c, src/xen_internal.h,
src/xen_unified.c, src/xen_unified.h,
src/xend_internal.c, src/xend_internal.h,
src/xm_internal.c, src/xm_internal.h,
src/xs_internal.c, src/xs_internal.h: The interface
between xen_unified.c and its underlying driver now uses
a custom structure (struct xenUnifiedDriver) instead
of reusing virDriver.
* src/xen_unified.c: virDomainLookup* functions in Xen
now throw VIR_ERR_NO_DOMAIN if the domain does not exist.
* src/xs_internal.c: Fix indentation.
2007-07-06 15:11:22 +00:00
|
|
|
if (i != XEN_UNIFIED_HYPERVISOR_OFFSET &&
|
2007-04-30 16:57:15 +00:00
|
|
|
priv->opened[i] &&
|
2007-04-10 11:17:34 +00:00
|
|
|
drivers[i]->domainSuspend &&
|
|
|
|
drivers[i]->domainSuspend (dom) == 0)
|
|
|
|
return 0;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
Fri Jul 6 16:08:00 BST 2007 Richard W.M. Jones <rjones@redhat.com>
* src/proxy_internal.c, src/proxy_internal.h,
src.xen_internal.c, src/xen_internal.h,
src/xen_unified.c, src/xen_unified.h,
src/xend_internal.c, src/xend_internal.h,
src/xm_internal.c, src/xm_internal.h,
src/xs_internal.c, src/xs_internal.h: The interface
between xen_unified.c and its underlying driver now uses
a custom structure (struct xenUnifiedDriver) instead
of reusing virDriver.
* src/xen_unified.c: virDomainLookup* functions in Xen
now throw VIR_ERR_NO_DOMAIN if the domain does not exist.
* src/xs_internal.c: Fix indentation.
2007-07-06 15:11:22 +00:00
|
|
|
if (priv->opened[XEN_UNIFIED_HYPERVISOR_OFFSET] &&
|
|
|
|
drivers[XEN_UNIFIED_HYPERVISOR_OFFSET]->domainSuspend &&
|
|
|
|
drivers[XEN_UNIFIED_HYPERVISOR_OFFSET]->domainSuspend (dom) == 0)
|
2007-04-10 11:17:34 +00:00
|
|
|
return 0;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
return -1;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
xenUnifiedDomainResume (virDomainPtr dom)
|
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(dom->conn);
|
2007-04-10 11:17:34 +00:00
|
|
|
int i;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
/* Try non-hypervisor methods first, then hypervisor direct method
|
|
|
|
* as a last resort.
|
|
|
|
*/
|
2007-04-30 16:57:15 +00:00
|
|
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
|
Fri Jul 6 16:08:00 BST 2007 Richard W.M. Jones <rjones@redhat.com>
* src/proxy_internal.c, src/proxy_internal.h,
src.xen_internal.c, src/xen_internal.h,
src/xen_unified.c, src/xen_unified.h,
src/xend_internal.c, src/xend_internal.h,
src/xm_internal.c, src/xm_internal.h,
src/xs_internal.c, src/xs_internal.h: The interface
between xen_unified.c and its underlying driver now uses
a custom structure (struct xenUnifiedDriver) instead
of reusing virDriver.
* src/xen_unified.c: virDomainLookup* functions in Xen
now throw VIR_ERR_NO_DOMAIN if the domain does not exist.
* src/xs_internal.c: Fix indentation.
2007-07-06 15:11:22 +00:00
|
|
|
if (i != XEN_UNIFIED_HYPERVISOR_OFFSET &&
|
2007-04-30 16:57:15 +00:00
|
|
|
priv->opened[i] &&
|
2007-04-10 11:17:34 +00:00
|
|
|
drivers[i]->domainResume &&
|
|
|
|
drivers[i]->domainResume (dom) == 0)
|
|
|
|
return 0;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
Fri Jul 6 16:08:00 BST 2007 Richard W.M. Jones <rjones@redhat.com>
* src/proxy_internal.c, src/proxy_internal.h,
src.xen_internal.c, src/xen_internal.h,
src/xen_unified.c, src/xen_unified.h,
src/xend_internal.c, src/xend_internal.h,
src/xm_internal.c, src/xm_internal.h,
src/xs_internal.c, src/xs_internal.h: The interface
between xen_unified.c and its underlying driver now uses
a custom structure (struct xenUnifiedDriver) instead
of reusing virDriver.
* src/xen_unified.c: virDomainLookup* functions in Xen
now throw VIR_ERR_NO_DOMAIN if the domain does not exist.
* src/xs_internal.c: Fix indentation.
2007-07-06 15:11:22 +00:00
|
|
|
if (priv->opened[XEN_UNIFIED_HYPERVISOR_OFFSET] &&
|
|
|
|
drivers[XEN_UNIFIED_HYPERVISOR_OFFSET]->domainResume &&
|
|
|
|
drivers[XEN_UNIFIED_HYPERVISOR_OFFSET]->domainResume (dom) == 0)
|
2007-04-10 11:17:34 +00:00
|
|
|
return 0;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
return -1;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
xenUnifiedDomainShutdown (virDomainPtr dom)
|
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(dom->conn);
|
2007-04-10 11:17:34 +00:00
|
|
|
int i;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-30 16:57:15 +00:00
|
|
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
|
|
|
|
if (priv->opened[i] &&
|
|
|
|
drivers[i]->domainShutdown &&
|
2007-04-10 11:17:34 +00:00
|
|
|
drivers[i]->domainShutdown (dom) == 0)
|
|
|
|
return 0;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
return -1;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
xenUnifiedDomainReboot (virDomainPtr dom, unsigned int flags)
|
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(dom->conn);
|
2007-04-10 11:17:34 +00:00
|
|
|
int i;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-30 16:57:15 +00:00
|
|
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
|
|
|
|
if (priv->opened[i] &&
|
|
|
|
drivers[i]->domainReboot &&
|
2007-04-10 11:17:34 +00:00
|
|
|
drivers[i]->domainReboot (dom, flags) == 0)
|
|
|
|
return 0;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
return -1;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
xenUnifiedDomainDestroy (virDomainPtr dom)
|
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(dom->conn);
|
2007-04-10 11:17:34 +00:00
|
|
|
int i;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
/* Try non-hypervisor methods first, then hypervisor direct method
|
|
|
|
* as a last resort.
|
|
|
|
*/
|
2007-04-30 16:57:15 +00:00
|
|
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
|
Fri Jul 6 16:08:00 BST 2007 Richard W.M. Jones <rjones@redhat.com>
* src/proxy_internal.c, src/proxy_internal.h,
src.xen_internal.c, src/xen_internal.h,
src/xen_unified.c, src/xen_unified.h,
src/xend_internal.c, src/xend_internal.h,
src/xm_internal.c, src/xm_internal.h,
src/xs_internal.c, src/xs_internal.h: The interface
between xen_unified.c and its underlying driver now uses
a custom structure (struct xenUnifiedDriver) instead
of reusing virDriver.
* src/xen_unified.c: virDomainLookup* functions in Xen
now throw VIR_ERR_NO_DOMAIN if the domain does not exist.
* src/xs_internal.c: Fix indentation.
2007-07-06 15:11:22 +00:00
|
|
|
if (i != XEN_UNIFIED_HYPERVISOR_OFFSET &&
|
2007-04-30 16:57:15 +00:00
|
|
|
priv->opened[i] &&
|
2007-04-10 11:17:34 +00:00
|
|
|
drivers[i]->domainDestroy &&
|
|
|
|
drivers[i]->domainDestroy (dom) == 0)
|
|
|
|
return 0;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2008-02-07 09:37:10 +00:00
|
|
|
if (priv->opened[XEN_UNIFIED_HYPERVISOR_OFFSET] &&
|
Fri Jul 6 16:08:00 BST 2007 Richard W.M. Jones <rjones@redhat.com>
* src/proxy_internal.c, src/proxy_internal.h,
src.xen_internal.c, src/xen_internal.h,
src/xen_unified.c, src/xen_unified.h,
src/xend_internal.c, src/xend_internal.h,
src/xm_internal.c, src/xm_internal.h,
src/xs_internal.c, src/xs_internal.h: The interface
between xen_unified.c and its underlying driver now uses
a custom structure (struct xenUnifiedDriver) instead
of reusing virDriver.
* src/xen_unified.c: virDomainLookup* functions in Xen
now throw VIR_ERR_NO_DOMAIN if the domain does not exist.
* src/xs_internal.c: Fix indentation.
2007-07-06 15:11:22 +00:00
|
|
|
drivers[XEN_UNIFIED_HYPERVISOR_OFFSET]->domainDestroy &&
|
|
|
|
drivers[XEN_UNIFIED_HYPERVISOR_OFFSET]->domainDestroy (dom) == 0)
|
2007-04-10 11:17:34 +00:00
|
|
|
return 0;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
return -1;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static char *
|
|
|
|
xenUnifiedDomainGetOSType (virDomainPtr dom)
|
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(dom->conn);
|
2007-04-10 11:17:34 +00:00
|
|
|
int i;
|
|
|
|
char *ret;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-30 16:57:15 +00:00
|
|
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
|
|
|
|
if (priv->opened[i] && drivers[i]->domainGetOSType) {
|
2007-04-10 11:17:34 +00:00
|
|
|
ret = drivers[i]->domainGetOSType (dom);
|
|
|
|
if (ret) return ret;
|
|
|
|
}
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
return NULL;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static unsigned long
|
|
|
|
xenUnifiedDomainGetMaxMemory (virDomainPtr dom)
|
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(dom->conn);
|
2007-04-10 11:17:34 +00:00
|
|
|
int i;
|
|
|
|
unsigned long ret;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-30 16:57:15 +00:00
|
|
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
|
|
|
|
if (priv->opened[i] && drivers[i]->domainGetMaxMemory) {
|
2007-04-10 11:17:34 +00:00
|
|
|
ret = drivers[i]->domainGetMaxMemory (dom);
|
|
|
|
if (ret != 0) return ret;
|
|
|
|
}
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
return 0;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
xenUnifiedDomainSetMaxMemory (virDomainPtr dom, unsigned long memory)
|
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(dom->conn);
|
2007-04-10 11:17:34 +00:00
|
|
|
int i;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-30 16:57:15 +00:00
|
|
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
|
|
|
|
if (priv->opened[i] &&
|
|
|
|
drivers[i]->domainSetMaxMemory &&
|
2007-04-10 11:17:34 +00:00
|
|
|
drivers[i]->domainSetMaxMemory (dom, memory) == 0)
|
|
|
|
return 0;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
return -1;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
xenUnifiedDomainSetMemory (virDomainPtr dom, unsigned long memory)
|
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(dom->conn);
|
2007-04-10 11:17:34 +00:00
|
|
|
int i;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-30 16:57:15 +00:00
|
|
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
|
|
|
|
if (priv->opened[i] &&
|
|
|
|
drivers[i]->domainSetMemory &&
|
2007-04-10 11:17:34 +00:00
|
|
|
drivers[i]->domainSetMemory (dom, memory) == 0)
|
|
|
|
return 0;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
return -1;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
xenUnifiedDomainGetInfo (virDomainPtr dom, virDomainInfoPtr info)
|
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(dom->conn);
|
2007-04-10 11:17:34 +00:00
|
|
|
int i;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-30 16:57:15 +00:00
|
|
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
|
|
|
|
if (priv->opened[i] &&
|
|
|
|
drivers[i]->domainGetInfo &&
|
2007-04-10 11:17:34 +00:00
|
|
|
drivers[i]->domainGetInfo (dom, info) == 0)
|
|
|
|
return 0;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
return -1;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
xenUnifiedDomainSave (virDomainPtr dom, const char *to)
|
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(dom->conn);
|
2007-04-10 11:17:34 +00:00
|
|
|
int i;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-30 16:57:15 +00:00
|
|
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
|
|
|
|
if (priv->opened[i] &&
|
|
|
|
drivers[i]->domainSave &&
|
2007-04-10 11:17:34 +00:00
|
|
|
drivers[i]->domainSave (dom, to) == 0)
|
|
|
|
return 0;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
return -1;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
xenUnifiedDomainRestore (virConnectPtr conn, const char *from)
|
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(conn);
|
2007-04-10 11:17:34 +00:00
|
|
|
int i;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-30 16:57:15 +00:00
|
|
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
|
|
|
|
if (priv->opened[i] &&
|
|
|
|
drivers[i]->domainRestore &&
|
2007-04-10 11:17:34 +00:00
|
|
|
drivers[i]->domainRestore (conn, from) == 0)
|
|
|
|
return 0;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
return -1;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
xenUnifiedDomainCoreDump (virDomainPtr dom, const char *to, int flags)
|
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(dom->conn);
|
2007-04-10 11:17:34 +00:00
|
|
|
int i;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-30 16:57:15 +00:00
|
|
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
|
|
|
|
if (priv->opened[i] &&
|
|
|
|
drivers[i]->domainCoreDump &&
|
2007-04-10 11:17:34 +00:00
|
|
|
drivers[i]->domainCoreDump (dom, to, flags) == 0)
|
|
|
|
return 0;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
return -1;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
xenUnifiedDomainSetVcpus (virDomainPtr dom, unsigned int nvcpus)
|
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(dom->conn);
|
2007-04-10 11:17:34 +00:00
|
|
|
int i;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
/* Try non-hypervisor methods first, then hypervisor direct method
|
|
|
|
* as a last resort.
|
|
|
|
*/
|
2007-04-30 16:57:15 +00:00
|
|
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
|
Fri Jul 6 16:08:00 BST 2007 Richard W.M. Jones <rjones@redhat.com>
* src/proxy_internal.c, src/proxy_internal.h,
src.xen_internal.c, src/xen_internal.h,
src/xen_unified.c, src/xen_unified.h,
src/xend_internal.c, src/xend_internal.h,
src/xm_internal.c, src/xm_internal.h,
src/xs_internal.c, src/xs_internal.h: The interface
between xen_unified.c and its underlying driver now uses
a custom structure (struct xenUnifiedDriver) instead
of reusing virDriver.
* src/xen_unified.c: virDomainLookup* functions in Xen
now throw VIR_ERR_NO_DOMAIN if the domain does not exist.
* src/xs_internal.c: Fix indentation.
2007-07-06 15:11:22 +00:00
|
|
|
if (i != XEN_UNIFIED_HYPERVISOR_OFFSET &&
|
2007-04-30 16:57:15 +00:00
|
|
|
priv->opened[i] &&
|
2007-04-10 11:17:34 +00:00
|
|
|
drivers[i]->domainSetVcpus &&
|
|
|
|
drivers[i]->domainSetVcpus (dom, nvcpus) == 0)
|
|
|
|
return 0;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
Fri Jul 6 16:08:00 BST 2007 Richard W.M. Jones <rjones@redhat.com>
* src/proxy_internal.c, src/proxy_internal.h,
src.xen_internal.c, src/xen_internal.h,
src/xen_unified.c, src/xen_unified.h,
src/xend_internal.c, src/xend_internal.h,
src/xm_internal.c, src/xm_internal.h,
src/xs_internal.c, src/xs_internal.h: The interface
between xen_unified.c and its underlying driver now uses
a custom structure (struct xenUnifiedDriver) instead
of reusing virDriver.
* src/xen_unified.c: virDomainLookup* functions in Xen
now throw VIR_ERR_NO_DOMAIN if the domain does not exist.
* src/xs_internal.c: Fix indentation.
2007-07-06 15:11:22 +00:00
|
|
|
if (priv->opened[XEN_UNIFIED_HYPERVISOR_OFFSET] &&
|
|
|
|
drivers[XEN_UNIFIED_HYPERVISOR_OFFSET]->domainSetVcpus &&
|
|
|
|
drivers[XEN_UNIFIED_HYPERVISOR_OFFSET]->domainSetVcpus (dom, nvcpus) == 0)
|
2007-04-10 11:17:34 +00:00
|
|
|
return 0;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
return -1;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
xenUnifiedDomainPinVcpu (virDomainPtr dom, unsigned int vcpu,
|
2007-04-10 11:17:34 +00:00
|
|
|
unsigned char *cpumap, int maplen)
|
2007-04-04 14:19:49 +00:00
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(dom->conn);
|
2007-04-10 11:17:34 +00:00
|
|
|
int i;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-30 16:57:15 +00:00
|
|
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
|
|
|
|
if (priv->opened[i] &&
|
|
|
|
drivers[i]->domainPinVcpu &&
|
2007-04-10 11:17:34 +00:00
|
|
|
drivers[i]->domainPinVcpu (dom, vcpu, cpumap, maplen) == 0)
|
|
|
|
return 0;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
return -1;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
xenUnifiedDomainGetVcpus (virDomainPtr dom,
|
2007-04-10 11:17:34 +00:00
|
|
|
virVcpuInfoPtr info, int maxinfo,
|
|
|
|
unsigned char *cpumaps, int maplen)
|
2007-04-04 14:19:49 +00:00
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(dom->conn);
|
2007-04-13 00:43:57 +00:00
|
|
|
int i, ret;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-30 16:57:15 +00:00
|
|
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
|
|
|
|
if (priv->opened[i] && drivers[i]->domainGetVcpus) {
|
2007-04-13 00:43:57 +00:00
|
|
|
ret = drivers[i]->domainGetVcpus (dom, info, maxinfo, cpumaps, maplen);
|
|
|
|
if (ret > 0)
|
|
|
|
return ret;
|
|
|
|
}
|
2007-04-10 11:17:34 +00:00
|
|
|
return -1;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
xenUnifiedDomainGetMaxVcpus (virDomainPtr dom)
|
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(dom->conn);
|
2007-04-10 11:17:34 +00:00
|
|
|
int i, ret;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-30 16:57:15 +00:00
|
|
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
|
|
|
|
if (priv->opened[i] && drivers[i]->domainGetMaxVcpus) {
|
2007-04-10 11:17:34 +00:00
|
|
|
ret = drivers[i]->domainGetMaxVcpus (dom);
|
|
|
|
if (ret != 0) return ret;
|
|
|
|
}
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
return -1;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static char *
|
|
|
|
xenUnifiedDomainDumpXML (virDomainPtr dom, int flags)
|
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(dom->conn);
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-10-31 09:39:13 +00:00
|
|
|
if (dom->id == -1 && priv->xendConfigVersion < 3 ) {
|
|
|
|
if (priv->opened[XEN_UNIFIED_XM_OFFSET])
|
|
|
|
return xenXMDomainDumpXML(dom, flags);
|
|
|
|
} else {
|
|
|
|
if (priv->opened[XEN_UNIFIED_XEND_OFFSET]) {
|
|
|
|
char *cpus, *res;
|
|
|
|
cpus = xenDomainUsedCpus(dom);
|
|
|
|
res = xenDaemonDomainDumpXML(dom, flags, cpus);
|
|
|
|
free(cpus);
|
2008-01-29 17:41:07 +00:00
|
|
|
return(res);
|
2007-04-10 11:17:34 +00:00
|
|
|
}
|
2007-10-31 09:39:13 +00:00
|
|
|
if (priv->opened[XEN_UNIFIED_PROXY_OFFSET])
|
|
|
|
return xenProxyDomainDumpXML(dom, flags);
|
2008-02-05 19:27:37 +00:00
|
|
|
}
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-10-31 09:39:13 +00:00
|
|
|
xenUnifiedError (dom->conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
|
2007-04-10 11:17:34 +00:00
|
|
|
return NULL;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
2007-08-21 09:31:12 +00:00
|
|
|
static int
|
|
|
|
xenUnifiedDomainMigratePrepare (virConnectPtr dconn,
|
|
|
|
char **cookie,
|
|
|
|
int *cookielen,
|
|
|
|
const char *uri_in,
|
|
|
|
char **uri_out,
|
|
|
|
unsigned long flags,
|
|
|
|
const char *dname,
|
|
|
|
unsigned long resource)
|
|
|
|
{
|
|
|
|
GET_PRIVATE(dconn);
|
|
|
|
|
|
|
|
if (priv->opened[XEN_UNIFIED_XEND_OFFSET])
|
|
|
|
return xenDaemonDomainMigratePrepare (dconn, cookie, cookielen,
|
|
|
|
uri_in, uri_out,
|
|
|
|
flags, dname, resource);
|
|
|
|
|
|
|
|
xenUnifiedError (dconn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
xenUnifiedDomainMigratePerform (virDomainPtr dom,
|
|
|
|
const char *cookie,
|
|
|
|
int cookielen,
|
|
|
|
const char *uri,
|
|
|
|
unsigned long flags,
|
|
|
|
const char *dname,
|
|
|
|
unsigned long resource)
|
|
|
|
{
|
|
|
|
GET_PRIVATE(dom->conn);
|
|
|
|
|
|
|
|
if (priv->opened[XEN_UNIFIED_XEND_OFFSET])
|
|
|
|
return xenDaemonDomainMigratePerform (dom, cookie, cookielen, uri,
|
|
|
|
flags, dname, resource);
|
|
|
|
|
|
|
|
xenUnifiedError (dom->conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static virDomainPtr
|
|
|
|
xenUnifiedDomainMigrateFinish (virConnectPtr dconn,
|
|
|
|
const char *dname,
|
|
|
|
const char *cookie ATTRIBUTE_UNUSED,
|
|
|
|
int cookielen ATTRIBUTE_UNUSED,
|
|
|
|
const char *uri ATTRIBUTE_UNUSED,
|
|
|
|
unsigned long flags ATTRIBUTE_UNUSED)
|
|
|
|
{
|
|
|
|
return xenUnifiedDomainLookupByName (dconn, dname);
|
|
|
|
}
|
|
|
|
|
2007-04-04 14:19:49 +00:00
|
|
|
static int
|
|
|
|
xenUnifiedListDefinedDomains (virConnectPtr conn, char **const names,
|
2007-04-10 11:17:34 +00:00
|
|
|
int maxnames)
|
2007-04-04 14:19:49 +00:00
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(conn);
|
2007-04-10 11:17:34 +00:00
|
|
|
int i;
|
|
|
|
int ret;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-30 16:57:15 +00:00
|
|
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
|
|
|
|
if (priv->opened[i] && drivers[i]->listDefinedDomains) {
|
2007-04-10 11:17:34 +00:00
|
|
|
ret = drivers[i]->listDefinedDomains (conn, names, maxnames);
|
|
|
|
if (ret >= 0) return ret;
|
|
|
|
}
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
return -1;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
xenUnifiedNumOfDefinedDomains (virConnectPtr conn)
|
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(conn);
|
2007-04-10 11:17:34 +00:00
|
|
|
int i;
|
|
|
|
int ret;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-30 16:57:15 +00:00
|
|
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
|
|
|
|
if (priv->opened[i] && drivers[i]->numOfDefinedDomains) {
|
2007-04-10 11:17:34 +00:00
|
|
|
ret = drivers[i]->numOfDefinedDomains (conn);
|
|
|
|
if (ret >= 0) return ret;
|
|
|
|
}
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
return -1;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
xenUnifiedDomainCreate (virDomainPtr dom)
|
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(dom->conn);
|
2007-04-10 11:17:34 +00:00
|
|
|
int i;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-30 16:57:15 +00:00
|
|
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
|
|
|
|
if (priv->opened[i] && drivers[i]->domainCreate &&
|
2007-04-10 11:17:34 +00:00
|
|
|
drivers[i]->domainCreate (dom) == 0)
|
|
|
|
return 0;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
return -1;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static virDomainPtr
|
|
|
|
xenUnifiedDomainDefineXML (virConnectPtr conn, const char *xml)
|
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(conn);
|
2007-04-10 11:17:34 +00:00
|
|
|
int i;
|
|
|
|
virDomainPtr ret;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-30 16:57:15 +00:00
|
|
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
|
|
|
|
if (priv->opened[i] && drivers[i]->domainDefineXML) {
|
2007-04-10 11:17:34 +00:00
|
|
|
ret = drivers[i]->domainDefineXML (conn, xml);
|
|
|
|
if (ret) return ret;
|
|
|
|
}
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
return NULL;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
xenUnifiedDomainUndefine (virDomainPtr dom)
|
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(dom->conn);
|
2007-04-10 11:17:34 +00:00
|
|
|
int i;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-30 16:57:15 +00:00
|
|
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
|
|
|
|
if (priv->opened[i] && drivers[i]->domainUndefine &&
|
2007-04-10 11:17:34 +00:00
|
|
|
drivers[i]->domainUndefine (dom) == 0)
|
|
|
|
return 0;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
return -1;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2007-10-15 21:38:56 +00:00
|
|
|
xenUnifiedDomainAttachDevice (virDomainPtr dom, const char *xml)
|
2007-04-04 14:19:49 +00:00
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(dom->conn);
|
2007-04-10 11:17:34 +00:00
|
|
|
int i;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-30 16:57:15 +00:00
|
|
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
|
|
|
|
if (priv->opened[i] && drivers[i]->domainAttachDevice &&
|
2007-04-10 11:17:34 +00:00
|
|
|
drivers[i]->domainAttachDevice (dom, xml) == 0)
|
|
|
|
return 0;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
return -1;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2007-10-15 21:38:56 +00:00
|
|
|
xenUnifiedDomainDetachDevice (virDomainPtr dom, const char *xml)
|
2007-04-04 14:19:49 +00:00
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(dom->conn);
|
2007-04-10 11:17:34 +00:00
|
|
|
int i;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-30 16:57:15 +00:00
|
|
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
|
|
|
|
if (priv->opened[i] && drivers[i]->domainDetachDevice &&
|
2007-04-10 11:17:34 +00:00
|
|
|
drivers[i]->domainDetachDevice (dom, xml) == 0)
|
|
|
|
return 0;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
return -1;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
2007-06-05 12:06:08 +00:00
|
|
|
static char *
|
|
|
|
xenUnifiedDomainGetSchedulerType (virDomainPtr dom, int *nparams)
|
|
|
|
{
|
|
|
|
GET_PRIVATE(dom->conn);
|
|
|
|
int i;
|
|
|
|
char *schedulertype;
|
|
|
|
|
|
|
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; i++) {
|
|
|
|
if (priv->opened[i] && drivers[i]->domainGetSchedulerType) {
|
|
|
|
schedulertype = drivers[i]->domainGetSchedulerType (dom, nparams);
|
|
|
|
if (schedulertype != NULL)
|
2008-02-05 19:27:37 +00:00
|
|
|
return(schedulertype);
|
2007-06-05 12:06:08 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return(NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
xenUnifiedDomainGetSchedulerParameters (virDomainPtr dom,
|
|
|
|
virSchedParameterPtr params, int *nparams)
|
|
|
|
{
|
|
|
|
GET_PRIVATE(dom->conn);
|
|
|
|
int i, ret;
|
|
|
|
|
|
|
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i) {
|
|
|
|
if (priv->opened[i] && drivers[i]->domainGetSchedulerParameters) {
|
|
|
|
ret = drivers[i]->domainGetSchedulerParameters(dom, params, nparams);
|
|
|
|
if (ret == 0)
|
|
|
|
return(0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return(-1);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
xenUnifiedDomainSetSchedulerParameters (virDomainPtr dom,
|
|
|
|
virSchedParameterPtr params, int nparams)
|
|
|
|
{
|
|
|
|
GET_PRIVATE(dom->conn);
|
|
|
|
int i, ret;
|
|
|
|
|
|
|
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i) {
|
|
|
|
if (priv->opened[i] && drivers[i]->domainSetSchedulerParameters) {
|
|
|
|
ret = drivers[i]->domainSetSchedulerParameters(dom, params, nparams);
|
|
|
|
if (ret == 0)
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return(-1);
|
|
|
|
}
|
|
|
|
|
2007-08-21 10:08:12 +00:00
|
|
|
static int
|
|
|
|
xenUnifiedDomainBlockStats (virDomainPtr dom, const char *path,
|
|
|
|
struct _virDomainBlockStats *stats)
|
|
|
|
{
|
|
|
|
GET_PRIVATE (dom->conn);
|
|
|
|
|
|
|
|
if (priv->opened[XEN_UNIFIED_HYPERVISOR_OFFSET])
|
|
|
|
return xenHypervisorDomainBlockStats (dom, path, stats);
|
|
|
|
|
|
|
|
xenUnifiedError (dom->conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
xenUnifiedDomainInterfaceStats (virDomainPtr dom, const char *path,
|
|
|
|
struct _virDomainInterfaceStats *stats)
|
|
|
|
{
|
|
|
|
GET_PRIVATE (dom->conn);
|
|
|
|
|
|
|
|
if (priv->opened[XEN_UNIFIED_HYPERVISOR_OFFSET])
|
|
|
|
return xenHypervisorDomainInterfaceStats (dom, path, stats);
|
|
|
|
|
|
|
|
xenUnifiedError (dom->conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2007-09-28 14:28:12 +00:00
|
|
|
static int
|
|
|
|
xenUnifiedNodeGetCellsFreeMemory (virConnectPtr conn, unsigned long long *freeMems,
|
|
|
|
int startCell, int maxCells)
|
|
|
|
{
|
|
|
|
GET_PRIVATE (conn);
|
|
|
|
|
|
|
|
if (priv->opened[XEN_UNIFIED_HYPERVISOR_OFFSET])
|
2008-02-05 19:27:37 +00:00
|
|
|
return xenHypervisorNodeGetCellsFreeMemory (conn, freeMems,
|
2007-09-28 14:28:12 +00:00
|
|
|
startCell, maxCells);
|
|
|
|
|
|
|
|
xenUnifiedError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2007-09-30 13:09:07 +00:00
|
|
|
static unsigned long long
|
|
|
|
xenUnifiedNodeGetFreeMemory (virConnectPtr conn)
|
|
|
|
{
|
|
|
|
unsigned long long freeMem = 0;
|
|
|
|
int ret;
|
|
|
|
GET_PRIVATE (conn);
|
|
|
|
|
|
|
|
if (priv->opened[XEN_UNIFIED_HYPERVISOR_OFFSET]) {
|
2008-02-05 19:27:37 +00:00
|
|
|
ret = xenHypervisorNodeGetCellsFreeMemory (conn, &freeMem,
|
2007-09-30 13:09:07 +00:00
|
|
|
-1, 1);
|
|
|
|
if (ret != 1)
|
|
|
|
return (0);
|
|
|
|
return(freeMem);
|
|
|
|
}
|
|
|
|
|
|
|
|
xenUnifiedError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
|
|
|
|
return(0);
|
|
|
|
}
|
|
|
|
|
2007-04-04 14:19:49 +00:00
|
|
|
/*----- Register with libvirt.c, and initialise Xen drivers. -----*/
|
|
|
|
|
Wed Dec 5 13:48:00 UTC 2007 Richard W.M. Jones <rjones@redhat.com>
* python/libvir.c, python/libvirt_wrap.h, qemud/qemud.c,
qemud/remote.c, src/internal.h, src/openvz_conf.c,
src/openvz_driver.c, src/proxy_internal.h, src/qemu_conf.c,
src/qemu_driver.c, src/remote_internal.h, src/test.h, src/util.c,
src/xen_unified.c, src/xen_unified.h, tests/nodeinfotest.c,
tests/qemuxml2argvtest.c, tests/qemuxml2xmltest.c, tests/reconnect.c,
tests/sexpr2xmltest.c, tests/virshtest.c, tests/xencapstest.c,
tests/xmconfigtest.c, tests/xml2sexprtest.c:
Change #include <> to #include "" for local includes.
Removed many includes from src/internal.h and put them in
the C files which actually use them.
Removed <ansidecl.h> - unused.
Added a comment around __func__.
Removed a clashing redefinition of VERSION symbol.
All limits (PATH_MAX etc) now done in src/internal.h, so we
don't need to include those headers in other files.
2007-12-05 13:56:22 +00:00
|
|
|
#define HV_VERSION ((DOM0_INTERFACE_VERSION >> 24) * 1000000 + \
|
|
|
|
((DOM0_INTERFACE_VERSION >> 16) & 0xFF) * 1000 + \
|
|
|
|
(DOM0_INTERFACE_VERSION & 0xFFFF))
|
2007-04-04 14:19:49 +00:00
|
|
|
|
|
|
|
/* The interface which we export upwards to libvirt.c. */
|
|
|
|
static virDriver xenUnifiedDriver = {
|
2007-04-10 11:17:34 +00:00
|
|
|
.no = VIR_DRV_XEN_UNIFIED,
|
2007-04-17 09:33:51 +00:00
|
|
|
.name = "Xen",
|
Wed Dec 5 13:48:00 UTC 2007 Richard W.M. Jones <rjones@redhat.com>
* python/libvir.c, python/libvirt_wrap.h, qemud/qemud.c,
qemud/remote.c, src/internal.h, src/openvz_conf.c,
src/openvz_driver.c, src/proxy_internal.h, src/qemu_conf.c,
src/qemu_driver.c, src/remote_internal.h, src/test.h, src/util.c,
src/xen_unified.c, src/xen_unified.h, tests/nodeinfotest.c,
tests/qemuxml2argvtest.c, tests/qemuxml2xmltest.c, tests/reconnect.c,
tests/sexpr2xmltest.c, tests/virshtest.c, tests/xencapstest.c,
tests/xmconfigtest.c, tests/xml2sexprtest.c:
Change #include <> to #include "" for local includes.
Removed many includes from src/internal.h and put them in
the C files which actually use them.
Removed <ansidecl.h> - unused.
Added a comment around __func__.
Removed a clashing redefinition of VERSION symbol.
All limits (PATH_MAX etc) now done in src/internal.h, so we
don't need to include those headers in other files.
2007-12-05 13:56:22 +00:00
|
|
|
.ver = HV_VERSION,
|
2008-02-26 07:05:18 +00:00
|
|
|
.probe = xenUnifiedProbe,
|
2007-04-10 11:17:34 +00:00
|
|
|
.open = xenUnifiedOpen,
|
|
|
|
.close = xenUnifiedClose,
|
2007-08-21 09:31:12 +00:00
|
|
|
.supports_feature = xenUnifiedSupportsFeature,
|
2007-04-10 11:17:34 +00:00
|
|
|
.type = xenUnifiedType,
|
|
|
|
.version = xenUnifiedVersion,
|
2007-06-26 11:42:46 +00:00
|
|
|
.getHostname = xenUnifiedGetHostname,
|
2007-04-10 11:17:34 +00:00
|
|
|
.getMaxVcpus = xenUnifiedGetMaxVcpus,
|
|
|
|
.nodeGetInfo = xenUnifiedNodeGetInfo,
|
|
|
|
.getCapabilities = xenUnifiedGetCapabilities,
|
|
|
|
.listDomains = xenUnifiedListDomains,
|
|
|
|
.numOfDomains = xenUnifiedNumOfDomains,
|
|
|
|
.domainCreateLinux = xenUnifiedDomainCreateLinux,
|
|
|
|
.domainLookupByID = xenUnifiedDomainLookupByID,
|
|
|
|
.domainLookupByUUID = xenUnifiedDomainLookupByUUID,
|
|
|
|
.domainLookupByName = xenUnifiedDomainLookupByName,
|
|
|
|
.domainSuspend = xenUnifiedDomainSuspend,
|
|
|
|
.domainResume = xenUnifiedDomainResume,
|
|
|
|
.domainShutdown = xenUnifiedDomainShutdown,
|
|
|
|
.domainReboot = xenUnifiedDomainReboot,
|
|
|
|
.domainDestroy = xenUnifiedDomainDestroy,
|
|
|
|
.domainGetOSType = xenUnifiedDomainGetOSType,
|
|
|
|
.domainGetMaxMemory = xenUnifiedDomainGetMaxMemory,
|
|
|
|
.domainSetMaxMemory = xenUnifiedDomainSetMaxMemory,
|
|
|
|
.domainSetMemory = xenUnifiedDomainSetMemory,
|
|
|
|
.domainGetInfo = xenUnifiedDomainGetInfo,
|
|
|
|
.domainSave = xenUnifiedDomainSave,
|
|
|
|
.domainRestore = xenUnifiedDomainRestore,
|
|
|
|
.domainCoreDump = xenUnifiedDomainCoreDump,
|
|
|
|
.domainSetVcpus = xenUnifiedDomainSetVcpus,
|
|
|
|
.domainPinVcpu = xenUnifiedDomainPinVcpu,
|
|
|
|
.domainGetVcpus = xenUnifiedDomainGetVcpus,
|
|
|
|
.domainGetMaxVcpus = xenUnifiedDomainGetMaxVcpus,
|
|
|
|
.domainDumpXML = xenUnifiedDomainDumpXML,
|
|
|
|
.listDefinedDomains = xenUnifiedListDefinedDomains,
|
|
|
|
.numOfDefinedDomains = xenUnifiedNumOfDefinedDomains,
|
|
|
|
.domainCreate = xenUnifiedDomainCreate,
|
|
|
|
.domainDefineXML = xenUnifiedDomainDefineXML,
|
|
|
|
.domainUndefine = xenUnifiedDomainUndefine,
|
|
|
|
.domainAttachDevice = xenUnifiedDomainAttachDevice,
|
|
|
|
.domainDetachDevice = xenUnifiedDomainDetachDevice,
|
2007-06-05 12:06:08 +00:00
|
|
|
.domainGetSchedulerType = xenUnifiedDomainGetSchedulerType,
|
|
|
|
.domainGetSchedulerParameters = xenUnifiedDomainGetSchedulerParameters,
|
|
|
|
.domainSetSchedulerParameters = xenUnifiedDomainSetSchedulerParameters,
|
2007-08-21 09:31:12 +00:00
|
|
|
.domainMigratePrepare = xenUnifiedDomainMigratePrepare,
|
|
|
|
.domainMigratePerform = xenUnifiedDomainMigratePerform,
|
|
|
|
.domainMigrateFinish = xenUnifiedDomainMigrateFinish,
|
2007-08-21 10:08:12 +00:00
|
|
|
.domainBlockStats = xenUnifiedDomainBlockStats,
|
|
|
|
.domainInterfaceStats = xenUnifiedDomainInterfaceStats,
|
2007-09-28 14:28:12 +00:00
|
|
|
.nodeGetCellsFreeMemory = xenUnifiedNodeGetCellsFreeMemory,
|
2007-09-30 13:09:07 +00:00
|
|
|
.getFreeMemory = xenUnifiedNodeGetFreeMemory,
|
2007-04-04 14:19:49 +00:00
|
|
|
};
|
|
|
|
|
2007-04-10 13:00:26 +00:00
|
|
|
/**
|
|
|
|
* xenUnifiedRegister:
|
|
|
|
*
|
|
|
|
* Register xen related drivers
|
|
|
|
*
|
|
|
|
* Returns the driver priority or -1 in case of error.
|
|
|
|
*/
|
2007-04-04 14:19:49 +00:00
|
|
|
int
|
|
|
|
xenUnifiedRegister (void)
|
|
|
|
{
|
2007-04-10 11:17:34 +00:00
|
|
|
/* Ignore failures here. */
|
|
|
|
(void) xenHypervisorInit ();
|
|
|
|
(void) xenProxyInit ();
|
|
|
|
(void) xenDaemonInit ();
|
|
|
|
(void) xenStoreInit ();
|
|
|
|
(void) xenXMInit ();
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
return virRegisterDriver (&xenUnifiedDriver);
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* WITH_XEN */
|
2007-04-10 11:17:34 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* vim: set tabstop=4:
|
|
|
|
* vim: set shiftwidth=4:
|
|
|
|
* vim: set expandtab:
|
|
|
|
*/
|
|
|
|
/*
|
|
|
|
* Local variables:
|
|
|
|
* indent-tabs-mode: nil
|
|
|
|
* c-indent-level: 4
|
|
|
|
* c-basic-offset: 4
|
|
|
|
* tab-width: 4
|
|
|
|
* End:
|
|
|
|
*/
|