14481 Package version Info image lock exception not handled
authorJohn Rice <john.rice@sun.com>
Fri, 12 Feb 2010 16:41:23 +0000
changeset 1761 b2d8237ac690
parent 1760 c170eda552cf
child 1762 2ae663f0e049
14481 Package version Info image lock exception not handled 14437 pm traceback in update_all on startup
src/checkforupdates.py
src/gui/modules/installupdate.py
src/gui/modules/misc.py
src/gui/modules/repository.py
src/gui/modules/webinstall.py
src/packagemanager.py
src/tests/gui_pylintrc
src/updatemanager.py
--- a/src/checkforupdates.py	Fri Feb 12 14:44:06 2010 +0000
+++ b/src/checkforupdates.py	Fri Feb 12 16:41:23 2010 +0000
@@ -32,7 +32,7 @@
 
 import pkg.client.progress as progress
 import pkg.client.api_errors as api_errors
-import pkg.gui.misc_non_gui as gui_misc
+import pkg.gui.misc_non_gui as nongui_misc
 import pkg.gui.enumerations as enumerations
 import pkg.misc as misc
 from pkg.client import global_settings
@@ -50,12 +50,14 @@
 
         message = None
         try:
-                api_obj = gui_misc.get_api_object(image_directory, pr)
+                api_obj = nongui_misc.get_api_object(image_directory, pr)
         except api_errors.VersionException, e:
                 message = "Version mismatch: expected version %d, got version %d" % \
                     (e.expected_version, e.received_version)
         except api_errors.ImageNotFoundException, e:
                 message = "%s is not an install image" % e.user_dir
+        except api_errors.ApiException, e:
+                message = "Unexpected exception: %s" % str(e)
         if message != None:
                 if debug:
                         print "Failed to get Api object: %s" % message
@@ -93,12 +95,16 @@
                 return enumerations.NO_UPDATES_AVAILABLE
 
 def __check_last_refresh(api_obj):
-        cache_dir = gui_misc.get_cache_dir(api_obj)
+        cache_dir = nongui_misc.get_cache_dir(api_obj)
         if not cache_dir:
                 return enumerations.UPDATES_UNDETERMINED
         try:
-                info = gui_misc.read_cache_file(os.path.join(
+                info = nongui_misc.read_cache_file(os.path.join(
                     cache_dir, CACHE_NAME + '.cpl'))
+                if len(info) == 0:
+                        if debug:
+                                print "No cache"
+                        return enumerations.UPDATES_UNDETERMINED
                 if info.get("version") != CACHE_VERSION:
                         if debug:
                                 print "Cache version mismatch:", \
@@ -137,7 +143,7 @@
                 return enumerations.UPDATES_UNDETERMINED
 
 def __dump_updates_available(api_obj, stuff_to_do):
-        cache_dir = gui_misc.get_cache_dir(api_obj)
+        cache_dir = nongui_misc.get_cache_dir(api_obj)
         if not cache_dir:
                 return
         publisher_list = {}
@@ -155,7 +161,7 @@
         dump_info["publishers"] = publisher_list
 
         try:
-                gui_misc.dump_cache_file(os.path.join(
+                nongui_misc.dump_cache_file(os.path.join(
                     cache_dir, CACHE_NAME + '.cpl'), dump_info)
         except IOError, e:
                 if debug:
--- a/src/gui/modules/installupdate.py	Fri Feb 12 14:44:06 2010 +0000
+++ b/src/gui/modules/installupdate.py	Fri Feb 12 16:41:23 2010 +0000
@@ -70,6 +70,7 @@
                 progress.GuiProgressTracker.__init__(self)
                 self.web_install = web_install
                 self.web_updates_list = None
+                self.web_install_all_installed = False
                 self.parent = parent
                 self.api_o = gui_misc.get_api_object(image_directory,
                     self, main_window)
@@ -92,6 +93,7 @@
                 self.ip = None
                 self.ips_update = False
                 self.operations_done = False
+                self.operations_done_ex = False
                 self.prev_ind_phase = None
                 self.uarenamebe_o = None
                 self.prev_pkg = None
@@ -422,7 +424,7 @@
         def __on_cancelcreateplan_clicked(self, widget):
                 '''Handler for signal send by cancel button, which user might press
                 during evaluation stage - while the dialog is creating plan'''
-                if self.api_o.can_be_canceled():
+                if self.api_o.can_be_canceled() and self.operations_done_ex == False:
                         self.canceling = True
                         Thread(target = self.api_o.cancel, args = ()).start()
                         cancel_txt = _("Canceling...")
@@ -433,11 +435,16 @@
                             gtk.STOCK_CANCEL, gtk.ICON_SIZE_MENU)
                         gobject.idle_add(self.w_stages_label.set_markup, cancel_txt)
                         self.w_cancel_button.set_sensitive(False)
-                if self.operations_done:
+                if self.operations_done or self.operations_done_ex:
                         self.w_dialog.hide()
                         if self.web_install:
-                                gobject.idle_add(self.parent.update_package_list,
-                                    self.web_updates_list)
+                                if self.operations_done_ex == False and \
+                                        not self.web_install_all_installed:
+                                        gobject.idle_add(self.parent.update_package_list,
+                                            None)
+                                else:
+                                        gobject.idle_add(self.parent.update_package_list,
+                                            self.web_updates_list)
                                 return
                         gobject.idle_add(self.parent.update_package_list, None)
 
@@ -692,7 +699,10 @@
                 to_remove = gtk.ListStore(str, str, str)
 
 
-                plan = self.api_o.describe().get_changes()
+                plan_desc = self.api_o.describe()
+                if plan_desc == None:
+                        return
+                plan = plan_desc.get_changes()
 
                 for pkg_plan in plan:
                         orig = pkg_plan[0]
@@ -879,6 +889,7 @@
                 if msg == None or len(msg) == 0:
                         msg = _("No futher information available")
                 self.operations_done = True
+                self.operations_done_ex = True
                 self.stop_bouncing_progress()
                 self.update_details_text(_("\nError:\n"), "bold")
                 self.update_details_text("%s" % msg, "level1")
@@ -892,6 +903,7 @@
 
         def __g_exception_stage(self, tracebk):
                 self.operations_done = True
+                self.operations_done_ex = True
                 self.stop_bouncing_progress()
                 if self.action == enumerations.IMAGE_UPDATE:
                         info_url = misc.get_release_notes_url()
@@ -1027,6 +1039,13 @@
                             and not self.action == enumerations.IMAGE_UPDATE:
                                 self.parent.update_package_list(self.update_list)
                         if self.web_install:
+                                if done_txt == \
+                                        _("All packages already installed.") or \
+                                        done_txt == \
+                                        _("Installation completed successfully"):
+                                        self.web_install_all_installed = True
+                                else:
+                                        self.web_install_all_installed = False
                                 self.web_updates_list = self.update_list
                 if self.ips_update:
                         self.w_dialog.hide()
@@ -1058,7 +1077,10 @@
                 install_iter = None
                 update_iter = None
                 remove_iter = None
-                plan = self.api_o.describe().get_changes()
+                plan_desc = self.api_o.describe()
+                if plan_desc == None:
+                        return
+                plan = plan_desc.get_changes()
                 self.update_details_text("\n")
                 for pkg_plan in plan:
                         origin_fmri = pkg_plan[0]
@@ -1133,12 +1155,8 @@
                                         to_install[stem][1] = info_s.summary
                                 elif stem in to_remove:
                                         to_remove[stem][1] = info_s.summary
-                except api_errors.TransportError, tpex:
-                        err = str(tpex)
-                        logger.error(err)
-                        gui_misc.notify_log_error(self.parent)
-                except api_errors.InvalidDepotResponseException, idex:
-                        err = str(idex)
+                except api_errors.ApiException, ex:
+                        err = str(ex)
                         logger.error(err)
                         gui_misc.notify_log_error(self.parent)
 
--- a/src/gui/modules/misc.py	Fri Feb 12 14:44:06 2010 +0000
+++ b/src/gui/modules/misc.py	Fri Feb 12 16:41:23 2010 +0000
@@ -36,6 +36,7 @@
 import urllib2
 import urlparse
 import socket
+import traceback
 try:
         import gobject
         import gnome
@@ -268,13 +269,23 @@
                     (ex.expected_version, ex.received_version)
         except api_errors.ImageNotFoundException, ex:
                 message = _("%s is not an install image") % ex.user_dir
-        if message != None:
-                if parent_dialog != None:
-                        error_occurred(parent_dialog,
-                            message, _("API Error"))
-                        sys.exit(0)
-                else:
-                        print message
+        except api_errors.ImageLockedError, ex:
+                message = str(ex)
+        except api_errors.ApiException, ex:
+                message = _("An unknown error occurred") + "\n\n" + _("Error details:\n")
+                message += str(ex)
+        except Exception:
+                traceback_lines = traceback.format_exc().splitlines()
+                traceback_str = ""
+                for line in traceback_lines:
+                        traceback_str += line + "\n"
+                message = _("An unknown error occurred")
+                if traceback_str != "":
+                        message += "\n\n" + _("Error details:\n") + traceback_str
+        if api_o == None or message != None:
+                if message == None:
+                        message = _("An unknown error occurred")
+                raise Exception(message)
         return api_o
 
 def error_occurred(parent, error_msg, msg_title = None,
--- a/src/gui/modules/repository.py	Fri Feb 12 14:44:06 2010 +0000
+++ b/src/gui/modules/repository.py	Fri Feb 12 16:41:23 2010 +0000
@@ -79,6 +79,7 @@
                 self.publishers_list = None
                 self.repository_modify_publisher = None
                 self.no_changes = 0
+                self.pylintstub = None
                 w_tree_add_publisher = \
                     gtk.glade.XML(parent.gladefile, "add_publisher")
                 w_tree_add_publisher_complete = \
@@ -415,14 +416,22 @@
                 selection = self.w_publishers_treeview.get_selection()
                 selected_rows = selection.get_selected_rows()
                 self.w_publishers_treeview.set_model(None)
-                pubs = self.api_o.get_publishers(duplicate=True)
+                try:
+                        pubs = self.api_o.get_publishers(duplicate=True)
+                except api_errors.ApiException, e:
+                        self.__show_errors([("", e)])
+                        return
                 if not sorted_model:
                         return
                 filtered_model = sorted_model.get_model()
                 model = filtered_model.get_model()
 
                 if len(pubs) > 1:
-                        so = self.api_o.get_pub_search_order()
+                        try:
+                                so = self.api_o.get_pub_search_order()
+                        except api_errors.ApiException, e:
+                                self.__show_errors([("", e)])
+                                return
                         pub_dict = dict([(p.prefix, p) for p in pubs])
                         pubs = [
                             pub_dict[name]
@@ -554,7 +563,12 @@
                 if not misc.valid_pub_prefix(name):
                         self.name_error = _("Name contains invalid characters")
                         return False
-                for p in self.api_o.get_publishers():
+                try:
+                        pubs = self.api_o.get_publishers()
+                except api_errors.ApiException, e:
+                        self.__show_errors([("", e)])
+                        return False
+                for p in pubs:
                         if name == p.prefix or name == p.alias:
                                 self.name_error = _("Name already in use")
                                 return False
@@ -586,8 +600,12 @@
         def __modify_publisher_dialog(self, pub):
                 gui_misc.set_modal_and_transient(self.w_modify_repository_dialog,
                     self.w_manage_publishers_dialog)
-                self.repository_modify_publisher = self.api_o.get_publisher(
-                    prefix=pub.prefix, alias=pub.prefix, duplicate=True)
+                try:
+                        self.repository_modify_publisher = self.api_o.get_publisher(
+                            prefix=pub.prefix, alias=pub.prefix, duplicate=True)
+                except api_errors.ApiException, e:
+                        self.__show_errors([("", e)])
+                        return                
                 updated_modify_repository = self.__update_modify_repository_dialog(True,
                     True, True, True)
                     
@@ -699,8 +717,7 @@
                 try:
                         repo.add_mirror(new_mirror)
                         self.w_addmirror_entry.set_text("")
-                except (api_errors.PublisherError,
-                    api_errors.CertificateError), e:
+                except api_errors.ApiException, e:
                         self.__show_errors([(pub, e)])
                 self.__update_modify_repository_dialog(update_mirrors=True)
 
@@ -713,7 +730,7 @@
                 repo = pub.selected_repository
                 try:
                         repo.remove_mirror(remove_mirror)
-                except api_errors.PublisherError, e:
+                except api_errors.ApiException, e:
                         self.__show_errors([(pub, e)])
                 self.__update_modify_repository_dialog(update_mirrors=True)
 
@@ -723,8 +740,7 @@
                 try:
                         repo.add_origin(new_origin)
                         self.w_addorigin_entry.set_text("")
-                except (api_errors.PublisherError,
-                    api_errors.CertificateError), e:
+                except api_errors.ApiException, e:
                         self.__show_errors([(pub, e)])
                 self.__update_modify_repository_dialog(update_origins=True)
 
@@ -737,7 +753,7 @@
                 repo = pub.selected_repository
                 try:
                         repo.remove_origin(remove_origin)
-                except api_errors.PublisherError, e:
+                except api_errors.ApiException, e:
                         self.__show_errors([(pub, e)])
                 self.__update_modify_repository_dialog(update_origins=True)
 
@@ -863,8 +879,7 @@
                                     alias=name)
                                 self.__g_update_details_text(
                                     _("Publisher %s succesfully removed\n") % name)
-                        except (api_errors.PermissionsException,
-                            api_errors.PublisherError), e:
+                        except api_errors.ApiException, e:
                                 errors.append((pub, e))
                         self.progress_stop_thread = True
                 else:
@@ -906,14 +921,7 @@
                                 raise e
                         else:
                                 errors.append((pub, e))
-                except api_errors.CatalogRefreshException, e:
-                        errors.append((pub, e))
-                except api_errors.InvalidDepotResponseException, e:
-                        errors.append((pub, e))
-                except api_errors.CertificateError, e:
-                        errors.append((pub, e))
-                except (api_errors.PermissionsException,
-                    api_errors.PublisherError), e:
+                except api_errors.ApiException, e:
                         errors.append((pub, e))
                 return errors
 
@@ -1048,8 +1056,7 @@
                                 self.__g_update_details_text(details_text %
                                     {"enable" : enable_text, "name" : name})
                                 self.api_o.update_publisher(pub)
-                        except (api_errors.PermissionsException,
-                            api_errors.PublisherError), e:
+                        except api_errors.ApiException, e:
                                 errors.append(pub, e)
                 self.progress_stop_thread = True
                 gobject.idle_add(self.publishers_apply_expander.set_expanded, False)
@@ -1061,6 +1068,7 @@
         def __proceed_after_confirmation(self):
                 errors = []
 
+                image_lock_err = False
                 for row in self.priority_changes:
                         try:
                                 if row[0] == enumerations.PUBLISHER_MOVE_BEFORE:
@@ -1073,9 +1081,12 @@
                                 self.__g_update_details_text(
                                     _("Changing priority for publisher %s\n")
                                     % row[1])
-                        except (api_errors.PermissionsException,
-                            api_errors.PublisherError,
-                            api_errors.InvalidDepotResponseException), e:
+                        except api_errors.ImageLockedError, e:
+                                self.no_changes = 0
+                                if not image_lock_err:
+                                        errors.append((row[1], e))
+                                        image_lock_err = True
+                        except api_errors.ApiException, e:
                                 errors.append((row[1], e))
 
                 for row in self.publishers_list:
@@ -1105,10 +1116,13 @@
                                         self.__g_update_details_text(details_text % 
                                             {"enable" : enable_text, "name" : name})
                                         self.api_o.update_publisher(pub)
-                        except (api_errors.PermissionsException,
-                            api_errors.PublisherError,
-                            api_errors.CatalogRefreshException,
-                            api_errors.InvalidDepotResponseException), e:
+                        except api_errors.ImageLockedError, e:
+                                self.no_changes = 0
+                                if not image_lock_err:
+                                        errors.append(
+                                            (row[enumerations.PUBLISHER_OBJECT], e))
+                                        image_lock_err = True
+                        except api_errors.ApiException, e:
                                 errors.append((row[enumerations.PUBLISHER_OBJECT], e))
                 self.progress_stop_thread = True
                 if len(errors) > 0:
@@ -1622,8 +1636,7 @@
                 widget.hide()
                 return True
 
-        @staticmethod
-        def __get_or_create_pub_with_url(api_o, name, origin_url):
+        def __get_or_create_pub_with_url(self, api_o, name, origin_url):
                 new_pub = False
                 repo = None
                 pub = None
@@ -1643,6 +1656,8 @@
                         else:
                                 origin = repo.origins[0]
                                 origin.uri = origin_url
+                except api_errors.ApiException, e:
+                        self.__show_errors([(name, e)])
                 return (pub, repo, new_pub)
 
         @staticmethod
@@ -1662,8 +1677,7 @@
                         for uri in repo.mirrors:
                                 uri.ssl_cert = ssl_cert
                                 uri.ssl_key = ssl_key
-                except (api_errors.PublisherError,
-                    api_errors.CertificateError), e:
+                except api_errors.ApiException, e:
                         errors.append((pub, e))
                 return errors
 
@@ -1684,8 +1698,7 @@
                 w_label.set_sensitive(True)
                 w_label.show()
 
-        @staticmethod
-        def __is_url_valid(url):
+        def __is_url_valid(self, url):
                 url_error = None
                 if len(url) == 0:
                         return False, url_error
@@ -1706,6 +1719,9 @@
                         else:
                                 url_error = _("URI is not valid")
                         return False, url_error
+                except api_errors.ApiException, e:
+                        self.__show_errors([("", e)])
+                        return False, url_error
 
         @staticmethod
         def __validate_ssl_key_cert(origin_url, ssl_key, ssl_cert, 
@@ -1864,6 +1880,7 @@
                 pass
 
         def is_progress_bouncing(self):
+                self.pylintstub = self
                 return True
 
         def stop_bouncing_progress(self):
--- a/src/gui/modules/webinstall.py	Fri Feb 12 14:44:06 2010 +0000
+++ b/src/gui/modules/webinstall.py	Fri Feb 12 16:41:23 2010 +0000
@@ -300,6 +300,10 @@
                             self.w_webinstall_dialog,
                             str(ex),
                             _("Publisher Error"))
+                except api_errors.ApiException, ex:
+                        gobject.idle_add(gui_misc.error_occurred, 
+                            self.w_webinstall_dialog, 
+                            str(ex), _("Web Installer Error"))
                 return False
 
         def __disabled_pubs_info(self, disabled_pubs):
@@ -345,11 +349,21 @@
                         gobject.idle_add(gui_misc.error_occurred, 
                             self.w_webinstall_dialog, 
                             str(ex), _("Publisher Error"))
+                except api_errors.ApiException, ex:
+                        gobject.idle_add(gui_misc.error_occurred, 
+                            self.w_webinstall_dialog, 
+                            str(ex), _("Web Installer Error"))
                 return False
 
         def __on_proceed_button_clicked(self, widget):
                 if not self.first_run:
-                        self.api_o.reset()
+                        try:
+                                self.api_o.reset()
+                        except api_errors.ApiException, ex:
+                                gobject.idle_add(gui_misc.error_occurred, 
+                                    self.w_webinstall_dialog, 
+                                    str(ex), _("Web Installer Error"))
+                                return
                         self.pub_pkg_list = self.api_parse_publisher_info()
                         self.__create_task_lists()
                 else:
@@ -411,7 +425,19 @@
                 if len(self.pkg_install_tasks) == 0:
                         return
                 # Handle all packages from all pubs as single install action
-                pref_pub = self.api_o.get_preferred_publisher()
+                try:
+                        pref_pub = self.api_o.get_preferred_publisher()
+                except api_errors.PublisherError, ex:
+                        gobject.idle_add(gui_misc.error_occurred,
+                            self.w_webinstall_dialog,
+                            str(ex),
+                            _("Publisher Error"))
+                        return
+                except api_errors.ApiException, ex:
+                        gobject.idle_add(gui_misc.error_occurred,
+                            self.w_webinstall_dialog,
+                            str(ex), _("Web Installer Error"))
+                        return
                 self.preferred = pref_pub.prefix
                 all_package_stems = []        
                 for pkg_installs in self.pkg_install_tasks:
@@ -446,6 +472,8 @@
        
         # Install Callback - invoked at end of installing packages
         def update_package_list(self, update_list):
+                if update_list == None:
+                        return
                 self.pkg_install_tasks = []
                 if len(self.disabled_pubs) > 0 and self.repo_gui:
                         gobject.idle_add(self.repo_gui.webinstall_enable_disable_pubs,
@@ -458,11 +486,7 @@
                    returns list of publisher and package list tuples'''
                 try:
                         return self.api_o.parse_p5i(location=self.param)
-                except (api_errors.InvalidP5IFile, 
-                        api_errors.InvalidResourceLocation,
-                        api_errors.RetrievalError,
-                        api_errors.UnsupportedP5IFile,
-                        api_errors.PublisherError), ex:
+                except api_errors.ApiException, ex:
                         self.w_webinstall_proceed.set_sensitive(False)
                         gui_misc.error_occurred( 
                             self.w_webinstall_dialog,
--- a/src/packagemanager.py	Fri Feb 12 14:44:06 2010 +0000
+++ b/src/packagemanager.py	Fri Feb 12 16:41:23 2010 +0000
@@ -874,12 +874,17 @@
                         return
                 try:
                         fobj = open(filename, 'w')
-                except IOError, ex_sel:
-                        self.error_occurred(ex_sel, _("Export Selections Error"))
+                        self.api_o.write_p5i(fobj, pkg_names=self.selected_pkgs,
+                            pubs=self.selected_pkgs.keys())
+                except IOError, ex:
+                        err = str(ex)
+                        self.error_occurred(err, _("Export Selections Error"))
                         return
-
-                self.api_o.write_p5i(fobj, pkg_names=self.selected_pkgs,
-                    pubs=self.selected_pkgs.keys())
+                except api_errors.ApiException, ex:
+                        fobj.close()
+                        err = str(ex)
+                        self.error_occurred(err, _("Export Selections Error"))
+                        return
                 fobj.close()
                 os.chmod(filename, stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP |
                     stat.S_IWGRP | stat.S_IROTH | stat.S_IWOTH )
@@ -2462,13 +2467,28 @@
                 if search_all:
                         self.search_all_pub_being_searched = _("All Publishers")
                         servers = None
-                        pub_prefix = self.api_o.get_preferred_publisher().prefix
+                        try:
+                                pref_pub = self.api_o.get_preferred_publisher()
+                                pub_prefix = pref_pub.prefix
+                        except api_errors.ApiException, ex:
+                                err = str(ex)
+                                gobject.idle_add(self.error_occurred, err,
+                                    None, gtk.MESSAGE_INFO)
+                                gobject.idle_add(self.unset_busy_cursor)
+                                return
                 else:
                         pub_prefix = self.__get_selected_publisher()
-                        if pub_prefix != None:
-                                pub = self.api_o.get_publisher(prefix=pub_prefix)
-                        else:
-                                pub = self.api_o.get_preferred_publisher()
+                        try:
+                                if pub_prefix != None:
+                                        pub = self.api_o.get_publisher(prefix=pub_prefix)
+                                else:
+                                        pub = self.api_o.get_preferred_publisher()
+                        except api_errors.ApiException, ex:
+                                err = str(ex)
+                                gobject.idle_add(self.error_occurred, err,
+                                    None, gtk.MESSAGE_INFO)
+                                gobject.idle_add(self.unset_busy_cursor)
+                                return
                         origin_uri = self.__get_origin_uri(pub.selected_repository)
                         servers.append({"origin": origin_uri})
                         self.search_all_pub_being_searched = \
@@ -2479,17 +2499,17 @@
                 #TBD If we ever search just Installed pkgs should allow for a local search
                 case_sensitive = False
                 return_actions = True
-                searches.append(self.api_o.remote_search(
-                    [api.Query(" ".join(pargs), case_sensitive, return_actions)],
-                    servers=servers))
-                if debug:
-                        print "Search Args: %s : cs: %s : retact: %s" % \
-                                ("".join(pargs), case_sensitive, return_actions)
 
                 last_name = ""
                 # Sorting results by Name gives best overall appearance and flow
                 sort_col = enumerations.NAME_COLUMN
                 try:
+                        searches.append(self.api_o.remote_search(
+                            [api.Query(" ".join(pargs), case_sensitive, return_actions)],
+                            servers=servers))
+                        if debug:
+                                print "Search Args: %s : cs: %s : retact: %s" % \
+                                        ("".join(pargs), case_sensitive, return_actions)
                         for query_num, pub, (v, return_type, tmp) in \
                             itertools.chain(*searches):
                                 if v < 1 or return_type != api.Query.RETURN_PACKAGES:
@@ -2532,6 +2552,12 @@
                         gobject.idle_add(self.unset_busy_cursor)
                         gobject.idle_add(self.__process_after_cancel)
                         return
+                except api_errors.ImageLockedError, ex:
+                        err = str(ex)
+                        gobject.idle_add(self.error_occurred, err,
+                                None, gtk.MESSAGE_INFO)
+                        self.__process_after_search_failure()
+                        return
                 except Exception, aex:
                         err = str(aex)
                         logger.error(err)
@@ -3655,7 +3681,8 @@
                         Thread(target = self.__get_info, args = (pkg_stem, name)).start()
 
         def __get_info(self, pkg_stem, name):
-                self.api_o.reset()
+                if not self.__do_api_reset():
+                        return
                 local_info = gui_misc.get_pkg_info(self, self.api_o, pkg_stem, True)
                 remote_info = gui_misc.get_pkg_info(self, self.api_o, pkg_stem, False)
                 if self.exiting:
@@ -3675,11 +3702,17 @@
                                 stuff_to_do = self.api_o.plan_install(
                                     install_update_list,
                                     refresh_catalogs = False) 
-                        except api_errors.ApiException:
+                        except api_errors.ApiException, ex:
+                                err = str(ex)
+                                logger.error(err)
+                                gobject.idle_add(gui_misc.notify_log_error, self)
                                 gobject.idle_add(self.unset_busy_cursor)
                                 return
                         if stuff_to_do:
-                                plan = self.api_o.describe().get_changes()
+                                plan_desc = self.api_o.describe()
+                                if plan_desc == None:
+                                        return
+                                plan = plan_desc.get_changes()
                                 plan_pkg = None
                                 for pkg_plan in plan:
                                         if name == pkg_plan[1].pkg_stem:
@@ -3839,8 +3872,19 @@
                 self.__on_info_ok_button_clicked(None)
                 return True
 
+        def __do_api_reset(self):
+                try:
+                        self.api_o.reset()
+                except api_errors.ApiException, ex:
+                        err = str(ex)
+                        gobject.idle_add(self.error_occurred, err,
+                            None, gtk.MESSAGE_INFO)
+                        return False
+                return True
+
         def __on_install_update(self, widget):
-                self.api_o.reset()
+                if not self.__do_api_reset():
+                        return
                 install_update = []
                 confirmation_list = None
                 if self.show_install:
@@ -3859,7 +3903,8 @@
                     confirmation_list = confirmation_list)
 
         def __on_update_all(self, widget):
-                self.api_o.reset()
+                if not self.__do_api_reset():
+                        return
                 confirmation = None
                 if self.show_image_update:
                         confirmation = []
@@ -3904,7 +3949,8 @@
                                                     desc, status])
 
         def __on_remove(self, widget):
-                self.api_o.reset()
+                if not self.__do_api_reset():
+                        return
                 remove_list = []
                 confirmation_list = None
                 if self.show_remove:
@@ -3941,10 +3987,12 @@
         def __catalog_refresh(self):
                 """Update image's catalogs."""
                 success = self.__do_refresh(immediate=True)
+                if not success:
+                        gobject.idle_add(self.unset_busy_cursor)
+                        gobject.idle_add(self.update_statusbar)
+                        return -1
                 gobject.idle_add(self.__clear_recent_searches)
                 self.__catalog_refresh_done()
-                if not success:
-                        return -1
                 return 0
 
         def __catalog_refresh_done(self):
@@ -4537,6 +4585,7 @@
                 if self.use_cache:
                         self.info_cache[pkg_stem] = (labs, text, inst_str,
                             local_info, dep_info, installed_dep_info)
+                self.unset_busy_cursor()
 
         @staticmethod
         def setup_package_license(licenses):
@@ -4655,6 +4704,7 @@
                 pkg_status = model.get_value(itr, enumerations.STATUS_COLUMN)
                 if self.info_cache.has_key(pkg_stem):
                         return
+                self.set_busy_cursor()
                 Thread(target = self.__show_package_info,
                     args = (pkg, pkg_stem, pkg_status, self.last_show_info_id)).start()
 
@@ -4902,15 +4952,6 @@
                 self.w_selectupdates_menuitem.set_sensitive(False)
                 return
 
-        def __get_inventory_list(self, pargs, all_known, all_versions):
-                self.__image_activity_lock.acquire()
-                try:
-                        res = misc.get_inventory_list(self.api_o.img, 
-                            pargs, all_known, all_versions)
-                finally:
-                        self.__image_activity_lock.release()
-                return res
-
         def __enable_disable_export_selections(self):
                 if self.selected_pkgs == None or len(self.selected_pkgs) == 0:
                         self.w_export_selections_menuitem.set_sensitive(False)
@@ -5457,7 +5498,7 @@
                 if count == total:
                         self.w_progress_frame.hide()
                         return False
-                if self.api_o.can_be_canceled():
+                if self.api_o and self.api_o.can_be_canceled():
                         self.progress_cancel.set_sensitive(True)
                 else:
                         self.progress_cancel.set_sensitive(False)
@@ -5481,7 +5522,7 @@
         def __progress_pulse(self):
                 gobject.idle_add(self.w_progress_frame.show)
                 while not self.progress_stop_thread:
-                        if self.api_o != None and self.api_o.can_be_canceled():
+                        if self.api_o and self.api_o.can_be_canceled():
                                 gobject.idle_add(self.progress_cancel.set_sensitive, True)
                         else:
                                 gobject.idle_add(self.progress_cancel.set_sensitive,
@@ -5552,15 +5593,21 @@
                         dt = version.get_timestamp()
                 return dt
 
-        @staticmethod
-        def __get_version(api_o, local, pkg):
-                info = api_o.info([pkg], local, frozenset(
-                    [api.PackageInfo.STATE, api.PackageInfo.IDENTITY]))
-                found = info[api.ImageInterface.INFO_FOUND]
+        def __get_version(self, api_o, local, pkg):
+                version = None
                 try:
+                        info = api_o.info([pkg], local, frozenset(
+                            [api.PackageInfo.STATE, api.PackageInfo.IDENTITY]))
+                        found = info[api.ImageInterface.INFO_FOUND]
                         version = found[0]
                 except IndexError:
-                        version = None
+                        pass
+                except api_errors.ApiException, ex:
+                        err = str(ex)
+                        logger.error(err)
+                        gobject.idle_add(gui_misc.notify_log_error, self)
+                except Exception, ex:
+                        pass
                 return version
 
 #-----------------------------------------------------------------------------#
@@ -5756,7 +5803,14 @@
                 visible_list = update_list.get(visible_publisher)
                 if self.is_all_publishers or self.is_all_publishers_installed \
                     or self.in_recent_search:
-                        for pub in self.api_o.get_publishers():
+                        try:
+                                pubs = self.api_o.get_publishers()
+                        except api_errors.ApiException, ex:
+                                err = str(ex)
+                                gobject.idle_add(self.error_occurred, err,
+                                    None, gtk.MESSAGE_INFO)
+                                return
+                        for pub in pubs:
                                 if pub.disabled:
                                         continue
                                 prefix = pub.prefix
--- a/src/tests/gui_pylintrc	Fri Feb 12 14:44:06 2010 +0000
+++ b/src/tests/gui_pylintrc	Fri Feb 12 16:41:23 2010 +0000
@@ -159,7 +159,7 @@
 
 # Maximum number of lines in a module
 # Increased from 1500 as the packagemanager is doing a lot of GUI initialisation that we can't logically put anywhere else.
-max-module-lines=6100
+max-module-lines=7000
 
 # String used as indentation unit. This is usually " " (4 spaces) or
 # "\t" (1 tab).
--- a/src/updatemanager.py	Fri Feb 12 14:44:06 2010 +0000
+++ b/src/updatemanager.py	Fri Feb 12 16:41:23 2010 +0000
@@ -51,6 +51,7 @@
 import pkg.gui.installupdate as installupdate
 import pkg.gui.enumerations as enumerations
 import pkg.gui.misc as gui_misc
+import pkg.client.api_errors as api_errors
 import pkg.misc as misc
 from pkg.client import global_settings
 logger = global_settings.logger
@@ -371,7 +372,13 @@
                 list_option = api.ImageInterface.LIST_UPGRADABLE
                 if list_uninstalled:
                         list_option = api.ImageInterface.LIST_INSTALLED_NEWEST
-                pkgs_from_api = self.api_obj.get_pkg_list(pkg_list = list_option)
+                try:
+                        pkgs_from_api = self.api_obj.get_pkg_list(pkg_list = list_option)
+                except api_errors.ApiException, ex:
+                        gobject.idle_add(gui_misc.error_occurred, 
+                            self.w_um_dialog, 
+                            str(ex), _("Update Manager"))
+                        return
                 for entry in pkgs_from_api:
                         (pkg_pub, pkg_name, ver) = entry[0]
                         states = entry[3]
@@ -547,7 +554,13 @@
 
         def __on_updateall_button_clicked(self, widget):
                 self.__selectall_toggle(True)
-                self.__get_api_obj().reset()
+                try:
+                        self.__get_api_obj().reset()
+                except api_errors.ApiException, ex:
+                        gobject.idle_add(gui_misc.error_occurred, 
+                            self.w_um_dialog, 
+                            str(ex), _("Update Manager"))
+                        return
                 installupdate.InstallUpdate([], self,
                     self.__get_image_path(), action = enumerations.IMAGE_UPDATE,
                     parent_name = _("Update Manager"),
@@ -559,11 +572,6 @@
         def __on_selectall_checkbutton_toggled(self, widget):
                 self.__selectall_toggle(widget.get_active())
                 
-        def __handle_cancel_exception(self):
-                gobject.idle_add(self.w_progress_dialog.hide)
-                gobject.idle_add(self.w_progressinfo_expander.set_expanded, False)
-                self.__cleanup()                
-        
         def __prompt_to_load_beadm(self):
                 msgbox = gtk.MessageDialog(parent = self.w_progress_dialog,
                     buttons = gtk.BUTTONS_OK_CANCEL, flags = gtk.DIALOG_MODAL,
@@ -592,11 +600,6 @@
                 list2 = dict([(k, None) for k in list2])
                 return [item for item in list1 if item not in list2]
                 
-        def __cleanup(self):
-                self.api_obj.reset()
-                self.pr.reset()
-                self.progress_stop_thread = True   
-                
         @staticmethod
         def __on_um_expander_activate(widget):
                 return