[virt-tools-list] [virt-manager][PATCH v2 2/2] Add delete VM option in console viewer.

lagarcia at linux.vnet.ibm.com lagarcia at linux.vnet.ibm.com
Wed Jun 5 19:40:46 UTC 2013


From: Leonardo Garcia <lagarcia at br.ibm.com>

---
 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




More information about the virt-tools-list mailing list