Add a new start hook that takes an opaque pointer so the tests can
stop having to nest hook calls.

Signed-off-by: Fabiano Rosas <[email protected]>
---
 tests/qtest/migration/framework.c |  8 ++++++++
 tests/qtest/migration/framework.h | 16 ++++++++++++++++
 2 files changed, 24 insertions(+)

diff --git a/tests/qtest/migration/framework.c 
b/tests/qtest/migration/framework.c
index f740228cf2..b9bbdca6a9 100644
--- a/tests/qtest/migration/framework.c
+++ b/tests/qtest/migration/framework.c
@@ -591,6 +591,9 @@ static int migrate_postcopy_prepare(QTestState **from_ptr,
 
     if (args->start_hook) {
         args->postcopy_data = args->start_hook(from, to);
+    } else if (args->start_hook_full) {
+        args->postcopy_data = args->start_hook_full(from, to,
+                                                    args->start_hook_data);
     }
 
     migrate_ensure_non_converge(from, args->start.config);
@@ -868,6 +871,9 @@ int test_precopy_common(MigrateCommon *args)
 
     if (args->start_hook) {
         data_hook = args->start_hook(from, to);
+    } else if (args->start_hook_full) {
+        data_hook = args->start_hook_full(from, to,
+                                          args->start_hook_data);
     }
 
     if (args->start.incoming_defer && !args->start.defer_target_connect) {
@@ -1062,6 +1068,8 @@ void test_file_common(MigrateCommon *args, bool stop_src)
 
     if (args->start_hook) {
         data_hook = args->start_hook(from, to);
+    } else if (args->start_hook_full) {
+        data_hook = args->start_hook_full(from, to, args->start_hook_data);
     }
 
     migrate_ensure_converge(from, args->start.config);
diff --git a/tests/qtest/migration/framework.h 
b/tests/qtest/migration/framework.h
index 65c656e0d3..2584599f14 100644
--- a/tests/qtest/migration/framework.h
+++ b/tests/qtest/migration/framework.h
@@ -65,6 +65,19 @@ int migration_env_clean(MigrationTestEnv *env);
 typedef void * (*TestMigrateStartHook)(QTestState *from,
                                        QTestState *to);
 
+
+/*
+ * A hook that runs after the src and dst QEMUs have been created, but
+ * before the migration is started. This can be used to run routines
+ * that require the QTestState object.
+ *
+ * Returns: NULL, or a pointer to opaque state to be
+ *          later passed to the TestMigrateEndHook
+ */
+typedef void * (*TestMigrateStartHookFull)(QTestState *from,
+                                           QTestState *to,
+                                           void *opaque);
+
 /*
  * A hook that runs after the migration has finished,
  * regardless of whether it succeeded or failed, but
@@ -196,6 +209,9 @@ typedef struct {
     /* Optional: callback to run at finish to cleanup */
     TestMigrateEndHook end_hook;
 
+    TestMigrateStartHookFull start_hook_full;
+    void *start_hook_data;
+
     /*
      * Optional: normally we expect the migration process to complete.
      *
-- 
2.51.0


Reply via email to