Index: third_party/gsutil/boto/boto/swf/layer2.py |
diff --git a/third_party/gsutil/boto/boto/swf/layer2.py b/third_party/gsutil/boto/boto/swf/layer2.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..10c34d558697881085b83d54146ac30b4eee6e9a |
--- /dev/null |
+++ b/third_party/gsutil/boto/boto/swf/layer2.py |
@@ -0,0 +1,342 @@ |
+"""Object-oriented interface to SWF wrapping boto.swf.layer1.Layer1""" |
+ |
+import time |
+from functools import wraps |
+from boto.swf.layer1 import Layer1 |
+from boto.swf.layer1_decisions import Layer1Decisions |
+ |
+DEFAULT_CREDENTIALS = { |
+ 'aws_access_key_id': None, |
+ 'aws_secret_access_key': None |
+} |
+ |
+def set_default_credentials(aws_access_key_id, aws_secret_access_key): |
+ """Set default credentials.""" |
+ DEFAULT_CREDENTIALS.update({ |
+ 'aws_access_key_id': aws_access_key_id, |
+ 'aws_secret_access_key': aws_secret_access_key, |
+ }) |
+ |
+class SWFBase(object): |
+ |
+ """SWFBase.""" |
+ |
+ name = None |
+ domain = None |
+ aws_access_key_id = None |
+ aws_secret_access_key = None |
+ |
+ def __init__(self, **kwargs): |
+ """Construct an SWF object.""" |
+ # Set default credentials. |
+ for credkey in ('aws_access_key_id', 'aws_secret_access_key'): |
+ if DEFAULT_CREDENTIALS.get(credkey): |
+ setattr(self, credkey, DEFAULT_CREDENTIALS[credkey]) |
+ # Override attributes with keyword args. |
+ for kwarg in kwargs: |
+ setattr(self, kwarg, kwargs[kwarg]) |
+ |
+ self._swf = Layer1(self.aws_access_key_id, |
+ self.aws_secret_access_key) |
+ |
+ def __repr__(self): |
+ """Generate string representation.""" |
+ rep_str = self.name |
+ if hasattr(self, 'version'): |
+ rep_str += '-' + getattr(self, 'version') |
+ return '<%s %r at 0x%x>' % (self.__class__.__name__, rep_str, id(self)) |
+ |
+class Domain(SWFBase): |
+ |
+ """Simple Workflow Domain.""" |
+ |
+ description = None |
+ retention = 30 |
+ @wraps(Layer1.describe_domain) |
+ def describe(self): |
+ """DescribeDomain.""" |
+ return self._swf.describe_domain(self.name) |
+ |
+ @wraps(Layer1.deprecate_domain) |
+ def deprecate(self): |
+ """DeprecateDomain""" |
+ self._swf.deprecate_domain(self.name) |
+ |
+ @wraps(Layer1.register_domain) |
+ def register(self): |
+ """RegisterDomain.""" |
+ self._swf.register_domain(self.name, str(self.retention), |
+ self.description) |
+ |
+ @wraps(Layer1.list_activity_types) |
+ def activities(self, status='REGISTERED', **kwargs): |
+ """ListActivityTypes.""" |
+ act_types = self._swf.list_activity_types(self.name, status, **kwargs) |
+ act_objects = [] |
+ for act_args in act_types['typeInfos']: |
+ act_ident = act_args['activityType'] |
+ del act_args['activityType'] |
+ act_args.update(act_ident) |
+ act_args.update({ |
+ 'aws_access_key_id': self.aws_access_key_id, |
+ 'aws_secret_access_key': self.aws_secret_access_key, |
+ 'domain': self.name, |
+ }) |
+ act_objects.append(ActivityType(**act_args)) |
+ return act_objects |
+ |
+ @wraps(Layer1.list_workflow_types) |
+ def workflows(self, status='REGISTERED', **kwargs): |
+ """ListWorkflowTypes.""" |
+ wf_types = self._swf.list_workflow_types(self.name, status, **kwargs) |
+ wf_objects = [] |
+ for wf_args in wf_types['typeInfos']: |
+ wf_ident = wf_args['workflowType'] |
+ del wf_args['workflowType'] |
+ wf_args.update(wf_ident) |
+ wf_args.update({ |
+ 'aws_access_key_id': self.aws_access_key_id, |
+ 'aws_secret_access_key': self.aws_secret_access_key, |
+ 'domain': self.name, |
+ }) |
+ |
+ wf_objects.append(WorkflowType(**wf_args)) |
+ return wf_objects |
+ |
+ def executions(self, closed=False, **kwargs): |
+ """List list open/closed executions. |
+ |
+ For more info, try: |
+ >>> help(boto.swf.layer1.Layer1.list_closed_workflow_executions) |
+ >>> help(boto.swf.layer1.Layer1.list_open_workflow_executions) |
+ """ |
+ if closed: |
+ executions = self._swf.list_closed_workflow_executions(self.name, |
+ **kwargs) |
+ else: |
+ if 'oldest_date' not in kwargs: |
+ # Last 24 hours. |
+ kwargs['oldest_date'] = time.time() - (3600 * 24) |
+ executions = self._swf.list_open_workflow_executions(self.name, |
+ **kwargs) |
+ exe_objects = [] |
+ for exe_args in executions['executionInfos']: |
+ for nested_key in ('execution', 'workflowType'): |
+ nested_dict = exe_args[nested_key] |
+ del exe_args[nested_key] |
+ exe_args.update(nested_dict) |
+ |
+ exe_args.update({ |
+ 'aws_access_key_id': self.aws_access_key_id, |
+ 'aws_secret_access_key': self.aws_secret_access_key, |
+ 'domain': self.name, |
+ }) |
+ |
+ exe_objects.append(WorkflowExecution(**exe_args)) |
+ return exe_objects |
+ |
+ @wraps(Layer1.count_pending_activity_tasks) |
+ def count_pending_activity_tasks(self, task_list): |
+ """CountPendingActivityTasks.""" |
+ return self._swf.count_pending_activity_tasks(self.name, task_list) |
+ |
+ @wraps(Layer1.count_pending_decision_tasks) |
+ def count_pending_decision_tasks(self, task_list): |
+ """CountPendingDecisionTasks.""" |
+ return self._swf.count_pending_decision_tasks(self.name, task_list) |
+ |
+ |
+class Actor(SWFBase): |
+ |
+ """Simple Workflow Actor interface.""" |
+ |
+ task_list = None |
+ last_tasktoken = None |
+ domain = None |
+ |
+ def run(self): |
+ """To be overloaded by subclasses.""" |
+ raise NotImplementedError() |
+ |
+class ActivityWorker(Actor): |
+ |
+ """ActivityWorker.""" |
+ |
+ @wraps(Layer1.respond_activity_task_canceled) |
+ def cancel(self, task_token=None, details=None): |
+ """RespondActivityTaskCanceled.""" |
+ if task_token is None: |
+ task_token = self.last_tasktoken |
+ return self._swf.respond_activity_task_canceled(task_token, details) |
+ |
+ @wraps(Layer1.respond_activity_task_completed) |
+ def complete(self, task_token=None, result=None): |
+ """RespondActivityTaskCompleted.""" |
+ if task_token is None: |
+ task_token = self.last_tasktoken |
+ return self._swf.respond_activity_task_completed(task_token, result) |
+ |
+ @wraps(Layer1.respond_activity_task_failed) |
+ def fail(self, task_token=None, details=None, reason=None): |
+ """RespondActivityTaskFailed.""" |
+ if task_token is None: |
+ task_token = self.last_tasktoken |
+ return self._swf.respond_activity_task_failed(task_token, details, |
+ reason) |
+ |
+ @wraps(Layer1.record_activity_task_heartbeat) |
+ def heartbeat(self, task_token=None, details=None): |
+ """RecordActivityTaskHeartbeat.""" |
+ if task_token is None: |
+ task_token = self.last_tasktoken |
+ return self._swf.record_activity_task_heartbeat(task_token, details) |
+ |
+ @wraps(Layer1.poll_for_activity_task) |
+ def poll(self, **kwargs): |
+ """PollForActivityTask.""" |
+ task = self._swf.poll_for_activity_task(self.domain, self.task_list, |
+ **kwargs) |
+ self.last_tasktoken = task.get('taskToken') |
+ return task |
+ |
+class Decider(Actor): |
+ |
+ """Simple Workflow Decider.""" |
+ |
+ @wraps(Layer1.respond_decision_task_completed) |
+ def complete(self, task_token=None, decisions=None, **kwargs): |
+ """RespondDecisionTaskCompleted.""" |
+ if isinstance(decisions, Layer1Decisions): |
+ # Extract decision list from a Layer1Decisions instance. |
+ decisions = decisions._data |
+ if task_token is None: |
+ task_token = self.last_tasktoken |
+ return self._swf.respond_decision_task_completed(task_token, decisions, |
+ **kwargs) |
+ |
+ @wraps(Layer1.poll_for_decision_task) |
+ def poll(self, **kwargs): |
+ """PollForDecisionTask.""" |
+ result = self._swf.poll_for_decision_task(self.domain, self.task_list, |
+ **kwargs) |
+ # Record task token. |
+ self.last_tasktoken = result.get('taskToken') |
+ # Record the last event. |
+ return result |
+ |
+class WorkflowType(SWFBase): |
+ |
+ """WorkflowType.""" |
+ |
+ version = None |
+ task_list = None |
+ child_policy = 'TERMINATE' |
+ |
+ @wraps(Layer1.describe_workflow_type) |
+ def describe(self): |
+ """DescribeWorkflowType.""" |
+ return self._swf.describe_workflow_type(self.domain, self.name, |
+ self.version) |
+ @wraps(Layer1.register_workflow_type) |
+ def register(self, **kwargs): |
+ """RegisterWorkflowType.""" |
+ args = { |
+ 'default_execution_start_to_close_timeout': '3600', |
+ 'default_task_start_to_close_timeout': '300', |
+ 'default_child_policy': 'TERMINATE', |
+ } |
+ args.update(kwargs) |
+ self._swf.register_workflow_type(self.domain, self.name, self.version, |
+ **args) |
+ |
+ @wraps(Layer1.deprecate_workflow_type) |
+ def deprecate(self): |
+ """DeprecateWorkflowType.""" |
+ self._swf.deprecate_workflow_type(self.domain, self.name, self.version) |
+ |
+ @wraps(Layer1.start_workflow_execution) |
+ def start(self, **kwargs): |
+ """StartWorkflowExecution.""" |
+ if 'workflow_id' in kwargs: |
+ workflow_id = kwargs['workflow_id'] |
+ del kwargs['workflow_id'] |
+ else: |
+ workflow_id = '%s-%s-%i' % (self.name, self.version, time.time()) |
+ |
+ for def_attr in ('task_list', 'child_policy'): |
+ kwargs[def_attr] = kwargs.get(def_attr, getattr(self, def_attr)) |
+ run_id = self._swf.start_workflow_execution(self.domain, workflow_id, |
+ self.name, self.version, **kwargs)['runId'] |
+ return WorkflowExecution(name=self.name, version=self.version, |
+ runId=run_id, domain=self.domain, workflowId=workflow_id, |
+ aws_access_key_id=self.aws_access_key_id, |
+ aws_secret_access_key=self.aws_secret_access_key) |
+ |
+class WorkflowExecution(SWFBase): |
+ |
+ """WorkflowExecution.""" |
+ |
+ workflowId = None |
+ runId = None |
+ |
+ @wraps(Layer1.signal_workflow_execution) |
+ def signal(self, signame, **kwargs): |
+ """SignalWorkflowExecution.""" |
+ self._swf.signal_workflow_execution(self.domain, signame, |
+ self.workflowId, **kwargs) |
+ |
+ @wraps(Layer1.terminate_workflow_execution) |
+ def terminate(self, **kwargs): |
+ """TerminateWorkflowExecution (p. 103).""" |
+ return self._swf.terminate_workflow_execution(self.domain, |
+ self.workflowId, **kwargs) |
+ |
+ @wraps(Layer1.get_workflow_execution_history) |
+ def history(self, **kwargs): |
+ """GetWorkflowExecutionHistory.""" |
+ return self._swf.get_workflow_execution_history(self.domain, self.runId, |
+ self.workflowId, **kwargs)['events'] |
+ |
+ @wraps(Layer1.describe_workflow_execution) |
+ def describe(self): |
+ """DescribeWorkflowExecution.""" |
+ return self._swf.describe_workflow_execution(self.domain, self.runId, |
+ self.workflowId) |
+ |
+ @wraps(Layer1.request_cancel_workflow_execution) |
+ def request_cancel(self): |
+ """RequestCancelWorkflowExecution.""" |
+ return self._swf.request_cancel_workflow_execution(self.domain, |
+ self.workflowId, self.runId) |
+ |
+ |
+class ActivityType(SWFBase): |
+ |
+ """ActivityType.""" |
+ |
+ version = None |
+ |
+ @wraps(Layer1.deprecate_activity_type) |
+ def deprecate(self): |
+ """DeprecateActivityType.""" |
+ return self._swf.deprecate_activity_type(self.domain, self.name, |
+ self.version) |
+ |
+ @wraps(Layer1.describe_activity_type) |
+ def describe(self): |
+ """DescribeActivityType.""" |
+ return self._swf.describe_activity_type(self.domain, self.name, |
+ self.version) |
+ |
+ @wraps(Layer1.register_activity_type) |
+ def register(self, **kwargs): |
+ """RegisterActivityType.""" |
+ args = { |
+ 'default_task_heartbeat_timeout': '600', |
+ 'default_task_schedule_to_close_timeout': '3900', |
+ 'default_task_schedule_to_start_timeout': '300', |
+ 'default_task_start_to_close_timeout': '3600', |
+ } |
+ args.update(kwargs) |
+ self._swf.register_activity_type(self.domain, self.name, self.version, |
+ **args) |