comparison env/lib/python3.7/site-packages/boto/swf/layer2.py @ 0:26e78fe6e8c4 draft

"planemo upload commit c699937486c35866861690329de38ec1a5d9f783"
author shellac
date Sat, 02 May 2020 07:14:21 -0400
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:26e78fe6e8c4
1 """Object-oriented interface to SWF wrapping boto.swf.layer1.Layer1"""
2
3 import time
4 from functools import wraps
5 from boto.swf.layer1 import Layer1
6 from boto.swf.layer1_decisions import Layer1Decisions
7
8 DEFAULT_CREDENTIALS = {
9 'aws_access_key_id': None,
10 'aws_secret_access_key': None
11 }
12
13 def set_default_credentials(aws_access_key_id, aws_secret_access_key):
14 """Set default credentials."""
15 DEFAULT_CREDENTIALS.update({
16 'aws_access_key_id': aws_access_key_id,
17 'aws_secret_access_key': aws_secret_access_key,
18 })
19
20 class SWFBase(object):
21
22 name = None
23 domain = None
24 aws_access_key_id = None
25 aws_secret_access_key = None
26 region = None
27
28 def __init__(self, **kwargs):
29 # Set default credentials.
30 for credkey in ('aws_access_key_id', 'aws_secret_access_key'):
31 if DEFAULT_CREDENTIALS.get(credkey):
32 setattr(self, credkey, DEFAULT_CREDENTIALS[credkey])
33 # Override attributes with keyword args.
34 for kwarg in kwargs:
35 setattr(self, kwarg, kwargs[kwarg])
36
37 self._swf = Layer1(self.aws_access_key_id,
38 self.aws_secret_access_key,
39 region=self.region)
40
41 def __repr__(self):
42 rep_str = str(self.name)
43 if hasattr(self, 'version'):
44 rep_str += '-' + str(getattr(self, 'version'))
45 return '<%s %r at 0x%x>' % (self.__class__.__name__, rep_str, id(self))
46
47 class Domain(SWFBase):
48
49 """Simple Workflow Domain."""
50
51 description = None
52 retention = 30
53 @wraps(Layer1.describe_domain)
54 def describe(self):
55 """DescribeDomain."""
56 return self._swf.describe_domain(self.name)
57
58 @wraps(Layer1.deprecate_domain)
59 def deprecate(self):
60 """DeprecateDomain"""
61 self._swf.deprecate_domain(self.name)
62
63 @wraps(Layer1.register_domain)
64 def register(self):
65 """RegisterDomain."""
66 self._swf.register_domain(self.name, str(self.retention),
67 self.description)
68
69 @wraps(Layer1.list_activity_types)
70 def activities(self, status='REGISTERED', **kwargs):
71 """ListActivityTypes."""
72 act_types = self._swf.list_activity_types(self.name, status, **kwargs)
73 act_objects = []
74 for act_args in act_types['typeInfos']:
75 act_ident = act_args['activityType']
76 del act_args['activityType']
77 act_args.update(act_ident)
78 act_args.update({
79 'aws_access_key_id': self.aws_access_key_id,
80 'aws_secret_access_key': self.aws_secret_access_key,
81 'domain': self.name,
82 'region': self.region,
83 })
84 act_objects.append(ActivityType(**act_args))
85 return act_objects
86
87 @wraps(Layer1.list_workflow_types)
88 def workflows(self, status='REGISTERED', **kwargs):
89 """ListWorkflowTypes."""
90 wf_types = self._swf.list_workflow_types(self.name, status, **kwargs)
91 wf_objects = []
92 for wf_args in wf_types['typeInfos']:
93 wf_ident = wf_args['workflowType']
94 del wf_args['workflowType']
95 wf_args.update(wf_ident)
96 wf_args.update({
97 'aws_access_key_id': self.aws_access_key_id,
98 'aws_secret_access_key': self.aws_secret_access_key,
99 'domain': self.name,
100 'region': self.region,
101 })
102
103 wf_objects.append(WorkflowType(**wf_args))
104 return wf_objects
105
106 def executions(self, closed=False, **kwargs):
107 """List list open/closed executions.
108
109 For a full list of available parameters refer to
110 :py:func:`boto.swf.layer1.Layer1.list_closed_workflow_executions` and
111 :py:func:`boto.swf.layer1.Layer1.list_open_workflow_executions`
112 """
113 if closed:
114 executions = self._swf.list_closed_workflow_executions(self.name,
115 **kwargs)
116 else:
117 if 'oldest_date' not in kwargs:
118 # Last 24 hours.
119 kwargs['oldest_date'] = time.time() - (3600 * 24)
120 executions = self._swf.list_open_workflow_executions(self.name,
121 **kwargs)
122 exe_objects = []
123 for exe_args in executions['executionInfos']:
124 for nested_key in ('execution', 'workflowType'):
125 nested_dict = exe_args[nested_key]
126 del exe_args[nested_key]
127 exe_args.update(nested_dict)
128
129 exe_args.update({
130 'aws_access_key_id': self.aws_access_key_id,
131 'aws_secret_access_key': self.aws_secret_access_key,
132 'domain': self.name,
133 'region': self.region,
134 })
135
136 exe_objects.append(WorkflowExecution(**exe_args))
137 return exe_objects
138
139 @wraps(Layer1.count_pending_activity_tasks)
140 def count_pending_activity_tasks(self, task_list):
141 """CountPendingActivityTasks."""
142 return self._swf.count_pending_activity_tasks(self.name, task_list)
143
144 @wraps(Layer1.count_pending_decision_tasks)
145 def count_pending_decision_tasks(self, task_list):
146 """CountPendingDecisionTasks."""
147 return self._swf.count_pending_decision_tasks(self.name, task_list)
148
149
150 class Actor(SWFBase):
151
152 task_list = None
153 last_tasktoken = None
154 domain = None
155
156 def run(self):
157 """To be overloaded by subclasses."""
158 raise NotImplementedError()
159
160 class ActivityWorker(Actor):
161
162 """Base class for SimpleWorkflow activity workers."""
163
164 @wraps(Layer1.respond_activity_task_canceled)
165 def cancel(self, task_token=None, details=None):
166 """RespondActivityTaskCanceled."""
167 if task_token is None:
168 task_token = self.last_tasktoken
169 return self._swf.respond_activity_task_canceled(task_token, details)
170
171 @wraps(Layer1.respond_activity_task_completed)
172 def complete(self, task_token=None, result=None):
173 """RespondActivityTaskCompleted."""
174 if task_token is None:
175 task_token = self.last_tasktoken
176 return self._swf.respond_activity_task_completed(task_token, result)
177
178 @wraps(Layer1.respond_activity_task_failed)
179 def fail(self, task_token=None, details=None, reason=None):
180 """RespondActivityTaskFailed."""
181 if task_token is None:
182 task_token = self.last_tasktoken
183 return self._swf.respond_activity_task_failed(task_token, details,
184 reason)
185
186 @wraps(Layer1.record_activity_task_heartbeat)
187 def heartbeat(self, task_token=None, details=None):
188 """RecordActivityTaskHeartbeat."""
189 if task_token is None:
190 task_token = self.last_tasktoken
191 return self._swf.record_activity_task_heartbeat(task_token, details)
192
193 @wraps(Layer1.poll_for_activity_task)
194 def poll(self, **kwargs):
195 """PollForActivityTask."""
196 task_list = self.task_list
197 if 'task_list' in kwargs:
198 task_list = kwargs.get('task_list')
199 del kwargs['task_list']
200 task = self._swf.poll_for_activity_task(self.domain, task_list,
201 **kwargs)
202 self.last_tasktoken = task.get('taskToken')
203 return task
204
205 class Decider(Actor):
206
207 """Base class for SimpleWorkflow deciders."""
208
209 @wraps(Layer1.respond_decision_task_completed)
210 def complete(self, task_token=None, decisions=None, **kwargs):
211 """RespondDecisionTaskCompleted."""
212 if isinstance(decisions, Layer1Decisions):
213 # Extract decision list from a Layer1Decisions instance.
214 decisions = decisions._data
215 if task_token is None:
216 task_token = self.last_tasktoken
217 return self._swf.respond_decision_task_completed(task_token, decisions,
218 **kwargs)
219
220 @wraps(Layer1.poll_for_decision_task)
221 def poll(self, **kwargs):
222 """PollForDecisionTask."""
223 task_list = self.task_list
224 if 'task_list' in kwargs:
225 task_list = kwargs.get('task_list')
226 del kwargs['task_list']
227 decision_task = self._swf.poll_for_decision_task(self.domain, task_list,
228 **kwargs)
229 self.last_tasktoken = decision_task.get('taskToken')
230 return decision_task
231
232 class WorkflowType(SWFBase):
233
234 """A versioned workflow type."""
235
236 version = None
237 task_list = None
238 child_policy = 'TERMINATE'
239
240 @wraps(Layer1.describe_workflow_type)
241 def describe(self):
242 """DescribeWorkflowType."""
243 return self._swf.describe_workflow_type(self.domain, self.name,
244 self.version)
245 @wraps(Layer1.register_workflow_type)
246 def register(self, **kwargs):
247 """RegisterWorkflowType."""
248 args = {
249 'default_execution_start_to_close_timeout': '3600',
250 'default_task_start_to_close_timeout': '300',
251 'default_child_policy': 'TERMINATE',
252 }
253 args.update(kwargs)
254 self._swf.register_workflow_type(self.domain, self.name, self.version,
255 **args)
256
257 @wraps(Layer1.deprecate_workflow_type)
258 def deprecate(self):
259 """DeprecateWorkflowType."""
260 self._swf.deprecate_workflow_type(self.domain, self.name, self.version)
261
262 @wraps(Layer1.start_workflow_execution)
263 def start(self, **kwargs):
264 """StartWorkflowExecution."""
265 if 'workflow_id' in kwargs:
266 workflow_id = kwargs['workflow_id']
267 del kwargs['workflow_id']
268 else:
269 workflow_id = '%s-%s-%i' % (self.name, self.version, time.time())
270
271 for def_attr in ('task_list', 'child_policy'):
272 kwargs[def_attr] = kwargs.get(def_attr, getattr(self, def_attr))
273 run_id = self._swf.start_workflow_execution(self.domain, workflow_id,
274 self.name, self.version, **kwargs)['runId']
275 return WorkflowExecution(name=self.name, version=self.version,
276 runId=run_id, domain=self.domain, workflowId=workflow_id,
277 aws_access_key_id=self.aws_access_key_id,
278 aws_secret_access_key=self.aws_secret_access_key)
279
280 class WorkflowExecution(SWFBase):
281
282 """An instance of a workflow."""
283
284 workflowId = None
285 runId = None
286
287 @wraps(Layer1.signal_workflow_execution)
288 def signal(self, signame, **kwargs):
289 """SignalWorkflowExecution."""
290 self._swf.signal_workflow_execution(self.domain, signame,
291 self.workflowId, **kwargs)
292
293 @wraps(Layer1.terminate_workflow_execution)
294 def terminate(self, **kwargs):
295 """TerminateWorkflowExecution (p. 103)."""
296 return self._swf.terminate_workflow_execution(self.domain,
297 self.workflowId, **kwargs)
298
299 @wraps(Layer1.get_workflow_execution_history)
300 def history(self, **kwargs):
301 """GetWorkflowExecutionHistory."""
302 return self._swf.get_workflow_execution_history(self.domain, self.runId,
303 self.workflowId, **kwargs)['events']
304
305 @wraps(Layer1.describe_workflow_execution)
306 def describe(self):
307 """DescribeWorkflowExecution."""
308 return self._swf.describe_workflow_execution(self.domain, self.runId,
309 self.workflowId)
310
311 @wraps(Layer1.request_cancel_workflow_execution)
312 def request_cancel(self):
313 """RequestCancelWorkflowExecution."""
314 return self._swf.request_cancel_workflow_execution(self.domain,
315 self.workflowId, self.runId)
316
317
318 class ActivityType(SWFBase):
319
320 """A versioned activity type."""
321
322 version = None
323
324 @wraps(Layer1.deprecate_activity_type)
325 def deprecate(self):
326 """DeprecateActivityType."""
327 return self._swf.deprecate_activity_type(self.domain, self.name,
328 self.version)
329
330 @wraps(Layer1.describe_activity_type)
331 def describe(self):
332 """DescribeActivityType."""
333 return self._swf.describe_activity_type(self.domain, self.name,
334 self.version)
335
336 @wraps(Layer1.register_activity_type)
337 def register(self, **kwargs):
338 """RegisterActivityType."""
339 args = {
340 'default_task_heartbeat_timeout': '600',
341 'default_task_schedule_to_close_timeout': '3900',
342 'default_task_schedule_to_start_timeout': '300',
343 'default_task_start_to_close_timeout': '3600',
344 }
345 args.update(kwargs)
346 self._swf.register_activity_type(self.domain, self.name, self.version,
347 **args)