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,80 @@
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
+ require 'openssl'
15
+ require 'time'
16
+
17
+ module AWS
18
+ class SimpleWorkflow
19
+
20
+ class Request < Core::Http::Request
21
+
22
+ attr_accessor :body
23
+
24
+ def add_authorization!(signer)
25
+
26
+ self.access_key_id = signer.access_key_id
27
+
28
+ headers["x-amz-date"] ||= (headers["date"] ||= Time.now.rfc822)
29
+ headers["host"] ||= host
30
+
31
+ #raise ArgumentError, "a security token is required" unless
32
+ # signer.session_token
33
+ #headers["x-amz-security-token"] = signer.session_token
34
+
35
+ # compute the authorization
36
+ request_hash = OpenSSL::Digest::SHA256.digest(string_to_sign)
37
+ signature = signer.sign(request_hash)
38
+ headers["x-amzn-authorization"] =
39
+ "AWS3 "+
40
+ "AWSAccessKeyId=#{signer.access_key_id},"+
41
+ "Algorithm=HmacSHA256,"+
42
+ "SignedHeaders=#{headers_to_sign.join(';')},"+
43
+ "Signature=#{signature}"
44
+ end
45
+
46
+ def headers_to_sign
47
+ headers.keys.select do |header|
48
+ header == "host" ||
49
+ header =~ /^x-amz/
50
+ end
51
+ end
52
+
53
+ def canonical_headers
54
+ headers_to_sign.map do |name|
55
+ value = headers[name]
56
+ "#{name.downcase.strip}:#{value.strip}\n"
57
+ end.sort.join
58
+ end
59
+
60
+ def string_to_sign
61
+ [http_method,
62
+ "/",
63
+ "",
64
+ canonical_headers,
65
+ body].join("\n")
66
+ end
67
+
68
+ def read_timeout
69
+ # these two operations have long polling
70
+ if headers['x-amz-target'] =~ /PollFor(Decision|Activity)Task/
71
+ 90
72
+ else
73
+ @read_timeout
74
+ end
75
+ end
76
+
77
+ end
78
+
79
+ end
80
+ end
@@ -0,0 +1,94 @@
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 Resource < Core::Resource
19
+
20
+ # @return [Boolean] Returns true if the resource exists.
21
+ def exists?
22
+ !!get_resource
23
+ rescue Errors::UnknownResourceFault
24
+ false
25
+ end
26
+
27
+ # @private
28
+ def self.attribute name, options = {}, &block
29
+
30
+ # the simple workflow attributes are all given as 'lowerCamelCase'
31
+ # this converts the :snake_case name to the correct format
32
+ unless options[:as]
33
+ parts = []
34
+ name.to_s.split(/_/).each_with_index do |part,n|
35
+ parts << (n == 0 ? part : part.capitalize)
36
+ end
37
+ options[:as] = parts.join.to_sym
38
+ end
39
+
40
+ if options[:duration]
41
+ super(name, options) do
42
+ translates_output do |v|
43
+ v.to_s =~ /^\d+$/ ? v.to_i : v.downcase.to_sym
44
+ end
45
+ end
46
+ else
47
+ super(name, options, &block)
48
+ end
49
+
50
+ end
51
+
52
+ protected
53
+ def get_resource attr_name = nil
54
+ method = "describe_#{Core::Inflection.ruby_name(self.class.name)}"
55
+ client.send(method, resource_options)
56
+ end
57
+
58
+ # @private
59
+ def self.type_attributes
60
+ @type_attributes ||= {}
61
+ end
62
+
63
+ # @private
64
+ def self.config_attributes
65
+ @config_attributes ||= {}
66
+ end
67
+
68
+ # @private
69
+ def self.info_attributes
70
+ @info_attributes ||= {}
71
+ end
72
+
73
+ # @private
74
+ def self.type_attribute name, options = {}, &block
75
+ options[:static] = true unless options.has_key?(:static)
76
+ attr = attribute(name, options, &block)
77
+ type_attributes[attr.name] = attr
78
+ end
79
+
80
+ # @private
81
+ def self.config_attribute name, options = {}, &block
82
+ attr = attribute(name, options.merge(:static => true), &block)
83
+ config_attributes[attr.name] = attr
84
+ end
85
+
86
+ # @private
87
+ def self.info_attribute name, options = {}
88
+ attr = attribute(name, options)
89
+ info_attributes[attr.name] = attr
90
+ end
91
+
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,89 @@
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
+ # Base class for {WorkflowType} and {ActivityType} objects.
18
+ class Type < Resource
19
+
20
+ # @param [Domain] The domain this type is registered to.
21
+ # @param [String] name The name of this type.
22
+ # @param [String] version The version of this type.
23
+ def initialize domain, name, version, options = {}
24
+ @domain = domain
25
+ @name = name.to_s
26
+ @version = version.to_s
27
+ super
28
+ end
29
+
30
+ # @return [Domain] Returns the domain this type is registered to.
31
+ attr_reader :domain
32
+
33
+ # @return [String] Returns the name of this type.
34
+ attr_reader :name
35
+
36
+ # @return [String] Returns the version of this type.
37
+ attr_reader :version
38
+
39
+ # Deprecates the type.
40
+ #
41
+ # After a type has been deprecated, you cannot create new
42
+ # executions of that type. Executions that were started before the
43
+ # type was deprecated will continue to run.
44
+ #
45
+ # @note This operation is eventually consistent. The results are best
46
+ # effort and may not exactly reflect recent updates and changes.
47
+ #
48
+ # @return [nil]
49
+ #
50
+ def deprecate
51
+ client.send("deprecate_#{self.class.ruby_name}", resource_options)
52
+ nil
53
+ end
54
+ alias_method :delete, :deprecate
55
+
56
+ # @return [Boolean] Returns true if the type is deprecated.
57
+ def deprecated?
58
+ status == :deprecated
59
+ end
60
+
61
+ protected
62
+ def resource_identifiers
63
+ [[:domain,domain.name], [:name,name], [:version,version]]
64
+ end
65
+
66
+ protected
67
+ def resource_options
68
+ {
69
+ :domain => domain.name,
70
+ :"#{self.class.ruby_name}" => {
71
+ :name => name,
72
+ :version => version
73
+ }
74
+ }
75
+ end
76
+
77
+ protected
78
+ def self.ruby_name
79
+ Core::Inflection.ruby_name(name.split(/::/).last)
80
+ end
81
+
82
+ protected
83
+ def self.type_key
84
+ "#{ruby_name.split(/_/).first}Type"
85
+ end
86
+
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,139 @@
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
+ # The base class for {WorkflowTypeCollection} and {ActivityTypeCollection}.
18
+ # @private
19
+ class TypeCollection
20
+
21
+ include OptionFormatters
22
+ include Core::Collection::Limitable
23
+
24
+ # @param [Domain] The domain the (workflow or activity types belong to.
25
+ def initialize domain, options = {}
26
+
27
+ @domain = domain
28
+
29
+ @named = options[:named]
30
+
31
+ @registration_status = options[:registration_status] ?
32
+ options[:registration_status].to_s.upcase : 'REGISTERED'
33
+
34
+ @reverse_order = options.key?(:reverse_order) ?
35
+ !!options[:reverse_order] : false
36
+
37
+ super
38
+
39
+ end
40
+
41
+ # @return [Domain]
42
+ attr_reader :domain
43
+
44
+ # Returns the type with the given name and version.
45
+ #
46
+ # # get a workflow type
47
+ # domain.workflow_types['name','version']
48
+ # domain.workflow_types.at('name','version')
49
+ #
50
+ # # get an activity type
51
+ # domain.activity_types['name','version']
52
+ # domain.activity_types.at('name','version')
53
+ #
54
+ # @param [String] Name of the type.
55
+ #
56
+ # @param [String] Version of the type.
57
+ #
58
+ # @return [ActivityType,WorkflowType]
59
+ #
60
+ def [] name, version
61
+ member_class.new(domain, name, version)
62
+ end
63
+ alias_method :at, :[]
64
+
65
+ def register
66
+ raise NotImplementedError # implemented in subclasses
67
+ end
68
+ alias_method :create, :register
69
+
70
+ # @return [TypeCollection] Returns a collection that
71
+ # will only enumerate deprecated types.
72
+ def deprecated
73
+ collection_with(:registration_status => 'DEPRECATED')
74
+ end
75
+
76
+ # @return [TypeCollection] Returns a collection that
77
+ # enumerates types in reverse alphabetical order. Default
78
+ # ordering is alphabetical.
79
+ def reverse_order
80
+ collection_with(:reverse_order => true)
81
+ end
82
+
83
+ # @return [TypeCollection] Returns a collection that
84
+ # enumerates types with the given name. Each instance
85
+ # will have a different version.
86
+ def named name
87
+ collection_with(:named => name.to_s)
88
+ end
89
+
90
+ protected
91
+ def collection_with options = {}
92
+ self.class.new(domain, {
93
+ :registration_status => @registration_status,
94
+ :reverse_order => @reverse_order,
95
+ :named => @named,
96
+ :config => config,
97
+ }.merge(options))
98
+ end
99
+
100
+ protected
101
+ def member_class
102
+ name = self.class.name.split(/::/).last.sub(/Collection/, '')
103
+ SimpleWorkflow.const_get(name)
104
+ end
105
+
106
+ protected
107
+ def _each_item next_token, limit, options = {}, &block
108
+
109
+ options[:domain] = domain.name
110
+ options[:next_page_token] = next_token if next_token
111
+ options[:maximum_page_size] = limit if limit
112
+ options[:registration_status] ||= @registration_status
113
+ options[:name] ||= @named if @named # may be nil
114
+ options[:reverse_order] = @reverse_order unless
115
+ options.has_key?(:reverse_order)
116
+
117
+
118
+ ruby_name = Core::Inflection.ruby_name(member_class.name)
119
+ type_key = member_class.type_key
120
+ client_method = :"list_#{ruby_name}s"
121
+
122
+ response = client.send(client_method, options)
123
+ response.data['typeInfos'].each do |desc|
124
+
125
+ type = member_class.new_from(client_method, desc, domain,
126
+ desc[type_key]['name'],
127
+ desc[type_key]['version'])
128
+
129
+ yield(type)
130
+
131
+ end
132
+
133
+ response.data['nextPageToken']
134
+
135
+ end
136
+
137
+ end
138
+ end
139
+ end
@@ -0,0 +1,386 @@
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
+ # @attr_reader [Symbol] child_policy The policy to use for the child
18
+ # workflow executions if this workflow execution is terminated.
19
+ # The return value will be one of the following values:
20
+ #
21
+ # * +:terminate+ - the child executions will be terminated.
22
+ #
23
+ # * +:request_cancel+ - a request to cancel will be attempted for each
24
+ # child execution by recording a WorkflowExecutionCancelRequested
25
+ # event in its history. It is up to the decider to take appropriate
26
+ # actions when it receives an execution history with this event.
27
+ #
28
+ # * +:abandon+ - no action will be taken. The child executions will
29
+ # continue to run.
30
+ #
31
+ # @attr_reader [String] start_to_close_timeout The total allowed
32
+ # duration for this workflow execution.
33
+ #
34
+ # The return value will be formatted as an ISO 8601 duration (e.g.
35
+ # 'PnYnMnDTnHnMnS').
36
+ #
37
+ # @attr_reader [String] task_list The task list used for the decision
38
+ # tasks generated for this workflow execution.
39
+ #
40
+ # @attr_reader [String] task_start_to_close_timeout The maximum duration
41
+ # allowed for decision tasks for this workflow execution.
42
+ #
43
+ # The return value will be formatted as an ISO 8601 duration (e.g.
44
+ # 'PnYnMnDTnHnMnS').
45
+ #
46
+ # @attr_reader [Time,nil] closed_at The time when the workflow execution
47
+ # was closed. Returns nil if this execution is not closed.
48
+ #
49
+ # @attr_reader [Time] started_at The time when the execution was started.
50
+ #
51
+ # @attr_reader [Time,nil] latest_activity_task_scheduled_at The time
52
+ # when the last activity task was scheduled for this workflow execution.
53
+ # You can use this information to determine if the workflow has not
54
+ # made progress for an unusually long period of time and might
55
+ # require a corrective action.
56
+ #
57
+ # @attr_reader [String,nil] latest_execution_context The latest execution
58
+ # context provided by the decider for this workflow execution. A decider
59
+ # can provide an execution context, which is a free form string, when
60
+ # closing a decision task.
61
+ #
62
+ # @attr_reader [Hash] open_counts Returns a hash of counts, including:
63
+ # +:open_timers+, +:open_child_workflow_executions+, +:open_decision_tasks+,
64
+ # and +:open_activity_tasks+.
65
+ #
66
+ class WorkflowExecution < Resource
67
+
68
+ def initialize domain, workflow_id, run_id, options = {}
69
+ @domain = domain
70
+ @workflow_id = workflow_id
71
+ @run_id = run_id
72
+ super
73
+ end
74
+
75
+ # @return [Domain] The domain this workflow execution was started in.
76
+ attr_reader :domain
77
+
78
+ # @return [String] The workflow id of this execution.
79
+ attr_reader :workflow_id
80
+
81
+ # @return [String] The run id of this execution.
82
+ attr_reader :run_id
83
+
84
+ config_attribute :child_policy, :to_sym => true
85
+
86
+ config_attribute :execution_start_to_close_timeout, :duration => true
87
+
88
+ config_attribute :task_list do
89
+ translates_output{|v| v['name'] }
90
+ end
91
+
92
+ config_attribute :task_start_to_close_timeout, :duration => true
93
+
94
+ info_attribute :cancel_requested
95
+
96
+ info_attribute :close_status, :to_sym => true
97
+ protected :close_status
98
+
99
+ info_attribute :closed_at, :as => 'closeTimestamp', :timestamp => true
100
+
101
+ info_attribute :execution_status, :to_sym => true
102
+ protected :execution_status
103
+
104
+ info_attribute :parent_details, :as => 'parent', :static => true
105
+ protected :parent_details
106
+
107
+ info_attribute :started_at,
108
+ :as => 'startTimestamp',
109
+ :timestamp => true,
110
+ :static => true
111
+
112
+ info_attribute :tag_list, :static => true
113
+ protected :tag_list
114
+
115
+ info_attribute :type_details, :as => 'workflowType', :static => true
116
+ protected :type_details
117
+
118
+ attribute :latest_activity_task_scheduled_at,
119
+ :as => 'latestActivityTaskTimestamp',
120
+ :timestamp => true
121
+
122
+ attribute :latest_execution_context
123
+
124
+ attribute :open_counts do
125
+ translates_output do |hash|
126
+ hash.inject({}) do |h,(k,v)|
127
+ h[Core::Inflection.ruby_name(k).to_sym] = v; h
128
+ end
129
+ end
130
+ end
131
+
132
+ # list_workflow_executions provides ONLY type attributes
133
+ provider(
134
+ :list_open_workflow_executions,
135
+ :list_closed_workflow_executions
136
+ ) do |provider|
137
+ provider.provides *info_attributes.keys
138
+ provider.find do |resp|
139
+ execution = { 'workflowId' => workflow_id, 'runId' => run_id }
140
+ resp.data['executionInfos'].find do |desc|
141
+ desc['execution'] == execution
142
+ end
143
+ end
144
+ end
145
+
146
+ # describe_workflow_execution provides ALL attributes
147
+ provider(:describe_workflow_execution) do |provider|
148
+ provider.provides *attributes.keys
149
+ provider.find do |resp|
150
+ execution = { 'workflowId' => workflow_id, 'runId' => run_id }
151
+ d = resp.data
152
+ if d['executionInfo']['execution'] == execution
153
+ d.merge(d['executionInfo']).merge(d['executionConfiguration'])
154
+ else
155
+ nil
156
+ end
157
+ end
158
+ end
159
+
160
+ # @return [Symbol] Returns the status of this exeuction. Possible
161
+ # return values are:
162
+ #
163
+ # * +:open+ - The execution is still running.
164
+ # * +:completed+ - The execution was successfully completed.
165
+ # * +:canceled+ - The execution was canceled, cancellation allows
166
+ # the implementation to gracefully clean up before the execution
167
+ # is closed.
168
+ # * +:failed+ - The execution failed to complete.
169
+ # and was automatically timed out.
170
+ # * +:continued_as_new+ - The execution is logically continued. This
171
+ # means the current execution was completed and a new execution
172
+ # was started to carry on the workflow.
173
+ # * +:terminated+ - The execution was force terminated.
174
+ # * +:timed_out+ - The execution did not complete in the alloted
175
+ # time and was automatically timed out.
176
+ #
177
+ def status
178
+ AWS.memoize do
179
+ execution_status == :open ? :open : (close_status || :closed)
180
+ end
181
+ end
182
+
183
+ # @return [Boolean] Returns true if a request was made to cancel
184
+ # this workflow execution.
185
+ def cancel_requested?
186
+ cancel_requested
187
+ end
188
+
189
+ # @return [Boolean] Returns true if the workflow execution is still open.
190
+ def open?
191
+ status == :open
192
+ end
193
+
194
+ # @return [Boolean] Returns true if the workflow execution is closed.
195
+ def closed?
196
+ !open?
197
+ end
198
+
199
+ # @return [Boolean] Returns true if this workflow execution has an
200
+ # open decision task.
201
+ def open_child_workflow_execution_count
202
+ open_counts[:open_child_workflow_executions]
203
+ end
204
+
205
+ # @return [Integer] Returns the number of open activity tasks.
206
+ def open_activity_task_count
207
+ open_counts[:open_activity_tasks]
208
+ end
209
+
210
+ # @return [Integer] Returns the number of open timers.
211
+ def open_timer_count
212
+ open_counts[:open_timers]
213
+ end
214
+
215
+ # @return [Integer] Returns the number of closed activity tasks.
216
+ def open_decision_task_count
217
+ open_counts[:open_decision_tasks]
218
+ end
219
+
220
+ # @return [Array<String>] Returns an array of tags assigned to this
221
+ # execution.
222
+ def tags
223
+ tag_list || []
224
+ end
225
+
226
+ # @return [HistoryEventCollection] Returns a collection that enumerates
227
+ # history events for this workflow execution.
228
+ def history_events
229
+ HistoryEventCollection.new(self)
230
+ end
231
+ alias_method :events, :history_events
232
+
233
+ # @return [WorkflowType] Returns the type of this workflow execution.
234
+ def workflow_type
235
+ type = self.type_details
236
+ WorkflowType.new(domain, type['name'], type['version'])
237
+ end
238
+
239
+ # @return [WorkflowExecution,nil] Returns the parent workflow execution
240
+ # (if there is one).
241
+ def parent
242
+ if parent = self.parent_details
243
+ domain.workflow_executions[parent['workflowId'],parent['runId']]
244
+ else
245
+ nil
246
+ end
247
+ end
248
+
249
+ # Records a WorkflowExecutionSignaled event in the workflow execution
250
+ # history and creates a decision task for the workflow execution.
251
+ #
252
+ # workflow_execution.signal('signal_name', :input => '...')
253
+ #
254
+ # @param [String] signal_name The name of the signal. This name must be
255
+ # meaningful to the target workflow.
256
+ #
257
+ # @param [Hash] options
258
+ #
259
+ # @option options [String] :input (nil) Data to attach to the
260
+ # WorkflowExecutionSignaled event in the target workflow
261
+ # execution's history.
262
+ #
263
+ # @return [nil]
264
+ #
265
+ def signal signal_name, options = {}
266
+ options[:run_id] = run_id
267
+ domain.workflow_executions.signal(workflow_id, signal_name, options)
268
+ end
269
+
270
+ # Records a WorkflowExecutionCancelRequested event in the currently
271
+ # running workflow execution. This logically requests the cancellation
272
+ # of the workflow execution as a whole. It is up to the decider to
273
+ # take appropriate actions when it receives an execution history
274
+ # with this event.
275
+ #
276
+ # @note Because this action allows the workflow to properly clean up
277
+ # and gracefully close, it should be used instead of {#terminate}
278
+ # when possible.
279
+ #
280
+ # @return [nil]
281
+ #
282
+ def request_cancel
283
+ options = { :run_id => run_id }
284
+ domain.workflow_executions.request_cancel(workflow_id, options)
285
+ end
286
+
287
+ # Records a WorkflowExecutionTerminated event and forces closure of
288
+ # the workflow execution. The child policy, registered with the
289
+ # workflow type or specified when starting this execution, is applied
290
+ # to any open child workflow executions of this workflow execution.
291
+ #
292
+ # @note If the workflow execution was in progress, it is terminated
293
+ # immediately.
294
+ #
295
+ # @note You should consider canceling the workflow execution
296
+ # instead because it allows the workflow to gracefully close
297
+ # while terminate does not.
298
+ #
299
+ # @param [Hash] options
300
+ #
301
+ # @option options [Symbol] :child_policy (nil)
302
+ # If set, specifies the policy to use for the child workflow
303
+ # executions of the workflow execution being terminated. This
304
+ # policy overrides the default child policy. Valid policies include:
305
+ #
306
+ # * +:terminate+ - the child executions will be terminated.
307
+ #
308
+ # * +:request_cancel+ - a request to cancel will be attempted for each
309
+ # child execution by recording a WorkflowExecutionCancelRequested
310
+ # event in its history. It is up to the decider to take appropriate
311
+ # actions when it receives an execution history with this event.
312
+ #
313
+ # * +:abandon+ - no action will be taken. The child executions will
314
+ # continue to run.
315
+ #
316
+ # @option options [String] :details (nil) Optional details for
317
+ # terminating the workflow execution.
318
+ #
319
+ # @option options [String] :reason (nil) An optional descriptive
320
+ # reason for terminating the workflow execution.
321
+ #
322
+ # @return [nil]
323
+ #
324
+ def terminate options = {}
325
+ options[:run_id] = run_id
326
+ domain.workflow_executions.terminate(workflow_id, options)
327
+ end
328
+
329
+ # Counts the number of executions that share the same workflow id.
330
+ #
331
+ # @note See {WorkflowExecutionCollection#count} for a broader count.
332
+ #
333
+ # @note This operation is eventually consistent. The results are best
334
+ # effort and may not exactly reflect recent updates and changes.
335
+ #
336
+ # @param [Hash] options
337
+ #
338
+ # @option options [Symbol] :status (:open) Specifies that
339
+ # status of the workflow executions to count. Defaults to
340
+ # open workflows.
341
+ #
342
+ # * +:open+
343
+ # * +:closed+
344
+ #
345
+ # @option options [Array<Time>] :started_between A start and end time
346
+ # to filter workflow execution start times by. You may pass an
347
+ # array with two time values or a range. Times should be
348
+ # timestamps (integers), Time, Date, DateTime or parseable time
349
+ # strings.
350
+ #
351
+ # You may not pass both +:started_between+ and +:closed_between+.
352
+ #
353
+ # @option options [Array<Time>] :closed_between A start and end time
354
+ # to filter workflow execution closed times by. You may pass an
355
+ # array with two time values or a range. Times should be
356
+ # timestamps (integers), Time, Date, DateTime or parseable time
357
+ # strings.
358
+ #
359
+ # You may not pass both +:started_between+ and +:closed_between+.
360
+ # You may also not pass +:closed_between+ if the +:status+ is
361
+ # +:open+.
362
+ #
363
+ # @return [Integer] Returns the count of executions that share
364
+ # workflow id with the curren execution.
365
+ #
366
+ def count_executions options = {}
367
+ options[:workflow_id] = workflow_id
368
+ domain.workflow_executions.count(options)
369
+ end
370
+
371
+ protected
372
+ def resource_identifiers
373
+ [[:domain,domain.name], [:workflow_id,workflow_id], [:run_id,run_id]]
374
+ end
375
+
376
+ protected
377
+ def resource_options
378
+ {
379
+ :domain => domain.name,
380
+ :execution => { :workflow_id => workflow_id, :run_id => run_id },
381
+ }
382
+ end
383
+
384
+ end
385
+ end
386
+ end