+static int
+esxIsAlive(virConnectPtr conn)
+{
+ esxPrivate *priv = conn->privateData;
+
+ /* XXX we should be able to do something better than this but this is
+ * simple, safe, and good enough for now. In worst case, the function will
+ * return true even though the connection is not alive.
+ */
+ if (priv->primary)
+ return 1;
+ else
+ return 0;
+}
+
+
+
static int
esxDomainIsActive(virDomainPtr domain)
{
.domainSnapshotCurrent = esxDomainSnapshotCurrent, /* 0.8.0 */
.domainRevertToSnapshot = esxDomainRevertToSnapshot, /* 0.8.0 */
.domainSnapshotDelete = esxDomainSnapshotDelete, /* 0.8.0 */
+ .isAlive = esxIsAlive, /* 0.9.7 */
};
+static int
+hypervIsAlive(virConnectPtr conn)
+{
+ hypervPrivate *priv = conn->privateData;
+
+ /* XXX we should be able to do something better than this is simple, safe,
+ * and good enough for now. In worst case, the function will return true
+ * even though the connection is not alive.
+ */
+ if (priv->client)
+ return 1;
+ else
+ return 0;
+}
+
+
+
static int
hypervDomainIsActive(virDomainPtr domain)
{
.domainManagedSave = hypervDomainManagedSave, /* 0.9.5 */
.domainHasManagedSaveImage = hypervDomainHasManagedSaveImage, /* 0.9.5 */
.domainManagedSaveRemove = hypervDomainManagedSaveRemove, /* 0.9.5 */
+ .isAlive = hypervIsAlive, /* 0.9.7 */
};
}
+static int
+libxlIsAlive(virConnectPtr conn ATTRIBUTE_UNUSED)
+{
+ return 1;
+}
+
+
static virDriver libxlDriver = {
.no = VIR_DRV_LIBXL,
.name = "xenlight",
.domainIsUpdated = libxlDomainIsUpdated, /* 0.9.0 */
.domainEventRegisterAny = libxlDomainEventRegisterAny, /* 0.9.0 */
.domainEventDeregisterAny = libxlDomainEventDeregisterAny, /* 0.9.0 */
+ .isAlive = libxlIsAlive, /* 0.9.7 */
};
static virStateDriver libxlStateDriver = {
}
+static int lxcIsAlive(virConnectPtr conn ATTRIBUTE_UNUSED)
+{
+ return 1;
+}
+
+
static char *lxcGetCapabilities(virConnectPtr conn) {
lxc_driver_t *driver = conn->privateData;
char *xml;
.domainEventRegisterAny = lxcDomainEventRegisterAny, /* 0.8.0 */
.domainEventDeregisterAny = lxcDomainEventDeregisterAny, /* 0.8.0 */
.domainOpenConsole = lxcDomainOpenConsole, /* 0.8.6 */
+ .isAlive = lxcIsAlive, /* 0.9.7 */
};
static virStateDriver lxcStateDriver = {
return 1;
}
+static int
+openvzIsAlive(virConnectPtr conn ATTRIBUTE_UNUSED)
+{
+ return 1;
+}
+
static char *openvzGetCapabilities(virConnectPtr conn) {
struct openvz_driver *driver = conn->privateData;
char *ret;
.domainIsActive = openvzDomainIsActive, /* 0.7.3 */
.domainIsPersistent = openvzDomainIsPersistent, /* 0.7.3 */
.domainIsUpdated = openvzDomainIsUpdated, /* 0.8.6 */
+ .isAlive = openvzIsAlive, /* 0.9.7 */
};
int openvzRegister(void) {
return 1;
}
+
+static int
+phypIsAlive(virConnectPtr conn)
+{
+ ConnectionData *connection_data = conn->networkPrivateData;
+
+ /* XXX we should be able to do something better but this is simple, safe,
+ * and good enough for now. In worst case, the function will return true
+ * even though the connection is not alive.
+ */
+ if (connection_data && connection_data->session)
+ return 1;
+ else
+ return 0;
+}
+
+
static int
phypIsUpdated(virDomainPtr conn ATTRIBUTE_UNUSED)
{
.isEncrypted = phypIsEncrypted, /* 0.7.3 */
.isSecure = phypIsSecure, /* 0.7.3 */
.domainIsUpdated = phypIsUpdated, /* 0.8.6 */
+ .isAlive = phypIsAlive, /* 0.9.7 */
};
static virStorageDriver phypStorageDriver = {
return 0;
}
+static int qemuIsAlive(virConnectPtr conn ATTRIBUTE_UNUSED)
+{
+ return 1;
+}
+
static int kvmGetMaxVCPUs(void) {
int maxvcpus = 1;
.domainGetBlockJobInfo = qemuDomainGetBlockJobInfo, /* 0.9.4 */
.domainBlockJobSetSpeed = qemuDomainBlockJobSetSpeed, /* 0.9.4 */
.domainBlockPull = qemuDomainBlockPull, /* 0.9.4 */
+ .isAlive = qemuIsAlive, /* 0.9.7 */
};
}
+static int
+remoteIsAlive(virConnectPtr conn)
+{
+ struct private_data *priv = conn->privateData;
+ bool ret;
+
+ remoteDriverLock(priv);
+ ret = virNetClientIsOpen(priv->client);
+ remoteDriverUnlock(priv);
+
+ if (ret)
+ return 1;
+ else
+ return 0;
+}
+
+
#include "remote_client_bodies.h"
#include "qemu_client_bodies.h"
.domainBlockJobSetSpeed = remoteDomainBlockJobSetSpeed, /* 0.9.4 */
.domainBlockPull = remoteDomainBlockPull, /* 0.9.4 */
.setKeepAlive = remoteSetKeepAlive, /* 0.9.7 */
+ .isAlive = remoteIsAlive, /* 0.9.7 */
};
static virNetworkDriver network_driver = {
}
+bool virNetClientIsOpen(virNetClientPtr client)
+{
+ bool ret;
+
+ if (!client)
+ return false;
+
+ virNetClientLock(client);
+ ret = client->sock && !client->wantClose;
+ virNetClientUnlock(client);
+ return ret;
+}
+
+
int virNetClientAddProgram(virNetClientPtr client,
virNetClientProgramPtr prog)
{
virNetTLSContextPtr tls);
bool virNetClientIsEncrypted(virNetClientPtr client);
+bool virNetClientIsOpen(virNetClientPtr client);
const char *virNetClientLocalAddrString(virNetClientPtr client);
const char *virNetClientRemoteAddrString(virNetClientPtr client);
return 0;
}
+static int testIsAlive(virConnectPtr conn ATTRIBUTE_UNUSED)
+{
+ return 1;
+}
+
static int testGetMaxVCPUs(virConnectPtr conn ATTRIBUTE_UNUSED,
const char *type ATTRIBUTE_UNUSED)
{
.domainIsUpdated = testDomainIsUpdated, /* 0.8.6 */
.domainEventRegisterAny = testDomainEventRegisterAny, /* 0.8.0 */
.domainEventDeregisterAny = testDomainEventDeregisterAny, /* 0.8.0 */
+ .isAlive = testIsAlive, /* 0.9.7 */
};
static virNetworkDriver testNetworkDriver = {
}
+static int umlIsAlive(virConnectPtr conn ATTRIBUTE_UNUSED)
+{
+ return 1;
+}
+
+
static char *umlGetCapabilities(virConnectPtr conn) {
struct uml_driver *driver = (struct uml_driver *)conn->privateData;
char *xml;
.domainEventRegisterAny = umlDomainEventRegisterAny, /* 0.9.4 */
.domainEventDeregisterAny = umlDomainEventDeregisterAny, /* 0.9.4 */
.domainOpenConsole = umlDomainOpenConsole, /* 0.8.6 */
+ .isAlive = umlIsAlive, /* 0.9.7 */
};
static int
return 0;
}
+static int vboxIsAlive(virConnectPtr conn ATTRIBUTE_UNUSED)
+{
+ return 1;
+}
+
static int vboxGetMaxVcpus(virConnectPtr conn, const char *type ATTRIBUTE_UNUSED) {
VBOX_OBJECT_CHECK(conn, int, -1);
PRUint32 maxCPUCount = 0;
.domainSnapshotCurrent = vboxDomainSnapshotCurrent, /* 0.8.0 */
.domainRevertToSnapshot = vboxDomainRevertToSnapshot, /* 0.8.0 */
.domainSnapshotDelete = vboxDomainSnapshotDelete, /* 0.8.0 */
+ .isAlive = vboxIsAlive, /* 0.9.7 */
};
virNetworkDriver NAME(NetworkDriver) = {
return ret;
}
+static int
+vmwareIsAlive(virConnectPtr conn ATTRIBUTE_UNUSED)
+{
+ return 1;
+}
+
static virDriver vmwareDriver = {
.no = VIR_DRV_VMWARE,
.name = "VMWARE",
.domainUndefineFlags = vmwareDomainUndefineFlags, /* 0.9.4 */
.domainIsActive = vmwareDomainIsActive, /* 0.8.7 */
.domainIsPersistent = vmwareDomainIsPersistent, /* 0.8.7 */
+ .isAlive = vmwareIsAlive, /* 0.9.7 */
};
int
return ret;
}
+static int
+xenUnifiedIsAlive(virConnectPtr conn ATTRIBUTE_UNUSED)
+{
+ /* XenD reconnects for each request */
+ return 1;
+}
+
int
xenUnifiedGetMaxVcpus (virConnectPtr conn, const char *type)
{
.domainEventRegisterAny = xenUnifiedDomainEventRegisterAny, /* 0.8.0 */
.domainEventDeregisterAny = xenUnifiedDomainEventDeregisterAny, /* 0.8.0 */
.domainOpenConsole = xenUnifiedDomainOpenConsole, /* 0.8.6 */
+ .isAlive = xenUnifiedIsAlive, /* 0.9.7 */
};
/**
}
}
+static int
+xenapiIsAlive(virConnectPtr conn)
+{
+ struct _xenapiPrivate *priv = conn->privateData;
+
+ if (priv->session && priv->session->ok)
+ return 1;
+ else
+ return 0;
+}
+
/* The interface which we export upwards to libvirt.c. */
static virDriver xenapiDriver = {
.no = VIR_DRV_XENAPI,
.nodeGetCellsFreeMemory = xenapiNodeGetCellsFreeMemory, /* 0.8.0 */
.nodeGetFreeMemory = xenapiNodeGetFreeMemory, /* 0.8.0 */
.domainIsUpdated = xenapiDomainIsUpdated, /* 0.8.6 */
+ .isAlive = xenapiIsAlive, /* 0.9.7 */
};
/**