]> xenbits.xensource.com Git - libvirt.git/commitdiff
storage: Fix formatting and parsing of qemu type 'UnixSocketAddress'
authorPeter Krempa <pkrempa@redhat.com>
Mon, 12 Feb 2018 14:44:11 +0000 (15:44 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Wed, 14 Feb 2018 14:58:04 +0000 (15:58 +0100)
The documentation for the JSON/qapi type 'UnixSocketAddress' states that
the unix socket path field is named 'path'. Unfortunately qemu uses
'socket' in case of the gluster driver (despite documented otherwise).

Add logic which will format the correct fields while keeping support of
the old spelling.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1544325

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
src/qemu/qemu_block.c
src/util/virstoragefile.c

index 8b71679118361efaa02a054e77fca3639a0b286e..6f81e9d96cb9745e57b5cdaf76a77d29098a4d25 100644 (file)
@@ -467,11 +467,14 @@ qemuBlockStorageSourceGetURI(virStorageSourcePtr src)
 /**
  * qemuBlockStorageSourceBuildJSONSocketAddress
  * @host: the virStorageNetHostDefPtr definition to build
- * @legacy: use 'tcp' instead of 'inet' for compatibility reasons
+ * @legacy: use old field names/values
  *
  * Formats @hosts into a json object conforming to the 'SocketAddress' type
  * in qemu.
  *
+ * For compatibility with old approach used in the gluster driver of old qemus
+ * use the old spelling for TCP transport and, the path field of the unix socket.
+ *
  * Returns a virJSONValuePtr for a single server.
  */
 static virJSONValuePtr
@@ -481,6 +484,7 @@ qemuBlockStorageSourceBuildJSONSocketAddress(virStorageNetHostDefPtr host,
     virJSONValuePtr server = NULL;
     virJSONValuePtr ret = NULL;
     const char *transport;
+    const char *field;
     char *port = NULL;
 
     switch ((virStorageNetHostTransport) host->transport) {
@@ -502,9 +506,14 @@ qemuBlockStorageSourceBuildJSONSocketAddress(virStorageNetHostDefPtr host,
         break;
 
     case VIR_STORAGE_NET_HOST_TRANS_UNIX:
+        if (legacy)
+            field = "s:socket";
+        else
+            field = "s:path";
+
         if (virJSONValueObjectCreate(&server,
                                      "s:type", "unix",
-                                     "s:socket", host->socket,
+                                     field, host->socket,
                                      NULL) < 0)
             goto cleanup;
         break;
index 7f878039ba762b6fefb1919bdc89af9250324d2d..ebfb0a860ae8589224791af97e9417f19933b16b 100644 (file)
@@ -2893,7 +2893,13 @@ virStorageSourceParseBackingJSONSocketAddress(virStorageNetHostDefPtr host,
     } else if (STREQ(type, "unix")) {
         host->transport = VIR_STORAGE_NET_HOST_TRANS_UNIX;
 
-        if (!(socket = virJSONValueObjectGetString(json, "socket"))) {
+        socket = virJSONValueObjectGetString(json, "path");
+
+        /* check for old spelling for gluster protocol */
+        if (!socket)
+            socket = virJSONValueObjectGetString(json, "socket");
+
+        if (!socket) {
             virReportError(VIR_ERR_INVALID_ARG, "%s",
                            _("missing socket path for udp backing server in "
                              "JSON backing volume definition"));