aws-sdk 1.3.4 → 1.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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