python/machine.py: fix _popen access

As always, Optional[T] causes problems with unchecked access. Add a
helper that asserts the pipe is present before we attempt to talk with
it.

Signed-off-by: John Snow <jsnow@redhat.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Message-id: 20201006235817.3280413-9-jsnow@redhat.com
Signed-off-by: John Snow <jsnow@redhat.com>
This commit is contained in:
John Snow 2020-10-06 19:58:05 -04:00
parent be1183e52f
commit 9223fda464
1 changed files with 11 additions and 5 deletions

View File

@ -131,7 +131,7 @@ class QEMUMachine:
# Runstate # Runstate
self._qemu_log_path = None self._qemu_log_path = None
self._qemu_log_file = None self._qemu_log_file = None
self._popen = None self._popen: Optional['subprocess.Popen[bytes]'] = None
self._events = [] self._events = []
self._iolog = None self._iolog = None
self._qmp_set = True # Enable QMP monitor by default. self._qmp_set = True # Enable QMP monitor by default.
@ -244,6 +244,12 @@ class QEMUMachine:
"""Returns true if the VM is running.""" """Returns true if the VM is running."""
return self._popen is not None and self._popen.poll() is None return self._popen is not None and self._popen.poll() is None
@property
def _subp(self) -> 'subprocess.Popen[bytes]':
if self._popen is None:
raise QEMUMachineError('Subprocess pipe not present')
return self._popen
def exitcode(self): def exitcode(self):
"""Returns the exit code if possible, or None.""" """Returns the exit code if possible, or None."""
if self._popen is None: if self._popen is None:
@ -254,7 +260,7 @@ class QEMUMachine:
"""Returns the PID of the running process, or None.""" """Returns the PID of the running process, or None."""
if not self.is_running(): if not self.is_running():
return None return None
return self._popen.pid return self._subp.pid
def _load_io_log(self): def _load_io_log(self):
if self._qemu_log_path is not None: if self._qemu_log_path is not None:
@ -415,8 +421,8 @@ class QEMUMachine:
waiting for the QEMU process to terminate. waiting for the QEMU process to terminate.
""" """
self._early_cleanup() self._early_cleanup()
self._popen.kill() self._subp.kill()
self._popen.wait(timeout=60) self._subp.wait(timeout=60)
def _soft_shutdown(self, timeout: Optional[int], def _soft_shutdown(self, timeout: Optional[int],
has_quit: bool = False) -> None: has_quit: bool = False) -> None:
@ -440,7 +446,7 @@ class QEMUMachine:
self._qmp.cmd('quit') self._qmp.cmd('quit')
# May raise subprocess.TimeoutExpired # May raise subprocess.TimeoutExpired
self._popen.wait(timeout=timeout) self._subp.wait(timeout=timeout)
def _do_shutdown(self, timeout: Optional[int], def _do_shutdown(self, timeout: Optional[int],
has_quit: bool = False) -> None: has_quit: bool = False) -> None: