]> xenbits.xensource.com Git - libvirt.git/commitdiff
Allow remote://hostname/ style URIs for automatic driver probe. Fix virGetVersion...
authorDaniel P. Berrange <berrange@redhat.com>
Fri, 28 Nov 2008 12:03:20 +0000 (12:03 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Fri, 28 Nov 2008 12:03:20 +0000 (12:03 +0000)
14 files changed:
ChangeLog
docs/uri.html
docs/uri.html.in
src/driver.h
src/libvirt.c
src/lxc_driver.c
src/openvz_driver.c
src/qemu_driver.c
src/remote_internal.c
src/remote_internal.h
src/test.c
src/uml_driver.c
src/xen_unified.c
src/xen_unified.h

index 2cf7e04e3ca85c0c3d7d6fb5ee5bbb1c394b3bdc..879209d40927b3bb50aaecc5f92786f778dd4023 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+Fri Nov 28 11:58:40 GMT 2008 Daniel P. Berrange <berrange@redhat.com>
+
+       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 <berrange@redhat.com>
 
        Fix XM driver disk parsing with no source CDROMs
index 0765a47d2043ca544330ca64a9032788a1c91e25..8979a1335f21c7ec522add55dcdbb67e2a7ad74c 100644 (file)
@@ -221,13 +221,21 @@ here</a>.
     </h3>
         <p>
 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:
 </p>
         <table class="top_table"><tr><th> Local URI </th><th> Remote URI </th><th> Meaning </th></tr><tr><td>
           <code>xen:///</code>
         </td><td>
           <code>xen://oirase/</code>
         </td><td> Connect to the Xen hypervisor running on host <code>oirase</code>
+  using TLS. </td></tr><tr><td>
+          <code>NULL</code>
+        </td><td>
+          <code>remote://oirase/</code>
+        </td><td> Connect to the "default" hypervisor running on host <code>oirase</code>
   using TLS. </td></tr><tr><td>
           <code>xen:///</code>
         </td><td>
index a357ee29bacf76160ab1b58d61685211daa10462..0540dab3dd75ac7c4486076e9e610a4d9eeb0f03 100644 (file)
@@ -124,7 +124,10 @@ here</a>.
     </h3>
     <p>
 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:
 </p>
     <table class="top_table">
       <tr>
@@ -140,6 +143,16 @@ hostname and/or transport name.  For example:
           <code>xen://oirase/</code>
         </td>
         <td> Connect to the Xen hypervisor running on host <code>oirase</code>
+  using TLS. </td>
+      </tr>
+      <tr>
+        <td>
+          <code>NULL</code>
+        </td>
+        <td>
+          <code>remote://oirase/</code>
+        </td>
+        <td> Connect to the "default" hypervisor running on host <code>oirase</code>
   using TLS. </td>
       </tr>
       <tr>
index 5fd3843f055fc96561950ec691cb39bef442617c..8c394e2628ec023b84c6d71b1f8517baf23b0b57 100644 (file)
@@ -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;
index 926c4a55c3f87dd66aeba426c373ce9a6d2a7003..a279024eb75f05fefca416382bead3b8673afd5b 100644 (file)
@@ -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);
         }
index cebc2ca2fe6ea68c0f8367dc2e95ca8cf28d9437..3ec1cb4dad3811b2500bb005f447444b83ae5172 100644 (file)
@@ -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 */
index 83cf19ab7bb65aa8e3f1b5d80a67bf9f2d515a6e..087ef475458254e0bdd7534a1c114d038d31875c 100644 (file)
@@ -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 */
index 90c6b194be93794ed4b0a5a4be8902ea848e53df..efe780c3b9f60f1265d4f27919382b8aec7369ae 100644 (file)
@@ -3725,7 +3725,6 @@ qemudDomainMigrateFinish2 (virConnectPtr dconn,
 static virDriver qemuDriver = {
     VIR_DRV_QEMU,
     "QEMU",
-    LIBVIR_VERSION_NUMBER,
     qemudOpen, /* open */
     qemudClose, /* close */
     qemudSupportsFeature, /* supports_feature */
index 3fdbc8bbb5e25c3c70a519554ec7c6de8b4754d5..7bf8766a86810f6c25f91ed36c08c014d1104d38 100644 (file)
@@ -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,
index 2abee770309c00aa85b10a988204bb47383a36ff..4d62e15e8363e8c88491fa9f9b74e5f09f294d20 100644 (file)
@@ -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"
index 3648c05788518fba5a89fa8341bf671dc11466f0..7998886c57ac96480a5239605411acdaa06c0644 100644 (file)
@@ -2194,7 +2194,6 @@ testStorageVolumeGetPath(virStorageVolPtr obj) {
 static virDriver testDriver = {
     VIR_DRV_TEST,
     "Test",
-    LIBVIR_VERSION_NUMBER,
     testOpen, /* open */
     testClose, /* close */
     NULL, /* supports_feature */
index 337a8ea5bf99823441f71e9bd0bcbd4e7fe9f5b0..1ce1d781a14dd17d5b77365cfcff1864b9b811a6 100644 (file)
@@ -1593,7 +1593,6 @@ found:
 static virDriver umlDriver = {
     VIR_DRV_UML,
     "UML",
-    LIBVIR_VERSION_NUMBER,
     umlOpen, /* open */
     umlClose, /* close */
     NULL, /* supports_feature */
index ef3784780db09328b13d804fbf4cd37ccd542e35..4229f0ef1e831a7e5492269d1fa55d4805da3dde 100644 (file)
@@ -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,
index 2f9346f6268a72d7f844a177f7b5ba53b6f7164d..831cefc3c4cbef61294433fd231fa54fc3adc274 100644 (file)
@@ -185,4 +185,6 @@ void xenUnifiedDomainEventDispatch (xenUnifiedPrivatePtr priv,
                                     virDomainPtr dom,
                                     int event,
                                     int detail);
+unsigned long xenUnifiedVersion(void);
+
 #endif /* __VIR_XEN_UNIFIED_H__ */