On 14.08.26 10:06, Thomas Huth wrote:
On 29/07/2026 11.31, Vladimir Sementsov-Ogievskiy wrote:
This is need to test cpr-transfer migration, as on started
target QMP is not available until we call "migrate" on
source.
Signed-off-by: Vladimir Sementsov-Ogievskiy <[email protected]>
---
python/qemu/machine/machine.py | 53 ++++++++++++++++++----------------
1 file changed, 28 insertions(+), 25 deletions(-)
diff --git a/python/qemu/machine/machine.py b/python/qemu/machine/machine.py
index bfb59d4c0bf..00154b8591f 100644
--- a/python/qemu/machine/machine.py
+++ b/python/qemu/machine/machine.py
@@ -449,17 +449,17 @@ def _post_shutdown(self) -> None:
self._user_killed = False
self._launched = False
- def launch(self) -> None:
+ def launch(self, do_start_process=True, do_qmp_connect=True) -> None:
Could you drop the "do_" prefix from the parameter names? ... that does not
provide any additional value here, I think.
"""
Launch the VM and make sure we cleanup and expose the
command line/output in case of exception
"""
- if self._launched:
+ if self._launched and do_start_process:
raise QEMUMachineError('VM already launched')
try:
- self._launch()
+ self._launch(do_start_process, do_qmp_connect)
except BaseException as exc:
# We may have launched the process but it may
# have exited before we could connect via QMP.
@@ -482,31 +482,34 @@ def launch(self) -> None:
# that exception. However, we still want to clean up.
raise
- def _launch(self) -> None:
+ def _launch(self, do_start_process=True, do_qmp_connect=True) -> None:
"""
Launch the VM and establish a QMP connection
"""
- self._pre_launch()
- LOG.debug('VM launch command: %r', ' '.join(self._qemu_full_args))
- # Log a simplified, developer-runnable command:
- # Exclude harness-managed infrastructure args (harness_args)
- # and wrapper.
- debug_cmd = [self._binary]
- debug_cmd.extend(self._console_args(interactive=True))
- debug_cmd.extend(self._base_args)
- debug_cmd.extend(self._args)
- LOG.debug('Developer-runnable command: %r', ' '.join(debug_cmd))
-
- # Cleaning up of this subprocess is guaranteed by _do_shutdown.
- # pylint: disable=consider-using-with
- self._popen = subprocess.Popen(self._qemu_full_args,
- stdin=subprocess.DEVNULL,
- stdout=self._qemu_log_file,
- stderr=subprocess.STDOUT,
- shell=False,
- close_fds=False)
- self._launched = True
- self._post_launch()
+ if do_start_process:
+ self._pre_launch()
+ LOG.debug('VM launch command: %r', ' '.join(self._qemu_full_args))
+ # Log a simplified, developer-runnable command:
+ # Exclude harness-managed infrastructure args (harness_args)
+ # and wrapper.
+ debug_cmd = [self._binary]
+ debug_cmd.extend(self._console_args(interactive=True))
+ debug_cmd.extend(self._base_args)
+ debug_cmd.extend(self._args)
+ LOG.debug('Developer-runnable command: %r', ' '.join(debug_cmd))
+
+ # Cleaning up of this subprocess is guaranteed by _do_shutdown.
+ # pylint: disable=consider-using-with
+ self._popen = subprocess.Popen(self._qemu_full_args,
+ stdin=subprocess.DEVNULL,
+ stdout=self._qemu_log_file,
+ stderr=subprocess.STDOUT,
+ shell=False,
+ close_fds=False)
+ self._launched = True
+
+ if do_qmp_connect:
+ self._post_launch()
Honestly, I think this is quite confusing that callers now have to run
"launch()" twice if they want to have a staged initialization.
Could you maybe drop the do_start_process parameter, just keep the qmp_connect
parameter here. Then wrap the QMP connection stuff in a new separate function.
So callers could do:
vm.launch(qmp_connect=False)
... do other stuff ...
vm.qmp_connect()
# instead of vm.launch(do_start_process=False, do_qmp_connect=True)\
Yes, that looks better, will do, thanks!
--
Best regards,
Vladimir