tests/qtest: failover: test migration if the guest doesn't support failover

The primary device is not plugged and the migration is done only with
the standby device

Signed-off-by: Laurent Vivier <lvivier@redhat.com>
Message-Id: <20220203141537.972317-7-lvivier@redhat.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
This commit is contained in:
Laurent Vivier 2022-02-03 15:15:36 +01:00 committed by Thomas Huth
parent 7f998491ae
commit d9872c00f7
1 changed files with 142 additions and 0 deletions

View File

@ -944,6 +944,144 @@ static void test_off_migrate_in(gconstpointer opaque)
machine_stop(qts);
}
static void test_guest_off_migrate_out(gconstpointer opaque)
{
QTestState *qts;
QDict *resp, *args, *ret;
g_autofree gchar *uri = g_strdup_printf("exec: cat > %s", (gchar *)opaque);
const gchar *status;
QVirtioPCIDevice *vdev;
uint64_t features;
qts = machine_start(BASE_MACHINE
"-netdev user,id=hs0 "
"-netdev user,id=hs1 ",
2);
check_one_card(qts, false, "standby0", MAC_STANDBY0);
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
qtest_qmp_device_add(qts, "virtio-net", "standby0",
"{'bus': 'root0',"
"'failover': 'on',"
"'netdev': 'hs0',"
"'mac': '"MAC_STANDBY0"'}");
check_one_card(qts, true, "standby0", MAC_STANDBY0);
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
qtest_qmp_device_add(qts, "virtio-net", "primary0",
"{'bus': 'root1',"
"'failover_pair_id': 'standby0',"
"'netdev': 'hs1',"
"'rombar': 0,"
"'romfile': '',"
"'mac': '"MAC_PRIMARY0"'}");
check_one_card(qts, true, "standby0", MAC_STANDBY0);
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
features = ~(QVIRTIO_F_BAD_FEATURE |
(1ull << VIRTIO_RING_F_INDIRECT_DESC) |
(1ull << VIRTIO_RING_F_EVENT_IDX) |
(1ull << VIRTIO_NET_F_STANDBY));
vdev = start_virtio_net_internal(qts, 1, 0, &features);
check_one_card(qts, true, "standby0", MAC_STANDBY0);
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
args = qdict_from_jsonf_nofail("{}");
g_assert_nonnull(args);
qdict_put_str(args, "uri", uri);
resp = qtest_qmp(qts, "{ 'execute': 'migrate', 'arguments': %p}", args);
g_assert(qdict_haskey(resp, "return"));
qobject_unref(resp);
while (true) {
ret = migrate_status(qts);
status = qdict_get_str(ret, "status");
if (strcmp(status, "completed") == 0) {
qobject_unref(ret);
break;
}
g_assert_cmpstr(status, !=, "failed");
g_assert_cmpstr(status, !=, "cancelling");
g_assert_cmpstr(status, !=, "cancelled");
qobject_unref(ret);
}
qtest_qmp_eventwait(qts, "STOP");
check_one_card(qts, true, "standby0", MAC_STANDBY0);
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
qos_object_destroy((QOSGraphObject *)vdev);
machine_stop(qts);
}
static void test_guest_off_migrate_in(gconstpointer opaque)
{
QTestState *qts;
QDict *resp, *args, *ret;
g_autofree gchar *uri = g_strdup_printf("exec: cat %s", (gchar *)opaque);
qts = machine_start(BASE_MACHINE
"-netdev user,id=hs0 "
"-netdev user,id=hs1 "
"-incoming defer ",
2);
check_one_card(qts, false, "standby0", MAC_STANDBY0);
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
qtest_qmp_device_add(qts, "virtio-net", "standby0",
"{'bus': 'root0',"
"'failover': 'on',"
"'netdev': 'hs0',"
"'mac': '"MAC_STANDBY0"'}");
check_one_card(qts, true, "standby0", MAC_STANDBY0);
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
qtest_qmp_device_add(qts, "virtio-net", "primary0",
"{'bus': 'root1',"
"'failover_pair_id': 'standby0',"
"'netdev': 'hs1',"
"'rombar': 0,"
"'romfile': '',"
"'mac': '"MAC_PRIMARY0"'}");
check_one_card(qts, true, "standby0", MAC_STANDBY0);
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
args = qdict_from_jsonf_nofail("{}");
g_assert_nonnull(args);
qdict_put_str(args, "uri", uri);
resp = qtest_qmp(qts, "{ 'execute': 'migrate-incoming', 'arguments': %p}",
args);
g_assert(qdict_haskey(resp, "return"));
qobject_unref(resp);
resp = get_migration_event(qts);
g_assert_cmpstr(qdict_get_str(resp, "status"), ==, "setup");
qobject_unref(resp);
check_one_card(qts, true, "standby0", MAC_STANDBY0);
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
qtest_qmp_eventwait(qts, "RESUME");
ret = migrate_status(qts);
g_assert_cmpstr(qdict_get_str(ret, "status"), ==, "completed");
qobject_unref(ret);
machine_stop(qts);
}
static void test_migrate_abort_wait_unplug(gconstpointer opaque)
{
QTestState *qts;
@ -1531,6 +1669,10 @@ int main(int argc, char **argv)
test_off_migrate_out);
qtest_add_data_func("failover-virtio-net/migrate/off/in", tmpfile,
test_off_migrate_in);
qtest_add_data_func("failover-virtio-net/migrate/guest_off/out", tmpfile,
test_guest_off_migrate_out);
qtest_add_data_func("failover-virtio-net/migrate/guest_off/in", tmpfile,
test_guest_off_migrate_in);
qtest_add_data_func("failover-virtio-net/migrate/abort/wait-unplug",
tmpfile, test_migrate_abort_wait_unplug);
qtest_add_data_func("failover-virtio-net/migrate/abort/active", tmpfile,