From: Daniel P. Berrange Date: Fri, 28 Nov 2008 12:03:20 +0000 (+0000) Subject: Allow remote://hostname/ style URIs for automatic driver probe. Fix virGetVersion... X-Git-Tag: LIBVIRT_0_5_1~16 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d88d459d7b6100f0967e1504ba9b326648b6ea4a;p=thirdparty%2Flibvirt.git Allow remote://hostname/ style URIs for automatic driver probe. Fix virGetVersion impl --- diff --git a/ChangeLog b/ChangeLog index 2cf7e04e3c..879209d409 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +Fri Nov 28 11:58:40 GMT 2008 Daniel P. Berrange + + Allow generic remote://hostname/ URI for automatic probe + of hypervisor driver. + * docs/uri.html, docs/uri.html.in: Document remote://hostname/ style + URI syntax + * src/driver.h: Remove version field + * src/libvirt.c: Directly impl virGetVersion() instead of calling out + to individual drivers + * src/lxc_driver.c, src/openvz_driver.c, src/qemu_driver.c, + src/remote_internal.h, src/test.c, src/uml_driver.c, + src/xen_unified.c, src/xen_unified.h: Remove version from + driver tables. + * src/remote_internal.c: Allow 'remote' as a URI scheme for + automatically probing on remote server + Fri Nov 28 11:21:40 GMT 2008 Daniel P. Berrange Fix XM driver disk parsing with no source CDROMs diff --git a/docs/uri.html b/docs/uri.html index 0765a47d20..8979a1335f 100644 --- a/docs/uri.html +++ b/docs/uri.html @@ -221,13 +221,21 @@ here.

Remote URIs are formed by taking ordinary local URIs and adding a -hostname and/or transport name. For example: +hostname and/or transport name. As a special case, using a URI +scheme of 'remote', will tell the remote libvirtd server to probe +for the optimal hypervisor driver. This is equivalent to passing +a NULL URI for a local connection. For example:

Local URI Remote URI Meaning
xen:/// xen://oirase/ Connect to the Xen hypervisor running on host oirase + using TLS.
+ NULL + + remote://oirase/ + Connect to the "default" hypervisor running on host oirase using TLS.
xen:/// diff --git a/docs/uri.html.in b/docs/uri.html.in index a357ee29ba..0540dab3dd 100644 --- a/docs/uri.html.in +++ b/docs/uri.html.in @@ -124,7 +124,10 @@ here.

Remote URIs are formed by taking ordinary local URIs and adding a -hostname and/or transport name. For example: +hostname and/or transport name. As a special case, using a URI +scheme of 'remote', will tell the remote libvirtd server to probe +for the optimal hypervisor driver. This is equivalent to passing +a NULL URI for a local connection. For example:

@@ -140,6 +143,16 @@ hostname and/or transport name. For example: xen://oirase/ + + + + + diff --git a/src/driver.h b/src/driver.h index 5fd3843f05..8c394e2628 100644 --- a/src/driver.h +++ b/src/driver.h @@ -328,7 +328,6 @@ typedef virDomainPtr struct _virDriver { int no; /* the number virDrvNo */ const char * name; /* the name of the driver */ - unsigned long ver; /* the version of the backend */ virDrvOpen open; virDrvClose close; virDrvDrvSupportsFeature supports_feature; diff --git a/src/libvirt.c b/src/libvirt.c index 926c4a55c3..a279024eb7 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -734,7 +734,6 @@ int virGetVersion(unsigned long *libVer, const char *type, unsigned long *typeVer) { - int i; DEBUG("libVir=%p, type=%s, typeVer=%p", libVer, type, typeVer); if (!initialized) @@ -748,15 +747,36 @@ virGetVersion(unsigned long *libVer, const char *type, if (typeVer != NULL) { if (type == NULL) type = "Xen"; - for (i = 0;i < virDriverTabCount;i++) { - if ((virDriverTab[i] != NULL) && - (STRCASEEQ(virDriverTab[i]->name, type))) { - *typeVer = virDriverTab[i]->ver; - break; - } - } - if (i >= virDriverTabCount) { - *typeVer = 0; + *typeVer = 0; +#if WITH_XEN + if (STRCASEEQ(type, "Xen")) + *typeVer = xenUnifiedVersion(); +#endif +#if WITH_TEST + if (STRCASEEQ(type, "Test")) + *typeVer = LIBVIR_VERSION_NUMBER; +#endif +#if WITH_QEMU + if (STRCASEEQ(type, "QEMU")) + *typeVer = LIBVIR_VERSION_NUMBER; +#endif +#if WITH_LXC + if (STRCASEEQ(type, "LXC")) + *typeVer = LIBVIR_VERSION_NUMBER; +#endif +#if WITH_OPENVZ + if (STRCASEEQ(type, "OpenVZ")) + *typeVer = LIBVIR_VERSION_NUMBER; +#endif +#if WITH_UML + if (STRCASEEQ(type, "UML")) + *typeVer = LIBVIR_VERSION_NUMBER; +#endif +#if WITH_REMOTE + if (STRCASEEQ(type, "Remote")) + *typeVer = remoteVersion(); +#endif + if (*typeVer == 0) { virLibConnError(NULL, VIR_ERR_NO_SUPPORT, type); return (-1); } diff --git a/src/lxc_driver.c b/src/lxc_driver.c index cebc2ca2fe..3ec1cb4dad 100644 --- a/src/lxc_driver.c +++ b/src/lxc_driver.c @@ -1232,7 +1232,6 @@ static int lxcGetSchedulerParameters(virDomainPtr _domain, static virDriver lxcDriver = { VIR_DRV_LXC, /* the number virDrvNo */ "LXC", /* the name of the driver */ - LIBVIR_VERSION_NUMBER, /* the version of the backend */ lxcOpen, /* open */ lxcClose, /* close */ NULL, /* supports_feature */ diff --git a/src/openvz_driver.c b/src/openvz_driver.c index 83cf19ab7b..087ef47545 100644 --- a/src/openvz_driver.c +++ b/src/openvz_driver.c @@ -1087,7 +1087,6 @@ static int openvzNumDefinedDomains(virConnectPtr conn) { static virDriver openvzDriver = { VIR_DRV_OPENVZ, "OPENVZ", - LIBVIR_VERSION_NUMBER, openvzOpen, /* open */ openvzClose, /* close */ NULL, /* supports_feature */ diff --git a/src/qemu_driver.c b/src/qemu_driver.c index 90c6b194be..efe780c3b9 100644 --- a/src/qemu_driver.c +++ b/src/qemu_driver.c @@ -3725,7 +3725,6 @@ qemudDomainMigrateFinish2 (virConnectPtr dconn, static virDriver qemuDriver = { VIR_DRV_QEMU, "QEMU", - LIBVIR_VERSION_NUMBER, qemudOpen, /* open */ qemudClose, /* close */ qemudSupportsFeature, /* supports_feature */ diff --git a/src/remote_internal.c b/src/remote_internal.c index 3fdbc8bbb5..7bf8766a86 100644 --- a/src/remote_internal.c +++ b/src/remote_internal.c @@ -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); - /* Restore transport scheme */ - if (transport_str) - transport_str[-1] = '+'; +#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] = '+'; + } } free_qparam_set (vars); @@ -1330,7 +1342,7 @@ remoteType (virConnectPtr conn) } static int -remoteVersion (virConnectPtr conn, unsigned long *hvVer) +remoteGetVersion (virConnectPtr conn, unsigned long *hvVer) { remote_get_version_ret ret; GET_PRIVATE (conn, -1); @@ -5300,15 +5312,19 @@ make_nonnull_storage_vol (remote_nonnull_storage_vol *vol_dst, virStorageVolPtr /*----------------------------------------------------------------------*/ +unsigned long remoteVersion(void) +{ + return REMOTE_PROTOCOL_VERSION; +} + static virDriver driver = { .no = VIR_DRV_REMOTE, .name = "remote", - .ver = REMOTE_PROTOCOL_VERSION, .open = remoteOpen, .close = remoteClose, .supports_feature = remoteSupportsFeature, .type = remoteType, - .version = remoteVersion, + .version = remoteGetVersion, .getHostname = remoteGetHostname, .getMaxVcpus = remoteGetMaxVcpus, .nodeGetInfo = remoteNodeGetInfo, diff --git a/src/remote_internal.h b/src/remote_internal.h index 2abee77030..4d62e15e83 100644 --- a/src/remote_internal.h +++ b/src/remote_internal.h @@ -28,6 +28,8 @@ int remoteRegister (void); +unsigned long remoteVersion(void); + #define LIBVIRTD_LISTEN_ADDR NULL #define LIBVIRTD_TLS_PORT "16514" #define LIBVIRTD_TCP_PORT "16509" diff --git a/src/test.c b/src/test.c index 3648c05788..7998886c57 100644 --- a/src/test.c +++ b/src/test.c @@ -2194,7 +2194,6 @@ testStorageVolumeGetPath(virStorageVolPtr obj) { static virDriver testDriver = { VIR_DRV_TEST, "Test", - LIBVIR_VERSION_NUMBER, testOpen, /* open */ testClose, /* close */ NULL, /* supports_feature */ diff --git a/src/uml_driver.c b/src/uml_driver.c index 337a8ea5bf..1ce1d781a1 100644 --- a/src/uml_driver.c +++ b/src/uml_driver.c @@ -1593,7 +1593,6 @@ found: static virDriver umlDriver = { VIR_DRV_UML, "UML", - LIBVIR_VERSION_NUMBER, umlOpen, /* open */ umlClose, /* close */ NULL, /* supports_feature */ diff --git a/src/xen_unified.c b/src/xen_unified.c index ef3784780d..4229f0ef1e 100644 --- a/src/xen_unified.c +++ b/src/xen_unified.c @@ -392,6 +392,17 @@ xenUnifiedClose (virConnectPtr conn) return 0; } + +#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; +} + + static const char * xenUnifiedType (virConnectPtr conn) { @@ -416,7 +427,7 @@ xenUnifiedSupportsFeature (virConnectPtr conn ATTRIBUTE_UNUSED, int feature) } static int -xenUnifiedVersion (virConnectPtr conn, unsigned long *hvVer) +xenUnifiedGetVersion (virConnectPtr conn, unsigned long *hvVer) { GET_PRIVATE(conn); int i; @@ -1366,20 +1377,15 @@ xenUnifiedDomainEventDeregister (virConnectPtr conn, /*----- Register with libvirt.c, and initialise Xen drivers. -----*/ -#define HV_VERSION ((DOM0_INTERFACE_VERSION >> 24) * 1000000 + \ - ((DOM0_INTERFACE_VERSION >> 16) & 0xFF) * 1000 + \ - (DOM0_INTERFACE_VERSION & 0xFFFF)) - /* The interface which we export upwards to libvirt.c. */ static virDriver xenUnifiedDriver = { .no = VIR_DRV_XEN_UNIFIED, .name = "Xen", - .ver = HV_VERSION, .open = xenUnifiedOpen, .close = xenUnifiedClose, .supports_feature = xenUnifiedSupportsFeature, .type = xenUnifiedType, - .version = xenUnifiedVersion, + .version = xenUnifiedGetVersion, .getHostname = xenUnifiedGetHostname, .getMaxVcpus = xenUnifiedGetMaxVcpus, .nodeGetInfo = xenUnifiedNodeGetInfo, diff --git a/src/xen_unified.h b/src/xen_unified.h index 2f9346f626..831cefc3c4 100644 --- a/src/xen_unified.h +++ b/src/xen_unified.h @@ -185,4 +185,6 @@ void xenUnifiedDomainEventDispatch (xenUnifiedPrivatePtr priv, virDomainPtr dom, int event, int detail); +unsigned long xenUnifiedVersion(void); + #endif /* __VIR_XEN_UNIFIED_H__ */
Connect to the Xen hypervisor running on host oirase + using TLS.
+ NULL + + remote://oirase/ + Connect to the "default" hypervisor running on host oirase using TLS.