baseclass: Centralize exception reporting

Also add some checks to make sure subclasses always specify a proper
cleanup method
This commit is contained in:
Cole Robinson 2011-07-23 21:16:54 -04:00
parent d5a59426ba
commit 5f22897f94
31 changed files with 181 additions and 244 deletions

View File

@ -51,4 +51,7 @@ class vmmAbout(vmmGObjectUI):
self.topwin.hide()
return 1
def _cleanup(self):
pass
vmmGObjectUI.type_register(vmmAbout)

View File

@ -154,20 +154,16 @@ class vmmAddHardware(vmmGObjectUI):
return 1
def cleanup(self):
def _cleanup(self):
self.close()
vmmGObjectUI.cleanup(self)
try:
self.vm = None
self.conn = None
self._dev = None
self.vm = None
self.conn = None
self._dev = None
if self.storage_browser:
self.storage_browser.cleanup()
self.storage_browser = None
except:
logging.exception("Error cleaning up addhw")
if self.storage_browser:
self.storage_browser.cleanup()
self.storage_browser = None
def remove_timers(self):
try:

View File

@ -163,8 +163,7 @@ class vmmAsyncJob(vmmGObjectUI):
self.cleanup()
return self._get_error()
def cleanup(self):
vmmGObjectUI.cleanup(self)
def _cleanup(self):
self.bg_thread = None
self.cancel_job = None
self.cancel_args = None

View File

@ -82,9 +82,14 @@ class vmmGObject(GObject):
self.disconnect(h)
for h in self._gobject_timeouts[:]:
self.remove_gobject_timeout(h)
self._cleanup()
except:
logging.exception("Error cleaning up %s" % self)
def _cleanup(self):
raise NotImplementedError("_cleanup must be implemented in subclass")
# Custom signal implementations
# These functions duplicate gobject signal behavior since it's
# needed for some TUI functionality
@ -254,6 +259,9 @@ class vmmGObjectUI(vmmGObject):
self.gladefile = None
self.err = None
def _cleanup(self):
raise NotImplementedError("_cleanup must be implemented in subclass")
def close(self, ignore1=None, ignore2=None):
pass

View File

@ -18,8 +18,6 @@
# MA 02110-1301 USA.
#
import logging
import virtManager.uihelpers as uihelpers
import virtManager.util as util
from virtManager.baseclass import vmmGObjectUI
@ -62,21 +60,16 @@ class vmmChooseCD(vmmGObjectUI):
self.topwin.set_transient_for(parent)
self.topwin.show()
def cleanup(self):
def _cleanup(self):
self.close()
try:
self.vm = None
self.conn = None
self.disk = None
self.vm = None
self.conn = None
self.disk = None
if self.storage_browser:
self.storage_browser.cleanup()
self.storage_browser = None
except:
logging.exception("Error cleaning up choosecd")
vmmGObjectUI.cleanup(self)
if self.storage_browser:
self.storage_browser.cleanup()
self.storage_browser = None
def reset_state(self):
cd_path = self.widget("cd-path")

View File

@ -196,7 +196,7 @@ class vmmCloneVM(vmmGObjectUI):
return 1
def cleanup(self):
def _cleanup(self):
self.close()
self.conn = None
@ -211,8 +211,6 @@ class vmmCloneVM(vmmGObjectUI):
self.storage_browser.cleanup()
self.storage_browser = None
vmmGObjectUI.cleanup(self)
def change_mac_close(self, ignore1=None, ignore2=None):
self.change_mac.hide()
return 1

View File

@ -107,6 +107,9 @@ class vmmConnect(vmmGObjectUI):
self.topwin.set_transient_for(parent)
self.topwin.present()
def _cleanup(self):
pass
def set_initial_state(self):
stock_img = gtk.image_new_from_stock(gtk.STOCK_CONNECT,
gtk.ICON_SIZE_BUTTON)

View File

@ -914,9 +914,7 @@ class vmmConnection(vmmGObject):
self._change_state(self.STATE_DISCONNECTED)
def cleanup(self):
# Do this first, so signals are unregistered before we change state
vmmGObject.cleanup(self)
def _cleanup(self):
self.close()
self.connectError = None

View File

@ -210,11 +210,9 @@ class Viewer(vmmGObject):
def close(self):
raise NotImplementedError()
def cleanup(self):
def _cleanup(self):
self.close()
vmmGObject.cleanup(self)
if self.display:
self.display.destroy()
self.display = None
@ -590,8 +588,7 @@ class vmmConsolePages(vmmGObjectUI):
return 1
return 0
def cleanup(self):
vmmGObjectUI.cleanup(self)
def _cleanup(self):
self.vm = None
if self.viewer:

View File

@ -157,7 +157,7 @@ class vmmCreate(vmmGObjectUI):
return 1
def cleanup(self):
def _cleanup(self):
self.close()
self.remove_conn()
@ -170,14 +170,9 @@ class vmmCreate(vmmGObjectUI):
self.disk = None
self.nic = None
try:
if self.storage_browser:
self.storage_browser.cleanup()
self.storage_browser = None
except:
logging.exception("Error cleaning up create")
vmmGObjectUI.cleanup(self)
if self.storage_browser:
self.storage_browser.cleanup()
self.storage_browser = None
def remove_timers(self):
try:

View File

@ -151,25 +151,20 @@ class vmmCreateInterface(vmmGObjectUI):
return 1
def cleanup(self):
def _cleanup(self):
self.close()
try:
self.conn = None
self.interface = None
self.conn = None
self.interface = None
self.ip_config.destroy()
self.ip_config = None
self.ip_config.destroy()
self.ip_config = None
self.bridge_config.destroy()
self.bridge_config = None
self.bridge_config.destroy()
self.bridge_config = None
self.bond_config.destroy()
self.bond_config = None
except:
logging.exception("Error cleaning up addiface")
vmmGObjectUI.cleanup(self)
self.bond_config.destroy()
self.bond_config = None
###########################
# Initialization routines #

View File

@ -80,12 +80,10 @@ class vmmCreateNetwork(vmmGObjectUI):
self.topwin.hide()
return 1
def cleanup(self):
def _cleanup(self):
self.close()
self.conn = None
vmmGObjectUI.cleanup(self)
def set_initial_state(self):
notebook = self.widget("create-pages")
notebook.set_show_tabs(False)

View File

@ -113,14 +113,12 @@ class vmmCreatePool(vmmGObjectUI):
self.topwin.hide()
return 1
def cleanup(self):
def _cleanup(self):
self.close()
self.conn = None
self._pool = None
vmmGObjectUI.cleanup(self)
def set_initial_state(self):
self.widget("pool-pages").set_show_tabs(False)

View File

@ -80,15 +80,11 @@ class vmmCreateVolume(vmmGObjectUI):
self.set_modal(False)
return 1
def cleanup(self):
def _cleanup(self):
self.close()
vmmGObjectUI.cleanup(self)
try:
self.conn = None
self.parent_pool = None
except:
logging.exception("Error cleaning up addvol")
self.conn = None
self.parent_pool = None
def set_name_hint(self, hint):
self.name_hint = hint

View File

@ -81,14 +81,12 @@ class vmmDeleteDialog(vmmGObjectUI):
self.conn = None
return 1
def cleanup(self):
def _cleanup(self):
self.close()
self.vm = None
self.conn = None
vmmGObjectUI.cleanup(self)
def reset_state(self):
# Set VM name in title'

View File

@ -476,38 +476,33 @@ class vmmDetails(vmmGObjectUI):
self.hw_selected()
self.refresh_vm_state()
def cleanup(self):
def _cleanup(self):
self.close()
try:
self.oldhwrow = None
self.oldhwrow = None
if self.addhw:
self.addhw.cleanup()
self.addhw = None
if self.addhw:
self.addhw.cleanup()
self.addhw = None
if self.storage_browser:
self.storage_browser.cleanup()
self.storage_browser = None
if self.storage_browser:
self.storage_browser.cleanup()
self.storage_browser = None
for key in self.media_choosers:
if self.media_choosers[key]:
self.media_choosers[key].cleanup()
self.media_choosers = {}
for key in self.media_choosers:
if self.media_choosers[key]:
self.media_choosers[key].cleanup()
self.media_choosers = {}
for serial in self.serial_tabs:
self._close_serial_tab(serial)
for serial in self.serial_tabs:
self._close_serial_tab(serial)
self.console.cleanup()
self.console = None
self.console.cleanup()
self.console = None
self.vm = None
self.conn = None
self.addhwmenu = None
except:
logging.exception("Error cleaning up details")
vmmGObjectUI.cleanup(self)
self.vm = None
self.conn = None
self.addhwmenu = None
def show(self):
vis = self.is_visible()

View File

@ -174,7 +174,6 @@ class vmmDomain(vmmLibvirtObject):
self._libvirt_init()
def _libvirt_init(self):
"""
Initialization to do if backed by a libvirt virDomain

View File

@ -465,56 +465,52 @@ class vmmEngine(vmmGObject):
not self.systray.is_visible()):
self.exit_app(src)
def cleanup(self):
try:
vmmGObject.cleanup(self)
uihelpers.cleanup()
halhelper.cleanup()
self.err = None
def _cleanup(self):
uihelpers.cleanup()
halhelper.cleanup()
self.err = None
if self.inspection:
self.inspection.cleanup()
self.inspection = None
if self.inspection:
self.inspection.cleanup()
self.inspection = None
if self.timer != None:
gobject.source_remove(self.timer)
if self.timer != None:
gobject.source_remove(self.timer)
if self.systray:
self.systray.cleanup()
self.systray = None
if self.systray:
self.systray.cleanup()
self.systray = None
self.get_manager()
if self.windowManager:
self.windowManager.cleanup()
self.windowManager = None
self.get_manager()
if self.windowManager:
self.windowManager.cleanup()
self.windowManager = None
if self.windowPreferences:
self.windowPreferences.cleanup()
self.windowPreferences = None
if self.windowPreferences:
self.windowPreferences.cleanup()
self.windowPreferences = None
if self.windowAbout:
self.windowAbout.cleanup()
self.windowAbout = None
if self.windowAbout:
self.windowAbout.cleanup()
self.windowAbout = None
if self.windowConnect:
self.windowConnect.cleanup()
self.windowConnect = None
if self.windowConnect:
self.windowConnect.cleanup()
self.windowConnect = None
if self.windowCreate:
self.windowCreate.cleanup()
self.windowCreate = None
if self.windowCreate:
self.windowCreate.cleanup()
self.windowCreate = None
if self.windowMigrate:
self.windowMigrate.cleanup()
self.windowMigrate = None
if self.windowMigrate:
self.windowMigrate.cleanup()
self.windowMigrate = None
# Do this last, so any manually 'disconnected' signals
# take precedence over cleanup signal removal
for uri in self.conns:
self.cleanup_conn(uri)
self.conns = {}
except:
logging.exception("Error cleaning up engine")
# Do this last, so any manually 'disconnected' signals
# take precedence over cleanup signal removal
for uri in self.conns:
self.cleanup_conn(uri)
self.conns = {}
def exit_app(self, src):
if self.err is None:

View File

@ -55,6 +55,9 @@ class vmmErrorDialog(vmmGObject):
self._parent = parent
self._simple = None
def _cleanup(self):
pass
def set_parent(self, parent):
self._parent = parent
def get_parent(self):

View File

@ -98,8 +98,7 @@ class vmmHalHelper(vmmGObject):
self._dbus_connect()
def cleanup(self):
vmmGObject.cleanup(self)
def _cleanup(self):
self.bus = None
self.hal_iface = None

View File

@ -305,40 +305,35 @@ class vmmHost(vmmGObjectUI):
return 1
def cleanup(self):
def _cleanup(self):
self.close()
try:
self.conn = None
self.conn = None
if self.addnet:
self.addnet.cleanup()
self.addnet = None
if self.addnet:
self.addnet.cleanup()
self.addnet = None
if self.addpool:
self.addpool.cleanup()
self.addpool = None
if self.addpool:
self.addpool.cleanup()
self.addpool = None
if self.addvol:
self.addvol.cleanup()
self.addvol = None
if self.addvol:
self.addvol.cleanup()
self.addvol = None
if self.addinterface:
self.addinterface.cleanup()
self.addinterface = None
if self.addinterface:
self.addinterface.cleanup()
self.addinterface = None
self.volmenu.destroy()
self.volmenu = None
self.volmenu.destroy()
self.volmenu = None
self.cpu_usage_graph.destroy()
self.cpu_usage_graph = None
self.cpu_usage_graph.destroy()
self.cpu_usage_graph = None
self.memory_usage_graph.destroy()
self.memory_usage_graph = None
except:
logging.exception("Error cleaning up host dialog")
vmmGObjectUI.cleanup(self)
self.memory_usage_graph.destroy()
self.memory_usage_graph = None
def show_help(self, src_ignore):
self.emit("action-show-help", "virt-manager-host-window")

View File

@ -43,16 +43,11 @@ class vmmInspection(vmmGObject):
self._conns = dict()
self._vmseen = dict()
def cleanup(self):
try:
vmmGObject.cleanup(self)
self._thread = None
self._q = Queue()
self._conns = {}
self._vmseen = {}
except:
pass
def _cleanup(self):
self._thread = None
self._q = Queue()
self._conns = {}
self._vmseen = {}
# Called by the main thread whenever a connection is added or
# removed. We tell the inspection thread, so it can track

View File

@ -46,6 +46,9 @@ class vmmLibvirtObject(vmmGObject):
self._inactive_xml_flags = 0
self._active_xml_flags = 0
def _cleanup(self):
pass
def _get_conn(self):
return self._conn
conn = property(_get_conn)

View File

@ -18,8 +18,6 @@
# MA 02110-1301 USA.
#
import logging
import gtk
import virtManager.uihelpers as uihelpers
@ -186,36 +184,29 @@ class vmmManager(vmmGObjectUI):
return 1
def cleanup(self):
def _cleanup(self):
self.close()
try:
self.rows = None
self.rows = None
self.diskcol = None
self.guestcpucol = None
self.hostcpucol = None
self.netcol = None
self.diskcol = None
self.guestcpucol = None
self.hostcpucol = None
self.netcol = None
if self.delete_dialog:
self.delete_dialog.cleanup()
self.delete_dialog = None
self.vmmenu.destroy()
self.vmmenu = None
self.vmmenu_items = None
self.vmmenushutdown.destroy()
self.vmmenushutdown = None
self.vmmenushutdown_items = None
self.connmenu.destroy()
self.connmenu = None
self.connmenu_items = None
except:
logging.exception("Error cleaning up manager")
vmmGObjectUI.cleanup(self)
if self.delete_dialog:
self.delete_dialog.cleanup()
self.delete_dialog = None
self.vmmenu.destroy()
self.vmmenu = None
self.vmmenu_items = None
self.vmmenushutdown.destroy()
self.vmmenushutdown = None
self.vmmenushutdown_items = None
self.connmenu.destroy()
self.connmenu = None
self.connmenu_items = None
def is_visible(self):
return bool(self.topwin.flags() & gtk.VISIBLE)

View File

@ -67,6 +67,9 @@ class vmmMediaDevice(vmmGObject):
self.nodedev_obj = nodedev_obj
self.poll_signal = None
def _cleanup(self):
pass
def get_path(self):
return self.path

View File

@ -92,7 +92,7 @@ class vmmMigrateDialog(vmmGObjectUI):
self.widget("migrate-advanced-expander").set_expanded(False)
return 1
def cleanup(self):
def _cleanup(self):
self.close()
self.vm = None
@ -103,8 +103,6 @@ class vmmMigrateDialog(vmmGObjectUI):
# Not sure why we need to do this manually, but it matters
self.widget("migrate-dest").get_model().clear()
vmmGObjectUI.cleanup(self)
def init_state(self):
# [hostname, conn, can_migrate, tooltip]
dest_model = gtk.ListStore(str, object, bool, str)

View File

@ -31,6 +31,9 @@ class vmmNetDevice(vmmGObject):
# Used for HAL backend population
self.hal_path = hal_path
def _cleanup(self):
pass
def get_name(self):
return self.name

View File

@ -101,6 +101,9 @@ class vmmPreferences(vmmGObjectUI):
self.topwin.set_transient_for(parent)
self.topwin.present()
def _cleanup(self):
pass
#########################
# Config Change Options #
#########################

View File

@ -41,8 +41,7 @@ class ConsoleConnection(vmmGObject):
self.vm = vm
self.conn = vm.conn
def cleanup(self):
vmmGObject.cleanup(self)
def _cleanup(self):
self.close()
self.vm = None
@ -67,9 +66,6 @@ class LocalConsoleConnection(ConsoleConnection):
self.source = None
self.origtermios = None
def cleanup(self):
ConsoleConnection.cleanup(self)
def open(self, dev, terminal):
if self.fd != None:
self.close()
@ -138,10 +134,6 @@ class LibvirtConsoleConnection(ConsoleConnection):
self.streamToTerminal = ""
self.terminalToStream = ""
def cleanup(self):
ConsoleConnection.cleanup(self)
self.close()
def _event_on_stream(self, stream, events, opaque):
ignore = stream
terminal = opaque
@ -357,9 +349,7 @@ class vmmSerialConsole(vmmGObject):
self.box.append_page(self.error_label)
self.box.show_all()
def cleanup(self):
vmmGObject.cleanup(self)
def _cleanup(self):
self.console.cleanup()
self.console = None

View File

@ -81,19 +81,15 @@ class vmmStorageBrowser(vmmGObjectUI):
self.addvol.close()
return 1
def cleanup(self):
def _cleanup(self):
self.close()
vmmGObjectUI.cleanup(self)
try:
self.remove_conn()
self.conn = None
self.remove_conn()
self.conn = None
if self.addvol:
self.addvol.cleanup()
self.addvol = None
except:
logging.exception("Error cleaning up storagebrowse")
if self.addvol:
self.addvol.cleanup()
self.addvol = None
def remove_conn(self):
if not self.conn:

View File

@ -18,8 +18,6 @@
# MA 02110-1301 USA.
#
import logging
import gtk
from virtManager.baseclass import vmmGObject
@ -78,19 +76,14 @@ class vmmSystray(vmmGObject):
self.systray_icon and
self.systray_icon.is_embedded())
def cleanup(self):
vmmGObject.cleanup(self)
def _cleanup(self):
self.err = None
try:
self.err = None
if self.systray_menu:
self.systray_menu.destroy()
self.systray_menu = None
if self.systray_menu:
self.systray_menu.destroy()
self.systray_menu = None
self.systray_icon = None
except:
logging.exception("Error cleaning up systray")
self.systray_icon = None
# Initialization routines