2009/10/21 Daniel P. Berrange <berrange(a)redhat.com>:
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
That one is simple, ESX has no concept of transient domains, all are persistent.
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
---
daemon/remote.c | 202 ++++++++++++++++++++++++++
daemon/remote_dispatch_args.h | 7 +
daemon/remote_dispatch_prototypes.h | 64 +++++++++
daemon/remote_dispatch_ret.h | 8 +
daemon/remote_dispatch_table.h | 40 ++++++
src/esx/esx_driver.c | 106 +++++++++++++-
src/lxc/lxc_driver.c | 68 +++++++++-
src/network/bridge_driver.c | 50 ++++++-
src/opennebula/one_driver.c | 21 +++-
src/openvz/openvz_conf.c | 2 +
src/openvz/openvz_driver.c | 66 ++++++++-
src/phyp/phyp_driver.c | 25 +++-
src/qemu/qemu_driver.c | 65 ++++++++-
src/remote/remote_driver.c | 266 +++++++++++++++++++++++++++++++++--
src/remote/remote_protocol.c | 137 ++++++++++++++++++-
src/remote/remote_protocol.h | 112 +++++++++++++++
src/remote/remote_protocol.x | 87 +++++++++++-
src/storage/storage_driver.c | 46 ++++++
src/test/test_driver.c | 184 +++++++++++++++++++++++--
src/uml/uml_driver.c | 67 ++++++++-
src/vbox/vbox_tmpl.c | 108 ++++++++++++++-
src/xen/xen_driver.c | 98 ++++++++++++-
src/xen/xen_driver.h | 2 +
src/xen/xen_inotify.c | 8 +-
src/xen/xen_inotify.h | 1 +
25 files changed, 1772 insertions(+), 68 deletions(-)
[...]
diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c
index 3a57613..c3d1eac 100644
--- a/src/esx/esx_driver.c
+++ b/src/esx/esx_driver.c
[...]
+static int
+esxDomainIsActive(virDomainPtr dom)
+{
+ esxPrivate *priv = (esxPrivate *)dom->conn->privateData;
+ esxVI_String *propertyNameList = NULL;
+ esxVI_ObjectContent *virtualMachineList = NULL;
+ esxVI_ObjectContent *virtualMachine = NULL;
+ esxVI_VirtualMachinePowerState powerState;
+ int id_candidate = -1;
+ char *name_candidate = NULL;
+ unsigned char uuid_candidate[VIR_UUID_BUFLEN];
+ char uuid_string[VIR_UUID_STRING_BUFLEN];
+ int ret = -1;
+
+ if (esxVI_EnsureSession(dom->conn, priv->host) < 0) {
+ goto cleanup;
+ }
+
+ if (esxVI_String_AppendValueListToList(dom->conn, &propertyNameList,
+ "configStatus\0"
+ "name\0"
+ "runtime.powerState\0"
+ "config.uuid\0") < 0 ||
+ esxVI_GetObjectContent(dom->conn, priv->host, priv->host->vmFolder,
+ "VirtualMachine", propertyNameList,
+ esxVI_Boolean_True, &virtualMachineList) < 0) {
+ goto cleanup;
+ }
+
+ for (virtualMachine = virtualMachineList; virtualMachine != NULL;
+ virtualMachine = virtualMachine->_next) {
+ VIR_FREE(name_candidate);
+
+ if (esxVI_GetVirtualMachineIdentity(dom->conn, virtualMachine,
+ &id_candidate, &name_candidate,
+ uuid_candidate) < 0) {
+ goto cleanup;
+ }
+
+ if (memcmp(dom->uuid, uuid_candidate,
+ VIR_UUID_BUFLEN * sizeof(unsigned char)) != 0) {
+ continue;
+ }
+
+ if (esxVI_GetVirtualMachinePowerState(dom->conn, virtualMachine,
+ &powerState) < 0) {
+ goto cleanup;
+ }
+
+ /* Only running/suspended virtual machines have an ID != -1 */
+ if (powerState != esxVI_VirtualMachinePowerState_PoweredOff) {
+ ret = 1;
+ } else {
+ ret = 0;
+ }
+
+ break;
+ }
+
+ if (ret == -1) {
+ virUUIDFormat(dom->uuid, uuid_string);
+
+ ESX_ERROR(dom->conn, VIR_ERR_NO_DOMAIN, "No domain with UUID
'%s'",
+ uuid_string);
+ }
+
+ cleanup:
+ esxVI_String_Free(&propertyNameList);
+ esxVI_ObjectContent_Free(&virtualMachineList);
+ VIR_FREE(name_candidate);
+
+ return ret;
+}
This looks like based on a verbatim copy of esxDomainLookupByUUID() :)
While looking at it I notice that esxDomainLookupByUUID() and
esxDomainIsActive() can be improved by using
esxVI_LookupVirtualMachineByUuid().
The current version of this functions enumerates all virtual machines
of an ESX host and searchs for a matching one. This works but can be
improved. The VI API allows to lookup a virtual machine by its UUID.
I'll post a separate patch for this.
[...]
diff --git a/src/network/bridge_driver.c
b/src/network/bridge_driver.c
index 311838c..60c1acc 100644
--- a/src/network/bridge_driver.c
+++ b/src/network/bridge_driver.c
[...]
static virNetworkPtr networkCreate(virConnectPtr conn, const char
*xml) {
struct network_driver *driver = conn->networkPrivateData;
virNetworkDefPtr def;
@@ -1246,7 +1290,7 @@ static int networkUndefine(virNetworkPtr net) {
network = virNetworkFindByUUID(&driver->networks, net->uuid);
if (!network) {
- networkReportError(net->conn, NULL, net, VIR_ERR_INVALID_DOMAIN,
+ networkReportError(net->conn, NULL, net, VIR_ERR_INVALID_NETWORK,
"%s", _("no network with matching
uuid"));
goto cleanup;
}
IMHO this should be fixed in a separate patch.
[...]
diff --git a/src/openvz/openvz_conf.c b/src/openvz/openvz_conf.c
index 403f537..83687a2 100644
--- a/src/openvz/openvz_conf.c
+++ b/src/openvz/openvz_conf.c
@@ -473,6 +473,8 @@ int openvzLoadDomains(struct openvz_driver *driver) {
dom->pid = veid;
dom->def->id = dom->state == VIR_DOMAIN_SHUTOFF ? -1 : veid;
+ /* XXX OpenVZ doesn't appear to have concept of a transient domain */
+ dom->persistent = 1;
if (virAsprintf(&dom->def->name, "%i", veid) < 0)
goto no_memory;
IMHO this should be fixed in a separate patch
diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c
index 4d7f56c..c9fb8a2 100644
--- a/src/openvz/openvz_driver.c
+++ b/src/openvz/openvz_driver.c
[...]
@@ -777,6 +821,7 @@ openvzDomainDefineXML(virConnectPtr conn, const
char *xml)
if (!(vm = virDomainAssignDef(conn, &driver->domains, vmdef)))
goto cleanup;
vmdef = NULL;
+ vm->persistent = 1;
if (openvzSetInitialConfig(conn, vm->def) < 0) {
openvzError(conn, VIR_ERR_INTERNAL_ERROR,
@@ -844,6 +889,9 @@ openvzDomainCreateXML(virConnectPtr conn, const char *xml,
if (!(vm = virDomainAssignDef(conn, &driver->domains, vmdef)))
goto cleanup;
vmdef = NULL;
+ /* All OpenVZ domains seem to be persistent - this is a bit of a violation
+ * of this libvirt API which is intended for transient domain creation */
+ vm->persistent = 1;
if (openvzSetInitialConfig(conn, vm->def) < 0) {
openvzError(conn, VIR_ERR_INTERNAL_ERROR,
IMHO this should be fixed in a separate patch too.
[...]
diff --git a/src/remote/remote_protocol.c
b/src/remote/remote_protocol.c
index 1449ed4..b6a85a8 100644
--- a/src/remote/remote_protocol.c
+++ b/src/remote/remote_protocol.c
@@ -4,7 +4,7 @@
* It was generated using rpcgen.
*/
-#include "remote_protocol.h"
+#include "./remote/remote_protocol.h"
Why change this include?
[...]
diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index 88dc6a5..afa9b02 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
[...]
@@ -4583,8 +4748,8 @@ static virNetworkDriver testNetworkDriver = {
testNetworkGetBridgeName, /* networkGetBridgeName */
testNetworkGetAutostart, /* networkGetAutostart */
testNetworkSetAutostart, /* networkSetAutostart */
- NULL, /* networkIsActive */
- NULL, /* networkIsEncrypted */
+ testNetworkIsActive, /* domainIsActive */
+ testNetworkIsPersistent, /* domainIsPersistent */
};
s/domainIsActive/networkIsActive/
s/domainIsPersistent/networkIsPersistent/
static virInterfaceDriver testInterfaceDriver = {
@@ -4602,7 +4767,7 @@ static virInterfaceDriver testInterfaceDriver = {
testInterfaceUndefine, /* interfaceUndefine */
testInterfaceCreate, /* interfaceCreate */
testInterfaceDestroy, /* interfaceDestroy */
- NULL, /* interfaceIsActive */
+ testInterfaceIsActive, /* domainIsActive */
};
s/domainIsActive/interfaceIsActive/
ACK.
Matthias