2007-04-04 14:19:49 +00:00
|
|
|
/*
|
Move xen driver code into src/xen/ directory
* src/Makefile.am, src/proxy_internal.c, src/proxy_internal.h
src/sexpr.c, src/sexpr.h, src/xen_unified.c, src/xen_unified.h,
src/xen_internal.c, src/xen_internal.h, src/xen_inotify.c,
src/xen_inotify.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: Move to src/xen/ directory
* proxy/Makefile.am, proxy/libvirt_proxy.c, src/Makefile.am,
src/libvirt.c, tests/sexpr2xmltest.c, tests/statstest.c,
tests/xencapstest.c, tests/xmconfigtest.c, tests/xml2sexprtest.c:
Adapt to changed xen location
* src/stats_linux.h, src/stats_linux.c: Remove xen specific block
stats APIs
* src/qemu_driver.c, src/uml_driver.c: Add missing sys/un.h include
uncovered after change to stats_linux.h
* src/xen/block_stats.h, src/xen/block_stats.c: Add xen specific
block stats APIs
2009-09-15 15:38:33 +00:00
|
|
|
* xen_driver.c: Unified Xen driver.
|
2007-04-04 14:19:49 +00:00
|
|
|
*
|
domain_conf: split source data out from ChrDef
This opens up the possibility of reusing the smaller ChrSourceDef
for both qemu monitor and a passthrough smartcard device.
* src/conf/domain_conf.h (_virDomainChrDef): Factor host
details...
(_virDomainChrSourceDef): ...into new struct.
(virDomainChrSourceDefFree): New prototype.
* src/conf/domain_conf.c (virDomainChrDefFree)
(virDomainChrDefParseXML, virDomainChrDefFormat): Split...
(virDomainChrSourceDefClear, virDomainChrSourceDefFree)
(virDomainChrSourceDefParseXML, virDomainChrSourceDefFormat):
...into new functions.
(virDomainChrDefParseTargetXML): Update clients to reflect type
split.
* src/vmx/vmx.c (virVMXParseSerial, virVMXParseParallel)
(virVMXFormatSerial, virVMXFormatParallel): Likewise.
* src/xen/xen_driver.c (xenUnifiedDomainOpenConsole): Likewise.
* src/xen/xend_internal.c (xenDaemonParseSxprChar)
(xenDaemonFormatSxprChr): Likewise.
* src/vbox/vbox_tmpl.c (vboxDomainDumpXML, vboxAttachSerial)
(vboxAttachParallel): Likewise.
* src/security/security_dac.c (virSecurityDACSetChardevLabel)
(virSecurityDACSetChardevCallback)
(virSecurityDACRestoreChardevLabel)
(virSecurityDACRestoreChardevCallback): Likewise.
* src/security/security_selinux.c (SELinuxSetSecurityChardevLabel)
(SELinuxSetSecurityChardevCallback)
(SELinuxRestoreSecurityChardevLabel)
(SELinuxSetSecurityChardevCallback): Likewise.
* src/security/virt-aa-helper.c (get_files): Likewise.
* src/lxc/lxc_driver.c (lxcVmStart, lxcDomainOpenConsole):
Likewise.
* src/uml/uml_conf.c (umlBuildCommandLineChr): Likewise.
* src/uml/uml_driver.c (umlIdentifyOneChrPTY, umlIdentifyChrPTY)
(umlDomainOpenConsole): Likewise.
* src/qemu/qemu_command.c (qemuBuildChrChardevStr)
(qemuBuildChrArgStr, qemuBuildCommandLine)
(qemuParseCommandLineChr): Likewise.
* src/qemu/qemu_domain.c (qemuDomainObjPrivateXMLFormat)
(qemuDomainObjPrivateXMLParse): Likewise.
* src/qemu/qemu_cgroup.c (qemuSetupChardevCgroup): Likewise.
* src/qemu/qemu_hotplug.c (qemuDomainAttachNetDevice): Likewise.
* src/qemu/qemu_driver.c (qemudFindCharDevicePTYsMonitor)
(qemudFindCharDevicePTYs, qemuPrepareChardevDevice)
(qemuPrepareMonitorChr, qemudShutdownVMDaemon)
(qemuDomainOpenConsole): Likewise.
* src/qemu/qemu_command.h (qemuBuildChrChardevStr)
(qemuBuildChrArgStr): Delete, now that they are static.
* src/libvirt_private.syms (domain_conf.h): New exports.
* cfg.mk (useless_free_options): Update list.
* tests/qemuxml2argvtest.c (testCompareXMLToArgvFiles): Update
tests.
2011-01-07 22:45:01 +00:00
|
|
|
* Copyright (C) 2007-2011 Red Hat, Inc.
|
2007-04-04 14:19:49 +00:00
|
|
|
*
|
|
|
|
* 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
|
|
|
/* Note:
|
|
|
|
*
|
|
|
|
* This driver provides a unified interface to the five
|
2010-11-08 16:32:02 +00:00
|
|
|
* separate underlying Xen drivers (xen_internal,
|
2007-04-04 14:19:49 +00:00
|
|
|
* 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>
|
2010-10-22 13:40:26 +00:00
|
|
|
#include <fcntl.h>
|
2007-04-04 14:19:49 +00:00
|
|
|
#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
|
|
|
|
2008-11-04 22:30:33 +00:00
|
|
|
#include "virterror_internal.h"
|
2008-11-06 16:36:07 +00:00
|
|
|
#include "logging.h"
|
2008-11-04 23:22:06 +00:00
|
|
|
#include "datatypes.h"
|
Move xen driver code into src/xen/ directory
* src/Makefile.am, src/proxy_internal.c, src/proxy_internal.h
src/sexpr.c, src/sexpr.h, src/xen_unified.c, src/xen_unified.h,
src/xen_internal.c, src/xen_internal.h, src/xen_inotify.c,
src/xen_inotify.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: Move to src/xen/ directory
* proxy/Makefile.am, proxy/libvirt_proxy.c, src/Makefile.am,
src/libvirt.c, tests/sexpr2xmltest.c, tests/statstest.c,
tests/xencapstest.c, tests/xmconfigtest.c, tests/xml2sexprtest.c:
Adapt to changed xen location
* src/stats_linux.h, src/stats_linux.c: Remove xen specific block
stats APIs
* src/qemu_driver.c, src/uml_driver.c: Add missing sys/un.h include
uncovered after change to stats_linux.h
* src/xen/block_stats.h, src/xen/block_stats.c: Add xen specific
block stats APIs
2009-09-15 15:38:33 +00:00
|
|
|
#include "xen_driver.h"
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2011-02-21 13:40:08 +00:00
|
|
|
#include "xen_sxpr.h"
|
2011-02-21 13:40:10 +00:00
|
|
|
#include "xen_xm.h"
|
Move xen driver code into src/xen/ directory
* src/Makefile.am, src/proxy_internal.c, src/proxy_internal.h
src/sexpr.c, src/sexpr.h, src/xen_unified.c, src/xen_unified.h,
src/xen_internal.c, src/xen_internal.h, src/xen_inotify.c,
src/xen_inotify.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: Move to src/xen/ directory
* proxy/Makefile.am, proxy/libvirt_proxy.c, src/Makefile.am,
src/libvirt.c, tests/sexpr2xmltest.c, tests/statstest.c,
tests/xencapstest.c, tests/xmconfigtest.c, tests/xml2sexprtest.c:
Adapt to changed xen location
* src/stats_linux.h, src/stats_linux.c: Remove xen specific block
stats APIs
* src/qemu_driver.c, src/uml_driver.c: Add missing sys/un.h include
uncovered after change to stats_linux.h
* src/xen/block_stats.h, src/xen/block_stats.c: Add xen specific
block stats APIs
2009-09-15 15:38:33 +00:00
|
|
|
#include "xen_hypervisor.h"
|
2007-04-04 14:19:49 +00:00
|
|
|
#include "xend_internal.h"
|
|
|
|
#include "xs_internal.h"
|
|
|
|
#include "xm_internal.h"
|
2008-11-25 10:44:52 +00:00
|
|
|
#if WITH_XEN_INOTIFY
|
2010-03-09 18:22:22 +00:00
|
|
|
# include "xen_inotify.h"
|
2008-11-25 10:44:52 +00:00
|
|
|
#endif
|
2007-10-31 09:39:13 +00:00
|
|
|
#include "xml.h"
|
2008-02-26 07:05:18 +00:00
|
|
|
#include "util.h"
|
2008-06-06 11:09:57 +00:00
|
|
|
#include "memory.h"
|
2009-04-03 12:38:52 +00:00
|
|
|
#include "node_device_conf.h"
|
|
|
|
#include "pci.h"
|
Implmentation of new APIs to checking state/persistence of objects
This implements the virConnectIsSecure, virConnectIsEncrypted,
virDomainIsPersistent, virDomainIsActive, virNetworkIsActive,
virNetworkIsPersistent, virStoragePoolIsActive,
virStoragePoolIsPersistent, virInterfaceIsActive APIs in
(nearly) all drivers. Exceptions are:
phyp: missing domainIsActive/Persistent
esx: missing domainIsPersistent
opennebula: missing domainIsActive/Persistent
* src/remote/remote_protocol.x: Define remote wire ABI for newly
added APIs.
* daemon/remote_dispatch*.h: Re-generated from remote_protocol.x
* src/esx/esx_driver.c, src/lxc/lxc_driver.c, src/network/bridge_driver.c,
src/opennebula/one_driver.c, src/openvz/openvz_conf.c,
src/openvz/openvz_driver.c, src/phyp/phyp_driver.c,
src/remote/remote_driver.c, src/storage/storage_driver.c,
src/test/test_driver.c, src/uml/uml_driver.c, src/vbox/vbox_tmpl.c,
src/xen/xen_driver.c, src/xen/xen_driver.h, src/xen/xen_inotify.c,
src/xen/xen_inotify.h: Implement all the new APIs where possible
2009-10-20 14:12:03 +00:00
|
|
|
#include "uuid.h"
|
2010-10-22 13:40:26 +00:00
|
|
|
#include "fdstream.h"
|
2010-11-17 02:13:29 +00:00
|
|
|
#include "files.h"
|
2011-02-10 22:42:34 +00:00
|
|
|
#include "command.h"
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2009-01-20 17:13:33 +00:00
|
|
|
#define VIR_FROM_THIS VIR_FROM_XEN
|
|
|
|
|
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. */
|
2009-01-21 18:11:14 +00:00
|
|
|
static struct xenUnifiedDriver const * const drivers[XEN_UNIFIED_NR_DRIVERS] = {
|
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
|
|
|
[XEN_UNIFIED_HYPERVISOR_OFFSET] = &xenHypervisorDriver,
|
|
|
|
[XEN_UNIFIED_XEND_OFFSET] = &xenDaemonDriver,
|
|
|
|
[XEN_UNIFIED_XS_OFFSET] = &xenStoreDriver,
|
|
|
|
[XEN_UNIFIED_XM_OFFSET] = &xenXMDriver,
|
2008-11-25 10:44:52 +00:00
|
|
|
#if WITH_XEN_INOTIFY
|
|
|
|
[XEN_UNIFIED_INOTIFY_OFFSET] = &xenInotifyDriver,
|
|
|
|
#endif
|
2007-04-04 14:19:49 +00:00
|
|
|
};
|
|
|
|
|
2010-04-23 16:12:09 +00:00
|
|
|
#if defined WITH_LIBVIRTD || defined __sun
|
2009-01-22 17:49:41 +00:00
|
|
|
static int inside_daemon;
|
2010-04-23 16:12:09 +00:00
|
|
|
#endif
|
2009-01-22 17:49:41 +00:00
|
|
|
|
2010-04-03 00:12:16 +00:00
|
|
|
#define xenUnifiedError(code, ...) \
|
2011-04-16 08:30:22 +00:00
|
|
|
virReportErrorHelper(VIR_FROM_XEN, code, __FILE__, \
|
2010-04-03 00:12:16 +00:00
|
|
|
__FUNCTION__, __LINE__, __VA_ARGS__)
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2007-10-22 20:28:55 +00:00
|
|
|
/**
|
|
|
|
* 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;
|
2009-01-21 18:11:14 +00:00
|
|
|
xenUnifiedPrivatePtr priv;
|
2007-10-22 20:28:55 +00:00
|
|
|
int ret;
|
|
|
|
|
|
|
|
ret = xenUnifiedNodeGetInfo(conn, &nodeInfo);
|
|
|
|
if (ret < 0)
|
|
|
|
return;
|
|
|
|
|
2009-01-21 18:11:14 +00:00
|
|
|
priv = conn->privateData;
|
2007-10-22 20:28:55 +00:00
|
|
|
|
2009-01-21 18:11:14 +00:00
|
|
|
priv->nbNodeCells = nodeInfo.nodes;
|
|
|
|
priv->nbNodeCpus = nodeInfo.cpus;
|
2007-10-22 20:28:55 +00:00
|
|
|
}
|
|
|
|
|
2009-01-21 18:11:14 +00:00
|
|
|
|
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;
|
2009-01-21 18:11:14 +00:00
|
|
|
int ncpus;
|
2007-10-31 09:39:13 +00:00
|
|
|
int nb_vcpu;
|
|
|
|
char *cpulist = NULL;
|
|
|
|
unsigned char *cpumap = NULL;
|
|
|
|
size_t cpumaplen;
|
|
|
|
int nb = 0;
|
|
|
|
int n, m;
|
|
|
|
virVcpuInfoPtr cpuinfo = NULL;
|
|
|
|
virNodeInfo nodeinfo;
|
2009-01-21 18:11:14 +00:00
|
|
|
xenUnifiedPrivatePtr priv;
|
2007-10-31 09:39:13 +00:00
|
|
|
|
|
|
|
if (!VIR_IS_CONNECTED_DOMAIN(dom))
|
|
|
|
return (NULL);
|
|
|
|
|
2009-01-21 18:11:14 +00:00
|
|
|
priv = dom->conn->privateData;
|
|
|
|
|
|
|
|
if (priv->nbNodeCpus <= 0)
|
2007-10-31 09:39:13 +00:00
|
|
|
return(NULL);
|
|
|
|
nb_vcpu = xenUnifiedDomainGetMaxVcpus(dom);
|
|
|
|
if (nb_vcpu <= 0)
|
|
|
|
return(NULL);
|
|
|
|
if (xenUnifiedNodeGetInfo(dom->conn, &nodeinfo) < 0)
|
|
|
|
return(NULL);
|
|
|
|
|
2009-11-08 21:08:54 +00:00
|
|
|
if (VIR_ALLOC_N(cpulist, priv->nbNodeCpus) < 0) {
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2007-10-31 09:39:13 +00:00
|
|
|
goto done;
|
2009-11-08 21:08:54 +00:00
|
|
|
}
|
|
|
|
if (VIR_ALLOC_N(cpuinfo, nb_vcpu) < 0) {
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2007-10-31 09:39:13 +00:00
|
|
|
goto done;
|
2009-11-08 21:08:54 +00:00
|
|
|
}
|
2007-10-31 09:39:13 +00:00
|
|
|
cpumaplen = VIR_CPU_MAPLEN(VIR_NODEINFO_MAXCPUS(nodeinfo));
|
2008-06-06 11:09:57 +00:00
|
|
|
if (xalloc_oversized(nb_vcpu, cpumaplen) ||
|
2009-11-08 21:08:54 +00:00
|
|
|
VIR_ALLOC_N(cpumap, nb_vcpu * cpumaplen) < 0) {
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2007-10-31 09:39:13 +00:00
|
|
|
goto done;
|
2009-11-08 21:08:54 +00:00
|
|
|
}
|
2007-10-31 09:39:13 +00:00
|
|
|
|
|
|
|
if ((ncpus = xenUnifiedDomainGetVcpus(dom, cpuinfo, nb_vcpu,
|
|
|
|
cpumap, cpumaplen)) >= 0) {
|
2008-04-10 16:54:54 +00:00
|
|
|
for (n = 0 ; n < ncpus ; n++) {
|
2009-01-21 18:11:14 +00:00
|
|
|
for (m = 0 ; m < priv->nbNodeCpus; m++) {
|
2008-04-10 16:54:54 +00:00
|
|
|
if ((cpulist[m] == 0) &&
|
|
|
|
(VIR_CPU_USABLE(cpumap, cpumaplen, n, m))) {
|
|
|
|
cpulist[m] = 1;
|
|
|
|
nb++;
|
|
|
|
/* if all CPU are used just return NULL */
|
2009-01-21 18:11:14 +00:00
|
|
|
if (nb == priv->nbNodeCpus)
|
2008-04-10 16:54:54 +00:00
|
|
|
goto done;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2010-02-09 18:58:01 +00:00
|
|
|
res = virDomainCpuSetFormat(cpulist, priv->nbNodeCpus);
|
2007-10-31 09:39:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
done:
|
2008-06-06 11:09:57 +00:00
|
|
|
VIR_FREE(cpulist);
|
|
|
|
VIR_FREE(cpumap);
|
|
|
|
VIR_FREE(cpuinfo);
|
2007-10-31 09:39:13 +00:00
|
|
|
return(res);
|
|
|
|
}
|
|
|
|
|
2009-01-22 17:49:41 +00:00
|
|
|
#ifdef WITH_LIBVIRTD
|
|
|
|
|
|
|
|
static int
|
2009-06-12 13:20:13 +00:00
|
|
|
xenInitialize (int privileged ATTRIBUTE_UNUSED)
|
2009-01-22 17:49:41 +00:00
|
|
|
{
|
|
|
|
inside_daemon = 1;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static virStateDriver state_driver = {
|
Fix return value in virStateInitialize impl for LXC
The LXC driver was mistakenly returning -1 for lxcStartup()
in scenarios that are not an error. This caused the libvirtd
to quit for unprivileged users. This fixes the return code
of LXC driver, and also adds a "name" field to the virStateDriver
struct and logging to make it easier to find these problems
in the future
* src/driver.h: Add a 'name' field to state driver to allow
easy identification during failures
* src/libvirt.c: Log name of failed driver for virStateInit
failures
* src/lxc/lxc_driver.c: Don't return a failure code for
lxcStartup() if LXC is not available on this host, simply
disable the driver.
* src/network/bridge_driver.c, src/node_device/node_device_devkit.c,
src/node_device/node_device_hal.c, src/opennebula/one_driver.c,
src/qemu/qemu_driver.c, src/remote/remote_driver.c,
src/secret/secret_driver.c, src/storage/storage_driver.c,
src/uml/uml_driver.c, src/xen/xen_driver.c: Fill in name
field in virStateDriver struct
2009-11-02 23:18:19 +00:00
|
|
|
.name = "Xen",
|
2009-01-22 17:49:41 +00:00
|
|
|
.initialize = xenInitialize,
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
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-11-17 11:44:51 +00:00
|
|
|
static int
|
2008-02-26 07:05:18 +00:00
|
|
|
xenUnifiedProbe (void)
|
|
|
|
{
|
|
|
|
#ifdef __linux__
|
|
|
|
if (virFileExists("/proc/xen"))
|
2008-11-17 11:44:51 +00:00
|
|
|
return 1;
|
2008-02-26 07:05:18 +00:00
|
|
|
#endif
|
2008-12-17 21:31:51 +00:00
|
|
|
#ifdef __sun
|
2010-11-17 02:13:29 +00:00
|
|
|
int fd;
|
2008-02-26 07:05:18 +00:00
|
|
|
|
2010-11-17 02:13:29 +00:00
|
|
|
if ((fd = open("/dev/xen/domcaps", O_RDONLY)) >= 0) {
|
|
|
|
VIR_FORCE_CLOSE(fd);
|
2008-11-17 11:44:51 +00:00
|
|
|
return 1;
|
2008-02-26 07:05:18 +00:00
|
|
|
}
|
|
|
|
#endif
|
2008-11-17 11:44:51 +00:00
|
|
|
return 0;
|
2008-02-26 07:05:18 +00:00
|
|
|
}
|
|
|
|
|
2011-02-10 22:42:34 +00:00
|
|
|
#ifdef WITH_LIBXL
|
|
|
|
static int
|
|
|
|
xenUnifiedXendProbe (void)
|
|
|
|
{
|
|
|
|
virCommandPtr cmd;
|
|
|
|
int status;
|
|
|
|
int ret = 0;
|
|
|
|
|
|
|
|
cmd = virCommandNewArgList("/usr/sbin/xend", "status", NULL);
|
|
|
|
if (virCommandRun(cmd, &status) == 0 && status == 0)
|
|
|
|
ret = 1;
|
|
|
|
virCommandFree(cmd);
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2008-12-17 21:26:16 +00:00
|
|
|
static virDrvOpenStatus
|
2008-11-17 11:44:51 +00:00
|
|
|
xenUnifiedOpen (virConnectPtr conn, virConnectAuthPtr auth, int flags)
|
2007-04-04 14:19:49 +00:00
|
|
|
{
|
2008-07-21 09:48:01 +00:00
|
|
|
int i, ret = VIR_DRV_OPEN_DECLINED;
|
2007-04-10 11:17:34 +00:00
|
|
|
xenUnifiedPrivatePtr priv;
|
2008-11-25 10:44:52 +00:00
|
|
|
virDomainEventCallbackListPtr cbList;
|
2007-06-20 10:01:14 +00:00
|
|
|
|
2009-01-22 17:49:41 +00:00
|
|
|
#ifdef __sun
|
|
|
|
/*
|
|
|
|
* Only the libvirtd instance can open this driver.
|
|
|
|
* Everything else falls back to the remote driver.
|
|
|
|
*/
|
|
|
|
if (!inside_daemon)
|
|
|
|
return VIR_DRV_OPEN_DECLINED;
|
|
|
|
#endif
|
|
|
|
|
2008-11-17 11:44:51 +00:00
|
|
|
if (conn->uri == NULL) {
|
|
|
|
if (!xenUnifiedProbe())
|
|
|
|
return VIR_DRV_OPEN_DECLINED;
|
|
|
|
|
|
|
|
conn->uri = xmlParseURI("xen:///");
|
|
|
|
if (!conn->uri) {
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2008-11-17 11:44:51 +00:00
|
|
|
return VIR_DRV_OPEN_ERROR;
|
|
|
|
}
|
2009-06-12 12:06:15 +00:00
|
|
|
} else {
|
|
|
|
if (conn->uri->scheme) {
|
|
|
|
/* Decline any scheme which isn't "xen://" or "http://". */
|
|
|
|
if (STRCASENEQ(conn->uri->scheme, "xen") &&
|
|
|
|
STRCASENEQ(conn->uri->scheme, "http"))
|
|
|
|
return VIR_DRV_OPEN_DECLINED;
|
|
|
|
|
|
|
|
|
|
|
|
/* Return an error if the path isn't '' or '/' */
|
|
|
|
if (conn->uri->path &&
|
|
|
|
STRNEQ(conn->uri->path, "") &&
|
|
|
|
STRNEQ(conn->uri->path, "/")) {
|
2010-04-03 00:12:16 +00:00
|
|
|
xenUnifiedError(VIR_ERR_INTERNAL_ERROR,
|
2009-06-12 12:06:15 +00:00
|
|
|
_("unexpected Xen URI path '%s', try xen:///"),
|
|
|
|
conn->uri->path);
|
|
|
|
return VIR_DRV_OPEN_ERROR;
|
|
|
|
}
|
2007-06-20 17:25:39 +00:00
|
|
|
|
2009-06-12 12:06:15 +00:00
|
|
|
/* Decline any xen:// URI with a server specified, allowing remote
|
|
|
|
* driver to handle, but keep any http:/// URIs */
|
|
|
|
if (STRCASEEQ(conn->uri->scheme, "xen") &&
|
|
|
|
conn->uri->server)
|
|
|
|
return VIR_DRV_OPEN_DECLINED;
|
|
|
|
} else {
|
|
|
|
/* Special case URI for Xen driver only:
|
|
|
|
*
|
|
|
|
* Treat a plain path as a Xen UNIX socket path, and give
|
|
|
|
* error unless path is absolute
|
|
|
|
*/
|
|
|
|
if (!conn->uri->path || conn->uri->path[0] != '/') {
|
2010-04-03 00:12:16 +00:00
|
|
|
xenUnifiedError(VIR_ERR_INTERNAL_ERROR,
|
2009-06-12 12:06:15 +00:00
|
|
|
_("unexpected Xen URI path '%s', try ///var/lib/xen/xend-socket"),
|
|
|
|
NULLSTR(conn->uri->path));
|
|
|
|
return VIR_DRV_OPEN_ERROR;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2007-06-20 10:01:14 +00:00
|
|
|
|
2011-02-10 22:42:34 +00:00
|
|
|
#ifdef WITH_LIBXL
|
|
|
|
/* Decline xen:// URI if xend is not running and libxenlight
|
|
|
|
* driver is potentially available. */
|
|
|
|
if (!xenUnifiedXendProbe())
|
|
|
|
return VIR_DRV_OPEN_DECLINED;
|
|
|
|
#endif
|
|
|
|
|
2009-06-12 12:06:15 +00:00
|
|
|
/* We now know the URI is definitely for this driver, so beyond
|
|
|
|
* here, don't return DECLINED, always use ERROR */
|
2007-04-10 11:17:34 +00:00
|
|
|
|
|
|
|
/* Allocate per-connection private data. */
|
2008-06-06 11:09:57 +00:00
|
|
|
if (VIR_ALLOC(priv) < 0) {
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2007-04-10 11:17:34 +00:00
|
|
|
return VIR_DRV_OPEN_ERROR;
|
|
|
|
}
|
2009-01-21 18:11:14 +00:00
|
|
|
if (virMutexInit(&priv->lock) < 0) {
|
2010-04-03 00:12:16 +00:00
|
|
|
xenUnifiedError(VIR_ERR_INTERNAL_ERROR,
|
2010-04-07 15:12:02 +00:00
|
|
|
"%s", _("cannot initialize mutex"));
|
2009-01-21 18:11:14 +00:00
|
|
|
VIR_FREE(priv);
|
|
|
|
return VIR_DRV_OPEN_ERROR;
|
|
|
|
}
|
2007-04-10 11:17:34 +00:00
|
|
|
|
2008-11-25 10:44:52 +00:00
|
|
|
/* Allocate callback list */
|
|
|
|
if (VIR_ALLOC(cbList) < 0) {
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2009-01-21 18:11:14 +00:00
|
|
|
virMutexDestroy(&priv->lock);
|
|
|
|
VIR_FREE(priv);
|
2008-11-25 10:44:52 +00:00
|
|
|
return VIR_DRV_OPEN_ERROR;
|
|
|
|
}
|
2009-01-21 18:11:14 +00:00
|
|
|
conn->privateData = priv;
|
|
|
|
|
2008-11-25 10:44:52 +00:00
|
|
|
priv->domainEventCallbacks = cbList;
|
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
priv->handle = -1;
|
|
|
|
priv->xendConfigVersion = -1;
|
|
|
|
priv->xshandle = NULL;
|
|
|
|
|
|
|
|
|
2009-01-22 17:49:41 +00:00
|
|
|
/* Hypervisor is only run with privilege & required to succeed */
|
|
|
|
if (xenHavePrivilege()) {
|
2011-02-16 23:37:57 +00:00
|
|
|
VIR_DEBUG0("Trying hypervisor sub-driver");
|
2008-11-17 11:44:51 +00:00
|
|
|
if (drivers[XEN_UNIFIED_HYPERVISOR_OFFSET]->open(conn, auth, flags) ==
|
2008-03-17 17:30:48 +00:00
|
|
|
VIR_DRV_OPEN_SUCCESS) {
|
2011-02-16 23:37:57 +00:00
|
|
|
VIR_DEBUG0("Activated hypervisor sub-driver");
|
2008-03-17 17:30:48 +00:00
|
|
|
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
|
|
|
|
2010-11-08 16:32:02 +00:00
|
|
|
/* XenD is required to succeed if privileged */
|
2011-02-16 23:37:57 +00:00
|
|
|
VIR_DEBUG0("Trying XenD sub-driver");
|
2008-11-17 11:44:51 +00:00
|
|
|
if (drivers[XEN_UNIFIED_XEND_OFFSET]->open(conn, auth, flags) ==
|
2008-03-17 17:30:48 +00:00
|
|
|
VIR_DRV_OPEN_SUCCESS) {
|
2011-02-16 23:37:57 +00:00
|
|
|
VIR_DEBUG0("Activated XenD sub-driver");
|
2008-03-17 17:30:48 +00:00
|
|
|
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) {
|
2011-02-16 23:37:57 +00:00
|
|
|
VIR_DEBUG0("Trying XM sub-driver");
|
2008-11-17 11:44:51 +00:00
|
|
|
if (drivers[XEN_UNIFIED_XM_OFFSET]->open(conn, auth, flags) ==
|
2008-03-17 17:30:48 +00:00
|
|
|
VIR_DRV_OPEN_SUCCESS) {
|
2011-02-16 23:37:57 +00:00
|
|
|
VIR_DEBUG0("Activated XM sub-driver");
|
2008-03-17 17:30:48 +00:00
|
|
|
priv->opened[XEN_UNIFIED_XM_OFFSET] = 1;
|
|
|
|
}
|
|
|
|
}
|
2011-02-16 23:37:57 +00:00
|
|
|
VIR_DEBUG0("Trying XS sub-driver");
|
2008-11-17 11:44:51 +00:00
|
|
|
if (drivers[XEN_UNIFIED_XS_OFFSET]->open(conn, auth, flags) ==
|
2008-03-17 17:30:48 +00:00
|
|
|
VIR_DRV_OPEN_SUCCESS) {
|
2011-02-16 23:37:57 +00:00
|
|
|
VIR_DEBUG0("Activated XS sub-driver");
|
2008-03-17 17:30:48 +00:00
|
|
|
priv->opened[XEN_UNIFIED_XS_OFFSET] = 1;
|
|
|
|
} else {
|
2009-01-22 17:49:41 +00:00
|
|
|
if (xenHavePrivilege())
|
|
|
|
goto fail; /* XS is mandatory when privileged */
|
2008-03-17 17:30:48 +00:00
|
|
|
}
|
|
|
|
} else {
|
2009-01-22 17:49:41 +00:00
|
|
|
if (xenHavePrivilege()) {
|
|
|
|
goto fail; /* XenD is mandatory when privileged */
|
2008-03-17 17:30:48 +00:00
|
|
|
} else {
|
2011-02-16 23:37:57 +00:00
|
|
|
VIR_DEBUG0("Handing off for remote driver");
|
2008-07-21 09:48:01 +00:00
|
|
|
ret = VIR_DRV_OPEN_DECLINED; /* Let remote_driver try instead */
|
|
|
|
goto clean;
|
2007-04-10 11:17:34 +00:00
|
|
|
}
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
2009-01-21 18:11:14 +00:00
|
|
|
xenNumaInit(conn);
|
|
|
|
|
2008-09-05 11:35:43 +00:00
|
|
|
if (!(priv->caps = xenHypervisorMakeCapabilities(conn))) {
|
2011-02-16 23:37:57 +00:00
|
|
|
VIR_DEBUG0("Failed to make capabilities");
|
2008-07-25 13:17:27 +00:00
|
|
|
goto fail;
|
|
|
|
}
|
|
|
|
|
2008-11-25 10:44:52 +00:00
|
|
|
#if WITH_XEN_INOTIFY
|
2009-01-29 23:01:37 +00:00
|
|
|
if (xenHavePrivilege()) {
|
2011-02-16 23:37:57 +00:00
|
|
|
VIR_DEBUG0("Trying Xen inotify sub-driver");
|
2009-01-29 23:01:37 +00:00
|
|
|
if (drivers[XEN_UNIFIED_INOTIFY_OFFSET]->open(conn, auth, flags) ==
|
|
|
|
VIR_DRV_OPEN_SUCCESS) {
|
2011-02-16 23:37:57 +00:00
|
|
|
VIR_DEBUG0("Activated Xen inotify sub-driver");
|
2009-01-29 23:01:37 +00:00
|
|
|
priv->opened[XEN_UNIFIED_INOTIFY_OFFSET] = 1;
|
|
|
|
}
|
2008-11-25 10:44:52 +00:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
return VIR_DRV_OPEN_SUCCESS;
|
2008-03-17 17:30:48 +00:00
|
|
|
|
2008-07-21 09:48:01 +00:00
|
|
|
fail:
|
|
|
|
ret = VIR_DRV_OPEN_ERROR;
|
|
|
|
clean:
|
2011-02-16 23:37:57 +00:00
|
|
|
VIR_DEBUG0("Failed to activate a mandatory sub-driver");
|
2008-03-17 17:30:48 +00:00
|
|
|
for (i = 0 ; i < XEN_UNIFIED_NR_DRIVERS ; i++)
|
|
|
|
if (priv->opened[i]) drivers[i]->close(conn);
|
2009-01-21 18:11:14 +00:00
|
|
|
virMutexDestroy(&priv->lock);
|
2008-06-06 11:09:57 +00:00
|
|
|
VIR_FREE(priv);
|
2009-01-21 18:11:14 +00:00
|
|
|
conn->privateData = NULL;
|
2008-07-21 12:06:16 +00:00
|
|
|
return ret;
|
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
|
|
|
|
2008-07-25 13:17:27 +00:00
|
|
|
virCapabilitiesFree(priv->caps);
|
2008-11-25 10:44:52 +00:00
|
|
|
virDomainEventCallbackListFree(priv->domainEventCallbacks);
|
|
|
|
|
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
|
|
|
|
2009-01-21 18:11:14 +00:00
|
|
|
virMutexDestroy(&priv->lock);
|
|
|
|
VIR_FREE(conn->privateData);
|
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
|
|
|
}
|
|
|
|
|
2008-11-28 12:03:20 +00:00
|
|
|
|
|
|
|
#define HV_VERSION ((DOM0_INTERFACE_VERSION >> 24) * 1000000 + \
|
|
|
|
((DOM0_INTERFACE_VERSION >> 16) & 0xFF) * 1000 + \
|
|
|
|
(DOM0_INTERFACE_VERSION & 0xFFFF))
|
|
|
|
|
|
|
|
unsigned long xenUnifiedVersion(void)
|
|
|
|
{
|
|
|
|
return HV_VERSION;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
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) {
|
2009-09-17 17:10:04 +00:00
|
|
|
case VIR_DRV_FEATURE_MIGRATION_V1:
|
|
|
|
case VIR_DRV_FEATURE_MIGRATION_DIRECT:
|
|
|
|
return 1;
|
|
|
|
default:
|
|
|
|
return 0;
|
2007-08-21 09:31:12 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-04-04 14:19:49 +00:00
|
|
|
static int
|
2008-11-28 12:03:20 +00:00
|
|
|
xenUnifiedGetVersion (virConnectPtr conn, unsigned long *hvVer)
|
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;
|
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
|
|
|
}
|
|
|
|
|
Implmentation of new APIs to checking state/persistence of objects
This implements the virConnectIsSecure, virConnectIsEncrypted,
virDomainIsPersistent, virDomainIsActive, virNetworkIsActive,
virNetworkIsPersistent, virStoragePoolIsActive,
virStoragePoolIsPersistent, virInterfaceIsActive APIs in
(nearly) all drivers. Exceptions are:
phyp: missing domainIsActive/Persistent
esx: missing domainIsPersistent
opennebula: missing domainIsActive/Persistent
* src/remote/remote_protocol.x: Define remote wire ABI for newly
added APIs.
* daemon/remote_dispatch*.h: Re-generated from remote_protocol.x
* src/esx/esx_driver.c, src/lxc/lxc_driver.c, src/network/bridge_driver.c,
src/opennebula/one_driver.c, src/openvz/openvz_conf.c,
src/openvz/openvz_driver.c, src/phyp/phyp_driver.c,
src/remote/remote_driver.c, src/storage/storage_driver.c,
src/test/test_driver.c, src/uml/uml_driver.c, src/vbox/vbox_tmpl.c,
src/xen/xen_driver.c, src/xen/xen_driver.h, src/xen/xen_inotify.c,
src/xen/xen_inotify.h: Implement all the new APIs where possible
2009-10-20 14:12:03 +00:00
|
|
|
static int
|
|
|
|
xenUnifiedIsEncrypted(virConnectPtr conn ATTRIBUTE_UNUSED)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
xenUnifiedIsSecure(virConnectPtr conn)
|
|
|
|
{
|
|
|
|
GET_PRIVATE(conn);
|
|
|
|
int ret = 1;
|
|
|
|
|
|
|
|
/* All drivers are secure, except for XenD over TCP */
|
|
|
|
if (priv->opened[XEN_UNIFIED_XEND_OFFSET] &&
|
|
|
|
priv->addrfamily != AF_UNIX)
|
|
|
|
ret = 0;
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2010-10-14 22:17:18 +00:00
|
|
|
int
|
2007-04-04 14:19:49 +00:00
|
|
|
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")) {
|
2010-04-03 00:12:16 +00:00
|
|
|
xenUnifiedError(VIR_ERR_INVALID_ARG, __FUNCTION__);
|
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
|
|
|
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 {
|
2010-04-03 00:12:16 +00:00
|
|
|
xenUnifiedError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
|
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
|
|
|
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)
|
|
|
|
{
|
2009-01-21 18:11:14 +00:00
|
|
|
xenUnifiedPrivatePtr priv = conn->privateData;
|
|
|
|
char *xml;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2009-01-21 18:11:14 +00:00
|
|
|
if (!(xml = virCapabilitiesFormatXML(priv->caps))) {
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2009-01-21 18:11:14 +00:00
|
|
|
return NULL;
|
|
|
|
}
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2009-01-21 18:11:14 +00:00
|
|
|
return xml;
|
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);
|
2008-11-28 15:25:04 +00:00
|
|
|
int ret;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2008-11-28 15:25:04 +00:00
|
|
|
/* Try xenstore. */
|
|
|
|
if (priv->opened[XEN_UNIFIED_XS_OFFSET]) {
|
|
|
|
ret = xenStoreListDomains (conn, ids, maxids);
|
|
|
|
if (ret >= 0) return ret;
|
|
|
|
}
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2008-11-28 15:25:04 +00:00
|
|
|
/* Try HV. */
|
|
|
|
if (priv->opened[XEN_UNIFIED_HYPERVISOR_OFFSET]) {
|
|
|
|
ret = xenHypervisorListDomains (conn, ids, maxids);
|
|
|
|
if (ret >= 0) return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Try xend. */
|
|
|
|
if (priv->opened[XEN_UNIFIED_XEND_OFFSET]) {
|
|
|
|
ret = xenDaemonListDomains (conn, ids, maxids);
|
|
|
|
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
|
|
|
|
xenUnifiedNumOfDomains (virConnectPtr conn)
|
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(conn);
|
2009-10-09 09:23:23 +00:00
|
|
|
int ret;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2009-10-09 09:23:23 +00:00
|
|
|
/* Try xenstore. */
|
|
|
|
if (priv->opened[XEN_UNIFIED_XS_OFFSET]) {
|
|
|
|
ret = xenStoreNumOfDomains (conn);
|
|
|
|
if (ret >= 0) return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Try HV. */
|
|
|
|
if (priv->opened[XEN_UNIFIED_HYPERVISOR_OFFSET]) {
|
|
|
|
ret = xenHypervisorNumOfDomains (conn);
|
|
|
|
if (ret >= 0) return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Try xend. */
|
|
|
|
if (priv->opened[XEN_UNIFIED_XEND_OFFSET]) {
|
|
|
|
ret = xenDaemonNumOfDomains (conn);
|
|
|
|
if (ret >= 0) return ret;
|
|
|
|
}
|
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
return -1;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static virDomainPtr
|
2008-10-10 09:32:27 +00:00
|
|
|
xenUnifiedDomainCreateXML (virConnectPtr conn,
|
|
|
|
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)
|
2008-10-10 09:32:27 +00:00
|
|
|
if (priv->opened[i] && drivers[i]->domainCreateXML) {
|
|
|
|
ret = drivers[i]->domainCreateXML (conn, xmlDesc, flags);
|
2007-04-10 11:17:34 +00:00
|
|
|
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 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. */
|
2010-04-03 00:12:16 +00:00
|
|
|
xenUnifiedError(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 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. */
|
2010-04-03 00:12:16 +00:00
|
|
|
xenUnifiedError(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 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. */
|
2010-04-03 00:12:16 +00:00
|
|
|
xenUnifiedError(VIR_ERR_NO_DOMAIN, __FUNCTION__);
|
2007-04-10 11:17:34 +00:00
|
|
|
return NULL;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
Implmentation of new APIs to checking state/persistence of objects
This implements the virConnectIsSecure, virConnectIsEncrypted,
virDomainIsPersistent, virDomainIsActive, virNetworkIsActive,
virNetworkIsPersistent, virStoragePoolIsActive,
virStoragePoolIsPersistent, virInterfaceIsActive APIs in
(nearly) all drivers. Exceptions are:
phyp: missing domainIsActive/Persistent
esx: missing domainIsPersistent
opennebula: missing domainIsActive/Persistent
* src/remote/remote_protocol.x: Define remote wire ABI for newly
added APIs.
* daemon/remote_dispatch*.h: Re-generated from remote_protocol.x
* src/esx/esx_driver.c, src/lxc/lxc_driver.c, src/network/bridge_driver.c,
src/opennebula/one_driver.c, src/openvz/openvz_conf.c,
src/openvz/openvz_driver.c, src/phyp/phyp_driver.c,
src/remote/remote_driver.c, src/storage/storage_driver.c,
src/test/test_driver.c, src/uml/uml_driver.c, src/vbox/vbox_tmpl.c,
src/xen/xen_driver.c, src/xen/xen_driver.h, src/xen/xen_inotify.c,
src/xen/xen_inotify.h: Implement all the new APIs where possible
2009-10-20 14:12:03 +00:00
|
|
|
|
|
|
|
static int
|
|
|
|
xenUnifiedDomainIsActive(virDomainPtr dom)
|
|
|
|
{
|
|
|
|
virDomainPtr currdom;
|
|
|
|
int ret = -1;
|
|
|
|
|
|
|
|
/* ID field in dom may be outdated, so re-lookup */
|
|
|
|
currdom = xenUnifiedDomainLookupByUUID(dom->conn, dom->uuid);
|
|
|
|
|
|
|
|
if (currdom) {
|
|
|
|
ret = currdom->id == -1 ? 0 : 1;
|
|
|
|
virDomainFree(currdom);
|
|
|
|
}
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2010-11-24 07:43:15 +00:00
|
|
|
xenUnifiedDomainIsPersistent(virDomainPtr dom)
|
Implmentation of new APIs to checking state/persistence of objects
This implements the virConnectIsSecure, virConnectIsEncrypted,
virDomainIsPersistent, virDomainIsActive, virNetworkIsActive,
virNetworkIsPersistent, virStoragePoolIsActive,
virStoragePoolIsPersistent, virInterfaceIsActive APIs in
(nearly) all drivers. Exceptions are:
phyp: missing domainIsActive/Persistent
esx: missing domainIsPersistent
opennebula: missing domainIsActive/Persistent
* src/remote/remote_protocol.x: Define remote wire ABI for newly
added APIs.
* daemon/remote_dispatch*.h: Re-generated from remote_protocol.x
* src/esx/esx_driver.c, src/lxc/lxc_driver.c, src/network/bridge_driver.c,
src/opennebula/one_driver.c, src/openvz/openvz_conf.c,
src/openvz/openvz_driver.c, src/phyp/phyp_driver.c,
src/remote/remote_driver.c, src/storage/storage_driver.c,
src/test/test_driver.c, src/uml/uml_driver.c, src/vbox/vbox_tmpl.c,
src/xen/xen_driver.c, src/xen/xen_driver.h, src/xen/xen_inotify.c,
src/xen/xen_inotify.h: Implement all the new APIs where possible
2009-10-20 14:12:03 +00:00
|
|
|
{
|
|
|
|
GET_PRIVATE(dom->conn);
|
|
|
|
virDomainPtr currdom = NULL;
|
|
|
|
int ret = -1;
|
|
|
|
|
|
|
|
if (priv->opened[XEN_UNIFIED_XM_OFFSET]) {
|
|
|
|
/* Old Xen, pre-inactive domain management.
|
|
|
|
* If the XM driver can see the guest, it is definitely persistent */
|
|
|
|
currdom = xenXMDomainLookupByUUID(dom->conn, dom->uuid);
|
|
|
|
if (currdom)
|
|
|
|
ret = 1;
|
|
|
|
else
|
|
|
|
ret = 0;
|
|
|
|
} else {
|
|
|
|
/* New Xen with inactive domain management */
|
|
|
|
if (priv->opened[XEN_UNIFIED_XEND_OFFSET]) {
|
|
|
|
currdom = xenDaemonLookupByUUID(dom->conn, dom->uuid);
|
|
|
|
if (currdom) {
|
|
|
|
if (currdom->id == -1) {
|
|
|
|
/* If its inactive, then trivially, it must be persistent */
|
|
|
|
ret = 1;
|
|
|
|
} else {
|
|
|
|
char *path;
|
|
|
|
char uuidstr[VIR_UUID_STRING_BUFLEN];
|
|
|
|
|
|
|
|
/* If its running there's no official way to tell, so we
|
|
|
|
* go behind xend's back & look at the config dir */
|
|
|
|
|
|
|
|
virUUIDFormat(dom->uuid, uuidstr);
|
|
|
|
if (virAsprintf(&path, "%s/%s", XEND_DOMAINS_DIR, uuidstr) < 0) {
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
Implmentation of new APIs to checking state/persistence of objects
This implements the virConnectIsSecure, virConnectIsEncrypted,
virDomainIsPersistent, virDomainIsActive, virNetworkIsActive,
virNetworkIsPersistent, virStoragePoolIsActive,
virStoragePoolIsPersistent, virInterfaceIsActive APIs in
(nearly) all drivers. Exceptions are:
phyp: missing domainIsActive/Persistent
esx: missing domainIsPersistent
opennebula: missing domainIsActive/Persistent
* src/remote/remote_protocol.x: Define remote wire ABI for newly
added APIs.
* daemon/remote_dispatch*.h: Re-generated from remote_protocol.x
* src/esx/esx_driver.c, src/lxc/lxc_driver.c, src/network/bridge_driver.c,
src/opennebula/one_driver.c, src/openvz/openvz_conf.c,
src/openvz/openvz_driver.c, src/phyp/phyp_driver.c,
src/remote/remote_driver.c, src/storage/storage_driver.c,
src/test/test_driver.c, src/uml/uml_driver.c, src/vbox/vbox_tmpl.c,
src/xen/xen_driver.c, src/xen/xen_driver.h, src/xen/xen_inotify.c,
src/xen/xen_inotify.h: Implement all the new APIs where possible
2009-10-20 14:12:03 +00:00
|
|
|
goto done;
|
|
|
|
}
|
|
|
|
if (access(path, R_OK) == 0)
|
|
|
|
ret = 1;
|
|
|
|
else if (errno == ENOENT)
|
|
|
|
ret = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
done:
|
|
|
|
if (currdom)
|
|
|
|
virDomainFree(currdom);
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2010-11-24 07:43:15 +00:00
|
|
|
static int
|
|
|
|
xenUnifiedDomainIsUpdated(virDomainPtr dom ATTRIBUTE_UNUSED)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
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
|
|
|
|
2008-11-27 16:16:13 +00:00
|
|
|
/* Prefer xend for setting max memory */
|
|
|
|
if (priv->opened[XEN_UNIFIED_XEND_OFFSET]) {
|
|
|
|
if (xenDaemonDomainSetMaxMemory (dom, memory) == 0)
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-04-30 16:57:15 +00:00
|
|
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
|
2008-11-27 16:16:13 +00:00
|
|
|
if (i != XEN_UNIFIED_XEND_OFFSET &&
|
|
|
|
priv->opened[i] &&
|
2007-04-30 16:57:15 +00:00
|
|
|
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
|
vcpu: make old API trivially wrap to new API
Note - this wrapping is completely mechanical; the old API will
function identically, since the new API validates that the exact
same flags are provided by the old API. On a per-driver basis,
it may make sense to have the old API pass a different set of flags,
but that should be done in the per-driver patch that implements
the full range of flag support in the new API.
* src/esx/esx_driver.c (esxDomainSetVcpus, escDomainGetMaxVpcus):
Move guts...
(esxDomainSetVcpusFlags, esxDomainGetVcpusFlags): ...to new
functions.
(esxDriver): Trivially support the new API.
* src/openvz/openvz_driver.c (openvzDomainSetVcpus)
(openvzDomainSetVcpusFlags, openvzDomainGetMaxVcpus)
(openvzDomainGetVcpusFlags, openvzDriver): Likewise.
* src/phyp/phyp_driver.c (phypDomainSetCPU)
(phypDomainSetVcpusFlags, phypGetLparCPUMAX)
(phypDomainGetVcpusFlags, phypDriver): Likewise.
* src/qemu/qemu_driver.c (qemudDomainSetVcpus)
(qemudDomainSetVcpusFlags, qemudDomainGetMaxVcpus)
(qemudDomainGetVcpusFlags, qemuDriver): Likewise.
* src/test/test_driver.c (testSetVcpus, testDomainSetVcpusFlags)
(testDomainGetMaxVcpus, testDomainGetVcpusFlags, testDriver):
Likewise.
* src/vbox/vbox_tmpl.c (vboxDomainSetVcpus)
(vboxDomainSetVcpusFlags, virDomainGetMaxVcpus)
(virDomainGetVcpusFlags, virDriver): Likewise.
* src/xen/xen_driver.c (xenUnifiedDomainSetVcpus)
(xenUnifiedDomainSetVcpusFlags, xenUnifiedDomainGetMaxVcpus)
(xenUnifiedDomainGetVcpusFlags, xenUnifiedDriver): Likewise.
* src/xenapi/xenapi_driver.c (xenapiDomainSetVcpus)
(xenapiDomainSetVcpusFlags, xenapiDomainGetMaxVcpus)
(xenapiDomainGetVcpusFlags, xenapiDriver): Likewise.
(xenapiError): New helper macro.
2010-09-27 22:37:53 +00:00
|
|
|
xenUnifiedDomainSetVcpusFlags (virDomainPtr dom, unsigned int nvcpus,
|
|
|
|
unsigned int flags)
|
2007-04-04 14:19:49 +00:00
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(dom->conn);
|
2010-10-14 22:17:18 +00:00
|
|
|
int ret;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2010-10-14 22:17:18 +00:00
|
|
|
virCheckFlags(VIR_DOMAIN_VCPU_LIVE |
|
|
|
|
VIR_DOMAIN_VCPU_CONFIG |
|
|
|
|
VIR_DOMAIN_VCPU_MAXIMUM, -1);
|
|
|
|
|
|
|
|
/* At least one of LIVE or CONFIG must be set. MAXIMUM cannot be
|
|
|
|
* mixed with LIVE. */
|
|
|
|
if ((flags & (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_CONFIG)) == 0 ||
|
|
|
|
(flags & (VIR_DOMAIN_VCPU_MAXIMUM | VIR_DOMAIN_VCPU_LIVE)) ==
|
|
|
|
(VIR_DOMAIN_VCPU_MAXIMUM | VIR_DOMAIN_VCPU_LIVE)) {
|
|
|
|
xenUnifiedError(VIR_ERR_INVALID_ARG,
|
|
|
|
_("invalid flag combination: (0x%x)"), flags);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (!nvcpus || (unsigned short) nvcpus != nvcpus) {
|
|
|
|
xenUnifiedError(VIR_ERR_INVALID_ARG,
|
|
|
|
_("argument out of range: %d"), nvcpus);
|
vcpu: make old API trivially wrap to new API
Note - this wrapping is completely mechanical; the old API will
function identically, since the new API validates that the exact
same flags are provided by the old API. On a per-driver basis,
it may make sense to have the old API pass a different set of flags,
but that should be done in the per-driver patch that implements
the full range of flag support in the new API.
* src/esx/esx_driver.c (esxDomainSetVcpus, escDomainGetMaxVpcus):
Move guts...
(esxDomainSetVcpusFlags, esxDomainGetVcpusFlags): ...to new
functions.
(esxDriver): Trivially support the new API.
* src/openvz/openvz_driver.c (openvzDomainSetVcpus)
(openvzDomainSetVcpusFlags, openvzDomainGetMaxVcpus)
(openvzDomainGetVcpusFlags, openvzDriver): Likewise.
* src/phyp/phyp_driver.c (phypDomainSetCPU)
(phypDomainSetVcpusFlags, phypGetLparCPUMAX)
(phypDomainGetVcpusFlags, phypDriver): Likewise.
* src/qemu/qemu_driver.c (qemudDomainSetVcpus)
(qemudDomainSetVcpusFlags, qemudDomainGetMaxVcpus)
(qemudDomainGetVcpusFlags, qemuDriver): Likewise.
* src/test/test_driver.c (testSetVcpus, testDomainSetVcpusFlags)
(testDomainGetMaxVcpus, testDomainGetVcpusFlags, testDriver):
Likewise.
* src/vbox/vbox_tmpl.c (vboxDomainSetVcpus)
(vboxDomainSetVcpusFlags, virDomainGetMaxVcpus)
(virDomainGetVcpusFlags, virDriver): Likewise.
* src/xen/xen_driver.c (xenUnifiedDomainSetVcpus)
(xenUnifiedDomainSetVcpusFlags, xenUnifiedDomainGetMaxVcpus)
(xenUnifiedDomainGetVcpusFlags, xenUnifiedDriver): Likewise.
* src/xenapi/xenapi_driver.c (xenapiDomainSetVcpus)
(xenapiDomainSetVcpusFlags, xenapiDomainGetMaxVcpus)
(xenapiDomainGetVcpusFlags, xenapiDriver): Likewise.
(xenapiError): New helper macro.
2010-09-27 22:37:53 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
/* Try non-hypervisor methods first, then hypervisor direct method
|
|
|
|
* as a last resort.
|
|
|
|
*/
|
2010-10-14 22:17:18 +00:00
|
|
|
if (priv->opened[XEN_UNIFIED_XEND_OFFSET]) {
|
|
|
|
ret = xenDaemonDomainSetVcpusFlags(dom, nvcpus, flags);
|
|
|
|
if (ret != -2)
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
if (priv->opened[XEN_UNIFIED_XM_OFFSET]) {
|
|
|
|
ret = xenXMDomainSetVcpusFlags(dom, nvcpus, flags);
|
|
|
|
if (ret != -2)
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
if (flags == VIR_DOMAIN_VCPU_LIVE)
|
|
|
|
return xenHypervisorSetVcpus(dom, nvcpus);
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2010-10-14 22:17:18 +00:00
|
|
|
xenUnifiedError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
|
2007-04-10 11:17:34 +00:00
|
|
|
return -1;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
vcpu: make old API trivially wrap to new API
Note - this wrapping is completely mechanical; the old API will
function identically, since the new API validates that the exact
same flags are provided by the old API. On a per-driver basis,
it may make sense to have the old API pass a different set of flags,
but that should be done in the per-driver patch that implements
the full range of flag support in the new API.
* src/esx/esx_driver.c (esxDomainSetVcpus, escDomainGetMaxVpcus):
Move guts...
(esxDomainSetVcpusFlags, esxDomainGetVcpusFlags): ...to new
functions.
(esxDriver): Trivially support the new API.
* src/openvz/openvz_driver.c (openvzDomainSetVcpus)
(openvzDomainSetVcpusFlags, openvzDomainGetMaxVcpus)
(openvzDomainGetVcpusFlags, openvzDriver): Likewise.
* src/phyp/phyp_driver.c (phypDomainSetCPU)
(phypDomainSetVcpusFlags, phypGetLparCPUMAX)
(phypDomainGetVcpusFlags, phypDriver): Likewise.
* src/qemu/qemu_driver.c (qemudDomainSetVcpus)
(qemudDomainSetVcpusFlags, qemudDomainGetMaxVcpus)
(qemudDomainGetVcpusFlags, qemuDriver): Likewise.
* src/test/test_driver.c (testSetVcpus, testDomainSetVcpusFlags)
(testDomainGetMaxVcpus, testDomainGetVcpusFlags, testDriver):
Likewise.
* src/vbox/vbox_tmpl.c (vboxDomainSetVcpus)
(vboxDomainSetVcpusFlags, virDomainGetMaxVcpus)
(virDomainGetVcpusFlags, virDriver): Likewise.
* src/xen/xen_driver.c (xenUnifiedDomainSetVcpus)
(xenUnifiedDomainSetVcpusFlags, xenUnifiedDomainGetMaxVcpus)
(xenUnifiedDomainGetVcpusFlags, xenUnifiedDriver): Likewise.
* src/xenapi/xenapi_driver.c (xenapiDomainSetVcpus)
(xenapiDomainSetVcpusFlags, xenapiDomainGetMaxVcpus)
(xenapiDomainGetVcpusFlags, xenapiDriver): Likewise.
(xenapiError): New helper macro.
2010-09-27 22:37:53 +00:00
|
|
|
static int
|
|
|
|
xenUnifiedDomainSetVcpus (virDomainPtr dom, unsigned int nvcpus)
|
|
|
|
{
|
2010-10-14 22:17:18 +00:00
|
|
|
unsigned int flags = VIR_DOMAIN_VCPU_LIVE;
|
|
|
|
xenUnifiedPrivatePtr priv;
|
|
|
|
|
|
|
|
/* Per the documented API, it is hypervisor-dependent whether this
|
|
|
|
* affects just _LIVE or _LIVE|_CONFIG; in xen's case, that
|
|
|
|
* depends on xendConfigVersion. */
|
|
|
|
if (dom) {
|
|
|
|
priv = dom->conn->privateData;
|
|
|
|
if (priv->xendConfigVersion >= 3)
|
|
|
|
flags |= VIR_DOMAIN_VCPU_CONFIG;
|
|
|
|
}
|
|
|
|
return xenUnifiedDomainSetVcpusFlags(dom, nvcpus, flags);
|
vcpu: make old API trivially wrap to new API
Note - this wrapping is completely mechanical; the old API will
function identically, since the new API validates that the exact
same flags are provided by the old API. On a per-driver basis,
it may make sense to have the old API pass a different set of flags,
but that should be done in the per-driver patch that implements
the full range of flag support in the new API.
* src/esx/esx_driver.c (esxDomainSetVcpus, escDomainGetMaxVpcus):
Move guts...
(esxDomainSetVcpusFlags, esxDomainGetVcpusFlags): ...to new
functions.
(esxDriver): Trivially support the new API.
* src/openvz/openvz_driver.c (openvzDomainSetVcpus)
(openvzDomainSetVcpusFlags, openvzDomainGetMaxVcpus)
(openvzDomainGetVcpusFlags, openvzDriver): Likewise.
* src/phyp/phyp_driver.c (phypDomainSetCPU)
(phypDomainSetVcpusFlags, phypGetLparCPUMAX)
(phypDomainGetVcpusFlags, phypDriver): Likewise.
* src/qemu/qemu_driver.c (qemudDomainSetVcpus)
(qemudDomainSetVcpusFlags, qemudDomainGetMaxVcpus)
(qemudDomainGetVcpusFlags, qemuDriver): Likewise.
* src/test/test_driver.c (testSetVcpus, testDomainSetVcpusFlags)
(testDomainGetMaxVcpus, testDomainGetVcpusFlags, testDriver):
Likewise.
* src/vbox/vbox_tmpl.c (vboxDomainSetVcpus)
(vboxDomainSetVcpusFlags, virDomainGetMaxVcpus)
(virDomainGetVcpusFlags, virDriver): Likewise.
* src/xen/xen_driver.c (xenUnifiedDomainSetVcpus)
(xenUnifiedDomainSetVcpusFlags, xenUnifiedDomainGetMaxVcpus)
(xenUnifiedDomainGetVcpusFlags, xenUnifiedDriver): Likewise.
* src/xenapi/xenapi_driver.c (xenapiDomainSetVcpus)
(xenapiDomainSetVcpusFlags, xenapiDomainGetMaxVcpus)
(xenapiDomainGetVcpusFlags, xenapiDriver): Likewise.
(xenapiError): New helper macro.
2010-09-27 22:37:53 +00:00
|
|
|
}
|
|
|
|
|
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
|
vcpu: make old API trivially wrap to new API
Note - this wrapping is completely mechanical; the old API will
function identically, since the new API validates that the exact
same flags are provided by the old API. On a per-driver basis,
it may make sense to have the old API pass a different set of flags,
but that should be done in the per-driver patch that implements
the full range of flag support in the new API.
* src/esx/esx_driver.c (esxDomainSetVcpus, escDomainGetMaxVpcus):
Move guts...
(esxDomainSetVcpusFlags, esxDomainGetVcpusFlags): ...to new
functions.
(esxDriver): Trivially support the new API.
* src/openvz/openvz_driver.c (openvzDomainSetVcpus)
(openvzDomainSetVcpusFlags, openvzDomainGetMaxVcpus)
(openvzDomainGetVcpusFlags, openvzDriver): Likewise.
* src/phyp/phyp_driver.c (phypDomainSetCPU)
(phypDomainSetVcpusFlags, phypGetLparCPUMAX)
(phypDomainGetVcpusFlags, phypDriver): Likewise.
* src/qemu/qemu_driver.c (qemudDomainSetVcpus)
(qemudDomainSetVcpusFlags, qemudDomainGetMaxVcpus)
(qemudDomainGetVcpusFlags, qemuDriver): Likewise.
* src/test/test_driver.c (testSetVcpus, testDomainSetVcpusFlags)
(testDomainGetMaxVcpus, testDomainGetVcpusFlags, testDriver):
Likewise.
* src/vbox/vbox_tmpl.c (vboxDomainSetVcpus)
(vboxDomainSetVcpusFlags, virDomainGetMaxVcpus)
(virDomainGetVcpusFlags, virDriver): Likewise.
* src/xen/xen_driver.c (xenUnifiedDomainSetVcpus)
(xenUnifiedDomainSetVcpusFlags, xenUnifiedDomainGetMaxVcpus)
(xenUnifiedDomainGetVcpusFlags, xenUnifiedDriver): Likewise.
* src/xenapi/xenapi_driver.c (xenapiDomainSetVcpus)
(xenapiDomainSetVcpusFlags, xenapiDomainGetMaxVcpus)
(xenapiDomainGetVcpusFlags, xenapiDriver): Likewise.
(xenapiError): New helper macro.
2010-09-27 22:37:53 +00:00
|
|
|
xenUnifiedDomainGetVcpusFlags (virDomainPtr dom, unsigned int flags)
|
2007-04-04 14:19:49 +00:00
|
|
|
{
|
2007-04-30 16:57:15 +00:00
|
|
|
GET_PRIVATE(dom->conn);
|
2010-10-06 23:54:41 +00:00
|
|
|
int ret;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2010-10-06 23:54:41 +00:00
|
|
|
virCheckFlags(VIR_DOMAIN_VCPU_LIVE |
|
|
|
|
VIR_DOMAIN_VCPU_CONFIG |
|
|
|
|
VIR_DOMAIN_VCPU_MAXIMUM, -1);
|
|
|
|
|
|
|
|
/* Exactly one of LIVE or CONFIG must be set. */
|
|
|
|
if (!(flags & VIR_DOMAIN_VCPU_LIVE) == !(flags & VIR_DOMAIN_VCPU_CONFIG)) {
|
|
|
|
xenUnifiedError(VIR_ERR_INVALID_ARG,
|
|
|
|
_("invalid flag combination: (0x%x)"), flags);
|
vcpu: make old API trivially wrap to new API
Note - this wrapping is completely mechanical; the old API will
function identically, since the new API validates that the exact
same flags are provided by the old API. On a per-driver basis,
it may make sense to have the old API pass a different set of flags,
but that should be done in the per-driver patch that implements
the full range of flag support in the new API.
* src/esx/esx_driver.c (esxDomainSetVcpus, escDomainGetMaxVpcus):
Move guts...
(esxDomainSetVcpusFlags, esxDomainGetVcpusFlags): ...to new
functions.
(esxDriver): Trivially support the new API.
* src/openvz/openvz_driver.c (openvzDomainSetVcpus)
(openvzDomainSetVcpusFlags, openvzDomainGetMaxVcpus)
(openvzDomainGetVcpusFlags, openvzDriver): Likewise.
* src/phyp/phyp_driver.c (phypDomainSetCPU)
(phypDomainSetVcpusFlags, phypGetLparCPUMAX)
(phypDomainGetVcpusFlags, phypDriver): Likewise.
* src/qemu/qemu_driver.c (qemudDomainSetVcpus)
(qemudDomainSetVcpusFlags, qemudDomainGetMaxVcpus)
(qemudDomainGetVcpusFlags, qemuDriver): Likewise.
* src/test/test_driver.c (testSetVcpus, testDomainSetVcpusFlags)
(testDomainGetMaxVcpus, testDomainGetVcpusFlags, testDriver):
Likewise.
* src/vbox/vbox_tmpl.c (vboxDomainSetVcpus)
(vboxDomainSetVcpusFlags, virDomainGetMaxVcpus)
(virDomainGetVcpusFlags, virDriver): Likewise.
* src/xen/xen_driver.c (xenUnifiedDomainSetVcpus)
(xenUnifiedDomainSetVcpusFlags, xenUnifiedDomainGetMaxVcpus)
(xenUnifiedDomainGetVcpusFlags, xenUnifiedDriver): Likewise.
* src/xenapi/xenapi_driver.c (xenapiDomainSetVcpus)
(xenapiDomainSetVcpusFlags, xenapiDomainGetMaxVcpus)
(xenapiDomainGetVcpusFlags, xenapiDriver): Likewise.
(xenapiError): New helper macro.
2010-09-27 22:37:53 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2010-10-06 23:54:41 +00:00
|
|
|
if (priv->opened[XEN_UNIFIED_XEND_OFFSET]) {
|
|
|
|
ret = xenDaemonDomainGetVcpusFlags(dom, flags);
|
|
|
|
if (ret != -2)
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
if (priv->opened[XEN_UNIFIED_XM_OFFSET]) {
|
|
|
|
ret = xenXMDomainGetVcpusFlags(dom, flags);
|
|
|
|
if (ret != -2)
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
if (flags == (VIR_DOMAIN_VCPU_CONFIG | VIR_DOMAIN_VCPU_MAXIMUM))
|
|
|
|
return xenHypervisorGetVcpuMax(dom);
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2010-10-06 23:54:41 +00:00
|
|
|
xenUnifiedError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
|
2007-04-10 11:17:34 +00:00
|
|
|
return -1;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
vcpu: make old API trivially wrap to new API
Note - this wrapping is completely mechanical; the old API will
function identically, since the new API validates that the exact
same flags are provided by the old API. On a per-driver basis,
it may make sense to have the old API pass a different set of flags,
but that should be done in the per-driver patch that implements
the full range of flag support in the new API.
* src/esx/esx_driver.c (esxDomainSetVcpus, escDomainGetMaxVpcus):
Move guts...
(esxDomainSetVcpusFlags, esxDomainGetVcpusFlags): ...to new
functions.
(esxDriver): Trivially support the new API.
* src/openvz/openvz_driver.c (openvzDomainSetVcpus)
(openvzDomainSetVcpusFlags, openvzDomainGetMaxVcpus)
(openvzDomainGetVcpusFlags, openvzDriver): Likewise.
* src/phyp/phyp_driver.c (phypDomainSetCPU)
(phypDomainSetVcpusFlags, phypGetLparCPUMAX)
(phypDomainGetVcpusFlags, phypDriver): Likewise.
* src/qemu/qemu_driver.c (qemudDomainSetVcpus)
(qemudDomainSetVcpusFlags, qemudDomainGetMaxVcpus)
(qemudDomainGetVcpusFlags, qemuDriver): Likewise.
* src/test/test_driver.c (testSetVcpus, testDomainSetVcpusFlags)
(testDomainGetMaxVcpus, testDomainGetVcpusFlags, testDriver):
Likewise.
* src/vbox/vbox_tmpl.c (vboxDomainSetVcpus)
(vboxDomainSetVcpusFlags, virDomainGetMaxVcpus)
(virDomainGetVcpusFlags, virDriver): Likewise.
* src/xen/xen_driver.c (xenUnifiedDomainSetVcpus)
(xenUnifiedDomainSetVcpusFlags, xenUnifiedDomainGetMaxVcpus)
(xenUnifiedDomainGetVcpusFlags, xenUnifiedDriver): Likewise.
* src/xenapi/xenapi_driver.c (xenapiDomainSetVcpus)
(xenapiDomainSetVcpusFlags, xenapiDomainGetMaxVcpus)
(xenapiDomainGetVcpusFlags, xenapiDriver): Likewise.
(xenapiError): New helper macro.
2010-09-27 22:37:53 +00:00
|
|
|
static int
|
|
|
|
xenUnifiedDomainGetMaxVcpus (virDomainPtr dom)
|
|
|
|
{
|
|
|
|
return xenUnifiedDomainGetVcpusFlags(dom, (VIR_DOMAIN_VCPU_LIVE |
|
|
|
|
VIR_DOMAIN_VCPU_MAXIMUM));
|
|
|
|
}
|
|
|
|
|
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;
|
2009-01-21 18:11:14 +00:00
|
|
|
xenUnifiedLock(priv);
|
2007-10-31 09:39:13 +00:00
|
|
|
cpus = xenDomainUsedCpus(dom);
|
2009-01-21 18:11:14 +00:00
|
|
|
xenUnifiedUnlock(priv);
|
2007-10-31 09:39:13 +00:00
|
|
|
res = xenDaemonDomainDumpXML(dom, flags, cpus);
|
2008-06-06 11:09:57 +00:00
|
|
|
VIR_FREE(cpus);
|
2008-01-29 17:41:07 +00:00
|
|
|
return(res);
|
2007-04-10 11:17:34 +00:00
|
|
|
}
|
2008-02-05 19:27:37 +00:00
|
|
|
}
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2010-04-03 00:12:16 +00:00
|
|
|
xenUnifiedError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
|
2007-04-10 11:17:34 +00:00
|
|
|
return NULL;
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
2009-05-21 14:14:01 +00:00
|
|
|
|
|
|
|
static char *
|
|
|
|
xenUnifiedDomainXMLFromNative(virConnectPtr conn,
|
|
|
|
const char *format,
|
|
|
|
const char *config,
|
|
|
|
unsigned int flags ATTRIBUTE_UNUSED)
|
|
|
|
{
|
|
|
|
virDomainDefPtr def = NULL;
|
|
|
|
char *ret = NULL;
|
|
|
|
virConfPtr conf = NULL;
|
2011-02-21 13:40:08 +00:00
|
|
|
int id;
|
|
|
|
char * tty;
|
|
|
|
int vncport;
|
2009-05-21 14:14:01 +00:00
|
|
|
GET_PRIVATE(conn);
|
|
|
|
|
|
|
|
if (STRNEQ(format, XEN_CONFIG_FORMAT_XM) &&
|
|
|
|
STRNEQ(format, XEN_CONFIG_FORMAT_SEXPR)) {
|
2010-04-03 00:12:16 +00:00
|
|
|
xenUnifiedError(VIR_ERR_INVALID_ARG,
|
2009-05-21 14:14:01 +00:00
|
|
|
_("unsupported config type %s"), format);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (STREQ(format, XEN_CONFIG_FORMAT_XM)) {
|
2009-06-19 12:34:30 +00:00
|
|
|
conf = virConfReadMem(config, strlen(config), 0);
|
2009-05-21 14:14:01 +00:00
|
|
|
if (!conf)
|
|
|
|
goto cleanup;
|
|
|
|
|
2011-02-21 13:40:12 +00:00
|
|
|
def = xenParseXM(conf, priv->xendConfigVersion, priv->caps);
|
2009-05-21 14:14:01 +00:00
|
|
|
} else if (STREQ(format, XEN_CONFIG_FORMAT_SEXPR)) {
|
2011-02-21 13:40:08 +00:00
|
|
|
id = xenGetDomIdFromSxprString(config, priv->xendConfigVersion);
|
|
|
|
xenUnifiedLock(priv);
|
|
|
|
tty = xenStoreDomainGetConsolePath(conn, id);
|
|
|
|
vncport = xenStoreDomainGetVNCPort(conn, id);
|
|
|
|
xenUnifiedUnlock(priv);
|
2011-02-21 13:40:12 +00:00
|
|
|
def = xenParseSxprString(config, priv->xendConfigVersion, tty,
|
2011-02-21 13:40:08 +00:00
|
|
|
vncport);
|
2009-05-21 14:14:01 +00:00
|
|
|
}
|
|
|
|
if (!def)
|
|
|
|
goto cleanup;
|
|
|
|
|
2010-02-09 18:58:01 +00:00
|
|
|
ret = virDomainDefFormat(def, 0);
|
2009-05-21 14:14:01 +00:00
|
|
|
|
|
|
|
cleanup:
|
|
|
|
virDomainDefFree(def);
|
2010-01-18 17:02:17 +00:00
|
|
|
if (conf)
|
|
|
|
virConfFree(conf);
|
2009-05-21 14:14:01 +00:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#define MAX_CONFIG_SIZE (1024 * 65)
|
|
|
|
static char *
|
|
|
|
xenUnifiedDomainXMLToNative(virConnectPtr conn,
|
|
|
|
const char *format,
|
|
|
|
const char *xmlData,
|
|
|
|
unsigned int flags ATTRIBUTE_UNUSED)
|
|
|
|
{
|
|
|
|
virDomainDefPtr def = NULL;
|
|
|
|
char *ret = NULL;
|
|
|
|
virConfPtr conf = NULL;
|
|
|
|
GET_PRIVATE(conn);
|
|
|
|
|
|
|
|
if (STRNEQ(format, XEN_CONFIG_FORMAT_XM) &&
|
|
|
|
STRNEQ(format, XEN_CONFIG_FORMAT_SEXPR)) {
|
2010-04-03 00:12:16 +00:00
|
|
|
xenUnifiedError(VIR_ERR_INVALID_ARG,
|
2009-05-21 14:14:01 +00:00
|
|
|
_("unsupported config type %s"), format);
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
2010-02-09 18:58:01 +00:00
|
|
|
if (!(def = virDomainDefParseString(priv->caps,
|
2009-05-21 14:14:01 +00:00
|
|
|
xmlData,
|
|
|
|
0)))
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
if (STREQ(format, XEN_CONFIG_FORMAT_XM)) {
|
|
|
|
int len = MAX_CONFIG_SIZE;
|
2011-02-21 13:40:12 +00:00
|
|
|
conf = xenFormatXM(conn, def, priv->xendConfigVersion);
|
2009-05-21 14:14:01 +00:00
|
|
|
if (!conf)
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
if (VIR_ALLOC_N(ret, len) < 0) {
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2009-05-21 14:14:01 +00:00
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (virConfWriteMem(ret, &len, conf) < 0) {
|
|
|
|
VIR_FREE(ret);
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
} else if (STREQ(format, XEN_CONFIG_FORMAT_SEXPR)) {
|
2011-02-21 13:40:12 +00:00
|
|
|
ret = xenFormatSxpr(conn, def, priv->xendConfigVersion);
|
2009-05-21 14:14:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
virDomainDefFree(def);
|
|
|
|
if (conf)
|
|
|
|
virConfFree(conf);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
2010-04-03 00:12:16 +00:00
|
|
|
xenUnifiedError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
|
2007-08-21 09:31:12 +00:00
|
|
|
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);
|
|
|
|
|
2010-04-03 00:12:16 +00:00
|
|
|
xenUnifiedError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
|
2007-08-21 09:31:12 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static virDomainPtr
|
|
|
|
xenUnifiedDomainMigrateFinish (virConnectPtr dconn,
|
|
|
|
const char *dname,
|
|
|
|
const char *cookie ATTRIBUTE_UNUSED,
|
|
|
|
int cookielen ATTRIBUTE_UNUSED,
|
|
|
|
const char *uri ATTRIBUTE_UNUSED,
|
2009-11-12 15:04:43 +00:00
|
|
|
unsigned long flags)
|
2007-08-21 09:31:12 +00:00
|
|
|
{
|
2009-11-12 15:04:43 +00:00
|
|
|
virDomainPtr dom = NULL;
|
|
|
|
char *domain_xml = NULL;
|
|
|
|
virDomainPtr dom_new = NULL;
|
|
|
|
|
|
|
|
dom = xenUnifiedDomainLookupByName (dconn, dname);
|
|
|
|
if (! dom) {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (flags & VIR_MIGRATE_PERSIST_DEST) {
|
|
|
|
domain_xml = xenDaemonDomainDumpXML (dom, 0, NULL);
|
|
|
|
if (! domain_xml) {
|
2010-04-03 00:12:16 +00:00
|
|
|
xenUnifiedError(VIR_ERR_MIGRATE_PERSIST_FAILED,
|
2009-12-05 00:10:01 +00:00
|
|
|
"%s", _("failed to get XML representation of migrated domain"));
|
2009-11-12 15:04:43 +00:00
|
|
|
goto failure;
|
|
|
|
}
|
|
|
|
|
|
|
|
dom_new = xenDaemonDomainDefineXML (dconn, domain_xml);
|
|
|
|
if (! dom_new) {
|
2010-04-03 00:12:16 +00:00
|
|
|
xenUnifiedError(VIR_ERR_MIGRATE_PERSIST_FAILED,
|
2009-12-05 00:10:01 +00:00
|
|
|
"%s", _("failed to define domain on destination host"));
|
2009-11-12 15:04:43 +00:00
|
|
|
goto failure;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Free additional reference added by Define */
|
|
|
|
virDomainFree (dom_new);
|
|
|
|
}
|
|
|
|
|
|
|
|
VIR_FREE (domain_xml);
|
|
|
|
|
|
|
|
return dom;
|
|
|
|
|
|
|
|
|
|
|
|
failure:
|
|
|
|
virDomainFree (dom);
|
|
|
|
|
|
|
|
VIR_FREE (domain_xml);
|
|
|
|
|
|
|
|
return NULL;
|
2007-08-21 09:31:12 +00:00
|
|
|
}
|
|
|
|
|
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
|
2010-06-10 15:55:36 +00:00
|
|
|
xenUnifiedDomainCreateWithFlags (virDomainPtr dom, unsigned int flags)
|
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
|
|
|
|
2010-06-10 15:55:36 +00:00
|
|
|
virCheckFlags(0, -1);
|
|
|
|
|
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
|
|
|
}
|
|
|
|
|
2010-06-10 15:55:36 +00:00
|
|
|
static int
|
|
|
|
xenUnifiedDomainCreate (virDomainPtr dom)
|
|
|
|
{
|
|
|
|
return xenUnifiedDomainCreateWithFlags(dom, 0);
|
|
|
|
}
|
|
|
|
|
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)
|
2010-01-14 01:44:26 +00:00
|
|
|
{
|
|
|
|
GET_PRIVATE(dom->conn);
|
|
|
|
int i;
|
2010-10-01 14:45:55 +00:00
|
|
|
unsigned int flags = VIR_DOMAIN_DEVICE_MODIFY_LIVE;
|
2010-01-14 01:44:26 +00:00
|
|
|
|
2010-10-01 14:45:55 +00:00
|
|
|
/*
|
|
|
|
* HACK: xend with xendConfigVersion >= 3 does not support changing live
|
|
|
|
* config without touching persistent config, we add the extra flag here
|
|
|
|
* to make this API work
|
|
|
|
*/
|
|
|
|
if (priv->opened[XEN_UNIFIED_XEND_OFFSET] &&
|
|
|
|
priv->xendConfigVersion >= 3)
|
|
|
|
flags |= VIR_DOMAIN_DEVICE_MODIFY_CONFIG;
|
2010-01-14 01:44:26 +00:00
|
|
|
|
|
|
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
|
|
|
|
if (priv->opened[i] && drivers[i]->domainAttachDeviceFlags &&
|
|
|
|
drivers[i]->domainAttachDeviceFlags(dom, xml, flags) == 0)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
xenUnifiedDomainAttachDeviceFlags (virDomainPtr dom, const char *xml,
|
|
|
|
unsigned int flags)
|
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)
|
2010-01-14 01:44:26 +00:00
|
|
|
if (priv->opened[i] && drivers[i]->domainAttachDeviceFlags &&
|
|
|
|
drivers[i]->domainAttachDeviceFlags(dom, xml, flags) == 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
|
2007-10-15 21:38:56 +00:00
|
|
|
xenUnifiedDomainDetachDevice (virDomainPtr dom, const char *xml)
|
2010-01-14 01:44:26 +00:00
|
|
|
{
|
|
|
|
GET_PRIVATE(dom->conn);
|
|
|
|
int i;
|
2010-10-01 14:45:55 +00:00
|
|
|
unsigned int flags = VIR_DOMAIN_DEVICE_MODIFY_LIVE;
|
2010-01-14 01:44:26 +00:00
|
|
|
|
2010-10-01 14:45:55 +00:00
|
|
|
/*
|
|
|
|
* HACK: xend with xendConfigVersion >= 3 does not support changing live
|
|
|
|
* config without touching persistent config, we add the extra flag here
|
|
|
|
* to make this API work
|
|
|
|
*/
|
|
|
|
if (priv->opened[XEN_UNIFIED_XEND_OFFSET] &&
|
|
|
|
priv->xendConfigVersion >= 3)
|
|
|
|
flags |= VIR_DOMAIN_DEVICE_MODIFY_CONFIG;
|
2010-01-14 01:44:26 +00:00
|
|
|
|
|
|
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
|
|
|
|
if (priv->opened[i] && drivers[i]->domainDetachDeviceFlags &&
|
|
|
|
drivers[i]->domainDetachDeviceFlags(dom, xml, flags) == 0)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
xenUnifiedDomainDetachDeviceFlags (virDomainPtr dom, const char *xml,
|
|
|
|
unsigned int flags)
|
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)
|
2010-01-14 01:44:26 +00:00
|
|
|
if (priv->opened[i] && drivers[i]->domainDetachDeviceFlags &&
|
|
|
|
drivers[i]->domainDetachDeviceFlags(dom, xml, flags) == 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
|
|
|
}
|
|
|
|
|
2010-03-22 13:13:53 +00:00
|
|
|
static int
|
|
|
|
xenUnifiedDomainUpdateDeviceFlags (virDomainPtr dom, const char *xml,
|
|
|
|
unsigned int flags)
|
|
|
|
{
|
|
|
|
GET_PRIVATE(dom->conn);
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
|
|
|
|
if (priv->opened[i] && drivers[i]->domainUpdateDeviceFlags &&
|
|
|
|
drivers[i]->domainUpdateDeviceFlags(dom, xml, flags) == 0)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2008-05-09 08:17:18 +00:00
|
|
|
static int
|
|
|
|
xenUnifiedDomainGetAutostart (virDomainPtr dom, int *autostart)
|
|
|
|
{
|
|
|
|
GET_PRIVATE(dom->conn);
|
|
|
|
|
2008-11-25 11:04:34 +00:00
|
|
|
if (priv->xendConfigVersion < 3) {
|
|
|
|
if (priv->opened[XEN_UNIFIED_XM_OFFSET])
|
|
|
|
return xenXMDomainGetAutostart(dom, autostart);
|
|
|
|
} else {
|
|
|
|
if (priv->opened[XEN_UNIFIED_XEND_OFFSET])
|
|
|
|
return xenDaemonDomainGetAutostart(dom, autostart);
|
|
|
|
}
|
2008-05-09 08:17:18 +00:00
|
|
|
|
2010-04-03 00:12:16 +00:00
|
|
|
xenUnifiedError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
|
2008-05-09 08:17:18 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
xenUnifiedDomainSetAutostart (virDomainPtr dom, int autostart)
|
|
|
|
{
|
|
|
|
GET_PRIVATE(dom->conn);
|
|
|
|
|
2008-11-25 11:04:34 +00:00
|
|
|
if (priv->xendConfigVersion < 3) {
|
|
|
|
if (priv->opened[XEN_UNIFIED_XM_OFFSET])
|
|
|
|
return xenXMDomainSetAutostart(dom, autostart);
|
|
|
|
} else {
|
|
|
|
if (priv->opened[XEN_UNIFIED_XEND_OFFSET])
|
|
|
|
return xenDaemonDomainSetAutostart(dom, autostart);
|
|
|
|
}
|
2008-05-09 08:17:18 +00:00
|
|
|
|
2010-04-03 00:12:16 +00:00
|
|
|
xenUnifiedError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
|
2008-05-09 08:17:18 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
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);
|
2008-04-10 16:54:54 +00:00
|
|
|
if (schedulertype != NULL)
|
|
|
|
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);
|
2008-04-10 16:54:54 +00:00
|
|
|
if (ret == 0)
|
|
|
|
return(0);
|
|
|
|
}
|
2007-06-05 12:06:08 +00:00
|
|
|
}
|
|
|
|
return(-1);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
xenUnifiedDomainSetSchedulerParameters (virDomainPtr dom,
|
|
|
|
virSchedParameterPtr params, int nparams)
|
|
|
|
{
|
|
|
|
GET_PRIVATE(dom->conn);
|
|
|
|
int i, ret;
|
|
|
|
|
2010-08-17 16:30:17 +00:00
|
|
|
/* do the hypervisor call last to get better error */
|
|
|
|
for (i = XEN_UNIFIED_NR_DRIVERS - 1; i >= 0; i--) {
|
2007-06-05 12:06:08 +00:00
|
|
|
if (priv->opened[i] && drivers[i]->domainSetSchedulerParameters) {
|
|
|
|
ret = drivers[i]->domainSetSchedulerParameters(dom, params, nparams);
|
2008-04-10 16:54:54 +00:00
|
|
|
if (ret == 0)
|
|
|
|
return 0;
|
|
|
|
}
|
2007-06-05 12:06:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
2010-04-03 00:12:16 +00:00
|
|
|
xenUnifiedError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
|
2007-08-21 10:08:12 +00:00
|
|
|
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);
|
|
|
|
|
2010-04-03 00:12:16 +00:00
|
|
|
xenUnifiedError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
|
2007-08-21 10:08:12 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
virDomainBlockPeek call
* configure.in: Document AC_SYS_LARGEFILE.
* docs/hvsupport.html.in: Document HV support for virDomainBlockPeek.
* include/libvirt/libvirt.h.in, src/driver.h, src/libvirt.c,
src/libvirt_sym.version: Add virDomainBlockPeek infrastructure.
* src/qemu_driver.c, src/test.c: Null versions of this call.
* src/xen_unified.c, src/xend_internal.c, src/xend_internal.h,
src/xm_internal.c, src/xm_internal.h: Xen implementation.
* tests/sexpr2xmldata/sexpr2xml-curmem.xml,
tests/sexpr2xmldata/sexpr2xml-no-source-cdrom.xml: XML output
has been reordered slightly in the Xen driver, but should be
functionally the same.
2008-06-05 13:17:45 +00:00
|
|
|
static int
|
|
|
|
xenUnifiedDomainBlockPeek (virDomainPtr dom, const char *path,
|
|
|
|
unsigned long long offset, size_t size,
|
2008-06-05 21:12:26 +00:00
|
|
|
void *buffer, unsigned int flags ATTRIBUTE_UNUSED)
|
virDomainBlockPeek call
* configure.in: Document AC_SYS_LARGEFILE.
* docs/hvsupport.html.in: Document HV support for virDomainBlockPeek.
* include/libvirt/libvirt.h.in, src/driver.h, src/libvirt.c,
src/libvirt_sym.version: Add virDomainBlockPeek infrastructure.
* src/qemu_driver.c, src/test.c: Null versions of this call.
* src/xen_unified.c, src/xend_internal.c, src/xend_internal.h,
src/xm_internal.c, src/xm_internal.h: Xen implementation.
* tests/sexpr2xmldata/sexpr2xml-curmem.xml,
tests/sexpr2xmldata/sexpr2xml-no-source-cdrom.xml: XML output
has been reordered slightly in the Xen driver, but should be
functionally the same.
2008-06-05 13:17:45 +00:00
|
|
|
{
|
|
|
|
int r;
|
|
|
|
GET_PRIVATE (dom->conn);
|
|
|
|
|
|
|
|
if (priv->opened[XEN_UNIFIED_XEND_OFFSET]) {
|
|
|
|
r = xenDaemonDomainBlockPeek (dom, path, offset, size, buffer);
|
|
|
|
if (r != -2) return r;
|
|
|
|
/* r == -2 means declined, so fall through to XM driver ... */
|
|
|
|
}
|
|
|
|
|
|
|
|
if (priv->opened[XEN_UNIFIED_XM_OFFSET]) {
|
|
|
|
if (xenXMDomainBlockPeek (dom, path, offset, size, buffer) == 0)
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2010-04-03 00:12:16 +00:00
|
|
|
xenUnifiedError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
|
virDomainBlockPeek call
* configure.in: Document AC_SYS_LARGEFILE.
* docs/hvsupport.html.in: Document HV support for virDomainBlockPeek.
* include/libvirt/libvirt.h.in, src/driver.h, src/libvirt.c,
src/libvirt_sym.version: Add virDomainBlockPeek infrastructure.
* src/qemu_driver.c, src/test.c: Null versions of this call.
* src/xen_unified.c, src/xend_internal.c, src/xend_internal.h,
src/xm_internal.c, src/xm_internal.h: Xen implementation.
* tests/sexpr2xmldata/sexpr2xml-curmem.xml,
tests/sexpr2xmldata/sexpr2xml-no-source-cdrom.xml: XML output
has been reordered slightly in the Xen driver, but should be
functionally the same.
2008-06-05 13:17:45 +00:00
|
|
|
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);
|
|
|
|
|
2010-04-03 00:12:16 +00:00
|
|
|
xenUnifiedError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
|
2007-09-28 14:28:12 +00:00
|
|
|
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);
|
2008-04-10 16:54:54 +00:00
|
|
|
if (ret != 1)
|
|
|
|
return (0);
|
|
|
|
return(freeMem);
|
2007-09-30 13:09:07 +00:00
|
|
|
}
|
|
|
|
|
2010-04-03 00:12:16 +00:00
|
|
|
xenUnifiedError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
|
2007-09-30 13:09:07 +00:00
|
|
|
return(0);
|
|
|
|
}
|
|
|
|
|
2010-03-18 14:47:07 +00:00
|
|
|
|
2008-11-25 10:44:52 +00:00
|
|
|
static int
|
2010-03-18 14:47:07 +00:00
|
|
|
xenUnifiedDomainEventRegister(virConnectPtr conn,
|
|
|
|
virConnectDomainEventCallback callback,
|
|
|
|
void *opaque,
|
|
|
|
virFreeCallback freefunc)
|
2008-11-25 10:44:52 +00:00
|
|
|
{
|
2009-01-21 18:11:14 +00:00
|
|
|
GET_PRIVATE (conn);
|
|
|
|
|
2009-01-15 01:18:37 +00:00
|
|
|
int ret;
|
2009-01-21 18:11:14 +00:00
|
|
|
xenUnifiedLock(priv);
|
2009-01-15 01:18:37 +00:00
|
|
|
|
2008-11-25 10:44:52 +00:00
|
|
|
if (priv->xsWatch == -1) {
|
2010-04-03 00:12:16 +00:00
|
|
|
xenUnifiedError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
|
2009-01-21 18:11:14 +00:00
|
|
|
xenUnifiedUnlock(priv);
|
2008-11-25 10:44:52 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2009-01-15 01:18:37 +00:00
|
|
|
ret = virDomainEventCallbackListAdd(conn, priv->domainEventCallbacks,
|
|
|
|
callback, opaque, freefunc);
|
|
|
|
|
2009-01-21 18:11:14 +00:00
|
|
|
xenUnifiedUnlock(priv);
|
2009-01-15 01:18:37 +00:00
|
|
|
return (ret);
|
2008-11-25 10:44:52 +00:00
|
|
|
}
|
|
|
|
|
2010-03-18 14:47:07 +00:00
|
|
|
|
2008-11-25 10:44:52 +00:00
|
|
|
static int
|
2010-03-18 14:47:07 +00:00
|
|
|
xenUnifiedDomainEventDeregister(virConnectPtr conn,
|
|
|
|
virConnectDomainEventCallback callback)
|
2008-11-25 10:44:52 +00:00
|
|
|
{
|
|
|
|
int ret;
|
|
|
|
GET_PRIVATE (conn);
|
2009-01-21 18:11:14 +00:00
|
|
|
xenUnifiedLock(priv);
|
|
|
|
|
2008-11-25 10:44:52 +00:00
|
|
|
if (priv->xsWatch == -1) {
|
2010-04-03 00:12:16 +00:00
|
|
|
xenUnifiedError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
|
2009-01-21 18:11:14 +00:00
|
|
|
xenUnifiedUnlock(priv);
|
2008-11-25 10:44:52 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2009-01-21 18:11:14 +00:00
|
|
|
if (priv->domainEventDispatching)
|
|
|
|
ret = virDomainEventCallbackListMarkDelete(conn, priv->domainEventCallbacks,
|
|
|
|
callback);
|
|
|
|
else
|
|
|
|
ret = virDomainEventCallbackListRemove(conn, priv->domainEventCallbacks,
|
|
|
|
callback);
|
2009-01-15 01:18:37 +00:00
|
|
|
|
2009-01-21 18:11:14 +00:00
|
|
|
xenUnifiedUnlock(priv);
|
2008-11-25 10:44:52 +00:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2009-04-03 12:38:52 +00:00
|
|
|
|
2010-03-18 14:47:07 +00:00
|
|
|
static int
|
|
|
|
xenUnifiedDomainEventRegisterAny(virConnectPtr conn,
|
|
|
|
virDomainPtr dom,
|
|
|
|
int eventID,
|
|
|
|
virConnectDomainEventGenericCallback callback,
|
|
|
|
void *opaque,
|
|
|
|
virFreeCallback freefunc)
|
|
|
|
{
|
|
|
|
GET_PRIVATE (conn);
|
|
|
|
|
|
|
|
int ret;
|
|
|
|
xenUnifiedLock(priv);
|
|
|
|
|
|
|
|
if (priv->xsWatch == -1) {
|
2010-04-03 00:12:16 +00:00
|
|
|
xenUnifiedError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
|
2010-03-18 14:47:07 +00:00
|
|
|
xenUnifiedUnlock(priv);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
ret = virDomainEventCallbackListAddID(conn, priv->domainEventCallbacks,
|
|
|
|
dom, eventID,
|
|
|
|
callback, opaque, freefunc);
|
|
|
|
|
|
|
|
xenUnifiedUnlock(priv);
|
|
|
|
return (ret);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
xenUnifiedDomainEventDeregisterAny(virConnectPtr conn,
|
|
|
|
int callbackID)
|
|
|
|
{
|
|
|
|
int ret;
|
|
|
|
GET_PRIVATE (conn);
|
|
|
|
xenUnifiedLock(priv);
|
|
|
|
|
|
|
|
if (priv->xsWatch == -1) {
|
2010-04-03 00:12:16 +00:00
|
|
|
xenUnifiedError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
|
2010-03-18 14:47:07 +00:00
|
|
|
xenUnifiedUnlock(priv);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (priv->domainEventDispatching)
|
|
|
|
ret = virDomainEventCallbackListMarkDeleteID(conn, priv->domainEventCallbacks,
|
|
|
|
callbackID);
|
|
|
|
else
|
|
|
|
ret = virDomainEventCallbackListRemoveID(conn, priv->domainEventCallbacks,
|
|
|
|
callbackID);
|
|
|
|
|
|
|
|
xenUnifiedUnlock(priv);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2009-04-03 12:38:52 +00:00
|
|
|
static int
|
|
|
|
xenUnifiedNodeDeviceGetPciInfo (virNodeDevicePtr dev,
|
|
|
|
unsigned *domain,
|
|
|
|
unsigned *bus,
|
|
|
|
unsigned *slot,
|
|
|
|
unsigned *function)
|
|
|
|
{
|
|
|
|
virNodeDeviceDefPtr def = NULL;
|
|
|
|
virNodeDevCapsDefPtr cap;
|
|
|
|
char *xml = NULL;
|
|
|
|
int ret = -1;
|
|
|
|
|
|
|
|
xml = virNodeDeviceGetXMLDesc(dev, 0);
|
|
|
|
if (!xml)
|
|
|
|
goto out;
|
|
|
|
|
2010-02-10 10:40:18 +00:00
|
|
|
def = virNodeDeviceDefParseString(xml, EXISTING_DEVICE);
|
2009-04-03 12:38:52 +00:00
|
|
|
if (!def)
|
|
|
|
goto out;
|
|
|
|
|
|
|
|
cap = def->caps;
|
|
|
|
while (cap) {
|
|
|
|
if (cap->type == VIR_NODE_DEV_CAP_PCI_DEV) {
|
|
|
|
*domain = cap->data.pci_dev.domain;
|
|
|
|
*bus = cap->data.pci_dev.bus;
|
|
|
|
*slot = cap->data.pci_dev.slot;
|
|
|
|
*function = cap->data.pci_dev.function;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
cap = cap->next;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!cap) {
|
2010-04-03 00:12:16 +00:00
|
|
|
xenUnifiedError(VIR_ERR_INVALID_ARG,
|
2009-04-03 12:38:52 +00:00
|
|
|
_("device %s is not a PCI device"), dev->name);
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
|
|
|
ret = 0;
|
|
|
|
out:
|
|
|
|
virNodeDeviceDefFree(def);
|
|
|
|
VIR_FREE(xml);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
xenUnifiedNodeDeviceDettach (virNodeDevicePtr dev)
|
|
|
|
{
|
|
|
|
pciDevice *pci;
|
|
|
|
unsigned domain, bus, slot, function;
|
|
|
|
int ret = -1;
|
|
|
|
|
|
|
|
if (xenUnifiedNodeDeviceGetPciInfo(dev, &domain, &bus, &slot, &function) < 0)
|
|
|
|
return -1;
|
|
|
|
|
2010-02-04 23:16:34 +00:00
|
|
|
pci = pciGetDevice(domain, bus, slot, function);
|
2009-04-03 12:38:52 +00:00
|
|
|
if (!pci)
|
|
|
|
return -1;
|
|
|
|
|
2010-06-14 21:12:35 +00:00
|
|
|
if (pciDettachDevice(pci, NULL) < 0)
|
2009-04-03 12:38:52 +00:00
|
|
|
goto out;
|
|
|
|
|
|
|
|
ret = 0;
|
|
|
|
out:
|
2010-02-04 23:16:34 +00:00
|
|
|
pciFreeDevice(pci);
|
2009-04-03 12:38:52 +00:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2011-04-27 12:09:12 +00:00
|
|
|
static int
|
|
|
|
xenUnifiedNodeDeviceAssignedDomainId (virNodeDevicePtr dev)
|
|
|
|
{
|
|
|
|
int numdomains;
|
|
|
|
int ret = -1, i;
|
|
|
|
int *ids = NULL;
|
|
|
|
char *bdf = NULL;
|
|
|
|
char *xref = NULL;
|
|
|
|
unsigned int domain, bus, slot, function;
|
|
|
|
virConnectPtr conn = dev->conn;
|
|
|
|
xenUnifiedPrivatePtr priv = conn->privateData;
|
|
|
|
|
|
|
|
/* Get active domains */
|
|
|
|
numdomains = xenUnifiedNumOfDomains(conn);
|
|
|
|
if (numdomains < 0) {
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
if (numdomains > 0){
|
|
|
|
if (VIR_ALLOC_N(ids, numdomains) < 0) {
|
|
|
|
virReportOOMError();
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
if ((numdomains = xenUnifiedListDomains(conn, &ids[0], numdomains)) < 0) {
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Get pci bdf */
|
|
|
|
if (xenUnifiedNodeDeviceGetPciInfo(dev, &domain, &bus, &slot, &function) < 0)
|
|
|
|
goto out;
|
|
|
|
|
|
|
|
if (virAsprintf(&bdf, "%04x:%02x:%02x.%0x",
|
|
|
|
domain, bus, slot, function) < 0) {
|
|
|
|
virReportOOMError();
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
|
|
|
xenUnifiedLock(priv);
|
|
|
|
/* Check if bdf is assigned to one of active domains */
|
|
|
|
for (i = 0; i < numdomains; i++ ) {
|
|
|
|
xref = xenStoreDomainGetPCIID(conn, ids[i], bdf);
|
|
|
|
if (xref == NULL) {
|
|
|
|
continue;
|
|
|
|
} else {
|
|
|
|
ret = ids[i];
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
xenUnifiedUnlock(priv);
|
|
|
|
|
|
|
|
VIR_FREE(xref);
|
|
|
|
VIR_FREE(bdf);
|
|
|
|
out:
|
|
|
|
VIR_FREE(ids);
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2009-04-03 12:38:52 +00:00
|
|
|
static int
|
|
|
|
xenUnifiedNodeDeviceReAttach (virNodeDevicePtr dev)
|
|
|
|
{
|
|
|
|
pciDevice *pci;
|
|
|
|
unsigned domain, bus, slot, function;
|
|
|
|
int ret = -1;
|
2011-04-27 12:09:12 +00:00
|
|
|
int domid;
|
2009-04-03 12:38:52 +00:00
|
|
|
|
|
|
|
if (xenUnifiedNodeDeviceGetPciInfo(dev, &domain, &bus, &slot, &function) < 0)
|
|
|
|
return -1;
|
|
|
|
|
2010-02-04 23:16:34 +00:00
|
|
|
pci = pciGetDevice(domain, bus, slot, function);
|
2009-04-03 12:38:52 +00:00
|
|
|
if (!pci)
|
|
|
|
return -1;
|
|
|
|
|
2011-04-27 12:09:12 +00:00
|
|
|
/* Check if device is assigned to an active guest */
|
|
|
|
if ((domid = xenUnifiedNodeDeviceAssignedDomainId(dev)) >= 0) {
|
|
|
|
xenUnifiedError(VIR_ERR_INTERNAL_ERROR,
|
|
|
|
_("Device %s has been assigned to guest %d"),
|
|
|
|
dev->name, domid);
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
2010-06-14 21:12:35 +00:00
|
|
|
if (pciReAttachDevice(pci, NULL) < 0)
|
2009-04-03 12:38:52 +00:00
|
|
|
goto out;
|
|
|
|
|
|
|
|
ret = 0;
|
|
|
|
out:
|
2010-02-04 23:16:34 +00:00
|
|
|
pciFreeDevice(pci);
|
2009-04-03 12:38:52 +00:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
xenUnifiedNodeDeviceReset (virNodeDevicePtr dev)
|
|
|
|
{
|
|
|
|
pciDevice *pci;
|
|
|
|
unsigned domain, bus, slot, function;
|
|
|
|
int ret = -1;
|
|
|
|
|
|
|
|
if (xenUnifiedNodeDeviceGetPciInfo(dev, &domain, &bus, &slot, &function) < 0)
|
|
|
|
return -1;
|
|
|
|
|
2010-02-04 23:16:34 +00:00
|
|
|
pci = pciGetDevice(domain, bus, slot, function);
|
2009-04-03 12:38:52 +00:00
|
|
|
if (!pci)
|
|
|
|
return -1;
|
|
|
|
|
2010-07-26 16:43:04 +00:00
|
|
|
if (pciResetDevice(pci, NULL, NULL) < 0)
|
2009-04-03 12:38:52 +00:00
|
|
|
goto out;
|
|
|
|
|
|
|
|
ret = 0;
|
|
|
|
out:
|
2010-02-04 23:16:34 +00:00
|
|
|
pciFreeDevice(pci);
|
2009-04-03 12:38:52 +00:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-10-22 13:40:26 +00:00
|
|
|
static int
|
|
|
|
xenUnifiedDomainOpenConsole(virDomainPtr dom,
|
|
|
|
const char *devname,
|
|
|
|
virStreamPtr st,
|
|
|
|
unsigned int flags)
|
|
|
|
{
|
|
|
|
virDomainDefPtr def = NULL;
|
|
|
|
int ret = -1;
|
|
|
|
virDomainChrDefPtr chr = NULL;
|
|
|
|
|
|
|
|
virCheckFlags(0, -1);
|
|
|
|
|
|
|
|
if (dom->id == -1) {
|
|
|
|
xenUnifiedError(VIR_ERR_OPERATION_INVALID,
|
|
|
|
"%s", _("domain is not running"));
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (devname) {
|
|
|
|
/* XXX support device aliases in future */
|
|
|
|
xenUnifiedError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
|
|
|
_("Named device aliases are not supported"));
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
def = xenDaemonDomainFetch(dom->conn, dom->id, dom->name, NULL);
|
|
|
|
if (!def)
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
if (def->console)
|
|
|
|
chr = def->console;
|
|
|
|
else if (def->nserials)
|
|
|
|
chr = def->serials[0];
|
|
|
|
|
|
|
|
if (!chr) {
|
|
|
|
xenUnifiedError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
|
|
_("cannot find default console device"));
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
domain_conf: split source data out from ChrDef
This opens up the possibility of reusing the smaller ChrSourceDef
for both qemu monitor and a passthrough smartcard device.
* src/conf/domain_conf.h (_virDomainChrDef): Factor host
details...
(_virDomainChrSourceDef): ...into new struct.
(virDomainChrSourceDefFree): New prototype.
* src/conf/domain_conf.c (virDomainChrDefFree)
(virDomainChrDefParseXML, virDomainChrDefFormat): Split...
(virDomainChrSourceDefClear, virDomainChrSourceDefFree)
(virDomainChrSourceDefParseXML, virDomainChrSourceDefFormat):
...into new functions.
(virDomainChrDefParseTargetXML): Update clients to reflect type
split.
* src/vmx/vmx.c (virVMXParseSerial, virVMXParseParallel)
(virVMXFormatSerial, virVMXFormatParallel): Likewise.
* src/xen/xen_driver.c (xenUnifiedDomainOpenConsole): Likewise.
* src/xen/xend_internal.c (xenDaemonParseSxprChar)
(xenDaemonFormatSxprChr): Likewise.
* src/vbox/vbox_tmpl.c (vboxDomainDumpXML, vboxAttachSerial)
(vboxAttachParallel): Likewise.
* src/security/security_dac.c (virSecurityDACSetChardevLabel)
(virSecurityDACSetChardevCallback)
(virSecurityDACRestoreChardevLabel)
(virSecurityDACRestoreChardevCallback): Likewise.
* src/security/security_selinux.c (SELinuxSetSecurityChardevLabel)
(SELinuxSetSecurityChardevCallback)
(SELinuxRestoreSecurityChardevLabel)
(SELinuxSetSecurityChardevCallback): Likewise.
* src/security/virt-aa-helper.c (get_files): Likewise.
* src/lxc/lxc_driver.c (lxcVmStart, lxcDomainOpenConsole):
Likewise.
* src/uml/uml_conf.c (umlBuildCommandLineChr): Likewise.
* src/uml/uml_driver.c (umlIdentifyOneChrPTY, umlIdentifyChrPTY)
(umlDomainOpenConsole): Likewise.
* src/qemu/qemu_command.c (qemuBuildChrChardevStr)
(qemuBuildChrArgStr, qemuBuildCommandLine)
(qemuParseCommandLineChr): Likewise.
* src/qemu/qemu_domain.c (qemuDomainObjPrivateXMLFormat)
(qemuDomainObjPrivateXMLParse): Likewise.
* src/qemu/qemu_cgroup.c (qemuSetupChardevCgroup): Likewise.
* src/qemu/qemu_hotplug.c (qemuDomainAttachNetDevice): Likewise.
* src/qemu/qemu_driver.c (qemudFindCharDevicePTYsMonitor)
(qemudFindCharDevicePTYs, qemuPrepareChardevDevice)
(qemuPrepareMonitorChr, qemudShutdownVMDaemon)
(qemuDomainOpenConsole): Likewise.
* src/qemu/qemu_command.h (qemuBuildChrChardevStr)
(qemuBuildChrArgStr): Delete, now that they are static.
* src/libvirt_private.syms (domain_conf.h): New exports.
* cfg.mk (useless_free_options): Update list.
* tests/qemuxml2argvtest.c (testCompareXMLToArgvFiles): Update
tests.
2011-01-07 22:45:01 +00:00
|
|
|
if (chr->source.type != VIR_DOMAIN_CHR_TYPE_PTY) {
|
2010-10-22 13:40:26 +00:00
|
|
|
xenUnifiedError(VIR_ERR_INTERNAL_ERROR,
|
|
|
|
_("character device %s is not using a PTY"), devname);
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
2011-02-22 12:05:20 +00:00
|
|
|
if (virFDStreamOpenFile(st, chr->source.data.file.path, 0, 0, O_RDWR) < 0)
|
2010-10-22 13:40:26 +00:00
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
ret = 0;
|
|
|
|
cleanup:
|
|
|
|
virDomainDefFree(def);
|
|
|
|
return ret;
|
|
|
|
}
|
2010-04-07 15:12:02 +00:00
|
|
|
/*----- Register with libvirt.c, and initialize Xen drivers. -----*/
|
2007-04-04 14:19:49 +00:00
|
|
|
|
|
|
|
/* The interface which we export upwards to libvirt.c. */
|
|
|
|
static virDriver xenUnifiedDriver = {
|
2009-03-31 15:47:16 +00:00
|
|
|
VIR_DRV_XEN_UNIFIED,
|
|
|
|
"Xen",
|
|
|
|
xenUnifiedOpen, /* open */
|
|
|
|
xenUnifiedClose, /* close */
|
|
|
|
xenUnifiedSupportsFeature, /* supports_feature */
|
|
|
|
xenUnifiedType, /* type */
|
|
|
|
xenUnifiedGetVersion, /* version */
|
2009-11-12 15:53:26 +00:00
|
|
|
NULL, /* libvirtVersion (impl. in libvirt.c) */
|
2009-10-23 17:01:22 +00:00
|
|
|
virGetHostname, /* getHostname */
|
2011-02-07 21:14:56 +00:00
|
|
|
NULL, /* getSysinfo */
|
2009-03-31 15:47:16 +00:00
|
|
|
xenUnifiedGetMaxVcpus, /* getMaxVcpus */
|
|
|
|
xenUnifiedNodeGetInfo, /* nodeGetInfo */
|
|
|
|
xenUnifiedGetCapabilities, /* getCapabilities */
|
|
|
|
xenUnifiedListDomains, /* listDomains */
|
|
|
|
xenUnifiedNumOfDomains, /* numOfDomains */
|
|
|
|
xenUnifiedDomainCreateXML, /* domainCreateXML */
|
|
|
|
xenUnifiedDomainLookupByID, /* domainLookupByID */
|
|
|
|
xenUnifiedDomainLookupByUUID, /* domainLookupByUUID */
|
|
|
|
xenUnifiedDomainLookupByName, /* domainLookupByName */
|
|
|
|
xenUnifiedDomainSuspend, /* domainSuspend */
|
|
|
|
xenUnifiedDomainResume, /* domainResume */
|
|
|
|
xenUnifiedDomainShutdown, /* domainShutdown */
|
|
|
|
xenUnifiedDomainReboot, /* domainReboot */
|
|
|
|
xenUnifiedDomainDestroy, /* domainDestroy */
|
|
|
|
xenUnifiedDomainGetOSType, /* domainGetOSType */
|
|
|
|
xenUnifiedDomainGetMaxMemory, /* domainGetMaxMemory */
|
|
|
|
xenUnifiedDomainSetMaxMemory, /* domainSetMaxMemory */
|
|
|
|
xenUnifiedDomainSetMemory, /* domainSetMemory */
|
2011-03-02 08:07:48 +00:00
|
|
|
NULL, /*domainSetMemoryFlags */
|
2011-02-22 05:31:57 +00:00
|
|
|
NULL, /* domainSetMemoryParameters */
|
|
|
|
NULL, /* domainGetMemoryParameters */
|
|
|
|
NULL, /* domainSetBlkioParameters */
|
|
|
|
NULL, /* domainGetBlkioParameters */
|
2009-03-31 15:47:16 +00:00
|
|
|
xenUnifiedDomainGetInfo, /* domainGetInfo */
|
|
|
|
xenUnifiedDomainSave, /* domainSave */
|
|
|
|
xenUnifiedDomainRestore, /* domainRestore */
|
|
|
|
xenUnifiedDomainCoreDump, /* domainCoreDump */
|
|
|
|
xenUnifiedDomainSetVcpus, /* domainSetVcpus */
|
vcpu: make old API trivially wrap to new API
Note - this wrapping is completely mechanical; the old API will
function identically, since the new API validates that the exact
same flags are provided by the old API. On a per-driver basis,
it may make sense to have the old API pass a different set of flags,
but that should be done in the per-driver patch that implements
the full range of flag support in the new API.
* src/esx/esx_driver.c (esxDomainSetVcpus, escDomainGetMaxVpcus):
Move guts...
(esxDomainSetVcpusFlags, esxDomainGetVcpusFlags): ...to new
functions.
(esxDriver): Trivially support the new API.
* src/openvz/openvz_driver.c (openvzDomainSetVcpus)
(openvzDomainSetVcpusFlags, openvzDomainGetMaxVcpus)
(openvzDomainGetVcpusFlags, openvzDriver): Likewise.
* src/phyp/phyp_driver.c (phypDomainSetCPU)
(phypDomainSetVcpusFlags, phypGetLparCPUMAX)
(phypDomainGetVcpusFlags, phypDriver): Likewise.
* src/qemu/qemu_driver.c (qemudDomainSetVcpus)
(qemudDomainSetVcpusFlags, qemudDomainGetMaxVcpus)
(qemudDomainGetVcpusFlags, qemuDriver): Likewise.
* src/test/test_driver.c (testSetVcpus, testDomainSetVcpusFlags)
(testDomainGetMaxVcpus, testDomainGetVcpusFlags, testDriver):
Likewise.
* src/vbox/vbox_tmpl.c (vboxDomainSetVcpus)
(vboxDomainSetVcpusFlags, virDomainGetMaxVcpus)
(virDomainGetVcpusFlags, virDriver): Likewise.
* src/xen/xen_driver.c (xenUnifiedDomainSetVcpus)
(xenUnifiedDomainSetVcpusFlags, xenUnifiedDomainGetMaxVcpus)
(xenUnifiedDomainGetVcpusFlags, xenUnifiedDriver): Likewise.
* src/xenapi/xenapi_driver.c (xenapiDomainSetVcpus)
(xenapiDomainSetVcpusFlags, xenapiDomainGetMaxVcpus)
(xenapiDomainGetVcpusFlags, xenapiDriver): Likewise.
(xenapiError): New helper macro.
2010-09-27 22:37:53 +00:00
|
|
|
xenUnifiedDomainSetVcpusFlags, /* domainSetVcpusFlags */
|
|
|
|
xenUnifiedDomainGetVcpusFlags, /* domainGetVcpusFlags */
|
2009-03-31 15:47:16 +00:00
|
|
|
xenUnifiedDomainPinVcpu, /* domainPinVcpu */
|
|
|
|
xenUnifiedDomainGetVcpus, /* domainGetVcpus */
|
|
|
|
xenUnifiedDomainGetMaxVcpus, /* domainGetMaxVcpus */
|
|
|
|
NULL, /* domainGetSecurityLabel */
|
|
|
|
NULL, /* nodeGetSecurityModel */
|
|
|
|
xenUnifiedDomainDumpXML, /* domainDumpXML */
|
2009-09-06 14:03:06 +00:00
|
|
|
xenUnifiedDomainXMLFromNative, /* domainXMLFromNative */
|
|
|
|
xenUnifiedDomainXMLToNative, /* domainXMLToNative */
|
2009-03-31 15:47:16 +00:00
|
|
|
xenUnifiedListDefinedDomains, /* listDefinedDomains */
|
|
|
|
xenUnifiedNumOfDefinedDomains, /* numOfDefinedDomains */
|
|
|
|
xenUnifiedDomainCreate, /* domainCreate */
|
2010-06-10 15:55:36 +00:00
|
|
|
xenUnifiedDomainCreateWithFlags, /* domainCreateWithFlags */
|
2009-03-31 15:47:16 +00:00
|
|
|
xenUnifiedDomainDefineXML, /* domainDefineXML */
|
|
|
|
xenUnifiedDomainUndefine, /* domainUndefine */
|
|
|
|
xenUnifiedDomainAttachDevice, /* domainAttachDevice */
|
2010-01-14 01:44:26 +00:00
|
|
|
xenUnifiedDomainAttachDeviceFlags, /* domainAttachDeviceFlags */
|
2009-03-31 15:47:16 +00:00
|
|
|
xenUnifiedDomainDetachDevice, /* domainDetachDevice */
|
2010-01-14 01:44:26 +00:00
|
|
|
xenUnifiedDomainDetachDeviceFlags, /* domainDetachDeviceFlags */
|
2010-03-22 13:13:53 +00:00
|
|
|
xenUnifiedDomainUpdateDeviceFlags, /* domainUpdateDeviceFlags */
|
2009-03-31 15:47:16 +00:00
|
|
|
xenUnifiedDomainGetAutostart, /* domainGetAutostart */
|
|
|
|
xenUnifiedDomainSetAutostart, /* domainSetAutostart */
|
|
|
|
xenUnifiedDomainGetSchedulerType, /* domainGetSchedulerType */
|
|
|
|
xenUnifiedDomainGetSchedulerParameters, /* domainGetSchedulerParameters */
|
|
|
|
xenUnifiedDomainSetSchedulerParameters, /* domainSetSchedulerParameters */
|
|
|
|
xenUnifiedDomainMigratePrepare, /* domainMigratePrepare */
|
|
|
|
xenUnifiedDomainMigratePerform, /* domainMigratePerform */
|
|
|
|
xenUnifiedDomainMigrateFinish, /* domainMigrateFinish */
|
|
|
|
xenUnifiedDomainBlockStats, /* domainBlockStats */
|
|
|
|
xenUnifiedDomainInterfaceStats, /* domainInterfaceStats */
|
2009-12-20 12:28:42 +00:00
|
|
|
NULL, /* domainMemoryStats */
|
2009-03-31 15:47:16 +00:00
|
|
|
xenUnifiedDomainBlockPeek, /* domainBlockPeek */
|
|
|
|
NULL, /* domainMemoryPeek */
|
Internal driver API infrastructure for virDomainGetBlockInfo
This defines the internal driver API and stubs out each driver
* src/driver.h: Define virDrvDomainGetBlockInfo signature
* src/libvirt.c, src/libvirt_public.syms: Glue public API to drivers
* src/esx/esx_driver.c, src/lxc/lxc_driver.c, src/opennebula/one_driver.c,
src/openvz/openvz_driver.c, src/phyp/phyp_driver.c,
src/test/test_driver.c, src/uml/uml_driver.c, src/vbox/vbox_tmpl.c,
src/xen/xen_driver.c, src/xenapi/xenapi_driver.c: Stub out driver
2010-04-27 19:27:34 +00:00
|
|
|
NULL, /* domainGetBlockInfo */
|
2009-03-31 15:47:16 +00:00
|
|
|
xenUnifiedNodeGetCellsFreeMemory, /* nodeGetCellsFreeMemory */
|
|
|
|
xenUnifiedNodeGetFreeMemory, /* getFreeMemory */
|
|
|
|
xenUnifiedDomainEventRegister, /* domainEventRegister */
|
|
|
|
xenUnifiedDomainEventDeregister, /* domainEventDeregister */
|
|
|
|
NULL, /* domainMigratePrepare2 */
|
|
|
|
NULL, /* domainMigrateFinish2 */
|
2009-04-03 12:38:52 +00:00
|
|
|
xenUnifiedNodeDeviceDettach, /* nodeDeviceDettach */
|
|
|
|
xenUnifiedNodeDeviceReAttach, /* nodeDeviceReAttach */
|
|
|
|
xenUnifiedNodeDeviceReset, /* nodeDeviceReset */
|
2009-09-30 10:51:54 +00:00
|
|
|
NULL, /* domainMigratePrepareTunnel */
|
2010-03-23 18:00:38 +00:00
|
|
|
xenUnifiedIsEncrypted, /* isEncrypted */
|
|
|
|
xenUnifiedIsSecure, /* isSecure */
|
|
|
|
xenUnifiedDomainIsActive, /* domainIsActive */
|
2010-11-24 07:43:15 +00:00
|
|
|
xenUnifiedDomainIsPersistent, /* domainIsPersistent */
|
|
|
|
xenUnifiedDomainIsUpdated, /* domainIsUpdated */
|
2009-12-18 13:59:39 +00:00
|
|
|
NULL, /* cpuCompare */
|
2010-02-02 11:34:01 +00:00
|
|
|
NULL, /* cpuBaseline */
|
Stub out internal driver entry points for job processing
The internal glue layer for the new pubic API
* src/driver.h: Define internal driver API contract
* src/libvirt.c, src/libvirt_public.syms: Wire up public
API to internal driver API
* src/esx/esx_driver.c, src/lxc/lxc_driver.c, src/opennebula/one_driver.c,
src/openvz/openvz_driver.c, src/phyp/phyp_driver.c,
src/qemu/qemu_driver.c, src/remote/remote_driver.c,
src/test/test_driver.c, src/uml/uml_driver.c, src/vbox/vbox_tmpl.c,
src/xen/xen_driver.c: Stub new entry point
2010-02-03 11:32:24 +00:00
|
|
|
NULL, /* domainGetJobInfo */
|
Wire up internal entry points for virDomainAbortJob API
This provides the internal glue for the driver API
* src/driver.h: Internal API contract
* src/libvirt.c, src/libvirt_public.syms: Connect public API
to driver API
* src/esx/esx_driver.c, src/lxc/lxc_driver.c, src/opennebula/one_driver.c,
src/openvz/openvz_driver.c, src/phyp/phyp_driver.c,
src/qemu/qemu_driver.c, src/remote/remote_driver.c,
src/test/test_driver.c src/uml/uml_driver.c, src/vbox/vbox_tmpl.c,
src/xen/xen_driver.c: Stub out entry points
2010-02-04 16:16:35 +00:00
|
|
|
NULL, /* domainAbortJob */
|
2010-03-12 13:55:08 +00:00
|
|
|
NULL, /* domainMigrateSetMaxDowntime */
|
Add public API for setting migration speed on the fly
It is possible to set a migration speed limit when starting
migration. This new API allows the speed limit to be changed
on the fly to adjust to changing conditions
* src/driver.h, src/libvirt.c, src/libvirt_public.syms,
include/libvirt/libvirt.h.in: Add virDomainMigrateSetMaxSpeed
* src/esx/esx_driver.c, src/lxc/lxc_driver.c,
src/opennebula/one_driver.c, src/openvz/openvz_driver.c,
src/phyp/phyp_driver.c, src/qemu/qemu_driver.c,
src/remote/remote_driver.c, src/test/test_driver.c,
src/uml/uml_driver.c, src/vbox/vbox_tmpl.c,
src/vmware/vmware_driver.c, src/xen/xen_driver.c,
src/libxl/libxl_driver.c: Stub new API
2011-02-17 13:57:53 +00:00
|
|
|
NULL, /* domainMigrateSetMaxSpeed */
|
2010-03-18 14:47:07 +00:00
|
|
|
xenUnifiedDomainEventRegisterAny, /* domainEventRegisterAny */
|
|
|
|
xenUnifiedDomainEventDeregisterAny, /* domainEventDeregisterAny */
|
2010-04-01 08:46:28 +00:00
|
|
|
NULL, /* domainManagedSave */
|
|
|
|
NULL, /* domainHasManagedSaveImage */
|
|
|
|
NULL, /* domainManagedSaveRemove */
|
2010-03-31 20:33:13 +00:00
|
|
|
NULL, /* domainSnapshotCreateXML */
|
|
|
|
NULL, /* domainSnapshotDumpXML */
|
|
|
|
NULL, /* domainSnapshotNum */
|
|
|
|
NULL, /* domainSnapshotListNames */
|
|
|
|
NULL, /* domainSnapshotLookupByName */
|
|
|
|
NULL, /* domainHasCurrentSnapshot */
|
|
|
|
NULL, /* domainSnapshotCurrent */
|
|
|
|
NULL, /* domainRevertToSnapshot */
|
|
|
|
NULL, /* domainSnapshotDelete */
|
2010-04-13 18:02:46 +00:00
|
|
|
NULL, /* qemuDomainMonitorCommand */
|
2010-10-22 13:40:26 +00:00
|
|
|
xenUnifiedDomainOpenConsole, /* domainOpenConsole */
|
2011-05-10 08:26:02 +00:00
|
|
|
NULL, /* domainInjectNMI */
|
2007-04-04 14:19:49 +00:00
|
|
|
};
|
|
|
|
|
2007-04-10 13:00:26 +00:00
|
|
|
/**
|
2008-11-21 12:16:08 +00:00
|
|
|
* xenRegister:
|
2007-04-10 13:00:26 +00:00
|
|
|
*
|
|
|
|
* Register xen related drivers
|
|
|
|
*
|
|
|
|
* Returns the driver priority or -1 in case of error.
|
|
|
|
*/
|
2007-04-04 14:19:49 +00:00
|
|
|
int
|
2008-11-21 12:16:08 +00:00
|
|
|
xenRegister (void)
|
2007-04-04 14:19:49 +00:00
|
|
|
{
|
2007-04-10 11:17:34 +00:00
|
|
|
/* Ignore failures here. */
|
|
|
|
(void) xenHypervisorInit ();
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2009-01-22 17:49:41 +00:00
|
|
|
#ifdef WITH_LIBVIRTD
|
|
|
|
if (virRegisterStateDriver (&state_driver) == -1) return -1;
|
|
|
|
#endif
|
|
|
|
|
2007-04-10 11:17:34 +00:00
|
|
|
return virRegisterDriver (&xenUnifiedDriver);
|
2007-04-04 14:19:49 +00:00
|
|
|
}
|
|
|
|
|
2008-11-25 10:44:52 +00:00
|
|
|
/**
|
|
|
|
* xenUnifiedDomainInfoListFree:
|
|
|
|
*
|
|
|
|
* Free the Domain Info List
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
xenUnifiedDomainInfoListFree(xenUnifiedDomainInfoListPtr list)
|
|
|
|
{
|
|
|
|
int i;
|
2009-01-15 01:21:36 +00:00
|
|
|
|
|
|
|
if (list == NULL)
|
|
|
|
return;
|
|
|
|
|
2008-11-25 10:44:52 +00:00
|
|
|
for (i=0; i<list->count; i++) {
|
|
|
|
VIR_FREE(list->doms[i]->name);
|
|
|
|
VIR_FREE(list->doms[i]);
|
|
|
|
}
|
2010-07-29 13:41:33 +00:00
|
|
|
VIR_FREE(list->doms);
|
2008-11-25 10:44:52 +00:00
|
|
|
VIR_FREE(list);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* xenUnifiedAddDomainInfo:
|
|
|
|
*
|
|
|
|
* Add name and uuid to the domain info list
|
|
|
|
*
|
|
|
|
* Returns: 0 on success, -1 on failure
|
|
|
|
*/
|
|
|
|
int
|
|
|
|
xenUnifiedAddDomainInfo(xenUnifiedDomainInfoListPtr list,
|
|
|
|
int id, char *name,
|
|
|
|
unsigned char *uuid)
|
|
|
|
{
|
|
|
|
xenUnifiedDomainInfoPtr info;
|
|
|
|
int n;
|
|
|
|
|
|
|
|
/* check if we already have this callback on our list */
|
|
|
|
for (n=0; n < list->count; n++) {
|
|
|
|
if (STREQ(list->doms[n]->name, name) &&
|
|
|
|
!memcmp(list->doms[n]->uuid, uuid, VIR_UUID_BUFLEN)) {
|
2011-02-16 23:37:57 +00:00
|
|
|
VIR_DEBUG0("WARNING: dom already tracked");
|
2008-11-25 10:44:52 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (VIR_ALLOC(info) < 0)
|
|
|
|
goto memory_error;
|
|
|
|
if (!(info->name = strdup(name)))
|
|
|
|
goto memory_error;
|
|
|
|
|
|
|
|
memcpy(info->uuid, uuid, VIR_UUID_BUFLEN);
|
|
|
|
info->id = id;
|
|
|
|
|
|
|
|
/* Make space on list */
|
|
|
|
n = list->count;
|
|
|
|
if (VIR_REALLOC_N(list->doms, n + 1) < 0) {
|
|
|
|
goto memory_error;
|
|
|
|
}
|
|
|
|
|
|
|
|
list->doms[n] = info;
|
|
|
|
list->count++;
|
|
|
|
return 0;
|
|
|
|
memory_error:
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2008-11-25 10:44:52 +00:00
|
|
|
if (info)
|
|
|
|
VIR_FREE(info->name);
|
|
|
|
VIR_FREE(info);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* xenUnifiedRemoveDomainInfo:
|
|
|
|
*
|
|
|
|
* Removes name and uuid to the domain info list
|
|
|
|
*
|
|
|
|
* Returns: 0 on success, -1 on failure
|
|
|
|
*/
|
|
|
|
int
|
|
|
|
xenUnifiedRemoveDomainInfo(xenUnifiedDomainInfoListPtr list,
|
|
|
|
int id, char *name,
|
|
|
|
unsigned char *uuid)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
for (i = 0 ; i < list->count ; i++) {
|
|
|
|
if( list->doms[i]->id == id &&
|
|
|
|
STREQ(list->doms[i]->name, name) &&
|
|
|
|
!memcmp(list->doms[i]->uuid, uuid, VIR_UUID_BUFLEN)) {
|
|
|
|
|
|
|
|
VIR_FREE(list->doms[i]->name);
|
|
|
|
VIR_FREE(list->doms[i]);
|
|
|
|
|
|
|
|
if (i < (list->count - 1))
|
|
|
|
memmove(list->doms + i,
|
|
|
|
list->doms + i + 1,
|
|
|
|
sizeof(*(list->doms)) *
|
|
|
|
(list->count - (i + 1)));
|
|
|
|
|
|
|
|
if (VIR_REALLOC_N(list->doms,
|
|
|
|
list->count - 1) < 0) {
|
|
|
|
; /* Failure to reduce memory allocation isn't fatal */
|
|
|
|
}
|
|
|
|
list->count--;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2009-01-21 18:11:14 +00:00
|
|
|
static void
|
|
|
|
xenUnifiedDomainEventDispatchFunc(virConnectPtr conn,
|
|
|
|
virDomainEventPtr event,
|
2010-03-18 14:06:09 +00:00
|
|
|
virConnectDomainEventGenericCallback cb,
|
2009-01-21 18:11:14 +00:00
|
|
|
void *cbopaque,
|
|
|
|
void *opaque)
|
|
|
|
{
|
|
|
|
xenUnifiedPrivatePtr priv = opaque;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Release the lock while the callback is running so that
|
|
|
|
* we're re-entrant safe for callback work - the callback
|
|
|
|
* may want to invoke other virt functions & we have already
|
|
|
|
* protected the one piece of state we have - the callback
|
|
|
|
* list
|
|
|
|
*/
|
|
|
|
xenUnifiedUnlock(priv);
|
|
|
|
virDomainEventDispatchDefaultFunc(conn, event, cb, cbopaque, NULL);
|
|
|
|
xenUnifiedLock(priv);
|
|
|
|
}
|
|
|
|
|
2008-11-25 10:44:52 +00:00
|
|
|
/**
|
|
|
|
* xenUnifiedDomainEventDispatch:
|
2009-01-21 18:11:14 +00:00
|
|
|
* @priv: the connection to dispatch events on
|
|
|
|
* @event: the event to dispatch
|
2008-11-25 10:44:52 +00:00
|
|
|
*
|
|
|
|
* Dispatch domain events to registered callbacks
|
|
|
|
*
|
2009-01-21 18:11:14 +00:00
|
|
|
* The caller must hold the lock in 'priv' before invoking
|
|
|
|
*
|
2008-11-25 10:44:52 +00:00
|
|
|
*/
|
|
|
|
void xenUnifiedDomainEventDispatch (xenUnifiedPrivatePtr priv,
|
2008-12-04 21:09:20 +00:00
|
|
|
virDomainEventPtr event)
|
2008-11-25 10:44:52 +00:00
|
|
|
{
|
2009-01-21 18:11:14 +00:00
|
|
|
if (!priv)
|
2008-12-04 21:09:20 +00:00
|
|
|
return;
|
2008-11-25 10:44:52 +00:00
|
|
|
|
2009-01-21 18:11:14 +00:00
|
|
|
priv->domainEventDispatching = 1;
|
|
|
|
|
|
|
|
if (priv->domainEventCallbacks) {
|
|
|
|
virDomainEventDispatch(event,
|
|
|
|
priv->domainEventCallbacks,
|
|
|
|
xenUnifiedDomainEventDispatchFunc,
|
|
|
|
priv);
|
|
|
|
|
|
|
|
/* Purge any deleted callbacks */
|
|
|
|
virDomainEventCallbackListPurgeMarked(priv->domainEventCallbacks);
|
|
|
|
}
|
|
|
|
|
2008-12-04 21:09:20 +00:00
|
|
|
virDomainEventFree(event);
|
2009-01-21 18:11:14 +00:00
|
|
|
|
|
|
|
priv->domainEventDispatching = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void xenUnifiedLock(xenUnifiedPrivatePtr priv)
|
|
|
|
{
|
|
|
|
virMutexLock(&priv->lock);
|
|
|
|
}
|
|
|
|
|
|
|
|
void xenUnifiedUnlock(xenUnifiedPrivatePtr priv)
|
|
|
|
{
|
|
|
|
virMutexUnlock(&priv->lock);
|
2008-11-25 10:44:52 +00:00
|
|
|
}
|