aws-sdk 1.3.4 → 1.3.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. data/lib/aws.rb +2 -0
  2. data/lib/aws/api_config/SimpleWorkflow-2012-01-25.yml +1163 -0
  3. data/lib/aws/core.rb +16 -11
  4. data/lib/aws/core/configuration.rb +65 -47
  5. data/lib/aws/dynamo_db/item_collection.rb +2 -3
  6. data/lib/aws/dynamo_db/table.rb +2 -2
  7. data/lib/aws/ec2/collection.rb +1 -1
  8. data/lib/aws/ec2/snapshot_collection.rb +1 -1
  9. data/lib/aws/ec2/tagged_collection.rb +6 -1
  10. data/lib/aws/elb/backend_server_policy_collection.rb +1 -11
  11. data/lib/aws/elb/load_balancer.rb +4 -4
  12. data/lib/aws/elb/load_balancer_collection.rb +1 -1
  13. data/lib/aws/iam/policy.rb +1 -1
  14. data/lib/aws/record.rb +10 -4
  15. data/lib/aws/record/hash_model/finder_methods.rb +2 -3
  16. data/lib/aws/s3/bucket_lifecycle_configuration.rb +2 -2
  17. data/lib/aws/s3/policy.rb +1 -1
  18. data/lib/aws/simple_email_service.rb +8 -2
  19. data/lib/aws/simple_workflow.rb +223 -0
  20. data/lib/aws/simple_workflow/activity_task.rb +173 -0
  21. data/lib/aws/simple_workflow/activity_task_collection.rb +112 -0
  22. data/lib/aws/simple_workflow/activity_type.rb +131 -0
  23. data/lib/aws/simple_workflow/activity_type_collection.rb +93 -0
  24. data/lib/aws/simple_workflow/client.rb +57 -0
  25. data/lib/aws/simple_workflow/config.rb +18 -0
  26. data/lib/aws/simple_workflow/count.rb +49 -0
  27. data/lib/aws/simple_workflow/decision_task.rb +603 -0
  28. data/lib/aws/simple_workflow/decision_task_collection.rb +213 -0
  29. data/lib/aws/simple_workflow/domain.rb +122 -0
  30. data/lib/aws/simple_workflow/domain_collection.rb +169 -0
  31. data/lib/aws/simple_workflow/errors.rb +57 -0
  32. data/lib/aws/simple_workflow/history_event.rb +276 -0
  33. data/lib/aws/simple_workflow/history_event_collection.rb +76 -0
  34. data/lib/aws/simple_workflow/option_formatters.rb +75 -0
  35. data/lib/aws/simple_workflow/request.rb +80 -0
  36. data/lib/aws/simple_workflow/resource.rb +94 -0
  37. data/lib/aws/simple_workflow/type.rb +89 -0
  38. data/lib/aws/simple_workflow/type_collection.rb +139 -0
  39. data/lib/aws/simple_workflow/workflow_execution.rb +386 -0
  40. data/lib/aws/simple_workflow/workflow_execution_collection.rb +617 -0
  41. data/lib/aws/simple_workflow/workflow_type.rb +177 -0
  42. data/lib/aws/simple_workflow/workflow_type_collection.rb +91 -0
  43. data/lib/aws/sns/policy.rb +1 -1
  44. data/lib/aws/sns/subscription.rb +2 -2
  45. data/lib/aws/sqs/errors.rb +2 -2
  46. data/lib/aws/sqs/policy.rb +1 -1
  47. metadata +111 -54
@@ -0,0 +1,131 @@
1
+ # Copyright 2011-2012 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You
4
+ # may not use this file except in compliance with the License. A copy of
5
+ # the License is located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is
10
+ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
+ # ANY KIND, either express or implied. See the License for the specific
12
+ # language governing permissions and limitations under the License.
13
+
14
+ module AWS
15
+ class SimpleWorkflow
16
+
17
+ # == Registering an ActivityType
18
+ #
19
+ # To register an activity type you should use the #activity_types method
20
+ # on the domain:
21
+ #
22
+ # domain.activity_types.register('name', 'version', { ... })
23
+ #
24
+ # See {ActivityTypeCollection#register} for a complete list of options.
25
+ #
26
+ # == Deprecating an activity type
27
+ #
28
+ # ActivityType inherits from the generic {Type} base class. Defined in
29
+ # {Type} are a few useful methods including:
30
+ #
31
+ # * {Type#deprecate}
32
+ # * {Type#deprecated?}
33
+ #
34
+ # You can use these to deprecate an activity type:
35
+ #
36
+ # domain.activity_types['name','version'].deprecate
37
+ #
38
+ # @attr_reader [Time] creation_date When the workflow type was registered.
39
+ #
40
+ # @attr_reader [Time,nil] deprecation_date When the workflow type
41
+ # was deprecated, or nil if the workflow type has not been deprecated.
42
+ #
43
+ # @attr_reader [String,nil] description The description of this workflow
44
+ # type, or nil if was not set when it was registered.
45
+ #
46
+ # @attr_reader [Symbol] status The status of this workflow type. The
47
+ # status will either be +:registered+ or +:deprecated+.
48
+ #
49
+ # @attr_reader [Integer,:none,nil] default_task_heartbeat_timeout
50
+ # The default maximum time specified when registering the activity
51
+ # type, before which a worker processing a task must report
52
+ # progress. If the timeout is exceeded, the activity task is
53
+ # automatically timed out. If the worker subsequently attempts
54
+ # to record a heartbeat or return a result, it will be ignored.
55
+ #
56
+ # The return value may be an integer (number of seconds), the
57
+ # symbol +:none+ (implying no timeout) or +nil+ (not specified).
58
+ #
59
+ # @attr_reader [String,nil] default_task_list
60
+ # The default task list specified for this activity type at
61
+ # registration. This default task list is used if a task list is
62
+ # not provided when a task is scheduled.
63
+ #
64
+ # @attr_reader [Integer,:none,nil] default_task_schedule_to_close_timeout
65
+ # The default maximum duration specified when registering the
66
+ # activity type, for tasks of this activity type. You can override
67
+ # this default when scheduling a task.
68
+ #
69
+ # The return value may be an integer (number of seconds), the
70
+ # symbol +:none+ (implying no timeout) or +nil+ (not specified).
71
+ #
72
+ # @attr_reader [Integer,:none,nil] default_task_schedule_to_start_timeout
73
+ # The optional default maximum duration specified when registering
74
+ # the activity type, that a task of an activity type can wait
75
+ # before being assigned to a worker.
76
+ #
77
+ # The return value may be an integer (number of seconds), the
78
+ # symbol +:none+ (implying no timeout) or +nil+ (not specified).
79
+ #
80
+ # @attr_reader [Integer,:none,nil] default_task_start_to_close_timeout
81
+ # The default maximum duration for activity tasks of this type.
82
+ #
83
+ # The return value may be an integer (number of seconds), the
84
+ # symbol +:none+ (implying no timeout) or +nil+ (not specified).
85
+ #
86
+ class ActivityType < Type
87
+
88
+ type_attribute :creation_date, :timestamp => true
89
+
90
+ type_attribute :deprecation_date, :timestamp => true, :static => false
91
+
92
+ type_attribute :description
93
+
94
+ type_attribute :status, :to_sym => true, :static => false
95
+
96
+ config_attribute :default_task_heartbeat_timeout, :duration => true
97
+
98
+ config_attribute :default_task_list do
99
+ translates_output {|v| v['name'] }
100
+ end
101
+
102
+ config_attribute :default_task_schedule_to_close_timeout, :duration => true
103
+
104
+ config_attribute :default_task_schedule_to_start_timeout, :duration => true
105
+
106
+ config_attribute :default_task_start_to_close_timeout, :duration => true
107
+
108
+ # list activity type only provides type attributes
109
+ provider(:list_activity_types) do |provider|
110
+ provider.provides *type_attributes.keys
111
+ provider.find do |resp|
112
+ desc = resp.data['typeInfos'].find do |info|
113
+ info[self.class.type_key] == { 'name' => name, 'version' => version }
114
+ end
115
+ end
116
+ end
117
+
118
+ # describe activity type provides type and config attributes
119
+ provider(:describe_activity_type) do |provider|
120
+ provider.provides *type_attributes.keys
121
+ provider.provides *config_attributes.keys
122
+ provider.find do |resp|
123
+ type = { 'name' => name, 'version' => version }
124
+ resp.data['typeInfo'][self.class.type_key] == type ?
125
+ resp.data['typeInfo'].merge(resp.data['configuration']) : nil
126
+ end
127
+ end
128
+
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,93 @@
1
+ # Copyright 2011-2012 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You
4
+ # may not use this file except in compliance with the License. A copy of
5
+ # the License is located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is
10
+ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
+ # ANY KIND, either express or implied. See the License for the specific
12
+ # language governing permissions and limitations under the License.
13
+
14
+ module AWS
15
+ class SimpleWorkflow
16
+ class ActivityTypeCollection < TypeCollection
17
+
18
+ # Registers a new activity type along with its configuration settings
19
+ # in the current domain.
20
+ #
21
+ # @param [String] name The name of the activity type.
22
+ #
23
+ # @param [String] version The version of the activity type.
24
+ # The activity type consists of the name and version, the
25
+ # combination of which must be unique within the domain.
26
+ #
27
+ # @param [Hash] options
28
+ #
29
+ # @option options [Integer,:none] :default_task_heartbeat_timeout (nil)
30
+ # The default maximum time before which a worker processing a task
31
+ # of this type must report progress. If the timeout is exceeded,
32
+ # the activity task is automatically timed out. If the worker
33
+ # subsequently attempts to record a heartbeat or returns a
34
+ # result, it will be ignored. This default can be overridden when
35
+ # scheduling an activity task.
36
+ #
37
+ # The value should be a number of seconds (integer) or the symbol
38
+ # +:none+ (implying no timeout).
39
+ #
40
+ # @option options [String] :default_task_list (nil) The default task
41
+ # list to use for scheduling tasks of this activity type.
42
+ # This default task list is used if a task list is not provided
43
+ # when a task is scheduled.
44
+ #
45
+ # @option options [Integer,:none] :default_task_schedule_to_close_timeout (nil)
46
+ # The value should be a number of seconds (integer) or the symbol
47
+ # +:none+ (implying no timeout).
48
+ #
49
+ # @option options [Integer,:none] :default_task_schedule_to_start_timeout (nil)
50
+ # The default maximum duration that a task of this activity type
51
+ # can wait before being assigned to a worker. This default can be
52
+ # overridden when scheduling an activity task.
53
+ #
54
+ # The value should be a number of seconds (integer) or the symbol
55
+ # +:none+ (implying no timeout).
56
+ #
57
+ # @option options [Integer,:none] :default_task_start_to_close_timeout (nil)
58
+ # The default maximum duration that a worker can take to process
59
+ # tasks of this activity type (in the ISO 8601 format). This default
60
+ # can be overridden when scheduling an activity task.
61
+ #
62
+ # The value should be a number of seconds (integer) or the symbol
63
+ # +:none+ (implying no timeout).
64
+ #
65
+ # @option options [String] :description (nil) A textual description
66
+ # of the activity type.
67
+ #
68
+ def register name, version, options = {}
69
+
70
+ options[:domain] = domain.name
71
+ options[:name] = name
72
+ options[:version] = version
73
+
74
+ duration_opts(options,
75
+ :default_task_heartbeat_timeout,
76
+ :default_task_schedule_to_close_timeout,
77
+ :default_task_schedule_to_start_timeout,
78
+ :default_task_start_to_close_timeout)
79
+
80
+ if task_list = options[:default_task_list]
81
+ options[:default_task_list] = { :name => task_list.to_s }
82
+ end
83
+
84
+ client.register_activity_type(options)
85
+
86
+ self[name, version]
87
+
88
+ end
89
+ alias_method :create, :register
90
+
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,57 @@
1
+ # Copyright 2011-2012 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You
4
+ # may not use this file except in compliance with the License. A copy of
5
+ # the License is located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is
10
+ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
+ # ANY KIND, either express or implied. See the License for the specific
12
+ # language governing permissions and limitations under the License.
13
+
14
+ module AWS
15
+ class SimpleWorkflow
16
+
17
+ # @private
18
+ class Client < Core::JsonClient
19
+
20
+ API_VERSION = '2012-01-25'
21
+
22
+ TARGET_PREFIX = "SimpleWorkflowService."
23
+
24
+ REQUEST_CLASS = SimpleWorkflow::Request
25
+
26
+ CACHEABLE_REQUESTS = Set[
27
+ :count_pending_activity_tasks,
28
+ :count_pending_decision_tasks,
29
+ :count_closed_workflow_executions,
30
+ :count_open_workflow_executions,
31
+ :describe_activity_type,
32
+ :describe_domain,
33
+ :describe_workflow_execution,
34
+ :describe_workflow_type,
35
+ :get_workflow_execution_history,
36
+ #:poll_for_decision_task, # see below for expanded logic
37
+ :list_activity_types,
38
+ :list_domains,
39
+ :list_closed_workfow_executions,
40
+ :list_open_workfow_executions,
41
+ :list_workfow_types,
42
+ ]
43
+
44
+ configure_client
45
+
46
+ private
47
+ def cacheable_request? name, options
48
+ if name == :poll_for_decision_task
49
+ options.keys.include?(:next_page_token)
50
+ else
51
+ self.class::CACHEABLE_REQUESTS.include?(name)
52
+ end
53
+ end
54
+
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,18 @@
1
+ # Copyright 2011-2012 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You
4
+ # may not use this file except in compliance with the License. A copy of
5
+ # the License is located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is
10
+ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
+ # ANY KIND, either express or implied. See the License for the specific
12
+ # language governing permissions and limitations under the License.
13
+
14
+ AWS::Core::Configuration.module_eval do
15
+
16
+ add_service 'SimpleWorkflow', 'simple_workflow', 'swf.us-east-1.amazonaws.com'
17
+
18
+ end
@@ -0,0 +1,49 @@
1
+ # Copyright 2011-2012 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You
4
+ # may not use this file except in compliance with the License. A copy of
5
+ # the License is located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is
10
+ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
+ # ANY KIND, either express or implied. See the License for the specific
12
+ # language governing permissions and limitations under the License.
13
+
14
+ module AWS
15
+ class SimpleWorkflow
16
+
17
+ # Simple Workflow returns counts that may be truncated. Truncated
18
+ # counts indicate a lower bound. A count of 100 that is truncated
19
+ # could be represented to a user like "100+". Non-truncated counts
20
+ # are definitive.
21
+ class Count
22
+
23
+ # @private
24
+ def initialize count, truncated
25
+ @count = count
26
+ @truncated = truncated
27
+ end
28
+
29
+ # @return [Integer]
30
+ attr_reader :count
31
+
32
+ alias_method :to_i, :count
33
+
34
+ # @return [Boolean]
35
+ def truncated?
36
+ @truncated
37
+ end
38
+
39
+ def == other
40
+ other.is_a?(Count) and
41
+ other.count == self.count and
42
+ other.truncated? == self.truncated?
43
+ end
44
+
45
+ alias_method :eql?, :==
46
+
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,603 @@
1
+ # Copyright 2011-2012 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You
4
+ # may not use this file except in compliance with the License. A copy of
5
+ # the License is located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is
10
+ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
+ # ANY KIND, either express or implied. See the License for the specific
12
+ # language governing permissions and limitations under the License.
13
+
14
+ module AWS
15
+ class SimpleWorkflow
16
+
17
+ # == Getting Decision Tasks
18
+ #
19
+ # You can use #poll or #poll_for_single_task on {DecisionTaskCollection}
20
+ # to grab a decision task:
21
+ #
22
+ # # get a single task
23
+ # if task = domain.decision_tasks.poll_for_single_task('task-list')
24
+ # # make decisions
25
+ # task.complete!
26
+ # end
27
+ #
28
+ # See {DecisionTaskCollection} for more information on getting and
29
+ # counting decision tasks.
30
+ #
31
+ # == Exploring Event History
32
+ #
33
+ # Once you have a decision task you can examine the event history.
34
+ # This can give you the information you need to make decisions.
35
+ # The {#events} and {#new_events} methods enumerate through
36
+ # all events or events since the last decision.
37
+ #
38
+ # decision_task.new_events.each do |event|
39
+ # # inspect the #event_type and #attributes
40
+ # end
41
+ #
42
+ # Check out {HistoryEvent} for more information on working with
43
+ # events.
44
+ #
45
+ # == Making Decisions
46
+ #
47
+ # Based on the history of events, you should make decisions by calling
48
+ # methods listed below. You can call each method as many times as
49
+ # you wish, until you have completed the decision task.
50
+ #
51
+ # * {#schedule_activity_task}
52
+ # * {#request_cancel_activity_task}
53
+ #
54
+ # * {#complete_workflow_execution}
55
+ # * {#cancel_workflow_execution}
56
+ # * {#fail_workflow_execution}
57
+ # * {#continue_as_new_workflow_execution}
58
+ #
59
+ # * {#record_marker}
60
+ # * {#start_timer}
61
+ # * {#cancel_timer}
62
+ #
63
+ # * {#signal_external_workflow_execution}
64
+ # * {#request_cancel_external_workflow_execution}
65
+ # * {#start_child_workflow_execution}
66
+ #
67
+ # The deicision methods are grouped above by concern.
68
+ #
69
+ # == Completing the Decision Task
70
+ #
71
+ # Once you have finished adding deicions to the task, you need to
72
+ # complete it. If you called {DecisionTaskCollection#poll} or
73
+ # {DecisionTaskCollection#poll_for_single_task} with a block
74
+ # argument then the decision will be completed automatically at the
75
+ # end of the block.
76
+ #
77
+ # domain.decision_tasks.poll do |decision_task|
78
+ # # ...
79
+ # end #=> the decision task is closed here
80
+ #
81
+ # If you get a task from {DecisionTaskCollection#poll_for_single_task}
82
+ # without a block, then it is your responsibility to call {#complete!}
83
+ # on the decision task. If you fail to do this before the
84
+ # task start to close timeout, then a decisionTaskTimedOut event
85
+ # will be added to the workflow execution history.
86
+ #
87
+ class DecisionTask
88
+
89
+ include Core::Model
90
+ include OptionFormatters
91
+
92
+ # @private
93
+ def initialize domain, request_options, data
94
+
95
+ @domain = domain
96
+
97
+ @request_options = request_options
98
+
99
+ @task_token = data['taskToken']
100
+
101
+ workflow_id = data['workflowExecution']['workflowId']
102
+ run_id = data['workflowExecution']['runId']
103
+ @workflow_execution = WorkflowExecution.new(domain, workflow_id, run_id)
104
+
105
+ name = data['workflowType']['name']
106
+ version = data['workflowType']['version']
107
+ @workflow_type = WorkflowType.new(domain, name, version)
108
+
109
+ @previous_started_event_id = data['previousStartedEventId']
110
+
111
+ @started_event_id = data['startedEventId']
112
+
113
+ @next_token = data['nextPageToken']
114
+
115
+ @events = data['events']
116
+
117
+ @decisions = []
118
+
119
+ super
120
+
121
+ end
122
+
123
+ # @return [String] The decision task identifier.
124
+ attr_reader :task_token
125
+
126
+ # @return [Domain]
127
+ attr_reader :domain
128
+
129
+ # @return [WorkflowExecution]
130
+ attr_reader :workflow_execution
131
+
132
+ # @return [WorkflowType]
133
+ attr_reader :workflow_type
134
+
135
+ # @return [Integer] The id of the DecisionTaskStarted event of the
136
+ # previous decision task of this workflow execution that was
137
+ # processed by the decider. This can be used to determine the new
138
+ # events in the history new since the last decision task received
139
+ # by the decider.
140
+ attr_reader :previous_started_event_id
141
+
142
+ # @return [Integer] The id of the DecisionTaskStarted event recorded
143
+ # in the history.
144
+ attr_reader :started_event_id
145
+
146
+ # @return [String,nil] Returns a value if the results are paginated.
147
+ # Normally you do not need this value, as {#events} will enumerate
148
+ # all events, making requests as necessary to get more.
149
+ attr_reader :next_token
150
+
151
+ # @return [Enumerable] Returns an enumerable collection of all events
152
+ # for the workflow execution.
153
+ def events
154
+ enum_for(:_events)
155
+ end
156
+
157
+ # @return [Enumerable] Returns an enumerable collection of only the
158
+ # new events for workflow execution (since the last decision).
159
+ def new_events
160
+ enum_for(:_new_events)
161
+ end
162
+
163
+ # @param [Hash] options
164
+ #
165
+ # @option options [String] :execution_context (nil) A user-defined
166
+ # context to add to the workflow execution. You can fetch this
167
+ # later with {WorkflowExecution#latest_execution_context}.
168
+ #
169
+ # @return [nil]
170
+ #
171
+ def complete! options = {}
172
+
173
+ raise 'already responded' if responded?
174
+
175
+ options[:task_token] = task_token
176
+ options[:decisions] = @decisions unless @decisions.empty?
177
+
178
+ client.respond_decision_task_completed(options)
179
+
180
+ @responded = true
181
+
182
+ nil
183
+
184
+ end
185
+
186
+ # @return [Boolean] Returns true if {#complete!} has been called on
187
+ # this decision task.
188
+ def responded?
189
+ !!@responded
190
+ end
191
+
192
+ # Schedules an activity task.
193
+ #
194
+ # @note This adds a decision to this task that is finalized when you
195
+ # call {#complete!}.
196
+ #
197
+ # @param [ActivityType,Hash] activity_type The type of activity
198
+ # to schedule. +activity_type+ must be an {ActivityType} object
199
+ # or a hash with +:name+ and +:version+.
200
+ #
201
+ # @param [Hash] options
202
+ #
203
+ # @option options [String] :control (nil) Optional data attached to
204
+ # the event that can be used by the decider in subsequent workflow
205
+ # tasks. This data is not sent to the activity.
206
+ #
207
+ # @option options [Integer,:none] :heartbeat_timeout (nil)
208
+ # The maximum time before which a worker processing a task
209
+ # of this type must report progress. If the timeout is exceeded,
210
+ # the activity task is automatically timed out. If the worker
211
+ # subsequently attempts to record a heartbeat or returns a
212
+ # result, it will be ignored. This default can be overridden when
213
+ # scheduling an activity task.
214
+ #
215
+ # The value should be a number of seconds (integer) or the symbol
216
+ # +:none+ (implying no timeout).
217
+ #
218
+ # @option options [String] :input (nil) Input provided to the
219
+ # activity task.
220
+ #
221
+ # @option options [Integer,:none] :schedule_to_close_timeout (nil)
222
+ # The maximum duration that a task of this activity type
223
+ # can wait before being assigned to a worker.
224
+ #
225
+ # A schedule-to-close timeout for this activity task must be
226
+ # specified either as a default for the activity type or through
227
+ # this option. If neither this field is set nor a default was
228
+ # specified at registration time then a fault will be returned.
229
+ #
230
+ # The value should be a number of seconds (integer) or the symbol
231
+ # +:none+ (implying no timeout).
232
+ #
233
+ # @option options [Integer,:none] :schedule_to_start_timeout (nil)
234
+ # The maximum duration that a task of this activity type
235
+ # can wait before being assigned to a worker. This overrides the
236
+ # default timeout specified when registering the activity type.
237
+ #
238
+ # The value should be a number of seconds (integer) or the symbol
239
+ # +:none+ (implying no timeout).
240
+ #
241
+ # @option options [Integer,:none] :start_to_close_timeout (nil)
242
+ # The maximum duration that a worker can take to process
243
+ # tasks of this activity type. This overrides the default
244
+ # timeout specified when registering the activity type.
245
+ #
246
+ # The value should be a number of seconds (integer) or the symbol
247
+ # +:none+ (implying no timeout).
248
+ #
249
+ # @option options [String] :task_list (nil)
250
+ # If set, specifies the name of the task list in which to schedule
251
+ # the activity task. If not specified, the default task list
252
+ # registered with the activity type will be used.
253
+ #
254
+ # @return [nil]
255
+ #
256
+ def schedule_activity_task activity_type, options = {}
257
+
258
+ options[:activity_id] ||= UUIDTools::UUID.random_create.to_s
259
+
260
+ options[:activity_type] = case activity_type
261
+ when Hash
262
+ unless
263
+ activity_type[:name].is_a?(String) and
264
+ activity_type[:version].is_a?(String) and
265
+ activity_type.keys.length == 2
266
+ then
267
+ msg = 'activity_type hash must have :name and :version strings'
268
+ raise ArgumentError, msg
269
+ end
270
+ activity_type
271
+ when ActivityType
272
+ { :name => activity_type.name, :version => activity_type.version }
273
+ else
274
+ msg = 'expected activity_type to be an ActivityType object or a hash'
275
+ raise ArgumentError, msg
276
+ end
277
+
278
+ duration_opts(options,
279
+ :heartbeat_timeout,
280
+ :schedule_to_close_timeout,
281
+ :schedule_to_start_timeout,
282
+ :start_to_close_timeout)
283
+
284
+ if task_list = options[:task_list]
285
+ options[:task_list] = { :name => task_list }
286
+ end
287
+
288
+ add_decision :schedule_activity_task, options
289
+
290
+ end
291
+
292
+ # Attempts to cancel a previously scheduled activity task. If the
293
+ # activity task was scheduled but has not been assigned to a worker,
294
+ # then it will be canceled. If the activity task was already assigned
295
+ # to a worker, then the worker will be informed that cancellation has
296
+ # been requested when recording the activity task heartbeat.
297
+ #
298
+ # @param [ActivityTask,String] activity_or_activity_id An {ActivityTask}
299
+ # object or the activity_id of an activity task to request
300
+ # cancellation for.
301
+ #
302
+ # @return [nil]
303
+ #
304
+ def request_cancel_activity_task activity_or_activity_id
305
+
306
+ id = activity_or_activity_id.is_a?(ActivityTask) ?
307
+ activity_or_activity_id.activity_id :
308
+ activity_or_activity_id
309
+
310
+ add_decision :request_cancel_activity_task, { :activity_id => id }
311
+
312
+ end
313
+
314
+ # Closes the workflow execution and records a
315
+ # WorkflowExecutionCompleted event in the history.
316
+ #
317
+ # @param [Hash] options
318
+ #
319
+ # @option options [String] :result (nil) The results of the workflow
320
+ # execution.
321
+ #
322
+ # @return [nil]
323
+ #
324
+ def complete_workflow_execution options = {}
325
+ add_decision :complete_workflow_execution, options
326
+ end
327
+
328
+ # Closes the workflow execution and records a WorkflowExecutionFailed
329
+ # event in the history.
330
+ #
331
+ # @param [Hash] options
332
+ #
333
+ # @option options [String] :reason (nil) Reason for the failure.
334
+ #
335
+ # @option options [String] :details (nil) Optional details of the failure.
336
+ #
337
+ # @return [nil]
338
+ #
339
+ def fail_workflow_execution options = {}
340
+ add_decision :fail_workflow_execution, options
341
+ end
342
+
343
+ # Closes the workflow execution and records a
344
+ # WorkflowExecutionCanceled event in the history.
345
+ #
346
+ # @param [Hash] options
347
+ #
348
+ # @option options [String] :details (nil) Optional details of the
349
+ # cancellation.
350
+ #
351
+ # @return [nil]
352
+ #
353
+ def cancel_workflow_execution options = {}
354
+ add_decision :cancel_workflow_execution, options
355
+ end
356
+
357
+ # Closes the workflow execution and starts a new workflow execution
358
+ # of the same type using the same workflow id and a unique run Id.
359
+ # A WorkflowExecutionContinuedAsNew event is recorded in the history.
360
+ #
361
+ # @option options [String] :input (nil)
362
+ # The input for the workflow execution. This is a free form string
363
+ # which should be meaningful to the workflow you are starting.
364
+ # This input is made available to the new workflow execution in the
365
+ # WorkflowExecutionStarted history event.
366
+ #
367
+ # @option options [Array<string>] :tag_list ([])
368
+ # A list of tags (strings) to associate with the workflow execution.
369
+ # You can specify a maximum of 5 tags.
370
+ #
371
+ # @option options [Symbol] :child_policy (nil)
372
+ # Specifies the policy to use for the child workflow executions of
373
+ # this workflow execution if it is terminated explicitly or due to
374
+ # an expired timeout. This policy overrides the default child policy
375
+ # specified when registering the workflow type. The supported child
376
+ # policies are:
377
+ #
378
+ # * +:terminate+ - the child executions will be terminated.
379
+ #
380
+ # * +:request_cancel+ - a request to cancel will be attempted for each
381
+ # child execution by recording a WorkflowExecutionCancelRequested
382
+ # event in its history. It is up to the decider to take appropriate
383
+ # actions when it receives an execution history with this event.
384
+ #
385
+ # * +:abandon+ - no action will be taken. The child executions will
386
+ # continue to run.
387
+ #
388
+ # @option options [Integer,:none] :execution_start_to_close_timeout (nil)
389
+ # The total duration for this workflow execution. This overrides
390
+ # the default specified when registering the workflow type.
391
+ #
392
+ # The value should be a number of seconds (integer) or the symbol
393
+ # +:none+ (implying no timeout).
394
+ #
395
+ # @option options [String] :task_list (nil)
396
+ # The task list to use for the decision tasks generated for this
397
+ # workflow execution. This overrides the default task list specified
398
+ # when registering the workflow type.
399
+ #
400
+ # @option options [Integer,:none] :task_start_to_close_timeout (nil)
401
+ # Specifies the maximum duration of decision tasks for this
402
+ # workflow execution. This parameter overrides the default
403
+ # specified when the workflow type was registered.
404
+ #
405
+ # The value should be a number of seconds (integer) or the symbol
406
+ # +:none+ (implying no timeout).
407
+ #
408
+ # @return [nil]
409
+ #
410
+ def continue_as_new_workflow_execution options = {}
411
+ start_execution_opts(options)
412
+ add_decision :continue_as_new_workflow_execution, options
413
+ end
414
+
415
+ # Records a MarkerRecorded event in the history. Markers can be used
416
+ # for adding custom information in the history for instance to let
417
+ # deciders know that they do not need to look at the history beyond
418
+ # the marker event.
419
+ #
420
+ # @param [String] marker_name The name of the marker.
421
+ #
422
+ # @param [Hash] options
423
+ #
424
+ # @option options [String] :details (nil) Optional details of the marker.
425
+ #
426
+ # @return [nil]
427
+ #
428
+ def record_marker marker_name, options = {}
429
+ add_decision :record_marker, options.merge(:marker_name => marker_name)
430
+ end
431
+
432
+ # Schedules a timer for this workflow execution and records a
433
+ # TimerScheduled event in the history. This timer will fire after
434
+ # the specified delay and record a TimerFired event.
435
+ #
436
+ # @param [Integer] start_to_fire_timeout (nil) The duration to wait
437
+ # before firing the timer.
438
+ #
439
+ # @param [Hash] options
440
+ #
441
+ # @option options [String] :control (nil) Optional data attached to
442
+ # the event that can be used by the decider in subsequent workflow
443
+ # tasks.
444
+ #
445
+ # @option options [String] :timer_id (nil) Unique id for the timer.
446
+ # If you do not pass this option, a UUID will be generated.
447
+ #
448
+ # @return [String] Returns the id of the timer.
449
+ #
450
+ def start_timer start_to_fire_timeout, options = {}
451
+ options[:timer_id] ||= UUIDTools::UUID.random_create.to_s
452
+ options[:start_to_fire_timeout] = start_to_fire_timeout
453
+ duration_opts(options, :start_to_fire_timeout)
454
+ add_decision :start_timer, options
455
+ options[:timer_id]
456
+ end
457
+
458
+ # Cancels a previously scheduled timer and records a TimerCanceled
459
+ # event in the history.
460
+ #
461
+ # @param [String] timer_id The id of the timer to cancel.
462
+ #
463
+ # @return [nil]
464
+ #
465
+ def cancel_timer timer_id
466
+ add_decision :cancel_timer, { :timer_id => timer_id }
467
+ end
468
+
469
+ # Requests a signal to be delivered to the specified external workflow
470
+ # execution and records a SignalExternalWorkflowExecutionRequested
471
+ # event in the history.
472
+ #
473
+ # @param [String] workflow_id
474
+ #
475
+ # @param [String] run_id
476
+ #
477
+ # @param [String] signal_name
478
+ #
479
+ # @param [Hash] options
480
+ #
481
+ # @option options [String] :control (nil) Optional data attached to
482
+ # the event that can be used by the decider in subsequent decision
483
+ # tasks.
484
+ #
485
+ # @option options [String] :input (nil) Optional input to be provided
486
+ # with the signal. The target workflow execution will use the
487
+ # signal name and input to process the signal.
488
+ #
489
+ # @return [nil]
490
+ #
491
+ def signal_external_workflow_execution workflow_execution, signal_name, options = {}
492
+ workflow_execution_opts(options, workflow_execution)
493
+ options[:signal_name] = signal_name
494
+ add_decision :signal_external_workflow_execution, options
495
+ end
496
+
497
+ # Requests that a request be made to cancel the specified external
498
+ # workflow execution and records a
499
+ # RequestCancelExternalWorkflowExecutionRequested event in
500
+ # the history.
501
+ #
502
+ # @return [nil]
503
+ #
504
+ def request_cancel_external_workflow_execution workflow_execution, options = {}
505
+ workflow_execution_opts(options, workflow_execution)
506
+ add_decision :request_cancel_external_workflow_execution, options
507
+ end
508
+
509
+ # Requests that a child workflow execution be started and records a
510
+ # StartChildWorkflowExecutionRequested event in the history.
511
+ # The child workflow execution is a separate workflow execution with
512
+ # its own history.
513
+ #
514
+ # @param [WorkflowType,Hash] workflow_type (nil) The type of
515
+ # workflow execution to start. This should be a {WorkflowType} object
516
+ # or a hash with the keys +:name+ and +:version+.
517
+ #
518
+ # @param [Hash] options
519
+ #
520
+ # @option (see WorkflowType#start_execution)
521
+ #
522
+ # @option options [String] :control (nil) Optional data attached to
523
+ # the event that can be used by the decider in subsequent workflow
524
+ # tasks.
525
+ #
526
+ # @return [String] Returns the workflow id of the new execution.
527
+ #
528
+ def start_child_workflow_execution workflow_type, options = {}
529
+ start_execution_opts(options, workflow_type)
530
+ add_decision :start_child_workflow_execution, options
531
+ options[:workflow_id]
532
+ end
533
+
534
+ protected
535
+ def workflow_execution_opts options, workflow_execution
536
+
537
+ if workflow_execution.is_a?(WorkflowExecution)
538
+ options[:workflow_id] = workflow_execution.workflow_id
539
+ options[:run_id] = workflow_execution.run_id
540
+ elsif
541
+ workflow_execution.is_a?(Hash) and
542
+ workflow_execution[:workflow_id].is_a?(String) and
543
+ workflow_execution[:run_id].is_a?(String) and
544
+ workflow_execution.keys.length == 2
545
+ then
546
+ options.merge!(workflow_execution)
547
+ else
548
+ msg = 'expected workflow_execution to be a WorkflowExecution ' +
549
+ 'object or a hash with :workflow_id and :run_id'
550
+ raise ArgumentError, msg
551
+ end
552
+
553
+ end
554
+
555
+ protected
556
+ def add_decision decision_type, attributes
557
+ @decisions << {
558
+ :decision_type => Core::Inflection.class_name(decision_type.to_s),
559
+ :"#{decision_type}_decision_attributes" => attributes,
560
+ }
561
+ nil
562
+ end
563
+
564
+ protected
565
+ def _new_events &block
566
+ _events do |event|
567
+ yield(event) if event.new?
568
+ end
569
+ end
570
+
571
+ protected
572
+ def _events &block
573
+
574
+ _each_event(@events, &block)
575
+ next_token = self.next_token
576
+
577
+ while next_token
578
+
579
+ options = @request_options.merge(:next_page_token => next_token)
580
+ response = client.poll_for_decision_task(options)
581
+
582
+ _each_event(response.data['events'], &block)
583
+ next_token = response.data['nextPageToken']
584
+
585
+ end
586
+
587
+ end
588
+
589
+ def _each_event events, &block
590
+ prev_event_id = self.previous_started_event_id
591
+ events.each do |description|
592
+ event = HistoryEvent.new(workflow_execution, description)
593
+ Core::MetaUtils.extend_method(event, :new?) do
594
+ prev_event_id.nil? or self.event_id > prev_event_id
595
+ end
596
+ yield(event)
597
+ end
598
+ end
599
+
600
+
601
+ end
602
+ end
603
+ end