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-05-09 09:24:09 +00:00
|
|
|
VIR_DEBUG("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-05-09 09:24:09 +00:00
|
|
|
VIR_DEBUG("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-05-09 09:24:09 +00:00
|
|
|
VIR_DEBUG("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-05-09 09:24:09 +00:00
|
|
|
VIR_DEBUG("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-05-09 09:24:09 +00:00
|
|
|
VIR_DEBUG("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-05-09 09:24:09 +00:00
|
|
|
VIR_DEBUG("Activated XM sub-driver");
|
2008-03-17 17:30:48 +00:00
|
|
|
priv->opened[XEN_UNIFIED_XM_OFFSET] = 1;
|
|
|
|
}
|
|
|
|
}
|
2011-05-09 09:24:09 +00:00
|
|
|
VIR_DEBUG("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-05-09 09:24:09 +00:00
|
|
|
VIR_DEBUG("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-05-09 09:24:09 +00:00
|
|
|
VIR_DEBUG("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-05-09 09:24:09 +00:00
|
|
|
VIR_DEBUG("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-05-09 09:24:09 +00:00
|
|
|
VIR_DEBUG("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-05-09 09:24:09 +00:00
|
|
|
VIR_DEBUG("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-05-09 09:24:09 +00:00
|
|
|
VIR_DEBUG("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
|
|
|
}
|
|
|
|
|
2011-05-02 09:35:29 +00:00
|
|
|
static int
|
|
|
|
xenUnifiedDomainGetState(virDomainPtr dom,
|
|
|
|
int *state,
|
|
|
|
int *reason,
|
|
|
|
unsigned int flags)
|
|
|
|
{
|
|
|
|
GET_PRIVATE(dom->conn);
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
virCheckFlags(0, -1);
|
|
|
|
|
|
|
|
/* trying drivers in the same order as GetInfo for consistent results:
|
|
|
|
* hypervisor, xend, xs, and xm */
|
|
|
|
|
|
|
|
if (priv->opened[XEN_UNIFIED_HYPERVISOR_OFFSET]) {
|
|
|
|
ret = xenHypervisorGetDomainState(dom, state, reason, flags);
|
|
|
|
if (ret >= 0)
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (priv->opened[XEN_UNIFIED_XEND_OFFSET]) {
|
|
|
|
ret = xenDaemonDomainGetState(dom, state, reason, flags);
|
|
|
|
if (ret >= 0)
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (priv->opened[XEN_UNIFIED_XS_OFFSET]) {
|
|
|
|
ret = xenStoreDomainGetState(dom, state, reason, flags);
|
|
|
|
if (ret >= 0)
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (priv->opened[XEN_UNIFIED_XM_OFFSET]) {
|
|
|
|
ret = xenXMDomainGetState(dom, state, reason, flags);
|
|
|
|
if (ret >= 0)
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
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 *
|
2011-05-06 19:53:10 +00:00
|
|
|
xenUnifiedDomainGetXMLDesc(virDomainPtr dom, int flags)
|
2007-04-04 14:19:49 +00:00
|
|
|
{
|
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])
|
2011-05-06 19:53:10 +00:00
|
|
|
return xenXMDomainGetXMLDesc(dom, flags);
|
2007-10-31 09:39:13 +00:00
|
|
|
} 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);
|
2011-05-06 19:53:10 +00:00
|
|
|
res = xenDaemonDomainGetXMLDesc(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) {
|
2011-05-06 19:53:10 +00:00
|
|
|
domain_xml = xenDaemonDomainGetXMLDesc(dom, 0, NULL);
|
2009-11-12 15:04:43 +00:00
|
|
|
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
|
2011-05-17 22:33:53 +00:00
|
|
|
xenUnifiedDomainGetSchedulerParametersFlags(virDomainPtr dom,
|
|
|
|
virTypedParameterPtr params,
|
|
|
|
int *nparams,
|
|
|
|
unsigned int flags)
|
2007-06-05 12:06:08 +00:00
|
|
|
{
|
|
|
|
GET_PRIVATE(dom->conn);
|
|
|
|
int i, ret;
|
|
|
|
|
2011-05-17 22:33:53 +00:00
|
|
|
virCheckFlags(0, -1);
|
|
|
|
|
2007-06-05 12:06:08 +00:00
|
|
|
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
|
2011-05-17 22:33:53 +00:00
|
|
|
xenUnifiedDomainGetSchedulerParameters(virDomainPtr dom,
|
|
|
|
virTypedParameterPtr params,
|
|
|
|
int *nparams)
|
|
|
|
{
|
|
|
|
return xenUnifiedDomainGetSchedulerParametersFlags(dom, params,
|
|
|
|
nparams, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
xenUnifiedDomainSetSchedulerParametersFlags(virDomainPtr dom,
|
|
|
|
virTypedParameterPtr params,
|
|
|
|
int nparams,
|
|
|
|
unsigned int flags)
|
2007-06-05 12:06:08 +00:00
|
|
|
{
|
|
|
|
GET_PRIVATE(dom->conn);
|
|
|
|
int i, ret;
|
|
|
|
|
2011-05-17 22:33:53 +00:00
|
|
|
virCheckFlags(0, -1);
|
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
2011-05-17 22:33:53 +00:00
|
|
|
static int
|
|
|
|
xenUnifiedDomainSetSchedulerParameters(virDomainPtr dom,
|
|
|
|
virTypedParameterPtr params,
|
|
|
|
int nparams)
|
|
|
|
{
|
|
|
|
return xenUnifiedDomainSetSchedulerParametersFlags(dom, params,
|
|
|
|
nparams, 0);
|
|
|
|
}
|
|
|
|
|
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-04-05 10:27:35 +00:00
|
|
|
if (virFDStreamOpenFile(st, chr->source.data.file.path,
|
|
|
|
0, 0, O_RDWR, false) < 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 = {
|
Convert all driver struct intializers to C99 style
Change all the driver struct initializers to use the
C99 style, leaving out unused fields. This will make
it possible to add new APIs without changing every
driver. eg change:
qemudDomainResume, /* domainResume */
qemudDomainShutdown, /* domainShutdown */
NULL, /* domainReboot */
qemudDomainDestroy, /* domainDestroy */
to
.domainResume = qemudDomainResume,
.domainShutdown = qemudDomainShutdown,
.domainDestroy = qemudDomainDestroy,
And get rid of any existing C99 style initializersr which
set NULL, eg change
.listPools = vboxStorageListPools,
.numOfDefinedPools = NULL,
.listDefinedPools = NULL,
.findPoolSources = NULL,
.poolLookupByName = vboxStoragePoolLookupByName,
to
.listPools = vboxStorageListPools,
.poolLookupByName = vboxStoragePoolLookupByName,
2011-05-13 10:16:31 +00:00
|
|
|
.no = VIR_DRV_XEN_UNIFIED,
|
|
|
|
.name = "Xen",
|
2011-05-13 13:35:01 +00:00
|
|
|
.open = xenUnifiedOpen, /* 0.0.3 */
|
|
|
|
.close = xenUnifiedClose, /* 0.0.3 */
|
|
|
|
.supports_feature = xenUnifiedSupportsFeature, /* 0.3.2 */
|
|
|
|
.type = xenUnifiedType, /* 0.0.3 */
|
|
|
|
.version = xenUnifiedGetVersion, /* 0.0.3 */
|
|
|
|
.getHostname = virGetHostname, /* 0.7.3 */
|
|
|
|
.getMaxVcpus = xenUnifiedGetMaxVcpus, /* 0.2.1 */
|
|
|
|
.nodeGetInfo = xenUnifiedNodeGetInfo, /* 0.1.0 */
|
|
|
|
.getCapabilities = xenUnifiedGetCapabilities, /* 0.2.1 */
|
|
|
|
.listDomains = xenUnifiedListDomains, /* 0.0.3 */
|
|
|
|
.numOfDomains = xenUnifiedNumOfDomains, /* 0.0.3 */
|
|
|
|
.domainCreateXML = xenUnifiedDomainCreateXML, /* 0.0.3 */
|
|
|
|
.domainLookupByID = xenUnifiedDomainLookupByID, /* 0.0.3 */
|
|
|
|
.domainLookupByUUID = xenUnifiedDomainLookupByUUID, /* 0.0.5 */
|
|
|
|
.domainLookupByName = xenUnifiedDomainLookupByName, /* 0.0.3 */
|
|
|
|
.domainSuspend = xenUnifiedDomainSuspend, /* 0.0.3 */
|
|
|
|
.domainResume = xenUnifiedDomainResume, /* 0.0.3 */
|
|
|
|
.domainShutdown = xenUnifiedDomainShutdown, /* 0.0.3 */
|
|
|
|
.domainReboot = xenUnifiedDomainReboot, /* 0.1.0 */
|
|
|
|
.domainDestroy = xenUnifiedDomainDestroy, /* 0.0.3 */
|
|
|
|
.domainGetOSType = xenUnifiedDomainGetOSType, /* 0.0.3 */
|
|
|
|
.domainGetMaxMemory = xenUnifiedDomainGetMaxMemory, /* 0.0.3 */
|
|
|
|
.domainSetMaxMemory = xenUnifiedDomainSetMaxMemory, /* 0.0.3 */
|
|
|
|
.domainSetMemory = xenUnifiedDomainSetMemory, /* 0.1.1 */
|
|
|
|
.domainGetInfo = xenUnifiedDomainGetInfo, /* 0.0.3 */
|
|
|
|
.domainGetState = xenUnifiedDomainGetState, /* 0.9.2 */
|
|
|
|
.domainSave = xenUnifiedDomainSave, /* 0.0.3 */
|
|
|
|
.domainRestore = xenUnifiedDomainRestore, /* 0.0.3 */
|
|
|
|
.domainCoreDump = xenUnifiedDomainCoreDump, /* 0.1.9 */
|
|
|
|
.domainSetVcpus = xenUnifiedDomainSetVcpus, /* 0.1.4 */
|
|
|
|
.domainSetVcpusFlags = xenUnifiedDomainSetVcpusFlags, /* 0.8.5 */
|
|
|
|
.domainGetVcpusFlags = xenUnifiedDomainGetVcpusFlags, /* 0.8.5 */
|
|
|
|
.domainPinVcpu = xenUnifiedDomainPinVcpu, /* 0.1.4 */
|
|
|
|
.domainGetVcpus = xenUnifiedDomainGetVcpus, /* 0.1.4 */
|
|
|
|
.domainGetMaxVcpus = xenUnifiedDomainGetMaxVcpus, /* 0.2.1 */
|
|
|
|
.domainGetXMLDesc = xenUnifiedDomainGetXMLDesc, /* 0.0.3 */
|
|
|
|
.domainXMLFromNative = xenUnifiedDomainXMLFromNative, /* 0.6.4 */
|
|
|
|
.domainXMLToNative = xenUnifiedDomainXMLToNative, /* 0.6.4 */
|
|
|
|
.listDefinedDomains = xenUnifiedListDefinedDomains, /* 0.1.1 */
|
|
|
|
.numOfDefinedDomains = xenUnifiedNumOfDefinedDomains, /* 0.1.5 */
|
|
|
|
.domainCreate = xenUnifiedDomainCreate, /* 0.1.1 */
|
|
|
|
.domainCreateWithFlags = xenUnifiedDomainCreateWithFlags, /* 0.8.2 */
|
|
|
|
.domainDefineXML = xenUnifiedDomainDefineXML, /* 0.1.1 */
|
|
|
|
.domainUndefine = xenUnifiedDomainUndefine, /* 0.1.1 */
|
|
|
|
.domainAttachDevice = xenUnifiedDomainAttachDevice, /* 0.1.9 */
|
|
|
|
.domainAttachDeviceFlags = xenUnifiedDomainAttachDeviceFlags, /* 0.7.7 */
|
|
|
|
.domainDetachDevice = xenUnifiedDomainDetachDevice, /* 0.1.9 */
|
|
|
|
.domainDetachDeviceFlags = xenUnifiedDomainDetachDeviceFlags, /* 0.7.7 */
|
|
|
|
.domainUpdateDeviceFlags = xenUnifiedDomainUpdateDeviceFlags, /* 0.8.0 */
|
|
|
|
.domainGetAutostart = xenUnifiedDomainGetAutostart, /* 0.4.4 */
|
|
|
|
.domainSetAutostart = xenUnifiedDomainSetAutostart, /* 0.4.4 */
|
|
|
|
.domainGetSchedulerType = xenUnifiedDomainGetSchedulerType, /* 0.2.3 */
|
|
|
|
.domainGetSchedulerParameters = xenUnifiedDomainGetSchedulerParameters, /* 0.2.3 */
|
2011-05-17 22:33:53 +00:00
|
|
|
.domainGetSchedulerParametersFlags = xenUnifiedDomainGetSchedulerParametersFlags, /* 0.9.2 */
|
2011-05-13 13:35:01 +00:00
|
|
|
.domainSetSchedulerParameters = xenUnifiedDomainSetSchedulerParameters, /* 0.2.3 */
|
2011-05-17 22:33:53 +00:00
|
|
|
.domainSetSchedulerParametersFlags = xenUnifiedDomainSetSchedulerParametersFlags, /* 0.9.2 */
|
2011-05-13 13:35:01 +00:00
|
|
|
.domainMigratePrepare = xenUnifiedDomainMigratePrepare, /* 0.3.2 */
|
|
|
|
.domainMigratePerform = xenUnifiedDomainMigratePerform, /* 0.3.2 */
|
|
|
|
.domainMigrateFinish = xenUnifiedDomainMigrateFinish, /* 0.3.2 */
|
|
|
|
.domainBlockStats = xenUnifiedDomainBlockStats, /* 0.3.2 */
|
|
|
|
.domainInterfaceStats = xenUnifiedDomainInterfaceStats, /* 0.3.2 */
|
|
|
|
.domainBlockPeek = xenUnifiedDomainBlockPeek, /* 0.4.4 */
|
|
|
|
.nodeGetCellsFreeMemory = xenUnifiedNodeGetCellsFreeMemory, /* 0.3.3 */
|
|
|
|
.nodeGetFreeMemory = xenUnifiedNodeGetFreeMemory, /* 0.3.3 */
|
|
|
|
.domainEventRegister = xenUnifiedDomainEventRegister, /* 0.5.0 */
|
|
|
|
.domainEventDeregister = xenUnifiedDomainEventDeregister, /* 0.5.0 */
|
|
|
|
.nodeDeviceDettach = xenUnifiedNodeDeviceDettach, /* 0.6.1 */
|
|
|
|
.nodeDeviceReAttach = xenUnifiedNodeDeviceReAttach, /* 0.6.1 */
|
|
|
|
.nodeDeviceReset = xenUnifiedNodeDeviceReset, /* 0.6.1 */
|
|
|
|
.isEncrypted = xenUnifiedIsEncrypted, /* 0.7.3 */
|
|
|
|
.isSecure = xenUnifiedIsSecure, /* 0.7.3 */
|
|
|
|
.domainIsActive = xenUnifiedDomainIsActive, /* 0.7.3 */
|
|
|
|
.domainIsPersistent = xenUnifiedDomainIsPersistent, /* 0.7.3 */
|
|
|
|
.domainIsUpdated = xenUnifiedDomainIsUpdated, /* 0.8.6 */
|
|
|
|
.domainEventRegisterAny = xenUnifiedDomainEventRegisterAny, /* 0.8.0 */
|
|
|
|
.domainEventDeregisterAny = xenUnifiedDomainEventDeregisterAny, /* 0.8.0 */
|
|
|
|
.domainOpenConsole = xenUnifiedDomainOpenConsole, /* 0.8.6 */
|
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-05-09 09:24:09 +00:00
|
|
|
VIR_DEBUG("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
|
|
|
}
|