python/machine.py: Prohibit multiple shutdown() calls

If the VM is not launched, don't try to shut it down. As a change,
_post_shutdown now unconditionally also calls _early_cleanup in order to
offer comprehensive object cleanup in failure cases.

As a courtesy, treat it as a NOP instead of rejecting it as an
error. This is slightly nicer for acceptance tests where vm.shutdown()
is issued unconditionally in tearDown callbacks.

Signed-off-by: John Snow <jsnow@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Message-Id: <20200710050649.32434-6-jsnow@redhat.com>
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
This commit is contained in:
John Snow 2020-07-10 01:06:42 -04:00 committed by Philippe Mathieu-Daudé
parent 3a7d64b6fc
commit a3842cb078

View File

@ -294,6 +294,13 @@ class QEMUMachine:
self._qmp.accept()
def _post_shutdown(self):
"""
Called to cleanup the VM instance after the process has exited.
May also be called after a failed launch.
"""
# Comprehensive reset for the failed launch case:
self._early_cleanup()
if self._qmp:
self._qmp.close()
self._qmp = None
@ -339,7 +346,7 @@ class QEMUMachine:
self._launch()
self._launched = True
except:
self.shutdown()
self._post_shutdown()
LOG.debug('Error launching VM')
if self._qemu_full_args:
@ -368,6 +375,8 @@ class QEMUMachine:
def _early_cleanup(self) -> None:
"""
Perform any cleanup that needs to happen before the VM exits.
Called additionally by _post_shutdown for comprehensive cleanup.
"""
# If we keep the console socket open, we may deadlock waiting
# for QEMU to exit, while QEMU is waiting for the socket to
@ -388,6 +397,9 @@ class QEMUMachine:
"""
Terminate the VM and clean up
"""
if not self._launched:
return
self._early_cleanup()
if self.is_running():