[libvirt] [PATCH 1/4] backup: Prepare for Unix sockets in QMP nbd-server-start
Peter Krempa
pkrempa at redhat.com
Thu Jun 6 12:53:52 UTC 2019
On Wed, Jun 05, 2019 at 22:01:07 -0500, Eric Blake wrote:
> 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 not only test the response to the
> command, but to actually verify that the command itself uses the two
> correct QMP forms. I'm actually a bit surprised that we are not
> utilizing qemuMonitorTestAddItemVerbatim more frequently.
>
> Signed-off-by: Eric Blake <eblake at redhat.com>
> ---
> src/qemu/qemu_monitor.h | 6 ++--
> src/qemu/qemu_monitor_json.h | 3 +-
> src/qemu/qemu_migration.c | 7 ++++-
> src/qemu/qemu_monitor.c | 13 +++++---
> src/qemu/qemu_monitor_json.c | 23 ++++++++++----
> tests/qemumonitorjsontest.c | 58 ++++++++++++++++++++++++++++++++++--
> 6 files changed, 92 insertions(+), 18 deletions(-)
>
> diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
> index dee594fa66..fa84ff821e 100644
> --- a/src/qemu/qemu_monitor.h
> +++ b/src/qemu/qemu_monitor.h
> @@ -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);
> diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h
> index acef1a0a79..e41bdc8c4f 100644
> --- a/src/qemu/qemu_monitor_json.h
> +++ b/src/qemu/qemu_monitor_json.h
> @@ -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,
> diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
> index 32b3040473..267a729c6f 100644
> --- a/src/qemu/qemu_migration.c
> +++ b/src/qemu/qemu_migration.c
> @@ -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;
> }
>
> diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
> index 6b731cd91a..187513a986 100644
> --- a/src/qemu/qemu_monitor.c
> +++ b/src/qemu/qemu_monitor.c
> @@ -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);
> }
>
>
> diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
> index 53a7de8b77..93113d4e8a 100644
> --- a/src/qemu/qemu_monitor_json.c
> +++ b/src/qemu/qemu_monitor_json.c
> @@ -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",
> diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c
> index 0894e748ae..9d707fcc7c 100644
> --- a/tests/qemumonitorjsontest.c
> +++ b/tests/qemumonitorjsontest.c
> @@ -1348,7 +1348,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)
> @@ -1356,6 +1355,61 @@ GEN_TEST_FUNC(qemuMonitorJSONBlockdevTrayClose, "foodev")
> GEN_TEST_FUNC(qemuMonitorJSONBlockdevMediumRemove, "foodev")
> GEN_TEST_FUNC(qemuMonitorJSONBlockdevMediumInsert, "foodev", "newnode")
>
> +static int
> +testQemuMonitorJSONqemuMonitorJSONNBDServerStart(const void *opaque)
> +{
> + virDomainXMLOptionPtr xmlopt = (virDomainXMLOptionPtr) opaque;
> + qemuMonitorTestPtr test = qemuMonitorTestNewSimple(true, xmlopt);
I'd suggest you use qemuMonitorTestNewSchema here so that we preserve
the schema checks.
> + int ret = -1;
> + 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,
> + };
> +
> + if (!test)
> + return -1;
> +
> + if (qemuMonitorTestAddItemVerbatim(test,
> + "{\"execute\":\"nbd-server-start\","
> + " \"arguments\":{\"addr\":{"
> + " \"type\":\"inet\",\"data\":{"
> + " \"host\":\"localhost\","
> + " \"port\":\"12345\"}},"
> + " \"tls-creds\":\"test-alias\"},"
> + " \"id\":\"libvirt-1\"}",
> + NULL, "{\"return\":{}}") < 0)
> + goto cleanup;
> +
> + if (qemuMonitorTestAddItemVerbatim(test,
> + "{\"execute\":\"nbd-server-start\","
> + " \"arguments\":{\"addr\":{"
> + " \"type\":\"unix\",\"data\":{"
> + " \"path\":\"/tmp/sock\"}},"
> + " \"tls-creds\":\"test-alias\"},"
> + " \"id\":\"libvirt-2\"}",
> + NULL, "{\"return\":{}}") < 0)
> + goto cleanup;
> +
> + if (qemuMonitorJSONNBDServerStart(qemuMonitorTestGetMonitor(test),
> + &server_tcp, "test-alias") < 0)
> + goto cleanup;
> +
> + if (qemuMonitorJSONNBDServerStart(qemuMonitorTestGetMonitor(test),
> + &server_unix, "test-alias") < 0)
> + goto cleanup;
> +
> + ret = 0;
> +
> + cleanup:
> + qemuMonitorTestFree(test);
> + return ret;
> +}
> +
> static bool
> testQemuMonitorJSONqemuMonitorJSONQueryCPUsEqual(struct qemuMonitorQueryCpusEntry *a,
> struct qemuMonitorQueryCpusEntry *b)
> @@ -3014,7 +3068,6 @@ mymain(void)
> DO_TEST_GEN(qemuMonitorJSONDrivePivot);
> DO_TEST_GEN(qemuMonitorJSONScreendump);
> DO_TEST_GEN(qemuMonitorJSONOpenGraphics);
> - DO_TEST_GEN(qemuMonitorJSONNBDServerStart);
Which are deleted here.
> DO_TEST_GEN(qemuMonitorJSONNBDServerAdd);
> DO_TEST_GEN(qemuMonitorJSONDetachCharDev);
> DO_TEST_GEN(qemuMonitorJSONBlockdevTrayOpen);
> @@ -3036,6 +3089,7 @@ mymain(void)
ACK with schema checks preserved.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20190606/90badbb7/attachment-0001.sig>
More information about the libvir-list
mailing list