A notification stream with process monitoring

This commit is contained in:
Julien Duponchelle committed 2015-05-01 13:20:30 +02:00
1 parent 57f5e7a7d9
commit e9ec5c8a37
15 files changed
+256 -25

No files matched your search

+18 -4
View File
@@ -35,6 +35,8 @@ from ..nios.nio_udp import NIOUDP
from ..nios.nio_tap import NIOTAP
from ..base_vm import BaseVM
from ...schemas.qemu import QEMU_OBJECT_SCHEMA
from ...utils.asyncio import monitor_process
from ...config import Config
import logging
log = logging.getLogger(__name__)
@@ -62,7 +64,6 @@ class QemuVM(BaseVM):
self._host = server_config.get("host", "127.0.0.1")
self._monitor_host = server_config.get("monitor_host", "127.0.0.1")
self._command = []
self._started = False
self._process = None
self._cpulimit_process = None
self._monitor = None
@@ -581,7 +582,9 @@ class QemuVM(BaseVM):
stderr=subprocess.STDOUT,
cwd=self.working_dir)
log.info('QEMU VM "{}" started PID={}'.format(self._name, self._process.pid))
self._started = True
self.status = "started"
monitor_process(self._process, self._termination_callback)
except (OSError, subprocess.SubprocessError) as e:
stdout = self.read_stdout()
log.error("Could not start QEMU {}: {}\n{}".format(self.qemu_path, e, stdout))
@@ -591,6 +594,17 @@ class QemuVM(BaseVM):
if self._cpu_throttling:
self._set_cpu_throttling()
def _termination_callback(self, returncode):
"""
Called when the process is killed
:param returncode: Process returncode
"""
if self.started:
log.info("Process Qemu is dead. Return code: %d", returncode)
self.status = "stopped"
self._process = None
@asyncio.coroutine
def stop(self):
"""
@@ -608,7 +622,7 @@ class QemuVM(BaseVM):
if self._process.returncode is None:
log.warn('QEMU VM "{}" PID={} is still running'.format(self._name, self._process.pid))
self._process = None
self._started = False
self.status = "stopped"
self._stop_cpulimit()
@asyncio.coroutine
@@ -807,7 +821,7 @@ class QemuVM(BaseVM):
:returns: boolean
"""
return self._started
return self.status == "started"
def read_stdout(self):
"""