Use a collections.namedtuple for the request work unit
Instead of returning a tuple with hard to understand and read contents a namedtuple can help understand what the tuple is composed of and how it can be used/what it is, so we should prefer to use it when we can for the wbe requested work to perform. Change-Id: I8147814449d04ba9a03730547ac113e4ef7b272a
This commit is contained in:
		| @@ -15,6 +15,7 @@ | ||||
| #    under the License. | ||||
|  | ||||
| import abc | ||||
| import collections | ||||
| import threading | ||||
|  | ||||
| from concurrent import futures | ||||
| @@ -171,6 +172,10 @@ class Notify(Message): | ||||
|                                          % (cls.TYPE, e.message), e) | ||||
|  | ||||
|  | ||||
| _WorkUnit = collections.namedtuple('_WorkUnit', ['task_cls', 'task_name', | ||||
|                                                  'action', 'arguments']) | ||||
|  | ||||
|  | ||||
| class Request(Message): | ||||
|     """Represents request with execution results. | ||||
|  | ||||
| @@ -371,7 +376,7 @@ class Request(Message): | ||||
|  | ||||
|     @staticmethod | ||||
|     def from_dict(data, task_uuid=None): | ||||
|         """Parses **validated** data before it can be further processed. | ||||
|         """Parses **validated** data into a work unit. | ||||
|  | ||||
|         All :py:class:`~taskflow.types.failure.Failure` objects that have been | ||||
|         converted to dict(s) on the remote side will now converted back | ||||
| @@ -401,7 +406,7 @@ class Request(Message): | ||||
|             arguments['failures'] = {} | ||||
|             for task, fail_data in six.iteritems(failures): | ||||
|                 arguments['failures'][task] = ft.Failure.from_dict(fail_data) | ||||
|         return (task_cls, task_name, action, arguments) | ||||
|         return _WorkUnit(task_cls, task_name, action, arguments) | ||||
|  | ||||
|  | ||||
| class Response(Message): | ||||
|   | ||||
| @@ -172,10 +172,9 @@ class Server(object): | ||||
|             reply_callback = functools.partial(self._reply, True, reply_to, | ||||
|                                                task_uuid) | ||||
|  | ||||
|         # parse request to get task name, action and action arguments | ||||
|         # Parse the request to get the activity/work to perform. | ||||
|         try: | ||||
|             bundle = pr.Request.from_dict(request, task_uuid=task_uuid) | ||||
|             task_cls, task_name, action, arguments = bundle | ||||
|             work = pr.Request.from_dict(request, task_uuid=task_uuid) | ||||
|         except ValueError: | ||||
|             with misc.capture_failure() as failure: | ||||
|                 LOG.warn("Failed to parse request contents from message '%s'", | ||||
| @@ -183,34 +182,35 @@ class Server(object): | ||||
|                 reply_callback(result=failure.to_dict()) | ||||
|                 return | ||||
|  | ||||
|         # get task endpoint | ||||
|         # Now fetch the task endpoint (and action handler on it). | ||||
|         try: | ||||
|             endpoint = self._endpoints[task_cls] | ||||
|             endpoint = self._endpoints[work.task_cls] | ||||
|         except KeyError: | ||||
|             with misc.capture_failure() as failure: | ||||
|                 LOG.warn("The '%s' task endpoint does not exist, unable" | ||||
|                          " to continue processing request message '%s'", | ||||
|                          task_cls, ku.DelayedPretty(message), exc_info=True) | ||||
|                          work.task_cls, ku.DelayedPretty(message), | ||||
|                          exc_info=True) | ||||
|                 reply_callback(result=failure.to_dict()) | ||||
|                 return | ||||
|         else: | ||||
|             try: | ||||
|                 handler = getattr(endpoint, action) | ||||
|                 handler = getattr(endpoint, work.action) | ||||
|             except AttributeError: | ||||
|                 with misc.capture_failure() as failure: | ||||
|                     LOG.warn("The '%s' handler does not exist on task endpoint" | ||||
|                              " '%s', unable to continue processing request" | ||||
|                              " message '%s'", action, endpoint, | ||||
|                              " message '%s'", work.action, endpoint, | ||||
|                              ku.DelayedPretty(message), exc_info=True) | ||||
|                     reply_callback(result=failure.to_dict()) | ||||
|                     return | ||||
|             else: | ||||
|                 try: | ||||
|                     task = endpoint.generate(name=task_name) | ||||
|                     task = endpoint.generate(name=work.task_name) | ||||
|                 except Exception: | ||||
|                     with misc.capture_failure() as failure: | ||||
|                         LOG.warn("The '%s' task '%s' generation for request" | ||||
|                                  " message '%s' failed", endpoint, action, | ||||
|                                  " message '%s' failed", endpoint, work.action, | ||||
|                                  ku.DelayedPretty(message), exc_info=True) | ||||
|                         reply_callback(result=failure.to_dict()) | ||||
|                         return | ||||
| @@ -218,7 +218,7 @@ class Server(object): | ||||
|                     if not reply_callback(state=pr.RUNNING): | ||||
|                         return | ||||
|  | ||||
|         # associate *any* events this task emits with a proxy that will | ||||
|         # Associate *any* events this task emits with a proxy that will | ||||
|         # emit them back to the engine... for handling at the engine side | ||||
|         # of things... | ||||
|         if task.notifier.can_be_registered(nt.Notifier.ANY): | ||||
| @@ -226,22 +226,23 @@ class Server(object): | ||||
|                                    functools.partial(self._on_event, | ||||
|                                                      reply_to, task_uuid)) | ||||
|         elif isinstance(task.notifier, nt.RestrictedNotifier): | ||||
|             # only proxy the allowable events then... | ||||
|             # Only proxy the allowable events then... | ||||
|             for event_type in task.notifier.events_iter(): | ||||
|                 task.notifier.register(event_type, | ||||
|                                        functools.partial(self._on_event, | ||||
|                                                          reply_to, task_uuid)) | ||||
|  | ||||
|         # perform the task action | ||||
|         # Perform the task action. | ||||
|         try: | ||||
|             result = handler(task, **arguments) | ||||
|             result = handler(task, **work.arguments) | ||||
|         except Exception: | ||||
|             with misc.capture_failure() as failure: | ||||
|                 LOG.warn("The '%s' endpoint '%s' execution for request" | ||||
|                          " message '%s' failed", endpoint, action, | ||||
|                          " message '%s' failed", endpoint, work.action, | ||||
|                          ku.DelayedPretty(message), exc_info=True) | ||||
|                 reply_callback(result=failure.to_dict()) | ||||
|         else: | ||||
|             # And be done with it! | ||||
|             if isinstance(result, ft.Failure): | ||||
|                 reply_callback(result=result.to_dict()) | ||||
|             else: | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Joshua Harlow
					Joshua Harlow