mirror of https://github.com/xemu-project/xemu.git
tests/qtest/migration: Add migrate_set_ports into migrate_qmp to update migration port value
migrate_get_connect_qdict gets qdict with the dst QEMU parameters. migrate_set_ports() from list of channels reads each QDict for port, and fills the port with correct value in case it was 0 in the test. Signed-off-by: Het Gala <het.gala@nutanix.com> Suggested-by: Fabiano Rosas <farosas@suse.de> Reviewed-by: Fabiano Rosas <farosas@suse.de> Link: https://lore.kernel.org/r/20240312202634.63349-6-het.gala@nutanix.com Signed-off-by: Peter Xu <peterx@redhat.com>
This commit is contained in:
parent
387dc407db
commit
2a49e3c618
|
@ -16,6 +16,8 @@
|
||||||
#include "qapi/qapi-visit-sockets.h"
|
#include "qapi/qapi-visit-sockets.h"
|
||||||
#include "qapi/qobject-input-visitor.h"
|
#include "qapi/qobject-input-visitor.h"
|
||||||
#include "qapi/error.h"
|
#include "qapi/error.h"
|
||||||
|
#include "qapi/qmp/qlist.h"
|
||||||
|
#include "qemu/cutils.h"
|
||||||
|
|
||||||
#include "migration-helpers.h"
|
#include "migration-helpers.h"
|
||||||
|
|
||||||
|
@ -48,6 +50,37 @@ static char *SocketAddress_to_str(SocketAddress *addr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static QDict *SocketAddress_to_qdict(SocketAddress *addr)
|
||||||
|
{
|
||||||
|
QDict *dict = qdict_new();
|
||||||
|
|
||||||
|
switch (addr->type) {
|
||||||
|
case SOCKET_ADDRESS_TYPE_INET:
|
||||||
|
qdict_put_str(dict, "type", "inet");
|
||||||
|
qdict_put_str(dict, "host", addr->u.inet.host);
|
||||||
|
qdict_put_str(dict, "port", addr->u.inet.port);
|
||||||
|
break;
|
||||||
|
case SOCKET_ADDRESS_TYPE_UNIX:
|
||||||
|
qdict_put_str(dict, "type", "unix");
|
||||||
|
qdict_put_str(dict, "path", addr->u.q_unix.path);
|
||||||
|
break;
|
||||||
|
case SOCKET_ADDRESS_TYPE_FD:
|
||||||
|
qdict_put_str(dict, "type", "fd");
|
||||||
|
qdict_put_str(dict, "str", addr->u.fd.str);
|
||||||
|
break;
|
||||||
|
case SOCKET_ADDRESS_TYPE_VSOCK:
|
||||||
|
qdict_put_str(dict, "type", "vsock");
|
||||||
|
qdict_put_str(dict, "cid", addr->u.vsock.cid);
|
||||||
|
qdict_put_str(dict, "port", addr->u.vsock.port);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
g_assert_not_reached();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return dict;
|
||||||
|
}
|
||||||
|
|
||||||
static SocketAddress *migrate_get_socket_address(QTestState *who)
|
static SocketAddress *migrate_get_socket_address(QTestState *who)
|
||||||
{
|
{
|
||||||
QDict *rsp;
|
QDict *rsp;
|
||||||
|
@ -81,6 +114,46 @@ migrate_get_connect_uri(QTestState *who)
|
||||||
return connect_uri;
|
return connect_uri;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static QDict *
|
||||||
|
migrate_get_connect_qdict(QTestState *who)
|
||||||
|
{
|
||||||
|
SocketAddress *addrs;
|
||||||
|
QDict *connect_qdict;
|
||||||
|
|
||||||
|
addrs = migrate_get_socket_address(who);
|
||||||
|
connect_qdict = SocketAddress_to_qdict(addrs);
|
||||||
|
|
||||||
|
qapi_free_SocketAddress(addrs);
|
||||||
|
return connect_qdict;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void migrate_set_ports(QTestState *to, QList *channel_list)
|
||||||
|
{
|
||||||
|
QDict *addr;
|
||||||
|
QListEntry *entry;
|
||||||
|
const char *addr_port = NULL;
|
||||||
|
|
||||||
|
if (channel_list == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
addr = migrate_get_connect_qdict(to);
|
||||||
|
|
||||||
|
QLIST_FOREACH_ENTRY(channel_list, entry) {
|
||||||
|
QDict *channel = qobject_to(QDict, qlist_entry_obj(entry));
|
||||||
|
QDict *addrdict = qdict_get_qdict(channel, "addr");
|
||||||
|
|
||||||
|
if (qdict_haskey(addrdict, "port") &&
|
||||||
|
qdict_haskey(addr, "port") &&
|
||||||
|
(strcmp(qdict_get_str(addrdict, "port"), "0") == 0)) {
|
||||||
|
addr_port = qdict_get_str(addr, "port");
|
||||||
|
qdict_put_str(addrdict, "port", g_strdup(addr_port));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
qobject_unref(addr);
|
||||||
|
}
|
||||||
|
|
||||||
bool migrate_watch_for_events(QTestState *who, const char *name,
|
bool migrate_watch_for_events(QTestState *who, const char *name,
|
||||||
QDict *event, void *opaque)
|
QDict *event, void *opaque)
|
||||||
{
|
{
|
||||||
|
@ -139,6 +212,7 @@ void migrate_qmp(QTestState *who, QTestState *to, const char *uri,
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
QDict *args;
|
QDict *args;
|
||||||
|
QList *channel_list = NULL;
|
||||||
g_autofree char *connect_uri = NULL;
|
g_autofree char *connect_uri = NULL;
|
||||||
|
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
|
@ -149,6 +223,7 @@ void migrate_qmp(QTestState *who, QTestState *to, const char *uri,
|
||||||
if (!uri) {
|
if (!uri) {
|
||||||
connect_uri = migrate_get_connect_uri(to);
|
connect_uri = migrate_get_connect_uri(to);
|
||||||
}
|
}
|
||||||
|
migrate_set_ports(to, channel_list);
|
||||||
qdict_put_str(args, "uri", uri ? uri : connect_uri);
|
qdict_put_str(args, "uri", uri ? uri : connect_uri);
|
||||||
|
|
||||||
qtest_qmp_assert_success(who,
|
qtest_qmp_assert_success(who,
|
||||||
|
|
Loading…
Reference in New Issue