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.
- data/lib/aws.rb +2 -0
- data/lib/aws/api_config/SimpleWorkflow-2012-01-25.yml +1163 -0
- data/lib/aws/core.rb +16 -11
- data/lib/aws/core/configuration.rb +65 -47
- data/lib/aws/dynamo_db/item_collection.rb +2 -3
- data/lib/aws/dynamo_db/table.rb +2 -2
- data/lib/aws/ec2/collection.rb +1 -1
- data/lib/aws/ec2/snapshot_collection.rb +1 -1
- data/lib/aws/ec2/tagged_collection.rb +6 -1
- data/lib/aws/elb/backend_server_policy_collection.rb +1 -11
- data/lib/aws/elb/load_balancer.rb +4 -4
- data/lib/aws/elb/load_balancer_collection.rb +1 -1
- data/lib/aws/iam/policy.rb +1 -1
- data/lib/aws/record.rb +10 -4
- data/lib/aws/record/hash_model/finder_methods.rb +2 -3
- data/lib/aws/s3/bucket_lifecycle_configuration.rb +2 -2
- data/lib/aws/s3/policy.rb +1 -1
- data/lib/aws/simple_email_service.rb +8 -2
- data/lib/aws/simple_workflow.rb +223 -0
- data/lib/aws/simple_workflow/activity_task.rb +173 -0
- data/lib/aws/simple_workflow/activity_task_collection.rb +112 -0
- data/lib/aws/simple_workflow/activity_type.rb +131 -0
- data/lib/aws/simple_workflow/activity_type_collection.rb +93 -0
- data/lib/aws/simple_workflow/client.rb +57 -0
- data/lib/aws/simple_workflow/config.rb +18 -0
- data/lib/aws/simple_workflow/count.rb +49 -0
- data/lib/aws/simple_workflow/decision_task.rb +603 -0
- data/lib/aws/simple_workflow/decision_task_collection.rb +213 -0
- data/lib/aws/simple_workflow/domain.rb +122 -0
- data/lib/aws/simple_workflow/domain_collection.rb +169 -0
- data/lib/aws/simple_workflow/errors.rb +57 -0
- data/lib/aws/simple_workflow/history_event.rb +276 -0
- data/lib/aws/simple_workflow/history_event_collection.rb +76 -0
- data/lib/aws/simple_workflow/option_formatters.rb +75 -0
- data/lib/aws/simple_workflow/request.rb +80 -0
- data/lib/aws/simple_workflow/resource.rb +94 -0
- data/lib/aws/simple_workflow/type.rb +89 -0
- data/lib/aws/simple_workflow/type_collection.rb +139 -0
- data/lib/aws/simple_workflow/workflow_execution.rb +386 -0
- data/lib/aws/simple_workflow/workflow_execution_collection.rb +617 -0
- data/lib/aws/simple_workflow/workflow_type.rb +177 -0
- data/lib/aws/simple_workflow/workflow_type_collection.rb +91 -0
- data/lib/aws/sns/policy.rb +1 -1
- data/lib/aws/sns/subscription.rb +2 -2
- data/lib/aws/sqs/errors.rb +2 -2
- data/lib/aws/sqs/policy.rb +1 -1
- 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
|