[libvirt] PATCH: Improve URI error reporting
by Daniel P. Berrange
There are currently far too many cases where a correct URI returns an
generic 'failed to connect to hypervisor' error message. This gives the
user no idea why they could not connect. Of particular importance is
that they cannot distinguish a correct URI + plus a driver problem, vs
incorrect URI. Consider the following examples
virsh -c qemu:///bogus
error: could not connect to qemu:///bogus
error: failed to connect to the hypervisor
virsh -c qemu://
error: could not connect to qemu://
error: failed to connect to the hypervisor
virsh -c /var/lib/xen/xend-socket
error: could not connect to /var/lib/xen/xend-socket
error: failed to connect to the hypervisor
virsh -c /bogus
error: could not connect to /bogus
error: failed to connect to the hypervisor
virsh -c bogus
error: could not connect to bogus
error: failed to connect to the hypervisor
virsh -c uml:///bogus
error: could not connect to uml:///bogus
error: failed to connect to the hypervisor
virsh -c uml://
error: could not connect to uml://
error: failed to connect to the hypervisor
virsh -c openvz:///system
error: could not connect to openvz:///system
error: failed to connect to the hypervisor
virsh -c openvz:///bogus
error: could not connect to openvz:///bogus
error: failed to connect to the hypervisor
virsh -c openvz:///
error: could not connect to openvz:///
error: failed to connect to the hypervisor
virsh -c bogus:///
error: could not connect to bogus:///
error: failed to connect to the hypervisor
virsh -c qemu+tls:///system
error: unable to connect to 'localhost': Connection refused
error: failed to connect to the hypervisor
virsh -c qemu://localhost/system
error: could not connect to qemu://localhost/system
error: failed to connect to the hypervisor
virsh -c bogus+unix:///
error: could not connect to bogus:///
error: failed to connect to the hypervisor
The core problem here is that far too many places are using the return
code VIR_DRV_OPEN_DECLINED instead of VIR_DRV_OPEN_ERROR. The former
provides no way to give any error info to the user. With this patch
I have taken the view that a driver must *only* ever use the return
code VIR_DRV_OPEN_DECLINED when:
- Auto-probe of a driver URI, and this driver is not active
- Explicit URI with 'server' specified
- URI scheme does not match the driver
The remote driver is special in that it *must* accept all URIs given to
it, no matter what, unless of course it is running inside the daemon
already. The result is that if you give a correct URI, but there is a
real problem opening the driver you are now guarenteed to get a useful
error message back. Consider the same examples again
virsh -c qemu:///bogus
error: internal error unexpected QEMU URI path '/bogus', try qemu:///system
error: failed to connect to the hypervisor
virsh -c qemu://
error: internal error unexpected QEMU URI path '', try qemu:///system
error: failed to connect to the hypervisor
virsh -c xen:///
error: unable to connect to 'localhost:8000': Connection refused
error: failed to connect to the hypervisor
virsh -c xen:///bogus
error: internal error unexpected Xen URI path '/bogus', try xen:///
error: failed to connect to the hypervisor
virsh -c /var/lib/xen/xend-socket
error: internal error failed to connect to xend
error: failed to connect to the hypervisor
virsh -c /bogus
error: internal error failed to connect to xend
error: failed to connect to the hypervisor
virsh -c bogus
error: internal error unexpected Xen URI path 'bogus', try ///var/lib/xen/xend-socket
error: failed to connect to the hypervisor
virsh -c uml:///bogus
error: internal error unexpected UML URI path '/bogus', try uml:///system
error: failed to connect to the hypervisor
virsh -c uml://
error: internal error unexpected UML URI path '', try uml:///system
error: failed to connect to the hypervisor
virsh -c lxc://
error: internal error unexpected LXC URI path '', try lxc:///
error: failed to connect to the hypervisor
virsh -c lxc:///bogus
error: internal error unexpected LXC URI path '/bogus', try lxc:///
error: failed to connect to the hypervisor
virsh -c openvz:///system
error: internal error OpenVZ control file /proc/vz does not exist
error: failed to connect to the hypervisor
virsh -c openvz:///bogus
error: internal error unexpected OpenVZ URI path '/bogus', try openvz:///system
error: failed to connect to the hypervisor
virsh -c openvz:///
error: internal error unexpected OpenVZ URI path '/', try openvz:///system
error: failed to connect to the hypervisor
virsh -c vbox:///system
error: internal error unknown driver path '/system' specified (try vbox:///session)
error: failed to connect to the hypervisor
virsh -c vbox:///bogus
error: internal error unknown driver path '/bogus' specified (try vbox:///session)
error: failed to connect to the hypervisor
virsh -c vbox://
error: internal error no VirtualBox driver path specified (try vbox:///session)
error: failed to connect to the hypervisor
virsh -c bogus:///
error: no hypervisor driver available for bogus:///
error: failed to connect to the hypervisor
virsh -c qemu+tls:///system
error: unable to connect to libvirtd at 'localhost': Connection refused
error: failed to connect to the hypervisor
virsh -c qemu://localhost/system
error: unable to connect to libvirtd at 'localhost': Connection refused
error: failed to connect to the hypervisor
virsh -c bogus+unix:///
error: no hypervisor driver available for bogus:///
error: failed to connect to the hypervisor
In every case there is now a useful error message.
lxc_driver.c | 48 ++++++++++----------
openvz_driver.c | 57 ++++++++++++++++-------
qemu_driver.c | 83 +++++++++++++++++-----------------
remote_internal.c | 129 ++++++++++++++++++++++++++++--------------------------
test.c | 3 -
uml_driver.c | 62 ++++++++++++++++---------
virterror.c | 4 -
xen_unified.c | 55 +++++++++++++++--------
xend_internal.c | 7 ++
9 files changed, 259 insertions(+), 189 deletions(-)
Daniel
diff -r 3c35f3b77286 src/lxc_driver.c
--- a/src/lxc_driver.c Wed Jun 03 15:37:52 2009 +0100
+++ b/src/lxc_driver.c Wed Jun 03 17:31:17 2009 +0100
@@ -68,46 +68,48 @@ static void lxcDriverUnlock(lxc_driver_t
}
-static int lxcProbe(void)
-{
- if (getuid() != 0 ||
- lxcContainerAvailable(0) < 0)
- return 0;
-
- return 1;
-}
-
static virDrvOpenStatus lxcOpen(virConnectPtr conn,
virConnectAuthPtr auth ATTRIBUTE_UNUSED,
int flags ATTRIBUTE_UNUSED)
{
- if (lxc_driver == NULL)
- goto declineConnection;
-
/* Verify uri was specified */
if (conn->uri == NULL) {
- if (!lxcProbe())
- goto declineConnection;
+ if (lxc_driver == NULL)
+ return VIR_DRV_OPEN_DECLINED;
conn->uri = xmlParseURI("lxc:///");
if (!conn->uri) {
virReportOOMError(conn);
return VIR_DRV_OPEN_ERROR;
}
- } else if (conn->uri->scheme == NULL ||
- STRNEQ(conn->uri->scheme, "lxc")) {
- goto declineConnection;
- } else if (!lxcProbe()) {
- goto declineConnection;
+ } else {
+ if (conn->uri->scheme == NULL ||
+ STRNEQ(conn->uri->scheme, "lxc"))
+ return VIR_DRV_OPEN_DECLINED;
+
+ /* Leave for remote driver */
+ if (conn->uri->server != NULL)
+ return VIR_DRV_OPEN_DECLINED;
+
+ /* If path isn't '/' then they typoed, tell them correct path */
+ if (STRNEQ(conn->uri->path, "/")) {
+ lxcError(conn, NULL, VIR_ERR_INTERNAL_ERROR,
+ _("unexpected LXC URI path '%s', try lxc:///"),
+ conn->uri->path);
+ return VIR_DRV_OPEN_ERROR;
+ }
+
+ /* URI was good, but driver isn't active */
+ if (lxc_driver == NULL) {
+ lxcError(conn, NULL, VIR_ERR_INTERNAL_ERROR,
+ _("lxc state driver is not active"));
+ return VIR_DRV_OPEN_ERROR;
+ }
}
-
conn->privateData = lxc_driver;
return VIR_DRV_OPEN_SUCCESS;
-
-declineConnection:
- return VIR_DRV_OPEN_DECLINED;
}
static int lxcClose(virConnectPtr conn)
diff -r 3c35f3b77286 src/openvz_driver.c
--- a/src/openvz_driver.c Wed Jun 03 15:37:52 2009 +0100
+++ b/src/openvz_driver.c Wed Jun 03 17:31:17 2009 +0100
@@ -1070,36 +1070,59 @@ cleanup:
return ret;
}
-static int openvzProbe(void)
-{
- if (geteuid() == 0 &&
- virFileExists("/proc/vz"))
- return 1;
-
- return 0;
-}
-
static virDrvOpenStatus openvzOpen(virConnectPtr conn,
virConnectAuthPtr auth ATTRIBUTE_UNUSED,
int flags ATTRIBUTE_UNUSED)
{
struct openvz_driver *driver;
- if (!openvzProbe())
- return VIR_DRV_OPEN_DECLINED;
if (conn->uri == NULL) {
+ if (!virFileExists("/proc/vz"))
+ return VIR_DRV_OPEN_DECLINED;
+
+ if (access("/proc/vz", W_OK) < 0)
+ return VIR_DRV_OPEN_DECLINED;
+
conn->uri = xmlParseURI("openvz:///system");
if (conn->uri == NULL) {
- openvzError(conn, VIR_ERR_NO_DOMAIN, NULL);
+ virReportOOMError(conn);
return VIR_DRV_OPEN_ERROR;
}
- } else if (conn->uri->scheme == NULL ||
- conn->uri->path == NULL ||
- STRNEQ (conn->uri->scheme, "openvz") ||
- STRNEQ (conn->uri->path, "/system")) {
- return VIR_DRV_OPEN_DECLINED;
+ } else {
+ /* If scheme isn't 'openvz', then its for another driver */
+ if (conn->uri->scheme == NULL ||
+ STRNEQ (conn->uri->scheme, "openvz"))
+ return VIR_DRV_OPEN_DECLINED;
+
+ /* If server name is given, its for remote driver */
+ if (conn->uri->server != NULL)
+ return VIR_DRV_OPEN_DECLINED;
+
+ /* If path isn't /system, then they typoed, so tell them correct path */
+ if (conn->uri->path == NULL ||
+ STRNEQ (conn->uri->path, "/system")) {
+ openvzError(conn, VIR_ERR_INTERNAL_ERROR,
+ _("unexpected OpenVZ URI path '%s', try openvz:///system"),
+ conn->uri->path);
+ return VIR_DRV_OPEN_ERROR;
+ }
+
+ if (!virFileExists("/proc/vz")) {
+ openvzError(conn, VIR_ERR_INTERNAL_ERROR, "%s",
+ _("OpenVZ control file /proc/vz does not exist"));
+ return VIR_DRV_OPEN_ERROR;
+ }
+
+ if (access("/proc/vz", W_OK) < 0) {
+ openvzError(conn, VIR_ERR_INTERNAL_ERROR, "%s",
+ _("OpenVZ control file /proc/vz is not accessible"));
+ return VIR_DRV_OPEN_ERROR;
+ }
}
+ /* We now know the URI is definitely for this driver, so beyond
+ * here, don't return DECLINED, always use ERROR */
+
if (VIR_ALLOC(driver) < 0) {
virReportOOMError(conn);
return VIR_DRV_OPEN_ERROR;
diff -r 3c35f3b77286 src/qemu_driver.c
--- a/src/qemu_driver.c Wed Jun 03 15:37:52 2009 +0100
+++ b/src/qemu_driver.c Wed Jun 03 17:31:17 2009 +0100
@@ -1743,62 +1743,61 @@ qemudMonitorCommand(const virDomainObjPt
}
-/**
- * qemudProbe:
- *
- * Probe for the availability of the qemu driver, assume the
- * presence of QEmu emulation if the binaries are installed
- */
-static int qemudProbe(void)
-{
- if ((virFileExists("/usr/bin/qemu")) ||
- (virFileExists("/usr/bin/qemu-kvm")) ||
- (virFileExists("/usr/bin/kvm")) ||
- (virFileExists("/usr/bin/xenner")))
- return 1;
-
- return 0;
-}
static virDrvOpenStatus qemudOpen(virConnectPtr conn,
virConnectAuthPtr auth ATTRIBUTE_UNUSED,
int flags ATTRIBUTE_UNUSED) {
uid_t uid = getuid();
- if (qemu_driver == NULL)
- goto decline;
-
- if (!qemudProbe())
- goto decline;
-
if (conn->uri == NULL) {
- conn->uri = xmlParseURI(uid ? "qemu:///session" : "qemu:///system");
+ if (qemu_driver == NULL)
+ return VIR_DRV_OPEN_DECLINED;
+
+ conn->uri = xmlParseURI(uid == 0 ?
+ "qemu:///system" :
+ "qemu:///session");
if (!conn->uri) {
virReportOOMError(conn);
return VIR_DRV_OPEN_ERROR;
}
- } else if (conn->uri->scheme == NULL ||
- conn->uri->path == NULL)
- goto decline;
-
- if (STRNEQ (conn->uri->scheme, "qemu"))
- goto decline;
-
- if (uid != 0) {
- if (STRNEQ (conn->uri->path, "/session"))
- goto decline;
- } else { /* root */
- if (STRNEQ (conn->uri->path, "/system") &&
- STRNEQ (conn->uri->path, "/session"))
- goto decline;
- }
-
+ } else {
+ /* If URI isn't 'qemu' its definitely not for us */
+ if (conn->uri->scheme == NULL ||
+ STRNEQ(conn->uri->scheme, "qemu"))
+ return VIR_DRV_OPEN_DECLINED;
+
+ /* Allow remote driver to deal with URIs with hostname server */
+ if (conn->uri->server != NULL)
+ return VIR_DRV_OPEN_DECLINED;
+
+ if (!uid) {
+ if (STRNEQ (conn->uri->path, "/system") &&
+ STRNEQ (conn->uri->path, "/session")) {
+ qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
+ _("unexpected QEMU URI path '%s', try qemu:///system"),
+ conn->uri->path);
+ return VIR_DRV_OPEN_ERROR;
+ }
+ } else {
+ if (STRNEQ (conn->uri->path, "/session")) {
+ qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
+ _("unexpected QEMU URI path '%s', try qemu:///session"),
+ conn->uri->path);
+ return VIR_DRV_OPEN_ERROR;
+ }
+ }
+
+ /* URI was good, but driver isn't active */
+ if (qemu_driver == NULL) {
+ qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR, "%s",
+ _("qemu state driver is not active"));
+ return VIR_DRV_OPEN_ERROR;
+ }
+
+ }
conn->privateData = qemu_driver;
return VIR_DRV_OPEN_SUCCESS;
-
- decline:
- return VIR_DRV_OPEN_DECLINED;
}
static int qemudClose(virConnectPtr conn) {
diff -r 3c35f3b77286 src/remote_internal.c
--- a/src/remote_internal.c Wed Jun 03 15:37:52 2009 +0100
+++ b/src/remote_internal.c Wed Jun 03 17:31:17 2009 +0100
@@ -305,21 +305,28 @@ remoteForkDaemon(virConnectPtr conn)
enum virDrvOpenRemoteFlags {
VIR_DRV_OPEN_REMOTE_RO = (1 << 0),
- VIR_DRV_OPEN_REMOTE_UNIX = (1 << 1),
- VIR_DRV_OPEN_REMOTE_USER = (1 << 2),
- VIR_DRV_OPEN_REMOTE_AUTOSTART = (1 << 3),
-};
-
-/* What transport? */
-enum {
- trans_tls,
- trans_unix,
- trans_ssh,
- trans_ext,
- trans_tcp,
-} transport;
-
-
+ VIR_DRV_OPEN_REMOTE_USER = (1 << 1), /* Use the per-user socket path */
+ VIR_DRV_OPEN_REMOTE_AUTOSTART = (1 << 2), /* Autostart a per-user daemon */
+};
+
+
+/*
+ * URIs that this driver needs to handle:
+ *
+ * The easy answer:
+ * - Everything that no one else has yet claimed, but nothing if
+ * we're inside the libvirtd daemon
+ *
+ * The hard answer:
+ * - Plain paths (///var/lib/xen/xend-socket) -> UNIX domain socket
+ * - xxx://servername/ -> TLS connection
+ * - xxx+tls://servername/ -> TLS connection
+ * - xxx+tls:/// -> TLS connection to localhost
+ * - xxx+tcp://servername/ -> TCP connection
+ * - xxx+tcp:/// -> TCP connection to localhost
+ * - xxx+unix:/// -> UNIX domain socket
+ * - xxx:/// -> UNIX domain socket
+ */
static int
doRemoteOpen (virConnectPtr conn,
struct private_data *priv,
@@ -328,37 +335,51 @@ doRemoteOpen (virConnectPtr conn,
{
int wakeupFD[2] = { -1, -1 };
char *transport_str = NULL;
+ enum {
+ trans_tls,
+ trans_unix,
+ trans_ssh,
+ trans_ext,
+ trans_tcp,
+ } transport;
+
+ /* We handle *ALL* URIs here. The caller has rejected any
+ * URIs we don't care about */
if (conn->uri) {
- if (!conn->uri->scheme)
- return VIR_DRV_OPEN_DECLINED;
-
- transport_str = get_transport_from_scheme (conn->uri->scheme);
-
- if (!transport_str || STRCASEEQ (transport_str, "tls"))
- transport = trans_tls;
- else if (STRCASEEQ (transport_str, "unix"))
+ if (!conn->uri->scheme) {
+ /* This is the ///var/lib/xen/xend-socket local path style */
transport = trans_unix;
- else if (STRCASEEQ (transport_str, "ssh"))
- transport = trans_ssh;
- else if (STRCASEEQ (transport_str, "ext"))
- transport = trans_ext;
- else if (STRCASEEQ (transport_str, "tcp"))
- transport = trans_tcp;
- else {
- error (conn, VIR_ERR_INVALID_ARG,
- _("remote_open: transport in URL not recognised "
- "(should be tls|unix|ssh|ext|tcp)"));
- return VIR_DRV_OPEN_ERROR;
- }
- }
-
- if (!transport_str) {
- if ((!conn->uri || !conn->uri->server) &&
- (flags & VIR_DRV_OPEN_REMOTE_UNIX))
- transport = trans_unix;
- else
- return VIR_DRV_OPEN_DECLINED; /* Decline - not a remote URL. */
+ } else {
+ transport_str = get_transport_from_scheme (conn->uri->scheme);
+
+ if (!transport_str) {
+ if (conn->uri->server)
+ transport = trans_tls;
+ else
+ transport = trans_unix;
+ } else {
+ if (STRCASEEQ (transport_str, "tls"))
+ transport = trans_tls;
+ else if (STRCASEEQ (transport_str, "unix"))
+ transport = trans_unix;
+ else if (STRCASEEQ (transport_str, "ssh"))
+ transport = trans_ssh;
+ else if (STRCASEEQ (transport_str, "ext"))
+ transport = trans_ext;
+ else if (STRCASEEQ (transport_str, "tcp"))
+ transport = trans_tcp;
+ else {
+ error (conn, VIR_ERR_INVALID_ARG,
+ _("remote_open: transport in URL not recognised "
+ "(should be tls|unix|ssh|ext|tcp)"));
+ return VIR_DRV_OPEN_ERROR;
+ }
+ }
+ }
+ } else {
+ /* No URI, then must be probing so use UNIX socket */
+ transport = trans_unix;
}
/* Local variables which we will initialise. These can
@@ -455,8 +476,9 @@ doRemoteOpen (virConnectPtr conn,
/* Construct the original name. */
if (!name) {
- if (STREQ(conn->uri->scheme, "remote") ||
- STRPREFIX(conn->uri->scheme, "remote+")) {
+ if (conn->uri->scheme &&
+ (STREQ(conn->uri->scheme, "remote") ||
+ STRPREFIX(conn->uri->scheme, "remote+"))) {
/* Allow remote serve to probe */
name = strdup("");
} else {
@@ -580,7 +602,7 @@ doRemoteOpen (virConnectPtr conn,
freeaddrinfo (res);
virReportSystemError(conn, saved_errno,
- _("unable to connect to '%s'"),
+ _("unable to connect to libvirtd at '%s'"),
priv->hostname);
goto failed;
@@ -925,7 +947,6 @@ remoteOpenSecondaryDriver(virConnectPtr
if (flags & VIR_CONNECT_RO)
rflags |= VIR_DRV_OPEN_REMOTE_RO;
- rflags |= VIR_DRV_OPEN_REMOTE_UNIX;
ret = doRemoteOpen(conn, *priv, auth, rflags);
if (ret != VIR_DRV_OPEN_SUCCESS) {
@@ -958,19 +979,6 @@ remoteOpen (virConnectPtr conn,
/*
* If no servername is given, and no +XXX
- * transport is listed, then force to a
- * local UNIX socket connection
- */
- if (conn->uri &&
- !conn->uri->server &&
- conn->uri->scheme &&
- !strchr(conn->uri->scheme, '+')) {
- DEBUG0("Auto-remote UNIX socket");
- rflags |= VIR_DRV_OPEN_REMOTE_UNIX;
- }
-
- /*
- * If no servername is given, and no +XXX
* transport is listed, or transport is unix,
* and path is /session, and uid is unprivileged
* then auto-spawn a daemon.
@@ -996,7 +1004,6 @@ remoteOpen (virConnectPtr conn,
*/
if (!conn->uri) {
DEBUG0("Auto-probe remote URI");
- rflags |= VIR_DRV_OPEN_REMOTE_UNIX;
#ifndef __sun
if (getuid() > 0) {
DEBUG0("Auto-spawn user daemon instance");
diff -r 3c35f3b77286 src/test.c
--- a/src/test.c Wed Jun 03 15:37:52 2009 +0100
+++ b/src/test.c Wed Jun 03 17:31:17 2009 +0100
@@ -639,9 +639,6 @@ static virDrvOpenStatus testOpen(virConn
if (conn->uri->server)
return VIR_DRV_OPEN_DECLINED;
- if (conn->uri->server)
- return VIR_DRV_OPEN_DECLINED;
-
/* From this point on, the connection is for us. */
if (!conn->uri->path
|| conn->uri->path[0] == '\0'
diff -r 3c35f3b77286 src/uml_driver.c
--- a/src/uml_driver.c Wed Jun 03 15:37:52 2009 +0100
+++ b/src/uml_driver.c Wed Jun 03 17:31:17 2009 +0100
@@ -913,28 +913,49 @@ static virDrvOpenStatus umlOpen(virConne
int flags ATTRIBUTE_UNUSED) {
uid_t uid = getuid();
- if (uml_driver == NULL)
- goto decline;
+ if (conn->uri == NULL) {
+ if (uml_driver == NULL)
+ return VIR_DRV_OPEN_DECLINED;
- if (conn->uri != NULL) {
- if (conn->uri->scheme == NULL || conn->uri->path == NULL)
- goto decline;
-
- if (STRNEQ (conn->uri->scheme, "uml"))
- goto decline;
-
- if (uid != 0) {
- if (STRNEQ (conn->uri->path, "/session"))
- goto decline;
- } else { /* root */
- if (STRNEQ (conn->uri->path, "/system") &&
- STRNEQ (conn->uri->path, "/session"))
- goto decline;
+ conn->uri = xmlParseURI(uid == 0 ?
+ "uml:///system" :
+ "uml:///session");
+ if (!conn->uri) {
+ virReportOOMError(conn);
+ return VIR_DRV_OPEN_ERROR;
}
} else {
- conn->uri = xmlParseURI(uid ? "uml:///session" : "uml:///system");
- if (!conn->uri) {
- virReportOOMError(conn);
+ if (conn->uri->scheme == NULL ||
+ STRNEQ (conn->uri->scheme, "uml"))
+ return VIR_DRV_OPEN_DECLINED;
+
+ /* Allow remote driver to deal with URIs with hostname server */
+ if (conn->uri->server != NULL)
+ return VIR_DRV_OPEN_DECLINED;
+
+
+ /* Check path and tell them correct path if they made a mistake */
+ if (uid == 0) {
+ if (STRNEQ (conn->uri->path, "/system") &&
+ STRNEQ (conn->uri->path, "/session")) {
+ umlReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
+ _("unexpected UML URI path '%s', try uml:///system"),
+ conn->uri->path);
+ return VIR_DRV_OPEN_ERROR;
+ }
+ } else {
+ if (STRNEQ (conn->uri->path, "/session")) {
+ umlReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
+ _("unexpected UML URI path '%s', try uml:///session"),
+ conn->uri->path);
+ return VIR_DRV_OPEN_ERROR;
+ }
+ }
+
+ /* URI was good, but driver isn't active */
+ if (uml_driver == NULL) {
+ umlReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR, "%s",
+ _("uml state driver is not active"));
return VIR_DRV_OPEN_ERROR;
}
}
@@ -942,9 +963,6 @@ static virDrvOpenStatus umlOpen(virConne
conn->privateData = uml_driver;
return VIR_DRV_OPEN_SUCCESS;
-
- decline:
- return VIR_DRV_OPEN_DECLINED;
}
static int umlClose(virConnectPtr conn) {
diff -r 3c35f3b77286 src/virterror.c
--- a/src/virterror.c Wed Jun 03 15:37:52 2009 +0100
+++ b/src/virterror.c Wed Jun 03 17:31:17 2009 +0100
@@ -737,9 +737,9 @@ virErrorMsg(virErrorNumber error, const
break;
case VIR_ERR_NO_CONNECT:
if (info == NULL)
- errmsg = _("could not connect to hypervisor");
+ errmsg = _("no hypervisor driver available");
else
- errmsg = _("could not connect to %s");
+ errmsg = _("no hypervisor driver available for %s");
break;
case VIR_ERR_INVALID_CONN:
if (info == NULL)
diff -r 3c35f3b77286 src/xen_unified.c
--- a/src/xen_unified.c Wed Jun 03 15:37:52 2009 +0100
+++ b/src/xen_unified.c Wed Jun 03 17:31:17 2009 +0100
@@ -241,25 +241,46 @@ xenUnifiedOpen (virConnectPtr conn, virC
virReportOOMError (NULL);
return VIR_DRV_OPEN_ERROR;
}
+ } 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, "/")) {
+ xenUnifiedError(NULL, VIR_ERR_INTERNAL_ERROR,
+ _("unexpected Xen URI path '%s', try xen:///"),
+ conn->uri->path);
+ return VIR_DRV_OPEN_ERROR;
+ }
+
+ /* 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] != '/') {
+ xenUnifiedError(NULL, VIR_ERR_INTERNAL_ERROR,
+ _("unexpected Xen URI path '%s', try ///var/lib/xen/xend-socket"),
+ NULLSTR(conn->uri->path));
+ return VIR_DRV_OPEN_ERROR;
+ }
+ }
}
- /* Refuse any scheme which isn't "xen://" or "http://". */
- if (conn->uri->scheme &&
- STRCASENEQ(conn->uri->scheme, "xen") &&
- STRCASENEQ(conn->uri->scheme, "http"))
- return VIR_DRV_OPEN_DECLINED;
-
- /* xmlParseURI will parse a naked string like "foo" as a URI with
- * a NULL scheme. That's not useful for us because we want to only
- * allow full pathnames (eg. ///var/lib/xen/xend-socket). Decline
- * anything else.
- */
- if (!conn->uri->scheme && (!conn->uri->path || conn->uri->path[0] != '/'))
- return VIR_DRV_OPEN_DECLINED;
-
- /* Refuse any xen:// URI with a server specified - allow remote to do it */
- if (conn->uri->scheme && STRCASEEQ(conn->uri->scheme, "xen") && conn->uri->server)
- return VIR_DRV_OPEN_DECLINED;
+ /* We now know the URI is definitely for this driver, so beyond
+ * here, don't return DECLINED, always use ERROR */
/* Allocate per-connection private data. */
if (VIR_ALLOC(priv) < 0) {
diff -r 3c35f3b77286 src/xend_internal.c
--- a/src/xend_internal.c Wed Jun 03 15:37:52 2009 +0100
+++ b/src/xend_internal.c Wed Jun 03 17:31:17 2009 +0100
@@ -2927,10 +2927,13 @@ xenDaemonOpen(virConnectPtr conn,
xend_detect_config_version(conn) == -1)
goto failed;
} else if (STRCASEEQ (conn->uri->scheme, "http")) {
- if (virAsprintf(&port, "%d", conn->uri->port) == -1)
+ if (conn->uri->port &&
+ virAsprintf(&port, "%d", conn->uri->port) == -1)
goto failed;
- if (xenDaemonOpen_tcp(conn, conn->uri->server, port) < 0 ||
+ if (xenDaemonOpen_tcp(conn,
+ conn->uri->server ? conn->uri->server : "localhost",
+ port ? port : "8000") < 0 ||
xend_detect_config_version(conn) == -1)
goto failed;
} else {
--
|: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
15 years, 5 months
[libvirt] Latest kvm packages for CentOS 5.3
by Federico Simoncelli
Hi all,
I've been working quite extensively with kvm on CentOS 5.3 lately.
If you are interested in the latest rpm of kvm-kmod-2.6.30-rc8,
qemu-kvm-0.10.5 and libvirt-0.6.4 you can temporary find them here:
http://update.nethesis.it/kvm/
I've had no problem so far using these packages.
Feedback is welcome.
--
Federico.
15 years, 5 months
[libvirt] [PATCH 0/1] Add support for disk serial number in node device code
by David Allan
This small patch extends the information for storage devices to include their serial number. This information is useful in figuring out which devices are actually multiple paths to the same backend device, as well as identifying devices uniquely across nodes. This code will be used by the multipath support that I'm working on, but since it's capable of standing alone, and might be useful for other reasons, I'm submitting it separately.
Dave
15 years, 5 months
[libvirt] [PATCH 1/3] Re-factor qemu version parsing
by Mark McLoughlin
This patch is purely re-factoring without any functional changes
to make way for the next patch.
The main thing achieved by the refactoring is that we now have
easier access to the parenthesised string that KVM folks seem
to delight in changing.
Signed-off-by: Mark McLoughlin <markmc(a)redhat.com>
---
src/qemu_conf.c | 92 +++++++++++++++++++++++++++++++++++++++++++------------
1 files changed, 72 insertions(+), 20 deletions(-)
diff --git a/src/qemu_conf.c b/src/qemu_conf.c
index 2c1eefc..f6a8390 100644
--- a/src/qemu_conf.c
+++ b/src/qemu_conf.c
@@ -412,6 +412,73 @@ virCapsPtr qemudCapsInit(void) {
return NULL;
}
+/* We parse the output of 'qemu -help' to get the QEMU
+ * version number. The first bit is easy, just parse
+ * 'QEMU PC emulator version x.y.z'.
+ *
+ * With qemu-kvm, however, that is followed by a kvm-XX
+ * string in parenthesis.
+ */
+#define QEMU_VERSION_STR "QEMU PC emulator version "
+#define KVM_VER_PREFIX " (kvm-"
+
+static int qemudParseVersionStr(const char *str,
+ unsigned int *version,
+ unsigned int *kvm_version)
+{
+ unsigned major, minor, micro;
+ const char *p = str;
+
+ *version = *kvm_version = 0;
+
+ if (!STRPREFIX(p, QEMU_VERSION_STR))
+ goto fail;
+
+ p += strlen(QEMU_VERSION_STR);
+
+ major = virParseNumber(&p);
+ if (major == -1 || *p != '.')
+ goto fail;
+
+ ++p;
+
+ minor = virParseNumber(&p);
+ if (major == -1 || *p != '.')
+ goto fail;
+
+ ++p;
+
+ micro = virParseNumber(&p);
+ if (major == -1)
+ goto fail;
+
+ if (STRPREFIX(p, KVM_VER_PREFIX)) {
+ int ret;
+
+ p += strlen(KVM_VER_PREFIX);
+
+ ret = virParseNumber(&p);
+ if (ret == -1)
+ goto fail;
+
+ *kvm_version = ret;
+ }
+
+ *version = (major * 1000 * 1000) + (minor * 1000) + micro;
+
+ qemudDebug("Version %d.%d.%d - cooked version: %d",
+ major, minor, micro, *version);
+ if (*kvm_version)
+ qemudDebug("KVM version %d detected", *kvm_version);
+
+ return 0;
+
+fail:
+ qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
+ _("cannot parse QEMU version number in '%s'"),
+ str);
+ return -1;
+}
int qemudExtractVersionInfo(const char *qemu,
unsigned int *retversion,
@@ -421,7 +488,6 @@ int qemudExtractVersionInfo(const char *qemu,
pid_t child;
int newstdout = -1;
int ret = -1, status;
- unsigned int major, minor, micro;
unsigned int version, kvm_version;
unsigned int flags = 0;
@@ -443,22 +509,11 @@ int qemudExtractVersionInfo(const char *qemu,
goto cleanup2;
}
- if (sscanf(help, "QEMU PC emulator version %u.%u.%u (kvm-%u)",
- &major, &minor, µ, &kvm_version) != 4)
- kvm_version = 0;
+ char *eol = strchr(help, '\n');
+ if (eol) *eol = '\0';
- if (!kvm_version &&
- sscanf(help, "QEMU PC emulator version %u.%u.%u",
- &major, &minor, µ) != 3) {
- char *eol = strchr(help, '\n');
- if (eol) *eol = '\0';
- qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
- _("cannot parse QEMU version number in '%s'"),
- help);
+ if (qemudParseVersionStr(help, &version, &kvm_version) == -1)
goto cleanup2;
- }
-
- version = (major * 1000 * 1000) + (minor * 1000) + micro;
if (strstr(help, "-no-kqemu"))
flags |= QEMUD_CMD_FLAG_KQEMU;
@@ -512,10 +567,7 @@ int qemudExtractVersionInfo(const char *qemu,
ret = 0;
- qemudDebug("Version %d %d %d Cooked version: %d, with flags ? %d",
- major, minor, micro, version, flags);
- if (kvm_version)
- qemudDebug("KVM version %d detected", kvm_version);
+ qemudDebug("QEMU supported cmdline flags = %d", flags);
cleanup2:
VIR_FREE(help);
--
1.6.0.6
15 years, 5 months
[libvirt][qemu] Ho to get a 'boot=on' parameter to appear on kvm command line
by Anton Protopopov
Hi, all.
Can someone tell me how to get boot=on parameter to appear on my kvm
cmdline?
I define domain with the following xml
<domain type="kvm">
<name>kvm-1</name>
<memory>524288</memory>
<vcpu>1</vcpu>
<os>
<type arch="x86_64" machine="pc">hvm</type>
<boot dev="hd"/>
</os>
<devices>
<emulator>/usr/bin/kvm</emulator>
<graphics type="vnc" port="-1"/>
<disk device="disk" type="file">
<source file="test.img"/>
<target dev="sda"/>
</disk>
<interface type="bridge">
<source bridge="breth0"/>
</interface>
</devices>
</domain>
and get
/usr/bin/kvm -S -M pc -m 512 -smp 1 -name kvm-1 -uuid
b462e575-4044-146c-193a-9a70523b4258 -monitor pty -no-acpi -boot c -drive
file=test.img,if=scsi,index=0 -net nic,macaddr=52:54:00:09:9b:19,vlan=0 -net
tap,fd=15,vlan=0 -serial none -parallel none -usb
But I want to get
-drive file=test.img,if=scsi,index=0,boot=on
instead.
15 years, 5 months
[libvirt] [PATCH] Support kvm-img or qemu-img dynamically
by Doug Goldstein
This patch adds a new function virFindFileInPath() and uses it to find
where a binary lives in the PATH environment variable. Using this, we
can dynamically find where utility functions exist (and if they even
exists). So such we remove the build-time check for qemu-img and make it
dynamic for kvm-img and qemu-img. Several distros uses kvm-img over
qemu-img when installing KVM. kvm-img also includes several patches
which Red Hat is trying to upstream with QEMU so this patch supports
those features which are commented out in libvirt when using kvm-img
Signed-off-by: Doug Goldstein <cardoe(a)gentoo.org>
---
configure.in | 15 ---------
src/libvirt_private.syms | 1 +
src/storage_backend_fs.c | 74 ++++++++++++++++++++++++++++++++-------------
src/util.c | 28 +++++++++++++++++
src/util.h | 2 +
5 files changed, 83 insertions(+), 37 deletions(-)
15 years, 5 months
[libvirt] PATCH: Fix typo in XML documentation regarding VNC password
by Garry Dolley
Excuse my previous post, I didn't know the website was in docs/ and
I could submit a real patch ;)
So here it is:
diff --git a/docs/formatdomain.html b/docs/formatdomain.html
index 27e42ac..817fd7e 100644
--- a/docs/formatdomain.html
+++ b/docs/formatdomain.html
@@ -746,7 +746,7 @@ qemu-kvm -net nic,model=? /dev/null
auto-allocated). The <code>autoport</code> attribute is the new
preferred syntax for indicating autoallocation of the TCP port to use.
The <code>listen</code> attribute is an IP address for the server to
- listen on. The <code>password</code> attribute provides a VNC password
+ listen on. The <code>passwd</code> attribute provides a VNC password
in clear text. The <code>keymap</code> attribute specifies the keymap
to use.</dd></dl>
<h4>
--
Garry Dolley
ARP Networks, Inc. | http://www.arpnetworks.com | (818) 206-0181
Data center, VPS, and IP Transit solutions
Member Los Angeles County REACT, Unit 336 | WQGK336
Blog http://scie.nti.st
15 years, 5 months
[libvirt] [PATCH] (not for inclusion) add virDomainRename API
by Doug Goldstein
The following patch stubs out virDomainRename() as an available API
function. I'm just making sure I'm doing this right. I know there were
some plans to include documentation about adding API to the website
but I don't see it. The included patch does not include my example
driver for qemu and test.
Just looking for a thumbs up/down whether I should continue or not and
whether I'm adding it right.
--
Doug Goldstein
15 years, 5 months
[libvirt] Remote Xen and libvirt >= 0.5.0 Issues
by Hany Fahim
Hi,
I'm currently running a few servers with CentOS 5.3 (i386) with the stock
Xen version:
# rpm -q kernel-xen xen libvirt
kernel-xen-2.6.18-92.1.22.el5
kernel-xen-2.6.18-128.1.6.el5
xen-3.0.3-80.el5_3.2
libvirt-0.6.3-1
libvirt was compiled from the src RPM from libvirt.org to run on i386
architecture without issue. I'm having a problem when trying to connect to
remote Xen installations using versions of libvirt starting from 0.5.0 and
above. When issuing virsh commands to query the local instance, it works
without issue, but any remote sources gives 'error: failed to connect to the
hypervisor'. Here's what LIBVIRT_DEBUG reveals:
# LIBVIRT_DEBUG=6 virsh -d 5 -c xen://node3/ list
command: "list "
13:53:17.132: debug : virInitialize:290 : register drivers
13:53:17.132: debug : virRegisterDriver:667 : registering Test as driver 0
13:53:17.132: debug : virRegisterNetworkDriver:567 : registering Test as
network driver 0
13:53:17.132: debug : virRegisterStorageDriver:598 : registering Test as
storage driver 0
13:53:17.132: debug : virRegisterDeviceMonitor:629 : registering Test as
device driver 0
13:53:17.132: debug : xenHypervisorInit:1922 : Using new hypervisor call:
30001
13:53:17.132: debug : xenHypervisorInit:1991 : Using hypervisor call v2, sys
ver3 dom ver5
13:53:17.132: debug : virRegisterDriver:667 : registering Xen as driver 1
13:53:17.132: debug : virRegisterDriver:667 : registering OPENVZ as driver 2
13:53:17.133: debug : vboxRegister:68 : VBoxCGlueInit failed: 0.0.0,
errorval=-1
13:53:17.133: debug : virRegisterDriver:667 : registering VBOX as driver 3
13:53:17.133: debug : virRegisterDriver:667 : registering remote as driver 4
13:53:17.133: debug : virRegisterNetworkDriver:567 : registering remote as
network driver 1
13:53:17.133: debug : virRegisterStorageDriver:598 : registering remote as
storage driver 1
13:53:17.133: debug : virRegisterDeviceMonitor:629 : registering remote as
device driver 1
13:53:17.133: debug : virConnectOpenAuth:1100 : name=xen://node3/,
auth=0x67d0080, flags=0
13:53:17.133: debug : do_open:920 : name "xen://node3/" to URI components:
scheme xen
opaque (null)
authority (null)
server node3
user (null)
port 0
path /
13:53:17.133: debug : do_open:930 : trying driver 0 (Test) ...
13:53:17.133: debug : do_open:936 : driver 0 Test returned DECLINED
13:53:17.133: debug : do_open:930 : trying driver 1 (Xen) ...
13:53:17.133: debug : do_open:936 : driver 1 Xen returned DECLINED
13:53:17.133: debug : do_open:930 : trying driver 2 (OPENVZ) ...
13:53:17.133: debug : do_open:936 : driver 2 OPENVZ returned DECLINED
13:53:17.133: debug : do_open:930 : trying driver 3 (VBOX) ...
13:53:17.133: debug : do_open:936 : driver 3 VBOX returned DECLINED
13:53:17.133: debug : do_open:930 : trying driver 4 (remote) ...
13:53:17.133: debug : do_open:936 : driver 4 remote returned DECLINED
13:53:17.133: debug : virUnrefConnect:210 : unref connection 0x93275d0 1
13:53:17.134: debug : virReleaseConnect:171 : release connection 0x93275d0
error: failed to connect to the hypervisor
But when connecting to localhost, it works just fine:
# LIBVIRT_DEBUG=6 virsh -d 5 -c xen:/// list
command: "list "
13:53:23.558: debug : virInitialize:290 : register drivers
13:53:23.558: debug : virRegisterDriver:667 : registering Test as driver 0
13:53:23.558: debug : virRegisterNetworkDriver:567 : registering Test as
network driver 0
13:53:23.558: debug : virRegisterStorageDriver:598 : registering Test as
storage driver 0
13:53:23.558: debug : virRegisterDeviceMonitor:629 : registering Test as
device driver 0
13:53:23.559: debug : xenHypervisorInit:1922 : Using new hypervisor call:
30001
13:53:23.559: debug : xenHypervisorInit:1991 : Using hypervisor call v2, sys
ver3 dom ver5
13:53:23.559: debug : virRegisterDriver:667 : registering Xen as driver 1
13:53:23.559: debug : virRegisterDriver:667 : registering OPENVZ as driver 2
13:53:23.559: debug : vboxRegister:68 : VBoxCGlueInit failed: 0.0.0,
errorval=-1
13:53:23.559: debug : virRegisterDriver:667 : registering VBOX as driver 3
13:53:23.559: debug : virRegisterDriver:667 : registering remote as driver 4
13:53:23.559: debug : virRegisterNetworkDriver:567 : registering remote as
network driver 1
13:53:23.560: debug : virRegisterStorageDriver:598 : registering remote as
storage driver 1
13:53:23.560: debug : virRegisterDeviceMonitor:629 : registering remote as
device driver 1
13:53:23.560: debug : virConnectOpenAuth:1100 : name=xen:///,
auth=0x67d0080, flags=0
13:53:23.560: debug : do_open:920 : name "xen:///" to URI components:
scheme xen
opaque (null)
authority (null)
server (null)
user (null)
port 0
path /
13:53:23.560: debug : do_open:930 : trying driver 0 (Test) ...
13:53:23.560: debug : do_open:936 : driver 0 Test returned DECLINED
13:53:23.560: debug : do_open:930 : trying driver 1 (Xen) ...
13:53:23.560: debug : xenUnifiedOpen:295 : Trying hypervisor sub-driver
13:53:23.560: debug : xenUnifiedOpen:298 : Activated hypervisor sub-driver
13:53:23.560: debug : xenUnifiedOpen:306 : Trying XenD sub-driver
13:53:23.563: debug : xenUnifiedOpen:309 : Activated XenD sub-driver
13:53:23.563: debug : xenUnifiedOpen:315 : Trying XM sub-driver
13:53:23.563: debug : xenUnifiedOpen:318 : Activated XM sub-driver
13:53:23.563: debug : xenUnifiedOpen:322 : Trying XS sub-driver
13:53:23.564: debug : xenStoreOpen:346 : Failed to add event handle,
disabling events
13:53:23.564: debug : xenUnifiedOpen:325 : Activated XS sub-driver
13:53:23.570: debug : xenUnifiedOpen:361 : Trying Xen inotify sub-driver
13:53:23.571: debug : xenInotifyOpen:439 : Adding a watch on /etc/xen
13:53:23.571: debug : xenInotifyOpen:451 : Building initial config cache
13:53:23.571: debug : xenXMConfigCacheAddFile:387 : Adding file
/etc/xen/centos
13:53:23.571: debug : xenXMConfigCacheAddFile:436 : Failed to read
/etc/xen/centos
13:53:23.571: debug : xenXMConfigCacheAddFile:387 : Adding file
/etc/xen/test3
13:53:23.571: debug : xenXMConfigCacheAddFile:465 : Added config test3
/etc/xen/test3
13:53:23.571: debug : xenXMConfigCacheAddFile:387 : Adding file
/etc/xen/hany
13:53:23.571: debug : xenXMConfigCacheAddFile:465 : Added config hany
/etc/xen/hany
13:53:23.572: debug : xenXMConfigCacheAddFile:387 : Adding file
/etc/xen/hany2
13:53:23.572: debug : xenXMConfigCacheAddFile:465 : Added config hany4
/etc/xen/hany2
13:53:23.572: debug : xenInotifyOpen:458 : Registering with event loop
13:53:23.572: debug : xenInotifyOpen:462 : Failed to add inotify handle,
disabling events
13:53:23.572: debug : virConnectRef:1165 : conn=0x996b5c8 refs=3
13:53:23.572: debug : xenUnifiedOpen:364 : Activated Xen inotify sub-driver
13:53:23.572: debug : do_open:936 : driver 1 Xen returned SUCCESS
13:53:23.572: debug : do_open:956 : network driver 0 Test returned DECLINED
13:53:23.572: debug : doRemoteOpen:511 : proceeding with name = xen:///
13:53:23.572: debug : call:6543 : Doing call 66 (nil)
13:53:23.573: debug : call:6613 : We have the buck 66 0xb736c008 0xb736c008
13:53:23.573: debug : processCallRecvLen:6201 : Got length, now need 36
total (32 more)
13:53:23.573: debug : processCalls:6469 : Giving up the buck 66 0xb736c008
(nil)
13:53:23.573: debug : call:6644 : All done with our call 66 (nil) 0xb736c008
13:53:23.573: debug : call:6543 : Doing call 1 (nil)
13:53:23.573: debug : call:6613 : We have the buck 1 0x997f3b0 0x997f3b0
13:53:23.584: debug : processCallRecvLen:6201 : Got length, now need 28
total (24 more)
13:53:23.585: debug : processCalls:6469 : Giving up the buck 1 0x997f3b0
(nil)
13:53:23.585: debug : call:6644 : All done with our call 1 (nil) 0x997f3b0
13:53:23.585: debug : doRemoteOpen:822 : Adding Handler for remote events
13:53:23.585: debug : doRemoteOpen:829 : virEventAddHandle failed: No
addHandleImpl defined. continuing without events.
13:53:23.585: debug : do_open:956 : network driver 1 remote returned SUCCESS
13:53:23.585: debug : do_open:978 : storage driver 0 Test returned DECLINED
13:53:23.585: debug : do_open:978 : storage driver 1 remote returned SUCCESS
13:53:23.585: debug : do_open:999 : node driver 0 Test returned DECLINED
13:53:23.585: debug : do_open:999 : node driver 1 remote returned SUCCESS
13:53:23.585: debug : virConnectNumOfDomains:1440 : conn=0x996b5c8
13:53:23.585: debug : virConnectListDomains:1401 : conn=0x996b5c8,
ids=0x997a6d0, maxids=1
Id Name State
----------------------------------
13:53:23.586: debug : virDomainLookupByID:1576 : conn=0x996b5c8, id=0
13:53:23.586: debug : virGetDomain:271 : New hash entry 0x997b300
13:53:23.586: debug : virDomainGetInfo:2569 : domain=0x997b300,
info=0xbfc34c64
13:53:23.586: debug : virDomainGetName:2268 : domain=0x997b300
13:53:23.586: debug : virDomainGetID:2361 : domain=0x997b300
0 Domain-0 running
13:53:23.586: debug : virDomainFree:1806 : domain=0x997b300
13:53:23.586: debug : virUnrefDomain:345 : unref domain 0x997b300 Domain-0 1
13:53:23.586: debug : virReleaseDomain:303 : release domain 0x997b300
Domain-0
13:53:23.587: debug : virReleaseDomain:315 : unref connection 0x996b5c8 5
13:53:23.587: debug : virConnectClose:1118 : conn=0x996b5c8
13:53:23.587: debug : call:6543 : Doing call 2 (nil)
13:53:23.587: debug : call:6613 : We have the buck 2 0x997f3b0 0x997f3b0
13:53:23.588: debug : processCallRecvLen:6201 : Got length, now need 28
total (24 more)
13:53:23.588: debug : processCalls:6469 : Giving up the buck 2 0x997f3b0
(nil)
13:53:23.588: debug : call:6644 : All done with our call 2 (nil) 0x997f3b0
13:53:23.588: debug : virUnrefConnect:210 : unref connection 0x996b5c8 4
13:53:23.588: debug : virUnrefConnect:210 : unref connection 0x996b5c8 3
13:53:23.589: debug : virUnrefConnect:210 : unref connection 0x996b5c8 2
13:53:23.589: debug : virUnrefConnect:210 : unref connection 0x996b5c8 1
13:53:23.589: debug : virReleaseConnect:171 : release connection 0x996b5c8
Anybody else run into this? Any help would be greatly appreciated.
Thanks,
Hany
15 years, 5 months