]> xenbits.xensource.com Git - libvirt.git/commitdiff
backup: Prepare for Unix sockets in QMP nbd-server-start
authorEric Blake <eblake@redhat.com>
Tue, 9 Apr 2019 21:21:38 +0000 (16:21 -0500)
committerEric Blake <eblake@redhat.com>
Wed, 12 Jun 2019 02:41:42 +0000 (21:41 -0500)
Migration always uses a TCP socket for NBD servers, because we don't
support same-host migration. But upcoming pull-mode incremental backup
needs to also support a Unix socket, for retrieving the backup from
the same host. Support this by plumbing virStorageNetHostDef through
the monitor calls, since that is a nice reusable struct that can track
both TCP and Unix sockets.

Update qemumonitorjsontest to verify both forms of the QMP command.

Signed-off-by: Eric Blake <eblake@redhat.com>
Acked-by: Peter Krempa <pkrempa@redhat.com>
src/qemu/qemu_migration.c
src/qemu/qemu_monitor.c
src/qemu/qemu_monitor.h
src/qemu/qemu_monitor_json.c
src/qemu/qemu_monitor_json.h
tests/qemumonitorjsontest.c

index 32b3040473250ddb632e94a52092e8d885f9e077..267a729c6f8b6149087072beca4800567c83e9d1 100644 (file)
@@ -380,6 +380,10 @@ qemuMigrationDstStartNBDServer(virQEMUDriverPtr driver,
     unsigned short port = 0;
     char *diskAlias = NULL;
     size_t i;
+    virStorageNetHostDef server = {
+        .name = (char *)listenAddr, /* cast away const */
+        .transport = VIR_STORAGE_NET_HOST_TRANS_TCP,
+    };
 
     if (nbdPort < 0 || nbdPort > USHRT_MAX) {
         virReportError(VIR_ERR_INVALID_ARG, "%s",
@@ -415,7 +419,8 @@ qemuMigrationDstStartNBDServer(virQEMUDriverPtr driver,
             else if (virPortAllocatorAcquire(driver->migrationPorts, &port) < 0)
                 goto exit_monitor;
 
-            if (qemuMonitorNBDServerStart(priv->mon, listenAddr, port, tls_alias) < 0)
+            server.port = port;
+            if (qemuMonitorNBDServerStart(priv->mon, &server, tls_alias) < 0)
                 goto exit_monitor;
         }
 
index 6b731cd91ac8fb197b06fd346cb62ba36e37fefa..187513a986bb93173c3e9c3838708c5ecd9ea63b 100644 (file)
@@ -3925,15 +3925,20 @@ qemuMonitorGetSEVCapabilities(qemuMonitorPtr mon,
 
 int
 qemuMonitorNBDServerStart(qemuMonitorPtr mon,
-                          const char *host,
-                          unsigned int port,
+                          const virStorageNetHostDef *server,
                           const char *tls_alias)
 {
-    VIR_DEBUG("host=%s port=%u tls_alias=%s", host, port, NULLSTR(tls_alias));
+    /* Peek inside the struct for nicer logging */
+    if (server->transport == VIR_STORAGE_NET_HOST_TRANS_TCP)
+        VIR_DEBUG("server={tcp host=%s port=%u} tls_alias=%s",
+                  NULLSTR(server->name), server->port, NULLSTR(tls_alias));
+    else
+        VIR_DEBUG("server={unix socket=%s} tls_alias=%s",
+                  NULLSTR(server->socket), NULLSTR(tls_alias));
 
     QEMU_CHECK_MONITOR(mon);
 
-    return qemuMonitorJSONNBDServerStart(mon, host, port, tls_alias);
+    return qemuMonitorJSONNBDServerStart(mon, server, tls_alias);
 }
 
 
index dee594fa66acdb8ceab34edf587909bd2ca498a3..fa84ff821e36d3f50067781953fa9594ad0bd45d 100644 (file)
@@ -1094,9 +1094,9 @@ int qemuMonitorGetObjectProps(qemuMonitorPtr mon,
 char *qemuMonitorGetTargetArch(qemuMonitorPtr mon);
 
 int qemuMonitorNBDServerStart(qemuMonitorPtr mon,
-                              const char *host,
-                              unsigned int port,
-                              const char *tls_alias);
+                              const virStorageNetHostDef *server,
+                              const char *tls_alias)
+    ATTRIBUTE_NONNULL(2);
 int qemuMonitorNBDServerAdd(qemuMonitorPtr mon,
                             const char *deviceID,
                             bool writable);
index 53a7de8b7740adc60c5b56ca3e9777617407d2f3..93113d4e8aec375bc190849d16884580d0813cb9 100644 (file)
@@ -6684,8 +6684,7 @@ qemuMonitorJSONBuildUnixSocketAddress(const char *path)
 
 int
 qemuMonitorJSONNBDServerStart(qemuMonitorPtr mon,
-                              const char *host,
-                              unsigned int port,
+                              const virStorageNetHostDef *server,
                               const char *tls_alias)
 {
     int ret = -1;
@@ -6694,10 +6693,22 @@ qemuMonitorJSONNBDServerStart(qemuMonitorPtr mon,
     virJSONValuePtr addr = NULL;
     char *port_str = NULL;
 
-    if (virAsprintf(&port_str, "%u", port) < 0)
-        return ret;
-
-    if (!(addr = qemuMonitorJSONBuildInetSocketAddress(host, port_str)))
+    switch ((virStorageNetHostTransport)server->transport) {
+    case VIR_STORAGE_NET_HOST_TRANS_TCP:
+        if (virAsprintf(&port_str, "%u", server->port) < 0)
+            return ret;
+        addr = qemuMonitorJSONBuildInetSocketAddress(server->name, port_str);
+        break;
+    case VIR_STORAGE_NET_HOST_TRANS_UNIX:
+        addr = qemuMonitorJSONBuildUnixSocketAddress(server->socket);
+        break;
+    case VIR_STORAGE_NET_HOST_TRANS_RDMA:
+    case VIR_STORAGE_NET_HOST_TRANS_LAST:
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       _("invalid server address"));
+        goto cleanup;
+    }
+    if (!addr)
         goto cleanup;
 
     if (!(cmd = qemuMonitorJSONMakeCommand("nbd-server-start",
index acef1a0a79a506167d57c1e5c43824f0eed5a497..e41bdc8c4f852eb8ae70fe3a6c6268ac7ea6bfba 100644 (file)
@@ -459,8 +459,7 @@ int qemuMonitorJSONGetObjectProps(qemuMonitorPtr mon,
 char *qemuMonitorJSONGetTargetArch(qemuMonitorPtr mon);
 
 int qemuMonitorJSONNBDServerStart(qemuMonitorPtr mon,
-                                  const char *host,
-                                  unsigned int port,
+                                  const virStorageNetHostDef *server,
                                   const char *tls_alias);
 int qemuMonitorJSONNBDServerAdd(qemuMonitorPtr mon,
                                 const char *deviceID,
index 54e54fbce919a21cf3cd754f26f6ecd58d250dd0..d29ce855cf18cbcfa9146d8c0378a87484bcc7fe 100644 (file)
@@ -1331,7 +1331,6 @@ GEN_TEST_FUNC(qemuMonitorJSONBlockCommit, "vdb", "/foo/bar1", "/foo/bar2", "back
 GEN_TEST_FUNC(qemuMonitorJSONDrivePivot, "vdb")
 GEN_TEST_FUNC(qemuMonitorJSONScreendump, "devicename", 1, "/foo/bar")
 GEN_TEST_FUNC(qemuMonitorJSONOpenGraphics, "spice", "spicefd", false)
-GEN_TEST_FUNC(qemuMonitorJSONNBDServerStart, "localhost", 12345, "test-alias")
 GEN_TEST_FUNC(qemuMonitorJSONNBDServerAdd, "vda", true)
 GEN_TEST_FUNC(qemuMonitorJSONDetachCharDev, "serial1")
 GEN_TEST_FUNC(qemuMonitorJSONBlockdevTrayOpen, "foodev", true)
@@ -1339,6 +1338,44 @@ GEN_TEST_FUNC(qemuMonitorJSONBlockdevTrayClose, "foodev")
 GEN_TEST_FUNC(qemuMonitorJSONBlockdevMediumRemove, "foodev")
 GEN_TEST_FUNC(qemuMonitorJSONBlockdevMediumInsert, "foodev", "newnode")
 
+static int
+testQemuMonitorJSONqemuMonitorJSONNBDServerStart(const void *opaque)
+{
+    const testGenericData *data = opaque;
+    virDomainXMLOptionPtr xmlopt = data->xmlopt;
+    virStorageNetHostDef server_tcp = {
+        .name = (char *)"localhost",
+        .port = 12345,
+        .transport = VIR_STORAGE_NET_HOST_TRANS_TCP,
+    };
+    virStorageNetHostDef server_unix = {
+        .socket = (char *)"/tmp/sock",
+        .transport = VIR_STORAGE_NET_HOST_TRANS_UNIX,
+    };
+    VIR_AUTOPTR(qemuMonitorTest) test = NULL;
+
+    if (!(test = qemuMonitorTestNewSchema(xmlopt, data->schema)))
+        return -1;
+
+    if (qemuMonitorTestAddItem(test, "nbd-server-start",
+                               "{\"return\":{}}") < 0)
+        return -1;
+
+    if (qemuMonitorTestAddItem(test, "nbd-server-start",
+                               "{\"return\":{}}") < 0)
+        return -1;
+
+    if (qemuMonitorJSONNBDServerStart(qemuMonitorTestGetMonitor(test),
+                                      &server_tcp, "test-alias") < 0)
+        return -1;
+
+    if (qemuMonitorJSONNBDServerStart(qemuMonitorTestGetMonitor(test),
+                                      &server_unix, "test-alias") < 0)
+        return -1;
+
+    return 0;
+}
+
 static bool
 testQemuMonitorJSONqemuMonitorJSONQueryCPUsEqual(struct qemuMonitorQueryCpusEntry *a,
                                                  struct qemuMonitorQueryCpusEntry *b)
@@ -2976,7 +3013,6 @@ mymain(void)
     DO_TEST_GEN(qemuMonitorJSONDrivePivot);
     DO_TEST_GEN(qemuMonitorJSONScreendump);
     DO_TEST_GEN(qemuMonitorJSONOpenGraphics);
-    DO_TEST_GEN(qemuMonitorJSONNBDServerStart);
     DO_TEST_GEN(qemuMonitorJSONNBDServerAdd);
     DO_TEST_GEN(qemuMonitorJSONDetachCharDev);
     DO_TEST_GEN(qemuMonitorJSONBlockdevTrayOpen);
@@ -2998,6 +3034,7 @@ mymain(void)
     DO_TEST(qemuMonitorJSONGetDumpGuestMemoryCapability);
     DO_TEST(qemuMonitorJSONSendKeyHoldtime);
     DO_TEST(qemuMonitorSupportsActiveCommit);
+    DO_TEST(qemuMonitorJSONNBDServerStart);
 
     DO_TEST_CPU_DATA("host");
     DO_TEST_CPU_DATA("full");