virtManager: add coverage annotations and remove dead code

Signed-off-by: Cole Robinson <crobinso@redhat.com>
This commit is contained in:
Cole Robinson 2020-08-20 13:34:01 -04:00
parent 27d1b4d4bd
commit 886339e8dd
19 changed files with 76 additions and 111 deletions

View File

@ -16,7 +16,7 @@ class vmmAbout(vmmGObjectUI):
if not cls._instance:
cls._instance = vmmAbout()
cls._instance.show(parentobj.topwin)
except Exception as e:
except Exception as e: # pragma: no cover
parentobj.err.show_err(
_("Error launching 'About' dialog: %s") % str(e))

View File

@ -246,11 +246,6 @@ class vmmAsyncJob(vmmGObjectUI):
def has_error(self):
return bool(self._error_info)
def set_extra_data(self, data):
self._data = data
def get_extra_data(self):
return self._data
def can_cancel(self):
return bool(self.cancel_cb)

View File

@ -231,7 +231,7 @@ class vmmConfig(object):
Gtk.STYLE_PROVIDER_PRIORITY_USER)
found, color = context.lookup_color("insensitive_fg_color")
if not found:
if not found: # pragma: no cover
log.debug("Didn't find insensitive_fg_color in theme")
return
self.color_insensitive = color.to_string()
@ -252,7 +252,7 @@ class vmmConfig(object):
def inspection_supported(self):
if not vmmInspection.libguestfs_installed():
return False
return False # pragma: no cover
return self.get_libguestfs_inspect_vms()
def remove_notifier(self, h):

View File

@ -160,9 +160,6 @@ class vmmConnection(vmmGObject):
def __init__(self, uri):
self._uri = uri
if self._uri is None or self._uri.lower() == "xen":
self._uri = "xen:///"
vmmGObject.__init__(self)
self._state = self._STATE_DISCONNECTED
@ -277,7 +274,7 @@ class vmmConnection(vmmGObject):
for vol in pool.get_volumes():
try:
ret.append(vol.get_xmlobj(refresh_if_nec=False))
except Exception as e:
except Exception as e: # pragma: no cover
log.debug("Fetching volume XML failed: %s", e)
return ret
self._backend.cb_fetch_all_vols = fetch_all_vols
@ -450,13 +447,13 @@ class vmmConnection(vmmGObject):
if self.support.domain_xml_inactive(vm):
inact = libvirt.VIR_DOMAIN_XML_INACTIVE
else:
else: # pragma: no cover
log.debug("Domain XML inactive flag not supported.")
if self.support.domain_xml_secure(vm):
inact |= libvirt.VIR_DOMAIN_XML_SECURE
act = libvirt.VIR_DOMAIN_XML_SECURE
else:
else: # pragma: no cover
log.debug("Domain XML secure flag not supported.")
return inact, act
@ -477,7 +474,7 @@ class vmmConnection(vmmGObject):
try:
if vol.get_target_path() == path:
return vol
except Exception as e:
except Exception as e: # pragma: no cover
# Errors can happen if the volume disappeared, bug 1092739
log.debug("Error looking up volume from path=%s: %s",
path, e)
@ -507,10 +504,7 @@ class vmmConnection(vmmGObject):
return _("Disconnected")
elif self.is_connecting():
return _("Connecting")
elif self.is_active():
return _("Active")
else:
return _("Unknown")
return _("Active")
#################################
@ -547,7 +541,7 @@ class vmmConnection(vmmGObject):
for dev in self.list_nodedevs():
try:
xmlobj = dev.get_xmlobj()
except libvirt.libvirtError as e:
except libvirt.libvirtError as e: # pragma: no cover
# Libvirt nodedev XML fetching can be busted
# https://bugzilla.redhat.com/show_bug.cgi?id=1225771
if e.get_error_code() != libvirt.VIR_ERR_NO_NODE_DEVICE:
@ -742,7 +736,7 @@ class vmmConnection(vmmGObject):
def _add_conn_events(self):
if not self.support.conn_working_xen_events():
return
return # pragma: no cover
def _check_events_disabled():
if self.config.CLITestOptions.no_events:
@ -771,7 +765,7 @@ class vmmConnection(vmmGObject):
self._domain_cb_ids.append(
self.get_backend().domainEventRegisterAny(
None, eventid, cb, eventname))
except Exception as e:
except Exception as e: # pragma: no cover
log.debug("Error registering %s event: %s",
eventname, e)
@ -856,7 +850,7 @@ class vmmConnection(vmmGObject):
self._backend.storagePoolEventDeregisterAny(eid)
for eid in self._node_device_cb_ids:
self._backend.nodeDeviceEventDeregisterAny(eid)
except Exception:
except Exception: # pragma: no cover
log.debug("Failed to deregister events in conn cleanup",
exc_info=True)
finally:
@ -875,14 +869,15 @@ class vmmConnection(vmmGObject):
try:
self._remove_object_signal(obj)
obj.cleanup()
except Exception as e:
except Exception as e: # pramga: no cover
log.debug("Failed to cleanup %s: %s", obj, e)
self._objects.cleanup()
self._objects = _ObjectList()
closeret = self._backend.close()
if closeret == 1 and self.config.CLITestOptions.leak_debug:
log.debug("LEAK: conn close() returned 1, "
log.debug( # pragma: no cover
"LEAK: conn close() returned 1, "
"meaning refs may have leaked.")
self._change_state(self._STATE_DISCONNECTED)
@ -900,7 +895,7 @@ class vmmConnection(vmmGObject):
def open(self):
if not self.is_disconnected():
return
return # pragma: no cover
self._change_state(self._STATE_CONNECTING)
@ -949,15 +944,15 @@ class vmmConnection(vmmGObject):
log.debug("conn version=%s", self._backend.conn_version())
log.debug("%s capabilities:\n%s", self.get_uri(), self.caps.get_xml())
if not self.support.conn_domain():
if not self.support.conn_domain(): # pragma: no cover
raise RuntimeError("Connection does not support required "
"domain listing APIs")
if not self.support.conn_storage():
if not self.support.conn_storage(): # pragma: no cover
log.debug("Connection doesn't seem to support storage APIs.")
if not self.support.conn_network():
if not self.support.conn_network(): # pragma: no cover
log.debug("Connection doesn't seem to support network APIs.")
if not self.support.conn_nodedev():
if not self.support.conn_nodedev(): # pragma: no cover
log.debug("Connection doesn't seem to support nodedev APIs.")
self._add_conn_events()
@ -989,7 +984,7 @@ class vmmConnection(vmmGObject):
# pool already exists
try:
virtinst.StoragePool.build_default_pool(self.get_backend())
except Exception as e:
except Exception as e: # pragma: no cover
log.debug("Building default pool failed: %s", str(e))
def _open_thread(self):
@ -1031,7 +1026,7 @@ class vmmConnection(vmmGObject):
app with long tick operations.
"""
if not self._backend.is_open():
return
return # pragma: no cover
for obj in gone_objects:
class_name = obj.class_name()
@ -1051,7 +1046,7 @@ class vmmConnection(vmmGObject):
def _new_object_cb(self, obj, initialize_failed):
if not self._backend.is_open():
return
return # pragma: no cover
try:
class_name = obj.class_name()
@ -1182,9 +1177,9 @@ class vmmConnection(vmmGObject):
are in use.
"""
if self._closing:
return
return # pragma: no cover
if self.is_disconnected():
return
return # pragma: no cover
if self.is_connecting() and not force:
return
@ -1244,7 +1239,7 @@ class vmmConnection(vmmGObject):
def _recalculate_stats(self, vms):
if not self._backend.is_open():
return
return # pragma: no cover
now = time.time()
expected = self.config.get_stats_history_length()

View File

@ -40,7 +40,7 @@ class vmmConnectionManager(vmmGObject):
conn.close()
self.emit("conn-removed", uri)
conn.cleanup()
except Exception:
except Exception: # pragma: no cover
log.exception("Error cleaning up conn=%s", uri)
self._conns = {}
@ -50,7 +50,7 @@ class vmmConnectionManager(vmmGObject):
def add_conn(self, uri):
if uri in self._conns:
return self._conns[uri]
return self._conns[uri] # pragma: no cover
conn = vmmConnection(uri)
self._conns[uri] = conn
self.config.add_conn_uri(uri)
@ -59,7 +59,7 @@ class vmmConnectionManager(vmmGObject):
def remove_conn(self, uri):
if uri not in self._conns:
return
return # pragma: no cover
conn = self._conns.pop(uri)
self.config.remove_conn_uri(uri)
self.emit("conn-removed", uri)

View File

@ -32,14 +32,10 @@ class vmmCreateConn(vmmGObjectUI):
if not cls._instance:
cls._instance = vmmCreateConn()
return cls._instance
except Exception as e:
except Exception as e: # pragma: no cover
parentobj.err.show_err(
_("Error launching connect dialog: %s") % str(e))
@classmethod
def is_initialized(cls):
return bool(cls._instance)
def __init__(self):
vmmGObjectUI.__init__(self, "createconn.ui", "vmm-open-connection")
self._cleanup_on_app_close()

View File

@ -350,8 +350,7 @@ class vmmCreatePool(vmmGObjectUI):
return
try:
if self._validate(pool) is False:
return
self._validate(pool)
build = self._get_build_default(pool.type)
except Exception as e: # pragma: no cover
return self.err.show_err(_("Error validating pool: %s") % e)

View File

@ -152,8 +152,6 @@ class vmmFSDetails(vmmGObjectUI):
check_visible=True)
def get_config_fs_readonly(self):
if not self.widget("fs-readonly").is_visible():
return None
return self.widget("fs-readonly").get_active()
def get_config_fs_driver(self):
@ -293,7 +291,7 @@ class vmmFSDetails(vmmGObjectUI):
self._dev.format = fsformat
if wrpolicy:
self._dev.wrpolicy = wrpolicy
except Exception as e:
except Exception as e: # pragma: no cover
return self.err.val_err(_("Filesystem parameter error"), e)
def _browse_file(self, textent, isdir=False):

View File

@ -97,11 +97,9 @@ class vmmMediaCombo(vmmGObjectUI):
if nodedev.xmlobj.drive_type != media_type:
continue
media_label = nodedev.xmlobj.media_label
media_label = nodedev.xmlobj.media_label or _("Media Unknown")
if not nodedev.xmlobj.media_available:
media_label = _("No media detected")
elif not nodedev.xmlobj.media_label:
media_label = _("Media Unknown")
label = "%s (%s)" % (media_label, nodedev.xmlobj.block)
row = self._make_row(nodedev.xmlobj.block, label,

View File

@ -169,7 +169,7 @@ class vmmHostNets(vmmGObjectUI):
try:
self._populate_net_state(net)
except Exception as e:
except Exception as e: # pragma: no cover
log.exception(e)
self._set_error_page(_("Error selecting network: %s") % e)
self._disable_net_apply()
@ -275,7 +275,7 @@ class vmmHostNets(vmmGObjectUI):
def _delete_network_cb(self, src):
net = self._current_network()
if net is None:
return
return # pragma: no cover
result = self.err.yes_no(_("Are you sure you want to permanently "
"delete the network %s?") % net.get_name())
@ -289,7 +289,7 @@ class vmmHostNets(vmmGObjectUI):
def _start_network_cb(self, src):
net = self._current_network()
if net is None:
return
return # pragma: no cover
log.debug("Starting network '%s'", net.get_name())
vmmAsyncJob.simple_async_noshow(net.start, [], self,
@ -298,7 +298,7 @@ class vmmHostNets(vmmGObjectUI):
def _stop_network_cb(self, src):
net = self._current_network()
if net is None:
return
return # pragma: no cover
log.debug("Stopping network '%s'", net.get_name())
vmmAsyncJob.simple_async_noshow(net.stop, [], self,
@ -310,7 +310,7 @@ class vmmHostNets(vmmGObjectUI):
if self._addnet is None:
self._addnet = vmmCreateNetwork(self.conn)
self._addnet.show(self.topwin)
except Exception as e:
except Exception as e: # pragma: no cover
self.err.show_err(_("Error launching network wizard: %s") % str(e))
@ -321,7 +321,7 @@ class vmmHostNets(vmmGObjectUI):
def _net_apply(self):
net = self._current_network()
if net is None:
return
return # pragma: no cover
log.debug("Applying changes for network '%s'", net.get_name())
try:

View File

@ -47,9 +47,8 @@ ICON_SHUTOFF = "state_shutoff"
def _get_pool_size_percent(pool):
cap = pool.get_capacity()
alloc = pool.get_allocation()
if not cap or alloc is None:
per = 0
else:
per = 0
if cap and alloc is not None:
per = int(((float(alloc) / float(cap)) * 100))
return "<span size='small'>%s%%</span>" % int(per)
@ -118,7 +117,7 @@ class vmmHostStorage(vmmGObjectUI):
def _cleanup(self):
try:
self.conn.disconnect_by_obj(self)
except Exception:
except Exception: # pragma: no cover
pass
self.conn = None
@ -271,7 +270,7 @@ class vmmHostStorage(vmmGObjectUI):
self.conn.support.conn_storage())
if conn_active and not self.conn.support.conn_storage():
self._set_error_page(
self._set_error_page( # pragma: no cover
_("Libvirt connection does not support storage management."))
if conn_active:
@ -288,7 +287,7 @@ class vmmHostStorage(vmmGObjectUI):
def _current_vol(self):
pool = self._current_pool()
if not pool:
return None
return None # pragma: no cover
connkey = uiutil.get_list_selection(self.widget("vol-list"))
return connkey and pool.get_volume(connkey)
@ -369,7 +368,7 @@ class vmmHostStorage(vmmGObjectUI):
try:
self._populate_pool_state(pool)
except Exception as e:
except Exception as e: # pragma: no cover
log.exception(e)
self._set_error_page(_("Error selecting pool: %s") % e)
self._disable_pool_apply()
@ -427,7 +426,7 @@ class vmmHostStorage(vmmGObjectUI):
cap = str(vol.get_capacity())
sizestr = vol.get_pretty_capacity()
fmt = vol.get_format() or ""
except Exception:
except Exception: # pragma: no cover
log.debug("Error getting volume info for '%s', "
"hiding it", key, exc_info=True)
continue
@ -440,7 +439,7 @@ class vmmHostStorage(vmmGObjectUI):
namestr = ", ".join(names)
if not namestr:
namestr = None
except Exception:
except Exception: # pragma: no cover
log.exception("Failed to determine if storage volume in "
"use.")
@ -470,7 +469,7 @@ class vmmHostStorage(vmmGObjectUI):
def _pool_stop_cb(self, src):
pool = self._current_pool()
if pool is None:
return
return # pragma: no cover
log.debug("Stopping pool '%s'", pool.get_name())
vmmAsyncJob.simple_async_noshow(pool.stop, [], self,
@ -479,7 +478,7 @@ class vmmHostStorage(vmmGObjectUI):
def _pool_start_cb(self, src):
pool = self._current_pool()
if pool is None:
return
return # pragma: no cover
log.debug("Starting pool '%s'", pool.get_name())
vmmAsyncJob.simple_async_noshow(pool.start, [], self,
@ -492,13 +491,13 @@ class vmmHostStorage(vmmGObjectUI):
if self._addpool is None:
self._addpool = vmmCreatePool(self.conn)
self._addpool.show(self.topwin)
except Exception as e:
except Exception as e: # pragma: no cover
self.err.show_err(_("Error launching pool wizard: %s") % str(e))
def _pool_delete_cb(self, src):
pool = self._current_pool()
if pool is None:
return
return # pragma: no cover
result = self.err.yes_no(_("Are you sure you want to permanently "
"delete the pool %s?") % pool.get_name())

View File

@ -7,6 +7,8 @@
from gi.repository import GObject
from gi.repository import Gtk
from virtinst import xmlutil
#####################
# UI getter helpers #
@ -142,8 +144,7 @@ def set_grid_row_visible(child, visible):
"""
parent = child.get_parent()
if not isinstance(parent, Gtk.Grid):
raise RuntimeError("Programming error, parent must be grid, "
"not %s" % type(parent))
raise xmlutil.DevError("parent must be grid, not %s" % type(parent))
row = child_get_property(parent, child, "top-attach")
for c in parent.get_children():

View File

@ -80,7 +80,7 @@ class vmmManager(vmmGObjectUI):
if not cls._instance:
cls._instance = vmmManager()
return cls._instance
except Exception as e:
except Exception as e: # pragma: no cover
if not parentobj:
raise
parentobj.err.show_err(
@ -279,13 +279,11 @@ class vmmManager(vmmGObjectUI):
c.set_homogeneous(False)
def init_context_menus(self):
def add_to_menu(idx, text, icon, cb):
def add_to_menu(idx, text, cb):
if text[0:3] == 'gtk':
item = Gtk.ImageMenuItem.new_from_stock(text, None)
else:
item = Gtk.ImageMenuItem.new_with_mnemonic(text)
if icon:
item.set_image(icon)
if cb:
item.connect("activate", cb)
item.get_accessible().set_name("conn-%s" % idx)
@ -293,14 +291,14 @@ class vmmManager(vmmGObjectUI):
self.connmenu_items[idx] = item
# Build connection context menu
add_to_menu("create", Gtk.STOCK_NEW, None, self.new_vm)
add_to_menu("connect", Gtk.STOCK_CONNECT, None, self.open_conn)
add_to_menu("disconnect", Gtk.STOCK_DISCONNECT, None,
add_to_menu("create", Gtk.STOCK_NEW, self.new_vm)
add_to_menu("connect", Gtk.STOCK_CONNECT, self.open_conn)
add_to_menu("disconnect", Gtk.STOCK_DISCONNECT,
self.close_conn)
self.connmenu.add(Gtk.SeparatorMenuItem())
add_to_menu("delete", Gtk.STOCK_DELETE, None, self.do_delete)
add_to_menu("delete", Gtk.STOCK_DELETE, self.do_delete)
self.connmenu.add(Gtk.SeparatorMenuItem())
add_to_menu("details", _("D_etails"), None, self.show_host)
add_to_menu("details", _("D_etails"), self.show_host)
self.connmenu.show_all()
def init_vmlist(self):
@ -553,7 +551,7 @@ class vmmManager(vmmGObjectUI):
def vm_added(self, conn, connkey):
vm = conn.get_vm(connkey)
if not vm:
return
return # pragma: no cover
vm_row = self._build_row(None, vm)
conn_row = self.get_row(conn)
@ -643,7 +641,7 @@ class vmmManager(vmmGObjectUI):
# Make sure error page isn't showing
self.widget("vm-notebook").set_current_page(0)
if self.get_row(conn):
return
return # pragma: no cover
conn_row = self._build_row(conn, None)
self.model.append(None, conn_row)

View File

@ -129,7 +129,7 @@ class vmmLibvirtObject(vmmGObject):
try:
self._key = newname
self.conn.rename_object(self, origxml, newxml, oldconnkey)
except Exception:
except Exception: # pragma: no cover
self._key = oldname
raise
finally:
@ -190,7 +190,7 @@ class vmmLibvirtObject(vmmGObject):
initialize_failed = False
try:
self._init_libvirt_state()
except Exception:
except Exception: # pragma: no cover
log.debug("Error initializing libvirt state for %s", self,
exc_info=True)
initialize_failed = True

View File

@ -106,8 +106,6 @@ class vmmNetwork(vmmLibvirtObject):
self._refresh_dhcp_leases()
return self._leases
def get_uuid(self):
return self.get_xmlobj().uuid
def get_bridge_device(self):
return self.get_xmlobj().bridge
def get_name_domain(self):

View File

@ -54,7 +54,7 @@ class vmmStorageVolume(vmmLibvirtObject):
def _XMLDesc(self, flags):
try:
return self._backend.XMLDesc(flags)
except Exception as e:
except Exception as e: # pragma: no cover
log.debug("XMLDesc for vol=%s failed: %s",
self._backend.key(), e)
raise
@ -97,13 +97,9 @@ class vmmStorageVolume(vmmLibvirtObject):
return self.get_xmlobj().format
def get_capacity(self):
return self.get_xmlobj().capacity
def get_allocation(self):
return self.get_xmlobj().allocation
def get_pretty_capacity(self):
return _pretty_bytes(self.get_capacity())
def get_pretty_allocation(self):
return _pretty_bytes(self.get_allocation())
def get_pretty_name(self, pooltype):
name = self.get_name()
@ -111,9 +107,10 @@ class vmmStorageVolume(vmmLibvirtObject):
return name
key = self.get_key()
if not key:
return name
return "%s (%s)" % (name, key)
ret = name
if key:
ret += " (%s)" % key
return ret
class vmmStoragePool(vmmLibvirtObject):
@ -261,7 +258,6 @@ class vmmStoragePool(vmmLibvirtObject):
for vol in self.get_volumes():
if vol.get_connkey() == key:
return vol
return None
def _update_volumes(self, force):
if not self.is_active():
@ -287,14 +283,8 @@ class vmmStoragePool(vmmLibvirtObject):
def get_autostart(self):
return self._backend.autostart()
def can_change_alloc(self):
typ = self.get_type()
return (typ in [StoragePool.TYPE_LOGICAL, StoragePool.TYPE_ZFS])
def get_type(self):
return self.get_xmlobj().type
def get_uuid(self):
return self.get_xmlobj().uuid
def get_target_path(self):
return self.get_xmlobj().target_path or ""

View File

@ -81,7 +81,7 @@ class vmmOSList(vmmGObjectUI):
if not self.is_visible():
return
if not len(os_list.get_model()):
return
return # pragma: no cover
sel.select_iter(os_list.get_model()[0].iter)
def _refilter(self):
@ -126,7 +126,7 @@ class vmmOSList(vmmGObjectUI):
def _entry_activate_cb(self, src):
os_list = self.widget("os-list")
if not os_list.is_visible():
return
return # pragma: no cover
sel = os_list.get_selection()
model, rows = sel.get_selected_rows()

View File

@ -23,7 +23,7 @@ class vmmPreferences(vmmGObjectUI):
if not cls._instance:
cls._instance = vmmPreferences()
cls._instance.show(parentobj.topwin)
except Exception as e:
except Exception as e: # pragma: no cover
parentobj.err.show_err(
_("Error launching preferences: %s") % str(e))
@ -201,12 +201,10 @@ class vmmPreferences(vmmGObjectUI):
def refresh_view_system_tray(self):
errmsg = vmmSystray.systray_disabled_message()
val = self.config.get_view_system_tray()
if errmsg:
val = False
val = bool(self.config.get_view_system_tray() and not errmsg)
self.widget("prefs-system-tray").set_sensitive(not bool(errmsg))
self.widget("prefs-system-tray").set_tooltip_text(errmsg)
self.widget("prefs-system-tray").set_active(bool(val))
self.widget("prefs-system-tray").set_active(val)
def refresh_xmleditor(self):
val = self.config.get_xmleditor_enabled()

View File

@ -10,7 +10,7 @@ from virtinst import log
try:
gi.require_version("GtkSource", "4")
log.debug("Using GtkSource 4")
except ValueError:
except ValueError: # pragma: no cover
gi.require_version("GtkSource", "3.0")
log.debug("Using GtkSource 3.0")
from gi.repository import GtkSource