From b7af2e4d5cbcec43b0d4544d473a3ba457a66190 Mon Sep 17 00:00:00 2001 From: grossmj Date: Wed, 12 Jun 2019 14:23:03 +0200 Subject: [PATCH 1/2] Refresh mounted media after ISO switch. --- gns3server/compute/qemu/qemu_vm.py | 28 ++++++++++++++++--- .../handlers/api/compute/qemu_handler.py | 5 +++- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/gns3server/compute/qemu/qemu_vm.py b/gns3server/compute/qemu/qemu_vm.py index af1cf859..0e560f0d 100644 --- a/gns3server/compute/qemu/qemu_vm.py +++ b/gns3server/compute/qemu/qemu_vm.py @@ -434,10 +434,30 @@ class QemuVM(BaseNode): :param cdrom_image: QEMU cdrom image path """ - self._cdrom_image = self.manager.get_abs_image_path(cdrom_image, self.project.path) - log.info('QEMU VM "{name}" [{id}] has set the QEMU cdrom image path to {cdrom_image}'.format(name=self._name, - id=self._id, - cdrom_image=self._cdrom_image)) + if cdrom_image: + self._cdrom_image = self.manager.get_abs_image_path(cdrom_image, self.project.path) + + log.info('QEMU VM "{name}" [{id}] has set the QEMU cdrom image path to {cdrom_image}'.format(name=self._name, + id=self._id, + cdrom_image=self._cdrom_image)) + else: + self._cdrom_image = "" + + async def update_cdrom_image(self): + """ + Update the cdrom image path for the Qemu guest OS + """ + + if self.is_running(): + if self._cdrom_image: + self._cdrom_option() # this will check the cdrom image is accessible + await self._control_vm("change ide1-cd0 {}".format(self._cdrom_image)) + log.info('QEMU VM "{name}" [{id}] has changed the cdrom image path to {cdrom_image} for the guest OS'.format(name=self._name, + id=self._id, + cdrom_image=self._cdrom_image)) + else: + await self._control_vm("eject ide1-cd0") + log.info('QEMU VM "{name}" [{id}] has ejected the cdrom image for the guest OS'.format(name=self._name, id=self._id)) @property def bios_image(self): diff --git a/gns3server/handlers/api/compute/qemu_handler.py b/gns3server/handlers/api/compute/qemu_handler.py index 30453f6e..0c3779cc 100644 --- a/gns3server/handlers/api/compute/qemu_handler.py +++ b/gns3server/handlers/api/compute/qemu_handler.py @@ -116,7 +116,7 @@ class QEMUHandler: description="Update a Qemu VM instance", input=QEMU_UPDATE_SCHEMA, output=QEMU_OBJECT_SCHEMA) - def update(request, response): + async def update(request, response): qemu_manager = Qemu.instance() vm = qemu_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"]) @@ -125,6 +125,9 @@ class QEMUHandler: 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() vm.updated() response.json(vm) From 7a463676cd2ac52b3b2d3302dd96ca6b3bab6630 Mon Sep 17 00:00:00 2001 From: grossmj Date: Sat, 15 Jun 2019 15:20:21 +0200 Subject: [PATCH 2/2] Eject cdrom first before changing an image. Use 'force' when ejecting. --- gns3server/compute/qemu/qemu_vm.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/gns3server/compute/qemu/qemu_vm.py b/gns3server/compute/qemu/qemu_vm.py index 0e560f0d..62eaef90 100644 --- a/gns3server/compute/qemu/qemu_vm.py +++ b/gns3server/compute/qemu/qemu_vm.py @@ -451,13 +451,14 @@ class QemuVM(BaseNode): if self.is_running(): if self._cdrom_image: self._cdrom_option() # this will check the cdrom image is accessible + await self._control_vm("eject -f ide1-cd0") await self._control_vm("change ide1-cd0 {}".format(self._cdrom_image)) - log.info('QEMU VM "{name}" [{id}] has changed the cdrom image path to {cdrom_image} for the guest OS'.format(name=self._name, - id=self._id, - cdrom_image=self._cdrom_image)) + log.info('QEMU VM "{name}" [{id}] has changed the cdrom image path to {cdrom_image}'.format(name=self._name, + id=self._id, + cdrom_image=self._cdrom_image)) else: - await self._control_vm("eject ide1-cd0") - log.info('QEMU VM "{name}" [{id}] has ejected the cdrom image for the guest OS'.format(name=self._name, id=self._id)) + await self._control_vm("eject -f ide1-cd0") + log.info('QEMU VM "{name}" [{id}] has ejected the cdrom image'.format(name=self._name, id=self._id)) @property def bios_image(self):