When connecting to a local libvirt you can let it automatically probe
the hypervisor URI if you don't know it ahead of time. This doesn't
work with remote URIs because you need to have something to put in
the URI scheme before the hostname
qemu+ssh://somehost/system
xen+tcp://somehost/system
This is then translated into the URI
qemu:///system
xen:///
It occurred to me that we can trivially enable probing with all existing
libvirtd daemon releases, simply by fixing the client side. All we need
todo is invent a new generic URI scheme, and convert that to empty string
This patch adds a 'remote' URI scheme, usable like this
remote+ssh://somehost/
remote+tcp://somehost/
remote://somehost/
remote+tls://somehost/
remote+ext://somehost/
In all these styles, the URI passed to the remote daemon is "", causing
it to probe.
As a demonstration, here's an example using virsh and two hosts I have,
one running Xen, the other QEMU
See it automatically choosing QEMU....
$ virsh --connect remote+ssh://root@lettuce/ version
Compiled against library: libvir 0.5.0
Using library: libvir 0.5.0
Running hypervisor: QEMU 0.9.1
And choosing Xen....
$ virsh --connect remote+ssh://root@pumpkin/ version
Compiled against library: libvir 0.5.0
Using library: libvir 0.5.0
Running hypervisor: Xen 3.1.0
This finally makes the Avahi broadcasts useful - they only include
info on the hostname + data transport (SSH, TCP, TLS), not the HV
type. So letting us use auto-probing remotely is the missing link.
NB. we've got a small problem with the virGetVersion() API - it does not
take a connection URI - just a hypervisor type. It then directly checks
the statically declared 'version' field in the virDriverPtr struct.
This no longer works now that some drivers are linked directly into the
libvirt daemon.
I'm thinking that perhaps we can just change the virGetVersion() apis
so that instead of looking in virDriverPtr struct, we just include the
version numbers directly in virGetVersion as a static const lookup
table. Meanwhile, this patch also includes a change to virsh to stop
it calling virGetVersion(), though this hunk instead intended to apply
to CVS.
Daniel
Index: remote_internal.c
===================================================================
RCS file: /data/cvs/libvirt/src/remote_internal.c,v
retrieving revision 1.108
diff -u -p -r1.108 remote_internal.c
--- remote_internal.c 21 Nov 2008 12:31:04 -0000 1.108
+++ remote_internal.c 26 Nov 2008 21:58:47 -0000
@@ -430,28 +430,40 @@ doRemoteOpen (virConnectPtr conn,
/* Construct the original name. */
if (!name) {
- xmlURI tmpuri = {
- .scheme = conn->uri->scheme,
+ if (STREQ(conn->uri->scheme, "remote") ||
+ STRPREFIX(conn->uri->scheme, "remote+")) {
+ /* Allow remote serve to probe */
+ name = strdup("");
+ } else {
+ xmlURI tmpuri = {
+ .scheme = conn->uri->scheme,
#ifdef HAVE_XMLURI_QUERY_RAW
- .query_raw = qparam_get_query (vars),
+ .query_raw = qparam_get_query (vars),
#else
- .query = qparam_get_query (vars),
+ .query = qparam_get_query (vars),
#endif
- .path = conn->uri->path,
- .fragment = conn->uri->fragment,
- };
-
- /* Evil, blank out transport scheme temporarily */
- if (transport_str) {
- assert (transport_str[-1] == '+');
- transport_str[-1] = '\0';
- }
+ .path = conn->uri->path,
+ .fragment = conn->uri->fragment,
+ };
+
+ /* Evil, blank out transport scheme temporarily */
+ if (transport_str) {
+ assert (transport_str[-1] == '+');
+ transport_str[-1] = '\0';
+ }
+
+ name = (char *) xmlSaveUri (&tmpuri);
- name = (char *) xmlSaveUri (&tmpuri);
+#ifdef HAVE_XMLURI_QUERY_RAW
+ VIR_FREE(tmpuri.query_raw);
+#else
+ VIR_FREE(tmpuri.query);
+#endif
- /* Restore transport scheme */
- if (transport_str)
- transport_str[-1] = '+';
+ /* Restore transport scheme */
+ if (transport_str)
+ transport_str[-1] = '+';
+ }
}
free_qparam_set (vars);
Index: virsh.c
===================================================================
RCS file: /data/cvs/libvirt/src/virsh.c,v
retrieving revision 1.175
diff -u -p -r1.175 virsh.c
--- virsh.c 24 Nov 2008 07:13:30 -0000 1.175
+++ virsh.c 26 Nov 2008 21:58:51 -0000
@@ -4357,7 +4357,6 @@ cmdVersion(vshControl *ctl, const vshCmd
const char *hvType;
unsigned long libVersion;
unsigned long includeVersion;
- unsigned long apiVersion;
int ret;
unsigned int major;
unsigned int minor;
@@ -4380,7 +4379,8 @@ cmdVersion(vshControl *ctl, const vshCmd
vshPrint(ctl, _("Compiled against library: libvir %d.%d.%d\n"),
major, minor, rel);
- ret = virGetVersion(&libVersion, hvType, &apiVersion);
+
+ ret = virGetVersion(&libVersion, NULL, NULL);
if (ret < 0) {
vshError(ctl, FALSE, "%s", _("failed to get the library
version"));
return FALSE;
@@ -4392,13 +4392,6 @@ cmdVersion(vshControl *ctl, const vshCmd
vshPrint(ctl, _("Using library: libvir %d.%d.%d\n"),
major, minor, rel);
- major = apiVersion / 1000000;
- apiVersion %= 1000000;
- minor = apiVersion / 1000;
- rel = apiVersion % 1000;
- vshPrint(ctl, _("Using API: %s %d.%d.%d\n"), hvType,
- major, minor, rel);
-
ret = virConnectGetVersion(ctl->conn, &hvVersion);
if (ret < 0) {
vshError(ctl, FALSE, "%s", _("failed to get the hypervisor
version"));
--
|: 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 :|