summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLeonardo Garcia <lagarcia@br.ibm.com>2013-06-18 00:29:20 -0300
committerCole Robinson <crobinso@redhat.com>2013-06-18 08:49:18 -0400
commit660178abe13c8a78c678f179534493b7f3ce827a (patch)
tree6413bcb56223bb70551f28cdc9fd1d2bf062ada8
parent44328b15079768dc7fdd062c9f501d92c615ad8c (diff)
downloadvirt-manager-660178abe13c8a78c678f179534493b7f3ce827a.tar.gz
Permit to delete a running VM.
The VM will be forced off before being deleted. (crobinso: fix a minor pylint violation)
-rw-r--r--ui/vmm-delete.ui46
-rw-r--r--ui/vmm-details.ui1
-rw-r--r--virtManager/console.py10
-rw-r--r--virtManager/delete.py8
-rw-r--r--virtManager/details.py5
-rw-r--r--virtManager/manager.py5
6 files changed, 61 insertions, 14 deletions
diff --git a/ui/vmm-delete.ui b/ui/vmm-delete.ui
index fa1e75e0..7cbab368 100644
--- a/ui/vmm-delete.ui
+++ b/ui/vmm-delete.ui
@@ -116,6 +116,50 @@
</packing>
</child>
<child>
+ <object class="GtkAlignment" id="delete-warn-running-vm-align">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">6</property>
+ <child>
+ <object class="GtkHBox" id="delete-warn-running-vm-box">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">3</property>
+ <child>
+ <object class="GtkImage" id="delete-warn-running-vm-icon">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="stock">gtk-dialog-warning</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="delete-warn-running-vm-label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;small&gt;This VM is currently running and will be forced off before being deleted&lt;/small&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
<object class="GtkCheckButton" id="delete-remove-storage">
<property name="label" translatable="yes">Delete _associated storage files</property>
<property name="visible">True</property>
@@ -129,7 +173,7 @@
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
- <property name="position">1</property>
+ <property name="position">2</property>
</packing>
</child>
</object>
diff --git a/ui/vmm-details.ui b/ui/vmm-details.ui
index c5233727..ea4b53ee 100644
--- a/ui/vmm-details.ui
+++ b/ui/vmm-details.ui
@@ -184,7 +184,6 @@
<property name="can_focus">False</property>
<property name="label" translatable="yes">Virtual _Machine</property>
<property name="use_underline">True</property>
- <signal name="activate" handler="on_details_menu_vm" swapped="no"/>
<child type="submenu">
<object class="GtkMenu" id="virtual_machine1_menu">
<property name="can_focus">False</property>
diff --git a/virtManager/console.py b/virtManager/console.py
index b9186ce3..001318e3 100644
--- a/virtManager/console.py
+++ b/virtManager/console.py
@@ -651,7 +651,10 @@ class vmmConsolePages(vmmGObjectUI):
self.page_changed()
def is_visible(self):
- return self.topwin.get_visible()
+ if self.topwin:
+ return self.topwin.get_visible()
+ else:
+ return False
def _cleanup(self):
self.vm = None
@@ -892,6 +895,9 @@ class vmmConsolePages(vmmGObjectUI):
##########################
def view_vm_status(self):
+ if not self.vm:
+ # window has been closed and no pages to update are available.
+ return
status = self.vm.status()
if status == libvirt.VIR_DOMAIN_SHUTOFF:
self.activate_unavailable_page(_("Guest not running"))
@@ -900,7 +906,6 @@ class vmmConsolePages(vmmGObjectUI):
self.activate_unavailable_page(_("Guest has crashed"))
def close_viewer(self):
- viewport = self.widget("console-gfx-viewport")
if self.viewer is None:
return
@@ -908,6 +913,7 @@ class vmmConsolePages(vmmGObjectUI):
self.viewer = None
w = v.display
+ viewport = self.widget("console-gfx-viewport")
if w and w in viewport.get_children():
viewport.remove(w)
diff --git a/virtManager/delete.py b/virtManager/delete.py
index 2bb44809..23aac1be 100644
--- a/virtManager/delete.py
+++ b/virtManager/delete.py
@@ -99,6 +99,10 @@ class vmmDeleteDialog(vmmGObjectUI):
self.widget("delete-cancel").grab_focus()
+ # Show warning message if VM is running
+ vm_active = self.vm.is_active()
+ self.widget("delete-warn-running-vm-box").set_visible(vm_active)
+
# Disable storage removal by default
self.widget("delete-remove-storage").set_active(True)
self.widget("delete-remove-storage").toggled()
@@ -169,6 +173,10 @@ class vmmDeleteDialog(vmmGObjectUI):
details = ""
try:
+ if self.vm.is_active():
+ logging.debug("Forcing VM '%s' power off.", self.vm.get_name())
+ self.vm.destroy()
+
# Open a seperate connection to install on since this is async
logging.debug("Threading off connection to delete vol.")
newconn = util.dup_conn(self.conn).vmm
diff --git a/virtManager/details.py b/virtManager/details.py
index b40ea47c..b2d496e5 100644
--- a/virtManager/details.py
+++ b/virtManager/details.py
@@ -404,7 +404,6 @@ class vmmDetails(vmmGObjectUI):
"on_details_customize_finish_clicked": self.customize_finish,
"on_details_cancel_customize_clicked": self.close,
- "on_details_menu_vm": self.update_vm_menu,
"on_details_menu_run_activate": self.control_vm_run,
"on_details_menu_poweroff_activate": self.control_vm_shutdown,
"on_details_menu_reboot_activate": self.control_vm_reboot,
@@ -1551,10 +1550,6 @@ class vmmDetails(vmmGObjectUI):
self.vm.get_uuid())
- def update_vm_menu(self, src_ignore):
- delete = bool(self.vm and self.vm.is_runable())
- self.widget("details-menu-delete").set_sensitive(delete)
-
def control_vm_run(self, src_ignore):
self.emit("action-run-domain",
self.vm.conn.get_uri(), self.vm.get_uuid())
diff --git a/virtManager/manager.py b/virtManager/manager.py
index 6b6ceb16..bdc21cfd 100644
--- a/virtManager/manager.py
+++ b/virtManager/manager.py
@@ -1045,15 +1045,12 @@ class vmmManager(vmmGObjectUI):
self.widget("vm-run").set_label(strip_text)
def vm_selected(self, ignore=None):
- conn = self.current_conn()
vm = self.current_vm()
show_open = bool(vm)
show_details = bool(vm)
host_details = bool(len(self.rows))
- delete = bool((vm and vm.is_runable()) or
- (not vm and conn))
show_run = bool(vm and vm.is_runable())
is_paused = bool(vm and vm.is_paused())
if is_paused:
@@ -1073,7 +1070,6 @@ class vmmManager(vmmGObjectUI):
self.widget("menu_edit_details").set_sensitive(show_details)
self.widget("menu_host_details").set_sensitive(host_details)
- self.widget("menu_edit_delete").set_sensitive(delete)
def popup_vm_menu_key(self, widget_ignore, event):
if Gdk.keyval_name(event.keyval) != "Menu":
@@ -1118,7 +1114,6 @@ class vmmManager(vmmGObjectUI):
self.vmmenu_items["resume"].set_sensitive(paused)
self.vmmenu_items["migrate"].set_sensitive(stop)
self.vmmenu_items["clone"].set_sensitive(not ro)
- self.vmmenu_items["delete"].set_sensitive(run)
self.vmmenushutdown_items["poweroff"].set_sensitive(stop)
self.vmmenushutdown_items["reboot"].set_sensitive(stop)