Skip to content

Commit

Permalink
tests/qtest: failover: migration abort test with failover off
Browse files Browse the repository at this point in the history
Test abort during active migration when failover is disabled from QEMU
or from guest side.

Signed-off-by: Laurent Vivier <lvivier@redhat.com>
Message-Id: <20220203141537.972317-8-lvivier@redhat.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
  • Loading branch information
vivier authored and huth committed Feb 21, 2022
1 parent d9872c0 commit e20977b
Showing 1 changed file with 180 additions and 0 deletions.
180 changes: 180 additions & 0 deletions tests/qtest/virtio-net-failover.c
Expand Up @@ -1082,6 +1082,97 @@ static void test_guest_off_migrate_in(gconstpointer opaque)
machine_stop(qts);
}

static void test_migrate_guest_off_abort(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, "active") == 0) {
qobject_unref(ret);
break;
}
g_assert_cmpstr(status, !=, "failed");
qobject_unref(ret);
}

resp = qtest_qmp(qts, "{ 'execute': 'migrate_cancel' }");
g_assert(qdict_haskey(resp, "return"));
qobject_unref(resp);

while (true) {
ret = migrate_status(qts);

status = qdict_get_str(ret, "status");
if (strcmp(status, "cancelled") == 0) {
qobject_unref(ret);
break;
}
g_assert_cmpstr(status, !=, "failed");
g_assert_cmpstr(status, !=, "active");
qobject_unref(ret);
}

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_migrate_abort_wait_unplug(gconstpointer opaque)
{
QTestState *qts;
Expand Down Expand Up @@ -1265,6 +1356,91 @@ static void test_migrate_abort_active(gconstpointer opaque)
machine_stop(qts);
}

static void test_migrate_off_abort(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;

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': 'off',"
"'netdev': 'hs0',"
"'mac': '"MAC_STANDBY0"'}");

check_one_card(qts, true, "standby0", MAC_STANDBY0);
check_one_card(qts, false, "primary0", MAC_PRIMARY0);

vdev = start_virtio_net(qts, 1, 0, "standby0", false);

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, true, "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, "active") == 0) {
qobject_unref(ret);
break;
}
g_assert_cmpstr(status, !=, "failed");
qobject_unref(ret);
}

resp = qtest_qmp(qts, "{ 'execute': 'migrate_cancel' }");
g_assert(qdict_haskey(resp, "return"));
qobject_unref(resp);

while (true) {
ret = migrate_status(qts);

status = qdict_get_str(ret, "status");
if (strcmp(status, "cancelled") == 0) {
qobject_unref(ret);
break;
}
g_assert_cmpstr(status, !=, "failed");
g_assert_cmpstr(status, !=, "active");
qobject_unref(ret);
}

check_one_card(qts, true, "standby0", MAC_STANDBY0);
check_one_card(qts, true, "primary0", MAC_PRIMARY0);

qos_object_destroy((QOSGraphObject *)vdev);
machine_stop(qts);
}

static void test_migrate_abort_timeout(gconstpointer opaque)
{
QTestState *qts;
Expand Down Expand Up @@ -1669,10 +1845,14 @@ 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/off/abort", tmpfile,
test_migrate_off_abort);
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/guest_off/abort", tmpfile,
test_migrate_guest_off_abort);
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,
Expand Down

0 comments on commit e20977b

Please sign in to comment.