aws-flow 2.3.1 → 2.4.0
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.
- checksums.yaml +8 -8
- data/aws-flow.gemspec +3 -2
- data/bin/aws-flow-ruby +1 -1
- data/bin/aws-flow-utils +5 -0
- data/lib/aws/decider.rb +7 -0
- data/lib/aws/decider/async_retrying_executor.rb +1 -1
- data/lib/aws/decider/data_converter.rb +161 -0
- data/lib/aws/decider/decider.rb +27 -14
- data/lib/aws/decider/flow_defaults.rb +28 -0
- data/lib/aws/decider/implementation.rb +0 -1
- data/lib/aws/decider/options.rb +2 -2
- data/lib/aws/decider/starter.rb +207 -0
- data/lib/aws/decider/task_poller.rb +4 -4
- data/lib/aws/decider/utilities.rb +38 -0
- data/lib/aws/decider/version.rb +1 -1
- data/lib/aws/decider/worker.rb +8 -7
- data/lib/aws/decider/workflow_definition_factory.rb +1 -1
- data/lib/aws/runner.rb +146 -65
- data/lib/aws/templates.rb +4 -0
- data/lib/aws/templates/activity.rb +69 -0
- data/lib/aws/templates/base.rb +87 -0
- data/lib/aws/templates/default.rb +146 -0
- data/lib/aws/templates/starter.rb +256 -0
- data/lib/aws/utils.rb +270 -0
- data/spec/aws/decider/integration/activity_spec.rb +7 -1
- data/spec/aws/decider/integration/data_converter_spec.rb +39 -0
- data/spec/aws/decider/integration/integration_spec.rb +12 -5
- data/spec/aws/decider/integration/options_spec.rb +23 -9
- data/spec/aws/decider/integration/starter_spec.rb +209 -0
- data/spec/aws/decider/unit/data_converter_spec.rb +276 -0
- data/spec/aws/decider/unit/decider_spec.rb +1360 -1386
- data/spec/aws/decider/unit/options_spec.rb +21 -22
- data/spec/aws/decider/unit/retry_spec.rb +8 -0
- data/spec/aws/decider/unit/starter_spec.rb +159 -0
- data/spec/aws/runner/integration/runner_integration_spec.rb +2 -3
- data/spec/aws/runner/unit/runner_unit_spec.rb +128 -38
- data/spec/aws/templates/unit/activity_spec.rb +89 -0
- data/spec/aws/templates/unit/base_spec.rb +72 -0
- data/spec/aws/templates/unit/default_spec.rb +141 -0
- data/spec/aws/templates/unit/starter_spec.rb +271 -0
- data/spec/spec_helper.rb +9 -11
- metadata +41 -4
@@ -47,11 +47,11 @@ describe AWS::Flow::ActivityRegistrationOptions do
|
|
47
47
|
default_task_start_to_close_timeout: "NONE",
|
48
48
|
default_task_priority: "0",
|
49
49
|
default_task_list: "USE_WORKER_TASK_LIST",
|
50
|
-
data_converter: FlowConstants.
|
50
|
+
data_converter: FlowConstants.data_converter
|
51
51
|
}
|
52
52
|
# We first compare and remove the following values because these objects have issues
|
53
53
|
# when we sort the values array below
|
54
|
-
full_options.delete(:data_converter)
|
54
|
+
full_options.delete(:data_converter).should be_kind_of(expected.delete(:data_converter).class)
|
55
55
|
full_options.keys.sort.should == expected.keys.sort
|
56
56
|
full_options.values.sort.should == expected.values.sort
|
57
57
|
end
|
@@ -82,11 +82,12 @@ describe AWS::Flow::ActivityRegistrationOptions do
|
|
82
82
|
prefix_name: "FooActivity",
|
83
83
|
manual_completion: true,
|
84
84
|
heartbeat_timeout: "10",
|
85
|
-
data_converter: FlowConstants.
|
85
|
+
data_converter: FlowConstants.data_converter
|
86
86
|
}
|
87
87
|
# We first compare and remove the following values because these objects have issues
|
88
88
|
# when we sort the values array below
|
89
|
-
|
89
|
+
full_options.delete(:data_converter).should be_kind_of(expected.delete(:data_converter).class)
|
90
|
+
full_options.delete(:manual_completion).should == expected.delete(:manual_completion)
|
90
91
|
full_options.keys.sort.should == expected.keys.sort
|
91
92
|
full_options.values.sort.should == expected.values.sort
|
92
93
|
end
|
@@ -139,11 +140,12 @@ describe AWS::Flow::WorkflowRegistrationOptions do
|
|
139
140
|
default_task_list: "USE_WORKER_TASK_LIST",
|
140
141
|
default_task_priority: "0",
|
141
142
|
tag_list: [],
|
142
|
-
data_converter: FlowConstants.
|
143
|
+
data_converter: FlowConstants.data_converter
|
143
144
|
}
|
144
145
|
# We first compare and remove the following values because these objects have issues
|
145
146
|
# when we sort the values array below
|
146
|
-
|
147
|
+
full_options.delete(:data_converter).should be_kind_of(expected.delete(:data_converter).class)
|
148
|
+
full_options.delete(:tag_list).should == expected.delete(:tag_list)
|
147
149
|
full_options.keys.sort.should == expected.keys.sort
|
148
150
|
full_options.values.sort.should == expected.values.sort
|
149
151
|
end
|
@@ -167,12 +169,13 @@ describe AWS::Flow::WorkflowRegistrationOptions do
|
|
167
169
|
default_task_priority: "0",
|
168
170
|
version: "1.0",
|
169
171
|
prefix_name: "FooActivity",
|
170
|
-
data_converter: FlowConstants.
|
172
|
+
data_converter: FlowConstants.data_converter,
|
171
173
|
tag_list: ["tag1", "tag2"]
|
172
174
|
}
|
173
175
|
# We first compare and remove the following values because these objects have issues
|
174
176
|
# when we sort the values array below
|
175
|
-
|
177
|
+
full_options.delete(:data_converter).should be_kind_of(expected.delete(:data_converter).class)
|
178
|
+
full_options.delete(:tag_list).should == expected.delete(:tag_list)
|
176
179
|
full_options.keys.sort.should == expected.keys.sort
|
177
180
|
full_options.values.sort.should == expected.values.sort
|
178
181
|
end
|
@@ -188,12 +191,9 @@ describe AWS::Flow::ActivityOptions do
|
|
188
191
|
it "should only contain the non registration options" do
|
189
192
|
options = AWS::Flow::ActivityOptions.new
|
190
193
|
full_options = options.get_full_options
|
191
|
-
expected = {
|
192
|
-
data_converter: FlowConstants.default_data_converter
|
193
|
-
}
|
194
194
|
# We first compare and remove the following values because these objects have issues
|
195
195
|
# when we sort the values array below
|
196
|
-
full_options.should
|
196
|
+
full_options[:data_converter].should be_kind_of(FlowConstants.data_converter.class)
|
197
197
|
end
|
198
198
|
|
199
199
|
it "should return the values passed in" do
|
@@ -213,11 +213,12 @@ describe AWS::Flow::ActivityOptions do
|
|
213
213
|
manual_completion: true,
|
214
214
|
task_priority: "100",
|
215
215
|
heartbeat_timeout: "10",
|
216
|
-
data_converter: FlowConstants.
|
216
|
+
data_converter: FlowConstants.data_converter,
|
217
217
|
}
|
218
218
|
# We first compare and remove the following values because these objects have issues
|
219
219
|
# when we sort the values array below
|
220
|
-
|
220
|
+
full_options.delete(:data_converter).should be_kind_of(expected.delete(:data_converter).class)
|
221
|
+
full_options.delete(:manual_completion).should == expected.delete(:manual_completion)
|
221
222
|
full_options.keys.sort.should == expected.keys.sort
|
222
223
|
full_options.values.sort.should == expected.values.sort
|
223
224
|
end
|
@@ -232,12 +233,9 @@ describe AWS::Flow::WorkflowOptions do
|
|
232
233
|
it "should not contain any registration options" do
|
233
234
|
options = AWS::Flow::WorkflowOptions.new
|
234
235
|
full_options = options.get_full_options
|
235
|
-
expected = {
|
236
|
-
data_converter: FlowConstants.default_data_converter
|
237
|
-
}
|
238
236
|
# We first compare and remove the following values because these objects have issues
|
239
237
|
# when we sort the values array below
|
240
|
-
full_options.should
|
238
|
+
full_options[:data_converter].should be_kind_of(FlowConstants.data_converter.class)
|
241
239
|
end
|
242
240
|
|
243
241
|
it "should return the values passed in" do
|
@@ -253,11 +251,12 @@ describe AWS::Flow::WorkflowOptions do
|
|
253
251
|
version: "1.0",
|
254
252
|
prefix_name: "FooWorkflow",
|
255
253
|
tag_list: ["tag1", "tag2"],
|
256
|
-
data_converter: FlowConstants.
|
254
|
+
data_converter: FlowConstants.data_converter,
|
257
255
|
}
|
258
256
|
# We first compare and remove the following values because these objects have issues
|
259
257
|
# when we sort the values array below
|
260
|
-
|
258
|
+
full_options.delete(:data_converter).should be_kind_of(expected.delete(:data_converter).class)
|
259
|
+
full_options.delete(:tag_list).should == expected.delete(:tag_list)
|
261
260
|
full_options.keys.sort.should == expected.keys.sort
|
262
261
|
full_options.values.sort.should == expected.values.sort
|
263
262
|
end
|
@@ -272,7 +271,7 @@ describe AWS::Flow::WorkflowRegistrationDefaults do
|
|
272
271
|
|
273
272
|
it "should return the correct default values" do
|
274
273
|
defaults = AWS::Flow::WorkflowRegistrationDefaults.new
|
275
|
-
defaults.data_converter.should
|
274
|
+
defaults.data_converter.should be_kind_of(AWS::Flow::FlowConstants.data_converter.class)
|
276
275
|
defaults.default_task_start_to_close_timeout.should == 30
|
277
276
|
defaults.default_child_policy.should == "TERMINATE"
|
278
277
|
defaults.tag_list.should == []
|
@@ -290,7 +289,7 @@ describe AWS::Flow::ActivityRegistrationDefaults do
|
|
290
289
|
|
291
290
|
it "should return the correct default values" do
|
292
291
|
defaults = AWS::Flow::ActivityRegistrationDefaults.new
|
293
|
-
defaults.data_converter.should
|
292
|
+
defaults.data_converter.should be_kind_of(AWS::Flow::FlowConstants.data_converter.class)
|
294
293
|
defaults.default_task_schedule_to_start_timeout.should == Float::INFINITY
|
295
294
|
defaults.default_task_schedule_to_close_timeout.should == Float::INFINITY
|
296
295
|
defaults.default_task_start_to_close_timeout.should == Float::INFINITY
|
@@ -19,6 +19,14 @@ end
|
|
19
19
|
|
20
20
|
describe "ExponentialRetry" do
|
21
21
|
|
22
|
+
before(:all) do
|
23
|
+
@bucket = ENV['AWS_SWF_BUCKET_NAME']
|
24
|
+
ENV['AWS_SWF_BUCKET_NAME'] = nil
|
25
|
+
end
|
26
|
+
after(:all) do
|
27
|
+
ENV['AWS_SWF_BUCKET_NAME'] = @bucket
|
28
|
+
end
|
29
|
+
|
22
30
|
context "ActivityRetry" do
|
23
31
|
# The following tests for github issue # 57
|
24
32
|
before(:all) do
|
@@ -0,0 +1,159 @@
|
|
1
|
+
require_relative 'setup'
|
2
|
+
|
3
|
+
describe "AWS::Flow" do
|
4
|
+
|
5
|
+
context "#start" do
|
6
|
+
|
7
|
+
it "calls AWS::Flow::Templates#start" do
|
8
|
+
AWS::Flow::stub(:start_workflow)
|
9
|
+
expect(AWS::Flow::Templates).to receive(:start)
|
10
|
+
AWS::Flow::start("HelloWorld.hello", { foo: "foo" })
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
context "#start_workflow" do
|
16
|
+
|
17
|
+
it "raises error if options are not passed in correctly" do
|
18
|
+
expect{AWS::Flow::start_workflow(nil, "input", nil)}.to raise_error(ArgumentError)
|
19
|
+
expect{AWS::Flow::start_workflow(nil, "input", "")}.to raise_error(ArgumentError)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "raises error if domain is not provided" do
|
23
|
+
|
24
|
+
options = { from_class: "FooWorkflow" }
|
25
|
+
expect{AWS::Flow::start_workflow(nil, "input", options)}.to raise_error(ArgumentError)
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
it "raises error if workflow type or from_class is not provided" do
|
30
|
+
|
31
|
+
domain = double
|
32
|
+
AWS::Flow::Utilities.stub(:register_domain).and_return(domain)
|
33
|
+
|
34
|
+
options = { domain: "foo", prefix_name: "FooWorkflow" }
|
35
|
+
expect{AWS::Flow::start_workflow(nil, "input", options)}.to raise_error(ArgumentError)
|
36
|
+
options.merge!(execution_method: "foo")
|
37
|
+
expect{AWS::Flow::start_workflow(nil, "input", options)}.to raise_error(ArgumentError)
|
38
|
+
|
39
|
+
wf_client = double
|
40
|
+
expect(wf_client).to receive(:start_execution)
|
41
|
+
|
42
|
+
expect(AWS::Flow).to receive(:workflow_client) do |client, domain, &block|
|
43
|
+
wf_client
|
44
|
+
end
|
45
|
+
|
46
|
+
options.merge!(version: "1.0")
|
47
|
+
expect{AWS::Flow::start_workflow(nil, "input", options)}.not_to raise_error
|
48
|
+
|
49
|
+
expect(wf_client).to receive(:start_execution)
|
50
|
+
|
51
|
+
expect(AWS::Flow).to receive(:workflow_client) do |client, domain, &block|
|
52
|
+
wf_client
|
53
|
+
end
|
54
|
+
|
55
|
+
options = { domain: "foo", from_class: "foo" }
|
56
|
+
expect{AWS::Flow::start_workflow(nil, "input", options)}.not_to raise_error
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
it "starts a workflow with overriden options" do
|
61
|
+
|
62
|
+
domain = double
|
63
|
+
AWS::Flow::Utilities.stub(:register_domain).and_return(domain)
|
64
|
+
wf_client = double
|
65
|
+
expect(wf_client).to receive(:start_execution)
|
66
|
+
|
67
|
+
expect(AWS::Flow).to receive(:workflow_client) do |client, domain, &block|
|
68
|
+
options = block.call
|
69
|
+
options.should include(
|
70
|
+
prefix_name: "HelloWorld",
|
71
|
+
execution_method: "hello",
|
72
|
+
version: "2.0",
|
73
|
+
execution_start_to_close_timeout: 120,
|
74
|
+
)
|
75
|
+
wf_client
|
76
|
+
end
|
77
|
+
|
78
|
+
options = {
|
79
|
+
domain: "FooDomain",
|
80
|
+
execution_start_to_close_timeout: 120,
|
81
|
+
version: "2.0",
|
82
|
+
}
|
83
|
+
|
84
|
+
AWS::Flow::start_workflow("HelloWorld.hello", "input", options)
|
85
|
+
|
86
|
+
end
|
87
|
+
|
88
|
+
it "starts a regular workflow execution with correct options" do
|
89
|
+
|
90
|
+
domain = double
|
91
|
+
AWS::Flow::Utilities.stub(:register_domain).and_return(domain)
|
92
|
+
wf_client = double
|
93
|
+
expect(wf_client).to receive(:start_execution)
|
94
|
+
|
95
|
+
expect(AWS::Flow).to receive(:workflow_client) do |client, domain, &block|
|
96
|
+
options = block.call
|
97
|
+
|
98
|
+
options.should include(
|
99
|
+
prefix_name: "StarterTestWorkflow",
|
100
|
+
execution_method: "start"
|
101
|
+
)
|
102
|
+
wf_client
|
103
|
+
end
|
104
|
+
|
105
|
+
AWS::Flow::start_workflow("StarterTestWorkflow", "input", {
|
106
|
+
domain: "test",
|
107
|
+
execution_method: "start",
|
108
|
+
version: "1.0"
|
109
|
+
})
|
110
|
+
|
111
|
+
end
|
112
|
+
|
113
|
+
it "starts a workflow execution with all options in options hash" do
|
114
|
+
|
115
|
+
domain = double
|
116
|
+
AWS::Flow::Utilities.stub(:register_domain).and_return(domain)
|
117
|
+
wf_client = double
|
118
|
+
expect(wf_client).to receive(:start_execution)
|
119
|
+
|
120
|
+
expect(AWS::Flow).to receive(:workflow_client) do |client, domain, &block|
|
121
|
+
options = block.call
|
122
|
+
|
123
|
+
options.should include(
|
124
|
+
prefix_name: "FooWorkflow",
|
125
|
+
execution_method: "start",
|
126
|
+
version: "1.0"
|
127
|
+
)
|
128
|
+
wf_client
|
129
|
+
end
|
130
|
+
|
131
|
+
options = { prefix_name: "FooWorkflow", domain: "Foo", version: "1.0", execution_method: "start" }
|
132
|
+
AWS::Flow::start_workflow(nil, "input", options)
|
133
|
+
|
134
|
+
end
|
135
|
+
|
136
|
+
|
137
|
+
it "starts workflow with from_options option correctly" do
|
138
|
+
|
139
|
+
domain = double
|
140
|
+
AWS::Flow::Utilities.stub(:register_domain).and_return(domain)
|
141
|
+
wf_client = double
|
142
|
+
expect(wf_client).to receive(:start_execution)
|
143
|
+
|
144
|
+
class FooWorkflow; extend AWS::Flow::Workflows; end
|
145
|
+
|
146
|
+
expect(AWS::Flow).to receive(:workflow_client) do |client, domain, &block|
|
147
|
+
options = block.call
|
148
|
+
options.should include(from_class: "FooWorkflow")
|
149
|
+
wf_client
|
150
|
+
end
|
151
|
+
|
152
|
+
options = { domain: "Foo", from_class: "FooWorkflow" }
|
153
|
+
AWS::Flow::start_workflow(nil, "input", options)
|
154
|
+
|
155
|
+
end
|
156
|
+
|
157
|
+
end
|
158
|
+
|
159
|
+
end
|
@@ -50,8 +50,7 @@ describe "Runner" do
|
|
50
50
|
|
51
51
|
# This activity will say hello when invoked by the workflow
|
52
52
|
def ping()
|
53
|
-
|
54
|
-
"Pong from #{Socket.gethostbyname(Socket.gethostname).first}"
|
53
|
+
"Pong from #{Socket.gethostname}"
|
55
54
|
end
|
56
55
|
end
|
57
56
|
|
@@ -134,7 +133,7 @@ describe "Runner" do
|
|
134
133
|
# mock the load_files method to avoid having to create default files
|
135
134
|
AWS::Flow::Runner.stub(:load_files)
|
136
135
|
|
137
|
-
workers = AWS::Flow::Runner.start_workers(
|
136
|
+
workers = AWS::Flow::Runner.start_workers(runner_config)
|
138
137
|
|
139
138
|
sleep 2
|
140
139
|
utils = PingUtils.new
|
@@ -64,6 +64,9 @@ describe "Runner" do
|
|
64
64
|
|
65
65
|
# just in case so we don't start chid processes
|
66
66
|
AWS::Flow::Runner.stub(:fork)
|
67
|
+
allow(AWS::Flow::Runner).to receive(:all_subclasses).and_return(nil)
|
68
|
+
|
69
|
+
AWS::Flow::Runner.stub(:setup_domain)
|
67
70
|
|
68
71
|
# make sure the error is thrown
|
69
72
|
expect {
|
@@ -86,6 +89,9 @@ describe "Runner" do
|
|
86
89
|
|
87
90
|
# just in case so we don't start chid processes
|
88
91
|
allow(AWS::Flow::Runner).to receive(:fork).and_return(42)
|
92
|
+
allow(AWS::Flow::Runner).to receive(:all_subclasses).and_return(nil)
|
93
|
+
|
94
|
+
AWS::Flow::Runner.stub(:setup_domain)
|
89
95
|
|
90
96
|
# make sure the error is thrown
|
91
97
|
expect {
|
@@ -109,6 +115,9 @@ describe "Runner" do
|
|
109
115
|
|
110
116
|
# just in case so we don't start chid processes
|
111
117
|
AWS::Flow::Runner.stub(:fork)
|
118
|
+
allow(AWS::Flow::Runner).to receive(:all_subclasses).and_return(nil)
|
119
|
+
|
120
|
+
AWS::Flow::Runner.stub(:setup_domain)
|
112
121
|
|
113
122
|
# make sure the error is thrown
|
114
123
|
expect {
|
@@ -131,6 +140,9 @@ describe "Runner" do
|
|
131
140
|
|
132
141
|
# just in case so we don't start chid processes
|
133
142
|
allow(AWS::Flow::Runner).to receive(:fork).and_return(42)
|
143
|
+
allow(AWS::Flow::Runner).to receive(:all_subclasses).and_return(nil)
|
144
|
+
|
145
|
+
AWS::Flow::Runner.stub(:setup_domain)
|
134
146
|
|
135
147
|
# make sure the error is thrown
|
136
148
|
expect {
|
@@ -143,34 +155,59 @@ describe "Runner" do
|
|
143
155
|
|
144
156
|
describe "Starting workers" do
|
145
157
|
|
158
|
+
before(:all) do
|
159
|
+
class Foo; extend AWS::Flow::Workflows; end
|
160
|
+
class Bar; extend AWS::Flow::Workflows; end
|
161
|
+
class FooActivity; extend AWS::Flow::Activities; end
|
162
|
+
class BarActivity; extend AWS::Flow::Activities; end
|
163
|
+
|
164
|
+
end
|
165
|
+
|
146
166
|
def workflow_js
|
147
|
-
|
167
|
+
JSON.parse('{
|
148
168
|
"workflow_paths": [],
|
149
169
|
"workflow_workers": [
|
150
170
|
{
|
151
171
|
"task_list": "bar",
|
152
|
-
"workflow_classes": [ "
|
172
|
+
"workflow_classes": [ "Foo", "Bar" ],
|
153
173
|
"number_of_workers": 3
|
154
174
|
}
|
155
175
|
]
|
156
|
-
}'
|
157
|
-
JSON.parse(document)
|
176
|
+
}')
|
158
177
|
end
|
159
178
|
|
160
179
|
def activity_js
|
161
|
-
|
180
|
+
JSON.parse('{
|
162
181
|
"activity_paths": [],
|
163
182
|
"activity_workers": [
|
164
183
|
{
|
165
184
|
"task_list": "bar",
|
166
|
-
"activity_classes": [ "
|
185
|
+
"activity_classes": [ "FooActivity", "BarActivity" ],
|
167
186
|
"number_of_workers": 3
|
168
187
|
}
|
169
188
|
]
|
170
|
-
}'
|
171
|
-
|
189
|
+
}')
|
190
|
+
end
|
191
|
+
|
192
|
+
def default_js
|
193
|
+
JSON.parse('{
|
194
|
+
"default_workers":
|
195
|
+
{
|
196
|
+
"number_of_workers": 3
|
197
|
+
}
|
198
|
+
}')
|
172
199
|
end
|
173
200
|
|
201
|
+
def default_js_0
|
202
|
+
JSON.parse('{
|
203
|
+
"default_workers":
|
204
|
+
{
|
205
|
+
"number_of_workers": 0
|
206
|
+
}
|
207
|
+
}')
|
208
|
+
end
|
209
|
+
|
210
|
+
|
174
211
|
it "makes sure the number of workflow workers is correct" do
|
175
212
|
# mock out a few methods to focus on the fact that the workers were created
|
176
213
|
allow_any_instance_of(AWS::Flow::WorkflowWorker).to receive(:add_implementation).and_return(nil)
|
@@ -182,7 +219,7 @@ describe "Runner" do
|
|
182
219
|
# what we are testing:
|
183
220
|
expect(AWS::Flow::Runner).to receive(:fork).exactly(3).times
|
184
221
|
|
185
|
-
# start the workers
|
222
|
+
# start the workers
|
186
223
|
workers = AWS::Flow::Runner.start_workflow_workers(AWS::SimpleWorkflow.new, "", workflow_js)
|
187
224
|
end
|
188
225
|
|
@@ -194,11 +231,12 @@ describe "Runner" do
|
|
194
231
|
allow_any_instance_of(AWS::Flow::ActivityWorker).to receive(:start).and_return(nil)
|
195
232
|
AWS::Flow::Runner.stub(:setup_domain)
|
196
233
|
AWS::Flow::Runner.stub(:load_files)
|
234
|
+
AWS::Flow::Runner.stub(:start_default_workers)
|
197
235
|
|
198
236
|
# what we are testing:
|
199
237
|
expect(AWS::Flow::Runner).to receive(:fork).exactly(3).times
|
200
238
|
|
201
|
-
# start the workers
|
239
|
+
# start the workers
|
202
240
|
workers = AWS::Flow::Runner.start_activity_workers(AWS::SimpleWorkflow.new, "",activity_js)
|
203
241
|
end
|
204
242
|
|
@@ -215,11 +253,11 @@ describe "Runner" do
|
|
215
253
|
implems << arg
|
216
254
|
end
|
217
255
|
|
218
|
-
# start the workers
|
256
|
+
# start the workers
|
219
257
|
workers = AWS::Flow::Runner.start_workflow_workers(AWS::SimpleWorkflow.new, "",workflow_js)
|
220
258
|
|
221
259
|
# validate
|
222
|
-
expect(implems).to include(Object.const_get("
|
260
|
+
expect(implems).to include(Object.const_get("Foo"), Object.const_get("Bar"))
|
223
261
|
end
|
224
262
|
|
225
263
|
it "makes sure the activity implementation classes are added" do
|
@@ -228,6 +266,8 @@ describe "Runner" do
|
|
228
266
|
AWS::Flow::Runner.stub(:fork)
|
229
267
|
AWS::Flow::Runner.stub(:load_files)
|
230
268
|
AWS::Flow::Runner.stub(:setup_domain)
|
269
|
+
AWS::Flow::Templates.stub(:make_activity_class).and_return{ |x| x }
|
270
|
+
AWS::Flow::Runner.stub(:start_default_workers)
|
231
271
|
|
232
272
|
# stub that we can query later
|
233
273
|
implems = []
|
@@ -235,11 +275,11 @@ describe "Runner" do
|
|
235
275
|
implems << arg
|
236
276
|
end
|
237
277
|
|
238
|
-
# start the workers
|
278
|
+
# start the workers
|
239
279
|
workers = AWS::Flow::Runner.start_activity_workers(AWS::SimpleWorkflow.new, "",activity_js)
|
240
280
|
|
241
281
|
# validate
|
242
|
-
expect(implems).to include(Object.const_get("
|
282
|
+
expect(implems).to include(Object.const_get("FooActivity"), Object.const_get("BarActivity"))
|
243
283
|
end
|
244
284
|
|
245
285
|
it "makes sure the workflow worker is started" do
|
@@ -255,7 +295,7 @@ describe "Runner" do
|
|
255
295
|
starts += 1
|
256
296
|
end
|
257
297
|
|
258
|
-
# start the workers
|
298
|
+
# start the workers
|
259
299
|
workers = AWS::Flow::Runner.start_workflow_workers(AWS::SimpleWorkflow.new, "",workflow_js)
|
260
300
|
|
261
301
|
# validate
|
@@ -268,6 +308,7 @@ describe "Runner" do
|
|
268
308
|
AWS::Flow::Runner.stub(:fork).and_yield
|
269
309
|
AWS::Flow::Runner.stub(:load_files)
|
270
310
|
AWS::Flow::Runner.stub(:setup_domain)
|
311
|
+
AWS::Flow::Runner.stub(:start_default_workers)
|
271
312
|
|
272
313
|
# stub that we can query later
|
273
314
|
starts = 0
|
@@ -275,13 +316,73 @@ describe "Runner" do
|
|
275
316
|
starts += 1
|
276
317
|
end
|
277
318
|
|
278
|
-
# start the workers
|
319
|
+
# start the workers
|
279
320
|
workers = AWS::Flow::Runner.start_activity_workers(AWS::SimpleWorkflow.new, "",activity_js)
|
280
321
|
|
281
322
|
# validate
|
282
323
|
expect(starts).to equal(3)
|
283
324
|
end
|
284
325
|
|
326
|
+
it "makes sure the number of default workers is correct when stated explicitly" do
|
327
|
+
# mock out a few methods to focus on the fact that the workers were created
|
328
|
+
allow_any_instance_of(AWS::Flow::WorkflowWorker).to receive(:add_implementation) do |klass|
|
329
|
+
klass.should be(AWS::Flow::Templates.default_workflow)
|
330
|
+
nil
|
331
|
+
end
|
332
|
+
|
333
|
+
allow_any_instance_of(AWS::Flow::WorkflowWorker).to receive(:start).and_return(nil)
|
334
|
+
AWS::Flow::Runner.stub(:setup_domain)
|
335
|
+
AWS::Flow::Runner.stub(:load_files)
|
336
|
+
AWS::Flow::Templates.stub(:register_default_result_activity)
|
337
|
+
|
338
|
+
# what we are testing:
|
339
|
+
expect(AWS::Flow::Runner).to receive(:fork).exactly(3).times
|
340
|
+
|
341
|
+
# start the workers
|
342
|
+
workers = AWS::Flow::Runner.start_default_workers(AWS::SimpleWorkflow.new, "", default_js)
|
343
|
+
end
|
344
|
+
|
345
|
+
it "makes sure the number of default workers is 0 when stated so explicitly" do
|
346
|
+
# mock out a few methods to focus on the fact that the workers were created
|
347
|
+
allow_any_instance_of(AWS::Flow::WorkflowWorker).to receive(:add_implementation) do |klass|
|
348
|
+
klass.should be(AWS::Flow::Templates.default_workflow)
|
349
|
+
nil
|
350
|
+
end
|
351
|
+
|
352
|
+
allow_any_instance_of(AWS::Flow::WorkflowWorker).to receive(:start).and_return(nil)
|
353
|
+
AWS::Flow::Runner.stub(:setup_domain)
|
354
|
+
AWS::Flow::Runner.stub(:load_files)
|
355
|
+
AWS::Flow::Templates.stub(:register_default_result_activity)
|
356
|
+
|
357
|
+
# what we are testing:
|
358
|
+
expect(AWS::Flow::Runner).to receive(:fork).exactly(0).times
|
359
|
+
|
360
|
+
# start the workers
|
361
|
+
workers = AWS::Flow::Runner.start_default_workers(AWS::SimpleWorkflow.new, "", default_js_0)
|
362
|
+
end
|
363
|
+
|
364
|
+
it "makes sure the number of default workers is correct when stated implicitly" do
|
365
|
+
# mock out a few methods to focus on the fact that the workers were created
|
366
|
+
allow_any_instance_of(AWS::Flow::ActivityWorker).to receive(:add_implementation).and_return(nil)
|
367
|
+
allow_any_instance_of(AWS::Flow::ActivityWorker).to receive(:start).and_return(nil)
|
368
|
+
|
369
|
+
allow_any_instance_of(AWS::Flow::WorkflowWorker).to receive(:add_implementation) do |klass|
|
370
|
+
klass.should be(AWS::Flow::Templates.default_workflow)
|
371
|
+
nil
|
372
|
+
end
|
373
|
+
|
374
|
+
AWS::Flow::Runner.stub(:setup_domain)
|
375
|
+
AWS::Flow::Runner.stub(:load_files)
|
376
|
+
AWS::Flow::Templates.stub(:register_default_result_activity)
|
377
|
+
|
378
|
+
# what we are testing:
|
379
|
+
expect(AWS::Flow::Runner).to receive(:fork).exactly(6).times
|
380
|
+
|
381
|
+
# start the workers
|
382
|
+
workers = AWS::Flow::Runner.start_activity_workers(AWS::SimpleWorkflow.new, "",activity_js)
|
383
|
+
|
384
|
+
end
|
385
|
+
|
285
386
|
end
|
286
387
|
|
287
388
|
|
@@ -321,33 +422,20 @@ describe "Runner" do
|
|
321
422
|
default_file: relative})
|
322
423
|
end
|
323
424
|
|
324
|
-
it "loads the \"flow/activities.rb\" by default for activity worker" do
|
425
|
+
it "loads the \"flow/activities.rb\" and \"flow/workflows.rb\" by default for activity and workflow worker respectively" do
|
325
426
|
def activity_js
|
326
427
|
document = '{
|
327
428
|
"activity_workers": [
|
328
429
|
{
|
329
430
|
"task_list": "bar",
|
330
|
-
"activity_classes": [ "
|
431
|
+
"activity_classes": [ "FooActivity", "BarActivity" ],
|
331
432
|
"number_of_workers": 3
|
332
433
|
}
|
333
|
-
]
|
334
|
-
}'
|
335
|
-
JSON.parse(document)
|
336
|
-
end
|
337
|
-
|
338
|
-
AWS::Flow::Runner.stub(:setup_domain)
|
339
|
-
expect(AWS::Flow::Runner).to receive(:require).with(File.join(".", "flow", "activities.rb"))
|
340
|
-
|
341
|
-
AWS::Flow::Runner.start_activity_workers(AWS::SimpleWorkflow.new, ".", activity_js)
|
342
|
-
end
|
343
|
-
|
344
|
-
it "loads the \"flow/workflows.rb\" by default for workflow worker" do
|
345
|
-
def workflow_js
|
346
|
-
document = '{
|
434
|
+
],
|
347
435
|
"workflow_workers": [
|
348
436
|
{
|
349
437
|
"task_list": "bar",
|
350
|
-
"workflow_classes": [ "
|
438
|
+
"workflow_classes": [ "Foo", "Bar" ],
|
351
439
|
"number_of_workers": 3
|
352
440
|
}
|
353
441
|
]
|
@@ -356,9 +444,10 @@ describe "Runner" do
|
|
356
444
|
end
|
357
445
|
|
358
446
|
AWS::Flow::Runner.stub(:setup_domain)
|
447
|
+
expect(AWS::Flow::Runner).to receive(:require).with(File.join(".", "flow", "activities.rb"))
|
359
448
|
expect(AWS::Flow::Runner).to receive(:require).with(File.join(".", "flow", "workflows.rb"))
|
360
449
|
|
361
|
-
AWS::Flow::Runner.
|
450
|
+
AWS::Flow::Runner.load_classes(".", activity_js)
|
362
451
|
end
|
363
452
|
|
364
453
|
it "takes activity_paths as override to \"flow/activities.rb\"" do
|
@@ -368,7 +457,7 @@ describe "Runner" do
|
|
368
457
|
"activity_workers": [
|
369
458
|
{
|
370
459
|
"task_list": "bar",
|
371
|
-
"activity_classes": [ "
|
460
|
+
"activity_classes": [ "FooActivity", "BarActivity" ],
|
372
461
|
"number_of_workers": 3
|
373
462
|
}
|
374
463
|
]
|
@@ -381,7 +470,7 @@ describe "Runner" do
|
|
381
470
|
expect(AWS::Flow::Runner).to receive(:require).with(File.join("foo"))
|
382
471
|
expect(AWS::Flow::Runner).to receive(:require).with(File.join("bar"))
|
383
472
|
|
384
|
-
AWS::Flow::Runner.
|
473
|
+
AWS::Flow::Runner.load_classes(".", activity_js)
|
385
474
|
end
|
386
475
|
|
387
476
|
it "takes workflow_paths as override to \"flow/workflows.rb\"" do
|
@@ -391,7 +480,7 @@ describe "Runner" do
|
|
391
480
|
"workflow_workers": [
|
392
481
|
{
|
393
482
|
"task_list": "bar",
|
394
|
-
"workflow_classes": [ "
|
483
|
+
"workflow_classes": [ "Foo", "Bar" ],
|
395
484
|
"number_of_workers": 3
|
396
485
|
}
|
397
486
|
]
|
@@ -404,7 +493,7 @@ describe "Runner" do
|
|
404
493
|
expect(AWS::Flow::Runner).to receive(:require).with(File.join("foo"))
|
405
494
|
expect(AWS::Flow::Runner).to receive(:require).with(File.join("bar"))
|
406
495
|
|
407
|
-
AWS::Flow::Runner.
|
496
|
+
AWS::Flow::Runner.load_classes(".", workflow_js)
|
408
497
|
end
|
409
498
|
|
410
499
|
end
|
@@ -480,6 +569,7 @@ describe "Runner" do
|
|
480
569
|
AWS::Flow::ActivityWorker.any_instance.stub(:add_implementation) do |impl|
|
481
570
|
impls << impl
|
482
571
|
end
|
572
|
+
AWS::Flow::Runner.stub(:start_default_workers)
|
483
573
|
|
484
574
|
AWS::Flow::Runner.start_activity_workers(AWS::SimpleWorkflow.new, ".", activity_js)
|
485
575
|
|