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",
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;
}
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);
}
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);
int
qemuMonitorJSONNBDServerStart(qemuMonitorPtr mon,
- const char *host,
- unsigned int port,
+ const virStorageNetHostDef *server,
const char *tls_alias)
{
int ret = -1;
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",
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,
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)
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)
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);
DO_TEST(qemuMonitorJSONGetDumpGuestMemoryCapability);
DO_TEST(qemuMonitorJSONSendKeyHoldtime);
DO_TEST(qemuMonitorSupportsActiveCommit);
+ DO_TEST(qemuMonitorJSONNBDServerStart);
DO_TEST_CPU_DATA("host");
DO_TEST_CPU_DATA("full");