mirror of
https://github.com/qemu/qemu.git
synced 2024-12-14 06:53:43 +08:00
tests/migration: Add a test for validate-uuid capability
Signed-off-by: Yury Kotov <yury-kotov@yandex-team.ru> Message-Id: <20190903162246.18524-4-yury-kotov@yandex-team.ru> Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
This commit is contained in:
parent
d43e59e7ab
commit
3af31a3469
@ -512,7 +512,8 @@ static void migrate_postcopy_start(QTestState *from, QTestState *to)
|
||||
|
||||
static int test_migrate_start(QTestState **from, QTestState **to,
|
||||
const char *uri, bool hide_stderr,
|
||||
bool use_shmem)
|
||||
bool use_shmem, const char *opts_src,
|
||||
const char *opts_dst)
|
||||
{
|
||||
gchar *cmd_src, *cmd_dst;
|
||||
char *bootpath = NULL;
|
||||
@ -521,6 +522,9 @@ static int test_migrate_start(QTestState **from, QTestState **to,
|
||||
const char *arch = qtest_get_arch();
|
||||
const char *accel = "kvm:tcg";
|
||||
|
||||
opts_src = opts_src ? opts_src : "";
|
||||
opts_dst = opts_dst ? opts_dst : "";
|
||||
|
||||
if (use_shmem) {
|
||||
if (!g_file_test("/dev/shm", G_FILE_TEST_IS_DIR)) {
|
||||
g_test_skip("/dev/shm is not supported");
|
||||
@ -539,16 +543,16 @@ static int test_migrate_start(QTestState **from, QTestState **to,
|
||||
cmd_src = g_strdup_printf("-machine accel=%s -m 150M"
|
||||
" -name source,debug-threads=on"
|
||||
" -serial file:%s/src_serial"
|
||||
" -drive file=%s,format=raw %s",
|
||||
" -drive file=%s,format=raw %s %s",
|
||||
accel, tmpfs, bootpath,
|
||||
extra_opts ? extra_opts : "");
|
||||
extra_opts ? extra_opts : "", opts_src);
|
||||
cmd_dst = g_strdup_printf("-machine accel=%s -m 150M"
|
||||
" -name target,debug-threads=on"
|
||||
" -serial file:%s/dest_serial"
|
||||
" -drive file=%s,format=raw"
|
||||
" -incoming %s %s",
|
||||
" -incoming %s %s %s",
|
||||
accel, tmpfs, bootpath, uri,
|
||||
extra_opts ? extra_opts : "");
|
||||
extra_opts ? extra_opts : "", opts_dst);
|
||||
start_address = X86_TEST_MEM_START;
|
||||
end_address = X86_TEST_MEM_END;
|
||||
} else if (g_str_equal(arch, "s390x")) {
|
||||
@ -556,15 +560,15 @@ static int test_migrate_start(QTestState **from, QTestState **to,
|
||||
extra_opts = use_shmem ? get_shmem_opts("128M", shmem_path) : NULL;
|
||||
cmd_src = g_strdup_printf("-machine accel=%s -m 128M"
|
||||
" -name source,debug-threads=on"
|
||||
" -serial file:%s/src_serial -bios %s %s",
|
||||
" -serial file:%s/src_serial -bios %s %s %s",
|
||||
accel, tmpfs, bootpath,
|
||||
extra_opts ? extra_opts : "");
|
||||
extra_opts ? extra_opts : "", opts_src);
|
||||
cmd_dst = g_strdup_printf("-machine accel=%s -m 128M"
|
||||
" -name target,debug-threads=on"
|
||||
" -serial file:%s/dest_serial -bios %s"
|
||||
" -incoming %s %s",
|
||||
" -incoming %s %s %s",
|
||||
accel, tmpfs, bootpath, uri,
|
||||
extra_opts ? extra_opts : "");
|
||||
extra_opts ? extra_opts : "", opts_dst);
|
||||
start_address = S390_TEST_MEM_START;
|
||||
end_address = S390_TEST_MEM_END;
|
||||
} else if (strcmp(arch, "ppc64") == 0) {
|
||||
@ -575,14 +579,15 @@ static int test_migrate_start(QTestState **from, QTestState **to,
|
||||
" -prom-env 'use-nvramrc?=true' -prom-env "
|
||||
"'nvramrc=hex .\" _\" begin %x %x "
|
||||
"do i c@ 1 + i c! 1000 +loop .\" B\" 0 "
|
||||
"until' %s", accel, tmpfs, end_address,
|
||||
start_address, extra_opts ? extra_opts : "");
|
||||
"until' %s %s", accel, tmpfs, end_address,
|
||||
start_address, extra_opts ? extra_opts : "",
|
||||
opts_src);
|
||||
cmd_dst = g_strdup_printf("-machine accel=%s -m 256M"
|
||||
" -name target,debug-threads=on"
|
||||
" -serial file:%s/dest_serial"
|
||||
" -incoming %s %s",
|
||||
" -incoming %s %s %s",
|
||||
accel, tmpfs, uri,
|
||||
extra_opts ? extra_opts : "");
|
||||
extra_opts ? extra_opts : "", opts_dst);
|
||||
|
||||
start_address = PPC_TEST_MEM_START;
|
||||
end_address = PPC_TEST_MEM_END;
|
||||
@ -592,16 +597,16 @@ static int test_migrate_start(QTestState **from, QTestState **to,
|
||||
cmd_src = g_strdup_printf("-machine virt,accel=%s,gic-version=max "
|
||||
"-name vmsource,debug-threads=on -cpu max "
|
||||
"-m 150M -serial file:%s/src_serial "
|
||||
"-kernel %s %s",
|
||||
"-kernel %s %s %s",
|
||||
accel, tmpfs, bootpath,
|
||||
extra_opts ? extra_opts : "");
|
||||
extra_opts ? extra_opts : "", opts_src);
|
||||
cmd_dst = g_strdup_printf("-machine virt,accel=%s,gic-version=max "
|
||||
"-name vmdest,debug-threads=on -cpu max "
|
||||
"-m 150M -serial file:%s/dest_serial "
|
||||
"-kernel %s "
|
||||
"-incoming %s %s",
|
||||
"-incoming %s %s %s",
|
||||
accel, tmpfs, bootpath, uri,
|
||||
extra_opts ? extra_opts : "");
|
||||
extra_opts ? extra_opts : "", opts_dst);
|
||||
|
||||
start_address = ARM_TEST_MEM_START;
|
||||
end_address = ARM_TEST_MEM_END;
|
||||
@ -731,7 +736,7 @@ static int migrate_postcopy_prepare(QTestState **from_ptr,
|
||||
char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs);
|
||||
QTestState *from, *to;
|
||||
|
||||
if (test_migrate_start(&from, &to, uri, hide_error, false)) {
|
||||
if (test_migrate_start(&from, &to, uri, hide_error, false, NULL, NULL)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -841,20 +846,16 @@ static void test_postcopy_recovery(void)
|
||||
migrate_postcopy_complete(from, to);
|
||||
}
|
||||
|
||||
static void test_baddest(void)
|
||||
static void wait_for_migration_fail(QTestState *from, bool allow_active)
|
||||
{
|
||||
QTestState *from, *to;
|
||||
QDict *rsp_return;
|
||||
char *status;
|
||||
bool failed;
|
||||
|
||||
if (test_migrate_start(&from, &to, "tcp:0:0", true, false)) {
|
||||
return;
|
||||
}
|
||||
migrate(from, "tcp:0:0", "{}");
|
||||
do {
|
||||
status = migrate_query_status(from);
|
||||
g_assert(!strcmp(status, "setup") || !(strcmp(status, "failed")));
|
||||
g_assert(!strcmp(status, "setup") || !strcmp(status, "failed") ||
|
||||
(allow_active && !strcmp(status, "active")));
|
||||
failed = !strcmp(status, "failed");
|
||||
g_free(status);
|
||||
} while (!failed);
|
||||
@ -864,7 +865,17 @@ static void test_baddest(void)
|
||||
g_assert(qdict_haskey(rsp_return, "running"));
|
||||
g_assert(qdict_get_bool(rsp_return, "running"));
|
||||
qobject_unref(rsp_return);
|
||||
}
|
||||
|
||||
static void test_baddest(void)
|
||||
{
|
||||
QTestState *from, *to;
|
||||
|
||||
if (test_migrate_start(&from, &to, "tcp:0:0", true, false, NULL, NULL)) {
|
||||
return;
|
||||
}
|
||||
migrate(from, "tcp:0:0", "{}");
|
||||
wait_for_migration_fail(from, false);
|
||||
test_migrate_end(from, to, false);
|
||||
}
|
||||
|
||||
@ -873,7 +884,7 @@ static void test_precopy_unix(void)
|
||||
char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs);
|
||||
QTestState *from, *to;
|
||||
|
||||
if (test_migrate_start(&from, &to, uri, false, false)) {
|
||||
if (test_migrate_start(&from, &to, uri, false, false, NULL, NULL)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -916,7 +927,7 @@ static void test_ignore_shared(void)
|
||||
char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs);
|
||||
QTestState *from, *to;
|
||||
|
||||
if (test_migrate_start(&from, &to, uri, false, true)) {
|
||||
if (test_migrate_start(&from, &to, uri, false, true, NULL, NULL)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -951,7 +962,7 @@ static void test_xbzrle(const char *uri)
|
||||
{
|
||||
QTestState *from, *to;
|
||||
|
||||
if (test_migrate_start(&from, &to, uri, false, false)) {
|
||||
if (test_migrate_start(&from, &to, uri, false, false, NULL, NULL)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1003,7 +1014,8 @@ static void test_precopy_tcp(void)
|
||||
char *uri;
|
||||
QTestState *from, *to;
|
||||
|
||||
if (test_migrate_start(&from, &to, "tcp:127.0.0.1:0", false, false)) {
|
||||
if (test_migrate_start(&from, &to, "tcp:127.0.0.1:0", false, false,
|
||||
NULL, NULL)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1049,7 +1061,7 @@ static void test_migrate_fd_proto(void)
|
||||
QDict *rsp;
|
||||
const char *error_desc;
|
||||
|
||||
if (test_migrate_start(&from, &to, "defer", false, false)) {
|
||||
if (test_migrate_start(&from, &to, "defer", false, false, NULL, NULL)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1125,6 +1137,68 @@ static void test_migrate_fd_proto(void)
|
||||
test_migrate_end(from, to, true);
|
||||
}
|
||||
|
||||
static void do_test_validate_uuid(const char *uuid_arg_src,
|
||||
const char *uuid_arg_dst,
|
||||
bool should_fail, bool hide_stderr)
|
||||
{
|
||||
char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs);
|
||||
QTestState *from, *to;
|
||||
|
||||
if (test_migrate_start(&from, &to, uri, hide_stderr, false,
|
||||
uuid_arg_src, uuid_arg_dst)) {
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* UUID validation is at the begin of migration. So, the main process of
|
||||
* migration is not interesting for us here. Thus, set huge downtime for
|
||||
* very fast migration.
|
||||
*/
|
||||
migrate_set_parameter_int(from, "downtime-limit", 1000000);
|
||||
migrate_set_capability(from, "validate-uuid", true);
|
||||
|
||||
/* Wait for the first serial output from the source */
|
||||
wait_for_serial("src_serial");
|
||||
|
||||
migrate(from, uri, "{}");
|
||||
|
||||
if (should_fail) {
|
||||
qtest_set_expected_status(to, 1);
|
||||
wait_for_migration_fail(from, true);
|
||||
} else {
|
||||
wait_for_migration_complete(from);
|
||||
}
|
||||
|
||||
test_migrate_end(from, to, false);
|
||||
g_free(uri);
|
||||
}
|
||||
|
||||
static void test_validate_uuid(void)
|
||||
{
|
||||
do_test_validate_uuid("-uuid 11111111-1111-1111-1111-111111111111",
|
||||
"-uuid 11111111-1111-1111-1111-111111111111",
|
||||
false, false);
|
||||
}
|
||||
|
||||
static void test_validate_uuid_error(void)
|
||||
{
|
||||
do_test_validate_uuid("-uuid 11111111-1111-1111-1111-111111111111",
|
||||
"-uuid 22222222-2222-2222-2222-222222222222",
|
||||
true, true);
|
||||
}
|
||||
|
||||
static void test_validate_uuid_src_not_set(void)
|
||||
{
|
||||
do_test_validate_uuid(NULL, "-uuid 11111111-1111-1111-1111-111111111111",
|
||||
false, true);
|
||||
}
|
||||
|
||||
static void test_validate_uuid_dst_not_set(void)
|
||||
{
|
||||
do_test_validate_uuid("-uuid 11111111-1111-1111-1111-111111111111", NULL,
|
||||
false, true);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
char template[] = "/tmp/migration-test-XXXXXX";
|
||||
@ -1180,6 +1254,12 @@ int main(int argc, char **argv)
|
||||
/* qtest_add_func("/migration/ignore_shared", test_ignore_shared); */
|
||||
qtest_add_func("/migration/xbzrle/unix", test_xbzrle_unix);
|
||||
qtest_add_func("/migration/fd_proto", test_migrate_fd_proto);
|
||||
qtest_add_func("/migration/validate_uuid", test_validate_uuid);
|
||||
qtest_add_func("/migration/validate_uuid_error", test_validate_uuid_error);
|
||||
qtest_add_func("/migration/validate_uuid_src_not_set",
|
||||
test_validate_uuid_src_not_set);
|
||||
qtest_add_func("/migration/validate_uuid_dst_not_set",
|
||||
test_validate_uuid_dst_not_set);
|
||||
|
||||
ret = g_test_run();
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user