changeset 1624:7e749e8eefd0

core: fixed launchAction: - getClient now raise a NotFound error if client is not available - errors ConnectedProfileError, NotConnectedProfileError anf ProfileKeyUnknownError renamed for consistency (all profile error must prefixed by Profile) - launchAction fixed, the case where client is not available is handled - kept actions are actuall1y removed on launchAction
author Goffi <goffi@goffi.org>
date Wed, 18 Nov 2015 11:06:24 +0100
parents ec48b35309dc
children 8b8b1af5905f
files src/core/exceptions.py src/core/sat_main.py src/memory/params.py src/test/helpers.py
diffstat 4 files changed, 34 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/src/core/exceptions.py	Tue Nov 17 21:29:03 2015 +0100
+++ b/src/core/exceptions.py	Wed Nov 18 11:06:24 2015 +0100
@@ -33,16 +33,16 @@
     pass
 
 
-class ConnectedProfileError(Exception):
+class ProfileConnected(Exception):
     """This error is raised when trying to delete a connected profile."""
     pass
 
 
-class NotConnectedProfileError(Exception):
+class ProfileNotConnected(Exception):
     pass
 
 
-class ProfileKeyUnknownError(Exception):
+class ProfileKeyUnknown(Exception):
     pass
 
 
--- a/src/core/sat_main.py	Tue Nov 17 21:29:03 2015 +0100
+++ b/src/core/sat_main.py	Wed Nov 18 11:06:24 2015 +0100
@@ -455,11 +455,19 @@
 
     def getClient(self, profile_key):
         """Convenient method to get client from profile key
-        @return: client or None if it doesn't exist"""
+
+        @return: client or None if it doesn't exist
+        @raise exceptions.ProfileKeyUnknown: the profile or profile key doesn't exist
+        @raise exceptions.NotFound: client is not available
+            This happen if profile has not been use yet
+        """
         profile = self.memory.getProfileName(profile_key)
         if not profile:
-            raise exceptions.ProfileKeyUnknownError
-        return self.profiles[profile]
+            raise exceptions.ProfileKeyUnknown
+        try:
+            return self.profiles[profile]
+        except KeyError:
+            raise exceptions.NotFound
 
     def getClients(self, profile_key):
         """Convenient method to get list of clients from profile key (manage list through profile_key like C.PROF_KEY_ALL)
@@ -474,7 +482,7 @@
         if profile == C.PROF_KEY_ALL:
             return self.profiles.values()
         elif profile.count('@') > 1:
-            raise exceptions.ProfileKeyUnknownError
+            raise exceptions.ProfileKeyUnknown
         return [self.profiles[profile]]
 
     def _getConfig(self, section, name):
@@ -925,13 +933,23 @@
                 - C.BOOL_TRUE
                 - C.BOOL_FALSE
         """
-        client = self.getClient(profile_key)
         try:
-            action_tuple = client.actions[callback_id]
-        except KeyError:
-            pass
+            client = self.getClient(profile_key)
+        except exceptions.NotFound:
+            # client is not available yet
+            profile = self.memory.getProfileName(profile_key)
+            if not profile:
+                raise exceptions.ProfileUnknownError(_('trying to launch action with a non-existant profile'))
         else:
-            action_tuple[-1].cancel() # the last item is the action timer
+            profile = client.profile
+            # we check if the action is kept, and remove it
+            try:
+                action_tuple = client.actions[callback_id]
+            except KeyError:
+                pass
+            else:
+                action_tuple[-1].cancel() # the last item is the action timer
+                del client.actions[callback_id]
 
         try:
             callback, args, kwargs = self._cb_map[callback_id]
@@ -943,7 +961,7 @@
                 raise exceptions.DataError("Required data for this callback is missing")
             args,kwargs=list(args)[:],kwargs.copy() # we don't want to modify the original (kw)args
             args.insert(0, data)
-            kwargs["profile"] = client.profile
+            kwargs["profile"] = profile
             del kwargs["with_data"]
 
         if kwargs.pop('one_shot', False):
--- a/src/memory/params.py	Tue Nov 17 21:29:03 2015 +0100
+++ b/src/memory/params.py	Wed Nov 18 11:06:24 2015 +0100
@@ -183,7 +183,7 @@
                 self.host.disconnect(profile)
             else:
                 log.info(_("Trying to delete a connected profile"))
-                return defer.fail(Failure(exceptions.ConnectedProfileError))
+                return defer.fail(Failure(exceptions.ProfileConnected))
         return self.storage.deleteProfile(profile)
 
     def getProfileName(self, profile_key, return_profile_keys=False):
@@ -482,7 +482,7 @@
 
         if profile not in self.params:
             log.error(_('Requesting synchronous param for not connected profile'))
-            raise exceptions.NotConnectedProfileError(profile)
+            raise exceptions.ProfileNotConnected(profile)
 
         if attr == "value":
             value = self._getParam(category, name, profile=profile)
--- a/src/test/helpers.py	Tue Nov 17 21:29:03 2015 +0100
+++ b/src/test/helpers.py	Wed Nov 18 11:06:24 2015 +0100
@@ -124,7 +124,7 @@
         @return: client or None if it doesn't exist"""
         profile = self.memory.getProfileName(profile_key)
         if not profile:
-            raise exceptions.ProfileKeyUnknownError
+            raise exceptions.ProfileKeyUnknown
         if profile not in self.profiles:
             self.profiles[profile] = FakeClient(self, profile)
         return self.profiles[profile]