From: Leonardo Garcia <lagarcia@xxxxxxxxxx> --- ui/vmm-details.ui | 15 +++++++++++++++ virtManager/baseclass.py | 5 +++-- virtManager/details.py | 11 +++++++++-- virtManager/engine.py | 46 +++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 72 insertions(+), 5 deletions(-) diff --git a/ui/vmm-details.ui b/ui/vmm-details.ui index ddb2a71..ea4b53e 100644 --- a/ui/vmm-details.ui +++ b/ui/vmm-details.ui @@ -314,6 +314,21 @@ </object> </child> <child> + <object class="GtkMenuItem" id="details-menu-delete"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">_Delete...</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_details_menu_delete_activate" swapped="no"/> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> <object class="GtkMenuItem" id="details-menu-vm-screenshot"> <property name="visible">True</property> <property name="can_focus">False</property> diff --git a/virtManager/baseclass.py b/virtManager/baseclass.py index 7bc7812..c3a093e 100644 --- a/virtManager/baseclass.py +++ b/virtManager/baseclass.py @@ -194,8 +194,9 @@ class vmmGObjectUI(vmmGObject): self.close() vmmGObject.cleanup(self) self.builder = None - self.topwin.destroy() - self.topwin = None + if self.topwin: + self.topwin.destroy() + self.topwin = None self.uifile = None self.err = None diff --git a/virtManager/details.py b/virtManager/details.py index 8e927b1..1323232 100644 --- a/virtManager/details.py +++ b/virtManager/details.py @@ -329,6 +329,7 @@ class vmmDetails(vmmGObjectUI): "action-exit-app": (GObject.SignalFlags.RUN_FIRST, None, []), "action-view-manager": (GObject.SignalFlags.RUN_FIRST, None, []), "action-migrate-domain": (GObject.SignalFlags.RUN_FIRST, None, [str, str]), + "action-delete-domain": (GObject.SignalFlags.RUN_FIRST, None, [str, str]), "action-clone-domain": (GObject.SignalFlags.RUN_FIRST, None, [str, str]), "details-closed": (GObject.SignalFlags.RUN_FIRST, None, []), "details-opened": (GObject.SignalFlags.RUN_FIRST, None, []), @@ -412,6 +413,7 @@ class vmmDetails(vmmGObjectUI): "on_details_menu_pause_activate": self.control_vm_pause, "on_details_menu_clone_activate": self.control_vm_clone, "on_details_menu_migrate_activate": self.control_vm_migrate, + "on_details_menu_delete_activate": self.control_vm_delete, "on_details_menu_screenshot_activate": self.control_vm_screenshot, "on_details_menu_view_toolbar_activate": self.toggle_toolbar, "on_details_menu_view_manager_activate": self.view_manager, @@ -559,8 +561,9 @@ class vmmDetails(vmmGObjectUI): for serial in self.serial_tabs: self._close_serial_tab(serial) - self.console.cleanup() - self.console = None + if self.console: + self.console.cleanup() + self.console = None self.vm = None self.conn = None @@ -1580,6 +1583,10 @@ class vmmDetails(vmmGObjectUI): self.emit("action-migrate-domain", self.vm.conn.get_uri(), self.vm.get_uuid()) + def control_vm_delete(self, src_ignore): + self.emit("action-delete-domain", + self.vm.conn.get_uri(), self.vm.get_uuid()) + def control_vm_screenshot(self, src_ignore): image = self.console.viewer.get_pixbuf() diff --git a/virtManager/engine.py b/virtManager/engine.py index 16ed552..7ab20e6 100644 --- a/virtManager/engine.py +++ b/virtManager/engine.py @@ -48,6 +48,7 @@ from virtManager.create import vmmCreate from virtManager.host import vmmHost from virtManager.error import vmmErrorDialog from virtManager.systray import vmmSystray +from virtManager.delete import vmmDeleteDialog # Enable this to get a report of leaked objects on app shutdown # gtk3/pygobject has issues here as of Fedora 18 @@ -95,6 +96,7 @@ class vmmEngine(vmmGObject): self.last_timeout = 0 self.systray = None + self.delete_dialog = None self.application = Gtk.Application( application_id="com.redhat.virt-manager", flags=0) @@ -239,7 +241,9 @@ class vmmEngine(vmmGObject): return self.conns[hvuri]["windowDetails"][vmuuid].cleanup() - del(self.conns[hvuri]["windowDetails"][vmuuid]) + if self.conns: + # The cleanup call above might end up emptying the conns dictionary + del(self.conns[hvuri]["windowDetails"][vmuuid]) def _do_conn_changed(self, conn): if (conn.get_state() == conn.STATE_ACTIVE or @@ -373,6 +377,10 @@ class vmmEngine(vmmGObject): self.windowMigrate.cleanup() self.windowMigrate = None + if self.delete_dialog: + self.delete_dialog.cleanup() + self.delete_dialog = None + # Do this last, so any manually 'disconnected' signals # take precedence over cleanup signal removal for uri in self.conns: @@ -594,6 +602,7 @@ class vmmEngine(vmmGObject): obj.connect("action-exit-app", self.exit_app) obj.connect("action-view-manager", self._do_show_manager) obj.connect("action-migrate-domain", self._do_show_migrate) + obj.connect("action-delete-domain", self._do_delete_domain) obj.connect("action-clone-domain", self._do_show_clone) obj.connect("details-opened", self.increment_window_counter) obj.connect("details-closed", self.decrement_window_counter) @@ -984,3 +993,38 @@ class vmmEngine(vmmGObject): logging.debug("Resetting vm '%s'", vm.get_name()) vmmAsyncJob.simple_async_noshow(vm.reset, [], src, _("Error resetting domain")) + + def _do_delete_domain(self, src, uri, uuid): + conn = self._lookup_conn(uri) + vm = conn.get_vm(uuid) + details_dialog = self._get_details_dialog(uri, uuid) + + if vm.is_active(): + if not util.chkbox_helper(src, self.config.get_confirm_delrunningvm, + self.config.set_confirm_delrunningvm, + text1=_("Are you sure you want to force poweroff '%s'?" % + vm.get_name()), + text2=_("In order to delete a running VM, you first need to power " + "it off. This will immediately power off the VM without " + "shutting down the OS and may cause data loss.")): + return + + logging.debug("Forced power off of vm '%s in order to proceed with " + "its deletion'", vm.get_name()) + def tmpcb(job, *args, **kwargs): + ignore = job + vm.destroy() + docb = tmpcb + + asyncjob = vmmAsyncJob(docb, [], _("Forcing VM Power off"), + _("Powering off the VM in order to proceed with its deletion."), + details_dialog.topwin, async=False, show_progress=True) + error, details = asyncjob.run() + if error is not None: + error = _("Error shutting down domain") + ": " + error + src.err.show_err(error, details=details) + return + + if not self.delete_dialog: + self.delete_dialog = vmmDeleteDialog() + self.delete_dialog.show(vm, details_dialog.topwin) \ No newline at end of file -- 1.7.1 _______________________________________________ virt-tools-list mailing list virt-tools-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/virt-tools-list