Implement full restart if user reload a Qemu VM which has been updated. Fixes https://github.com/GNS3/gns3-gui/issues/3038

This commit is contained in:
grossmj 2020-09-12 23:07:39 +09:30
parent 90ecefd455
commit 992cd7fc6c
2 changed files with 22 additions and 9 deletions

View File

@ -81,12 +81,13 @@ class QemuVM(BaseNode):
self._execute_lock = asyncio.Lock()
self._local_udp_tunnels = {}
self._guest_cid = None
self._command_line_changed = False
# QEMU VM settings
if qemu_path:
try:
self.qemu_path = qemu_path
except QemuError as e:
except QemuError:
# If the binary is not found for topologies 1.4 and later
# search via the platform otherwise use the binary name
if platform:
@ -444,7 +445,18 @@ class QemuVM(BaseNode):
else:
self._cdrom_image = ""
async def update_cdrom_image(self):
async def update(self, name, value):
"""
Update Qemu VM properties.
"""
setattr(self, name, value)
if name == "cdrom_image":
# let the guest know about the new cdrom image
await self._update_cdrom_image()
self._command_line_changed = True
async def _update_cdrom_image(self):
"""
Update the cdrom image path for the Qemu guest OS
"""
@ -1007,6 +1019,7 @@ class QemuVM(BaseNode):
stderr=subprocess.STDOUT,
cwd=self.working_dir)
log.info('QEMU VM "{}" started PID={}'.format(self._name, self._process.pid))
self._command_line_changed = False
self.status = "started"
monitor_process(self._process, self._termination_callback)
except (OSError, subprocess.SubprocessError, UnicodeEncodeError) as e:
@ -1282,6 +1295,10 @@ class QemuVM(BaseNode):
Reloads this QEMU VM.
"""
if self._command_line_changed:
await self.stop()
await self.start()
else:
await self._control_vm("system_reset")
log.debug("QEMU VM has been reset")
@ -2015,7 +2032,7 @@ class QemuVM(BaseNode):
command.extend(["-name", self._name])
command.extend(["-m", "{}M".format(self._ram)])
command.extend(["-smp", "cpus={}".format(self._cpus)])
if (await self._run_with_hardware_acceleration(self.qemu_path, self._options)):
if await self._run_with_hardware_acceleration(self.qemu_path, self._options):
if sys.platform.startswith("linux"):
command.extend(["-enable-kvm"])
version = await self.manager.get_qemu_version(self.qemu_path)

View File

@ -124,11 +124,7 @@ class QEMUHandler:
vm.console = request.json.pop("console", vm.console)
for name, value in request.json.items():
if hasattr(vm, name) and getattr(vm, name) != value:
setattr(vm, name, value)
if name == "cdrom_image":
# let the guest know about the new cdrom image
await vm.update_cdrom_image()
await vm.update(name, value)
vm.updated()
response.json(vm)