tengine_job 0.6.9
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.rspec +1 -0
- data/Gemfile +23 -0
- data/Gemfile.lock +109 -0
- data/README.rdoc +20 -0
- data/Rakefile +42 -0
- data/VERSION +1 -0
- data/examples/0004_retry_one_layer.rb +24 -0
- data/examples/0004_retry_one_layer.sh +38 -0
- data/examples/0005_retry_two_layer.rb +54 -0
- data/examples/0005_retry_two_layer.sh +80 -0
- data/examples/0006_retry_three_layer.rb +58 -0
- data/examples/0006_retry_three_layer.sh +74 -0
- data/examples/0007_simple_jobnet.rb +7 -0
- data/examples/0021_dynamic_env.rb +20 -0
- data/examples/VERSION +1 -0
- data/examples/tengine_job_test.sh +10 -0
- data/lib/tengine/job.rb +94 -0
- data/lib/tengine/job/category.rb +54 -0
- data/lib/tengine/job/connectable.rb +43 -0
- data/lib/tengine/job/drivers/job_control_driver.rb +82 -0
- data/lib/tengine/job/drivers/job_execution_driver.rb +30 -0
- data/lib/tengine/job/drivers/jobnet_control_driver.rb +117 -0
- data/lib/tengine/job/drivers/schedule_driver.rb +30 -0
- data/lib/tengine/job/dsl_binder.rb +12 -0
- data/lib/tengine/job/dsl_evaluator.rb +18 -0
- data/lib/tengine/job/dsl_loader.rb +180 -0
- data/lib/tengine/job/edge.rb +150 -0
- data/lib/tengine/job/element_selector_notation.rb +169 -0
- data/lib/tengine/job/end.rb +32 -0
- data/lib/tengine/job/executable.rb +74 -0
- data/lib/tengine/job/execution.rb +141 -0
- data/lib/tengine/job/expansion.rb +37 -0
- data/lib/tengine/job/fork.rb +6 -0
- data/lib/tengine/job/job.rb +23 -0
- data/lib/tengine/job/jobnet.rb +173 -0
- data/lib/tengine/job/jobnet/builder.rb +150 -0
- data/lib/tengine/job/jobnet/job_state_transition.rb +167 -0
- data/lib/tengine/job/jobnet/jobnet_state_transition.rb +110 -0
- data/lib/tengine/job/jobnet/state_transition.rb +37 -0
- data/lib/tengine/job/jobnet_actual.rb +55 -0
- data/lib/tengine/job/jobnet_template.rb +10 -0
- data/lib/tengine/job/join.rb +6 -0
- data/lib/tengine/job/junction.rb +29 -0
- data/lib/tengine/job/killing.rb +30 -0
- data/lib/tengine/job/mm_compatibility.rb +6 -0
- data/lib/tengine/job/mm_compatibility/connectable.rb +13 -0
- data/lib/tengine/job/name_path.rb +31 -0
- data/lib/tengine/job/root.rb +16 -0
- data/lib/tengine/job/root_jobnet_actual.rb +39 -0
- data/lib/tengine/job/root_jobnet_template.rb +49 -0
- data/lib/tengine/job/script_executable.rb +235 -0
- data/lib/tengine/job/signal.rb +121 -0
- data/lib/tengine/job/start.rb +20 -0
- data/lib/tengine/job/stoppable.rb +15 -0
- data/lib/tengine/job/vertex.rb +172 -0
- data/lib/tengine_job.rb +3 -0
- data/spec/fixtures/rjn_0001_simple_jobnet_builder.rb +42 -0
- data/spec/fixtures/rjn_0002_simple_parallel_jobnet_builder.rb +42 -0
- data/spec/fixtures/rjn_0003_fork_join_jobnet_builder.rb +61 -0
- data/spec/fixtures/rjn_0004_parallel_jobnet_with_finally_fixture.rb +62 -0
- data/spec/fixtures/rjn_0005_retry_two_layer_fixture.rb +153 -0
- data/spec/fixtures/rjn_0008_expansion_fixture.rb +32 -0
- data/spec/fixtures/rjn_0009_tree_sequential_jobnet_builder.rb +174 -0
- data/spec/fixtures/rjn_0010_2jobs_and_1job_parallel_jobnet_builder.rb +39 -0
- data/spec/fixtures/rjn_0011_nested_fork_jobnet_builder.rb +96 -0
- data/spec/fixtures/rjn_0012_nested_and_finally_builder.rb +157 -0
- data/spec/fixtures/rjn_1004_hadoop_job_in_jobnet_fixture.rb +105 -0
- data/spec/fixtures/rjn_means_root_jobnet +0 -0
- data/spec/fixtures/test_credential_fixture.rb +12 -0
- data/spec/fixtures/test_server_fixture.rb +28 -0
- data/spec/mongoid.yml +35 -0
- data/spec/spec_helper.rb +56 -0
- data/spec/sshd/.gitignore +1 -0
- data/spec/sshd/id_rsa +51 -0
- data/spec/sshd/id_rsa.pub +1 -0
- data/spec/sshd/ssh_host_rsa_key +51 -0
- data/spec/sshd/ssh_host_rsa_key.pub +1 -0
- data/spec/sshd/sshd_config +10 -0
- data/spec/sshd/sshd_config.erb +11 -0
- data/spec/sshd/tengine_job_test.sh +6 -0
- data/spec/support/jobnet_fixture_builder.rb +145 -0
- data/spec/support/mongo_index_key_log.rb +91 -0
- data/spec/tengine/job/category_spec.rb +193 -0
- data/spec/tengine/job/connectable_spec.rb +94 -0
- data/spec/tengine/job/drivers/job_controll_driver/connection_error_spec.rb +236 -0
- data/spec/tengine/job/drivers/job_controll_driver/duplicated_job_start_spec.rb +302 -0
- data/spec/tengine/job/drivers/job_controll_driver/expansion_spec.rb +120 -0
- data/spec/tengine/job/drivers/job_controll_driver/stop_spec.rb +159 -0
- data/spec/tengine/job/drivers/job_controll_driver_spec.rb +623 -0
- data/spec/tengine/job/drivers/job_execution_driver_spec.rb +88 -0
- data/spec/tengine/job/drivers/jobnet_control_driver/nested_and_finally_spec.rb +472 -0
- data/spec/tengine/job/drivers/jobnet_control_driver/nested_jobnet_spec.rb +231 -0
- data/spec/tengine/job/drivers/jobnet_control_driver/stop_jobnet_spec.rb +202 -0
- data/spec/tengine/job/drivers/jobnet_control_driver_spec.rb +446 -0
- data/spec/tengine/job/drivers/schedule_driver_spec.rb +202 -0
- data/spec/tengine/job/dsl_binder_spec.rb +36 -0
- data/spec/tengine/job/dsl_loader_spec.rb +403 -0
- data/spec/tengine/job/dsls/0013_hadoop_job_run.rb +29 -0
- data/spec/tengine/job/dsls/0014_join_and_join.rb +19 -0
- data/spec/tengine/job/dsls/0015_fork_and_fork.rb +18 -0
- data/spec/tengine/job/dsls/0016_complex_fork_and_join.rb +20 -0
- data/spec/tengine/job/dsls/0017_finally.rb +15 -0
- data/spec/tengine/job/dsls/0018_expansion.rb +23 -0
- data/spec/tengine/job/dsls/0019_execute_job_on_event.rb +16 -0
- data/spec/tengine/job/dsls/0020_duplicated_jobnet_name.rb +16 -0
- data/spec/tengine/job/dsls/1060_test_dir1/1060_test_dir2/0013_hadoop_job_run.rb +29 -0
- data/spec/tengine/job/dsls/2003_expansion/expansion_5.rb +11 -0
- data/spec/tengine/job/dsls/VERSION +1 -0
- data/spec/tengine/job/dynamic_env_spec.rb +95 -0
- data/spec/tengine/job/edge_spec.rb +241 -0
- data/spec/tengine/job/element_selector_notation_spec.rb +354 -0
- data/spec/tengine/job/examples_spec.rb +62 -0
- data/spec/tengine/job/execution_spec.rb +100 -0
- data/spec/tengine/job/expansion_spec.rb +116 -0
- data/spec/tengine/job/hadoop_job_run_spec.rb +65 -0
- data/spec/tengine/job/job_spec.rb +4 -0
- data/spec/tengine/job/jobnet/1015_complecated_jobnet_spec.rb +72 -0
- data/spec/tengine/job/jobnet_actual_spec.rb +175 -0
- data/spec/tengine/job/jobnet_spec.rb +399 -0
- data/spec/tengine/job/jobnet_template_spec.rb +240 -0
- data/spec/tengine/job/killing_spec.rb +91 -0
- data/spec/tengine/job/reset_spec.rb +958 -0
- data/spec/tengine/job/reset_spec/4056_1_dump.txt +1 -0
- data/spec/tengine/job/root_jobnet_actual_spec.rb +89 -0
- data/spec/tengine/job/root_jobnet_template_spec.rb +248 -0
- data/spec/tengine/job/script_executable_spec.rb +132 -0
- data/spec/tengine/job/stoppable_spec.rb +176 -0
- data/spec/tengine/job/vertex_spec.rb +25 -0
- data/spec/tengine_job_spec.rb +4 -0
- data/tengine_job.gemspec +197 -0
- data/tmp/log/.gitignore +1 -0
- metadata +296 -0
@@ -0,0 +1,29 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'tengine_job'
|
4
|
+
|
5
|
+
# [jobnet0013]
|
6
|
+
# start --- job1 --- [hadoop_job_run1] --- job2 --- end
|
7
|
+
#
|
8
|
+
# [hadoop_job_run1]
|
9
|
+
# start --- [hadoop_job1] --- [hadoop_job2] --- end
|
10
|
+
#
|
11
|
+
# [hadoop_job1]
|
12
|
+
# |--- map ------|
|
13
|
+
# start ---F J--- end
|
14
|
+
# |--- reduce ---|
|
15
|
+
#
|
16
|
+
# [hadoop_job2]
|
17
|
+
# |--- map ------|
|
18
|
+
# start ---F J--- end
|
19
|
+
# |--- reduce ---|
|
20
|
+
#
|
21
|
+
jobnet("jobnet0013", "ジョブネット0013", :vm_instance_name => "i-11111111", :credential_name => "goku-ssh-pk1") do
|
22
|
+
auto_sequence
|
23
|
+
job("job1", "ジョブ1", "import_hdfs.sh")
|
24
|
+
hadoop_job_run("hadoop_job_run1", "Hadoopジョブ1", "hadoop_job_run.sh") do
|
25
|
+
hadoop_job("hadoop_job1")
|
26
|
+
hadoop_job("hadoop_job2")
|
27
|
+
end
|
28
|
+
job("job2", "ジョブ2", "export_hdfs.sh")
|
29
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'tengine_job'
|
4
|
+
|
5
|
+
# [jobnet0014]
|
6
|
+
# |--- job1 ---|
|
7
|
+
# | J--- job4 ---|
|
8
|
+
# start ---F--- job2 ---| |
|
9
|
+
# | J--- job5 --- end
|
10
|
+
# |--- job3 ----------------|
|
11
|
+
#
|
12
|
+
jobnet("jobnet0014", :instance_name => "i-11111111", :user_group_credential_name => "goku-ssh-pk1") do
|
13
|
+
boot_jobs("job1", "job2", "job3")
|
14
|
+
job("job1", "echo 'job1'", :to => "job4")
|
15
|
+
job("job2", "echo 'job2'", :to => "job4")
|
16
|
+
job("job3", "echo 'job3'", :to => "job5")
|
17
|
+
job("job4", "echo 'job4'", :to => "job5")
|
18
|
+
job("job5", "echo 'job5'")
|
19
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'tengine_job'
|
4
|
+
|
5
|
+
# [jobnet0015]
|
6
|
+
# |--- job2--------------------|
|
7
|
+
# | |
|
8
|
+
# start --- job1 ---F |--- job4 --- J--- end
|
9
|
+
# |--- job3 ---- F |
|
10
|
+
# |--- job5 ----|
|
11
|
+
jobnet("jobnet0015", :instance_name => "i-11111111", :credential_name => "goku-ssh-pk1") do
|
12
|
+
boot_jobs("job1")
|
13
|
+
job("job1", "echo 'job1'", :to => ["job2", "job3"])
|
14
|
+
job("job2", "echo 'job2'")
|
15
|
+
job("job3", "echo 'job3'", :to => ["job4", "job5"])
|
16
|
+
job("job4", "echo 'job4'")
|
17
|
+
job("job5", "echo 'job5'")
|
18
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'tengine_job'
|
4
|
+
|
5
|
+
# [jobnet0016]
|
6
|
+
# |--- job4 --- job5 ---|
|
7
|
+
# |--- job1 --- job3 ---F |
|
8
|
+
# start ---F |=== J --- job6 ----- J--- end
|
9
|
+
# |--- job2 ------------F |
|
10
|
+
# |--------- job7 ------|
|
11
|
+
jobnet("jobnet0016", :instance_name => "i-11111111", :credential_name => "goku-ssh-pk1") do
|
12
|
+
boot_jobs("job1", "job2")
|
13
|
+
job("job1", "echo 'job1'", :to => ["job3"])
|
14
|
+
job("job2", "echo 'job2'", :to => ["job6", "job7"])
|
15
|
+
job("job3", "echo 'job3'", :to => ["job4", "job6"])
|
16
|
+
job("job4", "echo 'job4'", :to => "job5")
|
17
|
+
job("job5", "echo 'job5'")
|
18
|
+
job("job6", "echo 'job6'")
|
19
|
+
job("job7", "echo 'job7'")
|
20
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'tengine_job'
|
4
|
+
|
5
|
+
jobnet("jobnet0017", "ジョブネット0017", :instance_name => "i-11111111", :credential_name => "goku-ssh-pk1") do
|
6
|
+
auto_sequence
|
7
|
+
job("job1", "ジョブ1", "job1.sh")
|
8
|
+
job("job2", "ジョブ2", "job2.sh")
|
9
|
+
job("job3", "ジョブ3", "job3.sh")
|
10
|
+
finally do
|
11
|
+
auto_sequence
|
12
|
+
job("finally_job1", "finallyジョブ1", "finally_job1.sh")
|
13
|
+
job("finally_job2", "finallyジョブ2", "finally_job2.sh")
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'tengine_job'
|
4
|
+
|
5
|
+
jobnet("jobnet0018_01") do
|
6
|
+
boot_jobs("job101", "job102", "job103")
|
7
|
+
job("job101", "echo 'success101'")
|
8
|
+
job("job102", "echo 'success102'")
|
9
|
+
job("job103", "echo 'success103'")
|
10
|
+
end
|
11
|
+
|
12
|
+
jobnet("jobnet0018_02") do
|
13
|
+
auto_sequence
|
14
|
+
job("job101", "echo 'success101'")
|
15
|
+
job("job102", "echo 'success102'")
|
16
|
+
job("job103", "echo 'success103'")
|
17
|
+
end
|
18
|
+
|
19
|
+
jobnet("jobnet0018") do
|
20
|
+
auto_sequence
|
21
|
+
expansion("jobnet0018_01")
|
22
|
+
expansion("jobnet0018_02")
|
23
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'tengine_job'
|
4
|
+
|
5
|
+
jobnet("jobnet0019") do
|
6
|
+
auto_sequence
|
7
|
+
job("j11", "tengine_job_test 5 j11'")
|
8
|
+
job("j12", "tengine_job_test 5 j12'")
|
9
|
+
job("j13", "tengine_job_test 5 j13'")
|
10
|
+
end
|
11
|
+
|
12
|
+
driver :driver_for_jobnet_0019 do
|
13
|
+
on :foo do
|
14
|
+
jobnet("jobnet0019").execute(:sender => self)
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'tengine_job'
|
4
|
+
|
5
|
+
# 同じジョブネット名を2回指定しています
|
6
|
+
jobnet("jobnet0020", :instance_name => "test_server1", :credential_name => "test_credential1") do
|
7
|
+
auto_sequence
|
8
|
+
job("job1", "$HOME/tengine_job_test.sh 0 job1")
|
9
|
+
job("job2", "$HOME/tengine_job_test.sh 0 job2")
|
10
|
+
end
|
11
|
+
|
12
|
+
jobnet("jobnet0020", :instance_name => "test_server1", :credential_name => "test_credential1") do
|
13
|
+
auto_sequence
|
14
|
+
job("job3", "$HOME/tengine_job_test.sh 0 job3")
|
15
|
+
job("job4", "$HOME/tengine_job_test.sh 0 job4")
|
16
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'tengine_job'
|
4
|
+
|
5
|
+
# [jobnet0013]
|
6
|
+
# start --- job1 --- [hadoop_job_run1] --- job2 --- end
|
7
|
+
#
|
8
|
+
# [hadoop_job_run1]
|
9
|
+
# start --- [hadoop_job1] --- [hadoop_job2] --- end
|
10
|
+
#
|
11
|
+
# [hadoop_job1]
|
12
|
+
# |--- map ------|
|
13
|
+
# start ---F J--- end
|
14
|
+
# |--- reduce ---|
|
15
|
+
#
|
16
|
+
# [hadoop_job2]
|
17
|
+
# |--- map ------|
|
18
|
+
# start ---F J--- end
|
19
|
+
# |--- reduce ---|
|
20
|
+
#
|
21
|
+
jobnet("jobnet0013", "ジョブネット0013", :vm_instance_name => "i-11111111", :credential_name => "goku-ssh-pk1") do
|
22
|
+
auto_sequence
|
23
|
+
job("job1", "ジョブ1", "import_hdfs.sh")
|
24
|
+
hadoop_job_run("hadoop_job_run1", "Hadoopジョブ1", "hadoop_job_run.sh") do
|
25
|
+
hadoop_job("hadoop_job1")
|
26
|
+
hadoop_job("hadoop_job2")
|
27
|
+
end
|
28
|
+
job("job2", "ジョブ2", "export_hdfs.sh")
|
29
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'tengine_job'
|
4
|
+
|
5
|
+
jobnet('job_reference_test_6_2', '機能テスト6-2', :vm_instance_name => "test_server1", :credential_name => "test_credential1") do
|
6
|
+
boot_jobs('job6-2-1')
|
7
|
+
job('job6-2-1', '~/mm_server/spec/models/job/mm_job.sh 30 job_function_test_6-2-1', :to => ['job6-2-2', 'job6-2-3'])
|
8
|
+
job('job6-2-2', '~/mm_server/spec/models/job/mm_job.sh 30 job_function_test_6-2-2', :to => 'job6-2-4')
|
9
|
+
job('job6-2-3', '~/mm_server/spec/models/job/mm_job.sh 30 job_function_test_6-2-3', :to => 'job6-2-4')
|
10
|
+
job('job6-2-4', '~/mm_server/spec/models/job/mm_job.sh 30 job_function_test_6-2-4', :to => 'job6-2-3')
|
11
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
20111003160000
|
@@ -0,0 +1,95 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe 'hadoop_job_run' do
|
5
|
+
before(:all) do
|
6
|
+
Tengine.plugins.add(Tengine::Job::DslLoader)
|
7
|
+
end
|
8
|
+
|
9
|
+
def load_dsl(filename)
|
10
|
+
config = {
|
11
|
+
:action => "load",
|
12
|
+
:tengined => { :load_path => File.expand_path("../../../examples/#{filename}", File.dirname(__FILE__)) },
|
13
|
+
}
|
14
|
+
@version = File.read(File.expand_path("../../../examples/VERSION", File.dirname(__FILE__))).strip
|
15
|
+
@bootstrap = Tengine::Core::Bootstrap.new(config)
|
16
|
+
@bootstrap.boot
|
17
|
+
Tengine::Core::Setting.stub(:dsl_version).and_return(@version)
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "基本的なジョブDSL" do
|
21
|
+
context "0021_dynamic_env.rb" do
|
22
|
+
before do
|
23
|
+
Tengine::Job::JobnetTemplate.delete_all
|
24
|
+
Tengine::Resource::PhysicalServer.delete_all
|
25
|
+
TestServerFixture.test_server1
|
26
|
+
TestCredentialFixture.test_credential1
|
27
|
+
load_dsl("0021_dynamic_env.rb")
|
28
|
+
end
|
29
|
+
|
30
|
+
shared_examples_for "実行時に環境変数を設定できる" do
|
31
|
+
it "j1" do
|
32
|
+
mock_event = mock(:event)
|
33
|
+
signal = Tengine::Job::Signal.new(mock_event)
|
34
|
+
mock_ssh = mock(:ssh)
|
35
|
+
Net::SSH.should_receive(:start).and_yield(mock_ssh)
|
36
|
+
mock_channel = mock(:channel)
|
37
|
+
mock_ssh.should_receive(:open_channel).and_yield(mock_channel)
|
38
|
+
mock_channel.should_receive(:exec).with(an_instance_of(String)) do |cmd|
|
39
|
+
cmd.should =~ /export FOO=BAR/
|
40
|
+
end
|
41
|
+
@root.element("j1").run(@execution)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "j2" do
|
45
|
+
mock_event = mock(:event)
|
46
|
+
signal = Tengine::Job::Signal.new(mock_event)
|
47
|
+
mock_ssh = mock(:ssh)
|
48
|
+
Net::SSH.should_receive(:start).and_yield(mock_ssh)
|
49
|
+
mock_channel = mock(:channel)
|
50
|
+
mock_ssh.should_receive(:open_channel).and_yield(mock_channel)
|
51
|
+
mock_channel.should_receive(:exec).with(an_instance_of(String)) do |cmd|
|
52
|
+
cmd.should =~ /export SERVER_NAME=test_server1 && export DNS_NAME=localhost/
|
53
|
+
end
|
54
|
+
@root.element("j2").run(@execution)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
context "rjn0021_1" do
|
59
|
+
before do
|
60
|
+
@template = Tengine::Job::RootJobnetTemplate.find_by_name!("rjn0021_1")
|
61
|
+
mock_sender = mock(:sender)
|
62
|
+
mock_sender.should_receive(:fire).with(any_args)
|
63
|
+
@execution = @template.execute(:sender => mock_sender)
|
64
|
+
@root = @execution.root_jobnet
|
65
|
+
end
|
66
|
+
it_should_behave_like "実行時に環境変数を設定できる"
|
67
|
+
end
|
68
|
+
|
69
|
+
context "/rjn0021/rjn0021_1" do
|
70
|
+
before do
|
71
|
+
@template = Tengine::Job::RootJobnetTemplate.find_by_name!("rjn0021")
|
72
|
+
mock_sender = mock(:sender)
|
73
|
+
mock_sender.should_receive(:fire).with(any_args)
|
74
|
+
@execution = @template.execute(:sender => mock_sender)
|
75
|
+
@root = @execution.root_jobnet.vertex_by_name_path("/rjn0021/rjn0021_1")
|
76
|
+
end
|
77
|
+
it_should_behave_like "実行時に環境変数を設定できる"
|
78
|
+
end
|
79
|
+
|
80
|
+
context "/rjn0021/rjn0021_2" do
|
81
|
+
before do
|
82
|
+
@template = Tengine::Job::RootJobnetTemplate.find_by_name!("rjn0021")
|
83
|
+
mock_sender = mock(:sender)
|
84
|
+
mock_sender.should_receive(:fire).with(any_args)
|
85
|
+
@execution = @template.execute(:sender => mock_sender)
|
86
|
+
@root = @execution.root_jobnet.vertex_by_name_path("/rjn0021/rjn0021_2")
|
87
|
+
end
|
88
|
+
it_should_behave_like "実行時に環境変数を設定できる"
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
@@ -0,0 +1,241 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Tengine::Job::Edge do
|
5
|
+
before do
|
6
|
+
@now = Time.now.utc
|
7
|
+
@event = mock(:event, :occurred_at => @now)
|
8
|
+
@execution = mock(:execution,
|
9
|
+
:id => "execution_id",
|
10
|
+
:estimated_time => 600,
|
11
|
+
:actual_estimated_end => Time.utc(2011,10,27,19,8),
|
12
|
+
:preparation_command => nil)
|
13
|
+
@execution.stub!(:retry).and_return(false) # 再実行ではないという設定
|
14
|
+
@execution.stub!(:in_scope?).with(any_args).and_return(true)
|
15
|
+
@signal = Tengine::Job::Signal.new(@event)
|
16
|
+
@signal.stub!(:execution).and_return(@execution)
|
17
|
+
end
|
18
|
+
|
19
|
+
describe :transmit do
|
20
|
+
context "シンプルなケース" do
|
21
|
+
# in [rjn0001]
|
22
|
+
# (S1) --e1-->(j11)--e2-->(j12)--e3-->(E1)
|
23
|
+
before do
|
24
|
+
builder = Rjn0001SimpleJobnetBuilder.new
|
25
|
+
builder.create_actual
|
26
|
+
@ctx = builder.context
|
27
|
+
end
|
28
|
+
|
29
|
+
it "e1をtransmitするとtransmitting、j11はactivateされてreadyになり、イベントが通知されるのを待つ" do
|
30
|
+
@ctx[:e1].phase_key = :active
|
31
|
+
@ctx[:j11].phase_key = :initialized
|
32
|
+
@ctx[:root].save!
|
33
|
+
@ctx[:e1].transmit(@signal)
|
34
|
+
@ctx[:e1].phase_key.should == :transmitting
|
35
|
+
@ctx[:j11].phase_key.should == :ready
|
36
|
+
@signal.reservations.length.should == 1
|
37
|
+
reservation = @signal.reservations.first
|
38
|
+
reservation.event_type_name.should == :"start.job.job.tengine"
|
39
|
+
reservation.options[:properties][:target_jobnet_id].should == @ctx[:root].id.to_s
|
40
|
+
reservation.options[:properties][:target_job_id].should == @ctx[:j11].id.to_s
|
41
|
+
reservation.options[:source_name].should =~ %r<^job:.+/\d+/#{@ctx[:root].id.to_s}/#{@ctx[:j11].id.to_s}$>
|
42
|
+
end
|
43
|
+
|
44
|
+
it "j11がactivateされると、e1はcompleteされてtransmittedになり、j11はstartingになる" do
|
45
|
+
@ctx[:root].phase_key = :starting
|
46
|
+
@ctx[:e1].phase_key = :transmitting
|
47
|
+
@ctx[:j11].phase_key = :ready
|
48
|
+
@ctx[:root].save!
|
49
|
+
@ctx[:j11].should_receive(:execute)
|
50
|
+
@execution.should_receive(:signal=).with(@signal)
|
51
|
+
@execution.stub(:retry).and_return(false)
|
52
|
+
@ctx[:j11].activate(@signal)
|
53
|
+
@signal.callback.should_not be_nil
|
54
|
+
@signal.callback.call # 2回に分けてphaseを更新するのでcallbackすることを期待しています
|
55
|
+
@ctx[:e1].phase_key.should == :transmitted
|
56
|
+
@ctx[:j11].phase_key.should == :starting
|
57
|
+
@signal.reservations.length.should == 0
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context "分岐するケース" do
|
62
|
+
# in [rjn0002]
|
63
|
+
# |--e2-->(j11)--e4-->|
|
64
|
+
# (S1)--e1-->[F1] [J1]--e6-->(E1)
|
65
|
+
# |--e3-->(j12)--e5-->|
|
66
|
+
before do
|
67
|
+
builder = Rjn0002SimpleParallelJobnetBuilder.new
|
68
|
+
builder.create_actual
|
69
|
+
@ctx = builder.context
|
70
|
+
end
|
71
|
+
|
72
|
+
it "e1をtransmitするとe1はtransmitted,e2とe3はtransmittingでj11とj12はreadyになる" do
|
73
|
+
[:e1, :e2, :e3].each{|name| @ctx[name].phase_key = :active}
|
74
|
+
@ctx[:j11].phase_key = :initialized
|
75
|
+
@ctx[:j12].phase_key = :initialized
|
76
|
+
@ctx[:root].save!
|
77
|
+
@ctx[:e1].transmit(@signal)
|
78
|
+
@ctx[:root].save!
|
79
|
+
@ctx[:root].reload
|
80
|
+
@ctx.edge(:e1).phase_key.should == :transmitted
|
81
|
+
@ctx.edge(:e2).phase_key.should == :transmitting
|
82
|
+
@ctx.edge(:e3).phase_key.should == :transmitting
|
83
|
+
@ctx.vertex(:j11).phase_key.should == :ready
|
84
|
+
@ctx.vertex(:j12).phase_key.should == :ready
|
85
|
+
@signal.reservations.length.should == 2
|
86
|
+
@signal.reservations.first.tap do |r|
|
87
|
+
r.event_type_name.should == :"start.job.job.tengine"
|
88
|
+
r.options[:properties][:target_jobnet_id].should == @ctx[:root].id.to_s
|
89
|
+
r.options[:properties][:target_job_id].should == @ctx[:j11].id.to_s
|
90
|
+
r.options[:source_name].should =~ %r<^job:.+/\d+/#{@ctx[:root].id.to_s}/#{@ctx[:j11].id.to_s}$>
|
91
|
+
end
|
92
|
+
@signal.reservations.last.tap do |r|
|
93
|
+
r.event_type_name.should == :"start.job.job.tengine"
|
94
|
+
r.options[:properties][:target_jobnet_id].should == @ctx[:root].id.to_s
|
95
|
+
r.options[:properties][:target_job_id].should == @ctx[:j12].id.to_s
|
96
|
+
r.options[:source_name].should =~ %r<^job:.+/\d+/#{@ctx[:root].id.to_s}/#{@ctx[:j12].id.to_s}$>
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
it "e4をtransmitするとtransmittedになるけどe6は変わらず" do
|
101
|
+
[:e4, :e5, :e6].each{|name| @ctx[name].phase_key = :active}
|
102
|
+
@ctx[:root].save!
|
103
|
+
@ctx[:e4].transmit(@signal)
|
104
|
+
@ctx[:root].save!
|
105
|
+
@ctx[:root].reload
|
106
|
+
@ctx[:e4].phase_key.should == :transmitted
|
107
|
+
@ctx[:e5].phase_key.should == :active
|
108
|
+
@ctx[:e6].phase_key.should == :active
|
109
|
+
@signal.reservations.should be_empty
|
110
|
+
end
|
111
|
+
|
112
|
+
it "e4をtransmitした後、e5をtransmitするとe6もtransmittedになる" do
|
113
|
+
@ctx[:root].phase_key = :running
|
114
|
+
@ctx[:e4].phase_key = :transmitted
|
115
|
+
@ctx[:e5].phase_key = :active
|
116
|
+
@ctx[:e6].phase_key = :active
|
117
|
+
@ctx[:root].save!
|
118
|
+
@ctx[:e5].transmit(@signal)
|
119
|
+
@ctx[:root].save!
|
120
|
+
@ctx[:root].reload
|
121
|
+
@ctx.edge(:e4).phase_key.should == :transmitted
|
122
|
+
@ctx.edge(:e5).phase_key.should == :transmitted
|
123
|
+
@ctx.edge(:e6).phase_key.should == :transmitted
|
124
|
+
@ctx.vertex(:J1).activatable?.should == true
|
125
|
+
@signal.reservations.first.tap do |r|
|
126
|
+
r.event_type_name.should == :"success.jobnet.job.tengine"
|
127
|
+
r.options[:properties][:target_jobnet_id].should == @ctx[:root].id.to_s
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
context "forkとjoinが直接組み合わされるケース" do
|
133
|
+
# in [rjn0003]
|
134
|
+
# |--e7-->(j14)--e11-->(j16)--e14--->|
|
135
|
+
# |--e2-->(j11)--e4-->(j13)--e6-->[F2] |
|
136
|
+
# (S1)--e1-->[F1] |--e8-->[J1]--e12-->(j17)--e15-->[J2]--e16-->(E2)
|
137
|
+
# | |--e9-->[J1] |
|
138
|
+
# |--e3-->(j12)------e5---------->[F3] |
|
139
|
+
# |--e10---->(j15)---e13------------>|
|
140
|
+
before do
|
141
|
+
builder = Rjn0003ForkJoinJobnetBuilder.new
|
142
|
+
builder.create_actual
|
143
|
+
@ctx = builder.context
|
144
|
+
end
|
145
|
+
|
146
|
+
it "e6.transmitしてもe12には伝搬しない" do
|
147
|
+
[:e5, :e6, :e7, :e8, :e9, :e10, :e12].each{|name| @ctx[name].phase_key = :active}
|
148
|
+
[:j14, :j15, :j17].each{|name| @ctx[name].phase_key = :initialized}
|
149
|
+
@ctx[:root].save!
|
150
|
+
@ctx[:e6].transmit(@signal)
|
151
|
+
@ctx[:e6].phase_key.should == :transmitted
|
152
|
+
@ctx[:e7].phase_key.should == :transmitting
|
153
|
+
@ctx[:e8].phase_key.should == :transmitted
|
154
|
+
@ctx[:e12].phase_key.should == :active
|
155
|
+
@ctx[:j14].phase_key.should == :ready
|
156
|
+
@signal.reservations.length.should == 1
|
157
|
+
@signal.reservations.first.tap do |r|
|
158
|
+
r.event_type_name.should == :"start.job.job.tengine"
|
159
|
+
r.options[:properties][:target_jobnet_id].should == @ctx[:root].id.to_s
|
160
|
+
r.options[:properties][:target_job_id].should == @ctx[:j14].id.to_s
|
161
|
+
r.options[:source_name].should =~ %r<^job:.+/\d+/#{@ctx[:root].id.to_s}/#{@ctx[:j14].id.to_s}$>
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
it "e5とe6の両方をtransmitするとe12に伝搬する" do
|
166
|
+
[:e5, :e9, :e10, :e12].each{|name| @ctx[name].phase_key = :active}
|
167
|
+
@ctx[:e6].phase_key = :transmitted
|
168
|
+
@ctx[:e7].phase_key = :transmitting
|
169
|
+
@ctx[:e8].phase_key = :transmitted
|
170
|
+
[:j14].each{|name| @ctx[name].phase_key = :ready}
|
171
|
+
[:j15, :j17].each{|name| @ctx[name].phase_key = :initialized}
|
172
|
+
@ctx[:root].save!
|
173
|
+
@signal.reservations.clear
|
174
|
+
@ctx[:e5].transmit(@signal)
|
175
|
+
@ctx[:e6].phase_key.should == :transmitted
|
176
|
+
@ctx[:e7].phase_key.should == :transmitting
|
177
|
+
@ctx[:e8].phase_key.should == :transmitted
|
178
|
+
@ctx[:e9].phase_key.should == :transmitted
|
179
|
+
@ctx[:e10].phase_key.should == :transmitting
|
180
|
+
@ctx[:e12].phase_key.should == :transmitting
|
181
|
+
@signal.reservations.length.should == 2
|
182
|
+
@signal.reservations.first.tap do |r|
|
183
|
+
r.event_type_name.should == :"start.job.job.tengine"
|
184
|
+
r.options[:properties][:target_jobnet_id].should == @ctx[:root].id.to_s
|
185
|
+
r.options[:properties][:target_job_id].should == @ctx[:j17].id.to_s
|
186
|
+
end
|
187
|
+
@signal.reservations.last.tap do |r|
|
188
|
+
r.event_type_name.should == :"start.job.job.tengine"
|
189
|
+
r.options[:properties][:target_jobnet_id].should == @ctx[:root].id.to_s
|
190
|
+
r.options[:properties][:target_job_id].should == @ctx[:j15].id.to_s
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
end
|
195
|
+
|
196
|
+
end
|
197
|
+
|
198
|
+
context "<BUG>再実行したジョブが準備中のままになってしまう" do
|
199
|
+
# in [jn0004]
|
200
|
+
# |--e3-->(j2)--e5-->|
|
201
|
+
# (S1)--e1-->(j1)--e2-->[F1] [J1]--e7-->(j4)--e8-->(E1)
|
202
|
+
# |--e4-->(j3)--e6-->|
|
203
|
+
#
|
204
|
+
# in [jn0004/finally]
|
205
|
+
# (S2) --e9-->(jn0004_f)-e10-->(E2)
|
206
|
+
before do
|
207
|
+
builder = Rjn0004ParallelJobnetWithFinally.new
|
208
|
+
builder.create_actual
|
209
|
+
@ctx = builder.context
|
210
|
+
end
|
211
|
+
|
212
|
+
context "j1が失敗するとe2以降のedgeはclosedになる。" do
|
213
|
+
before do
|
214
|
+
[:e1].each{|name| @ctx[name].phase_key = :transmitted}
|
215
|
+
[:e2, :e3, :e4, :e5, :e6, :e7, :e8].each{|name| @ctx[name].phase_key = :closed}
|
216
|
+
[:root, :j1].each{|name| @ctx[name].phase_key = :error}
|
217
|
+
[:j2].each{|name| @ctx[name].phase_key = :ready}
|
218
|
+
[:j3, :j4].each{|name| @ctx[name].phase_key = :initialized}
|
219
|
+
@ctx[:root].save!
|
220
|
+
end
|
221
|
+
|
222
|
+
it "j2以降を再実行しようとしてclosedのe3に対してcompleteしても問題なく動けばOK" do
|
223
|
+
@now = Time.now.utc
|
224
|
+
@event = mock(:event, :occurred_at => @now)
|
225
|
+
@execution = mock(:execution,
|
226
|
+
:id => "execution_id",
|
227
|
+
:estimated_time => 600,
|
228
|
+
:retry => true,
|
229
|
+
:spot => true,
|
230
|
+
:target_actual_ids => [@ctx[:j2].id.to_s],
|
231
|
+
:actual_estimated_end => Time.utc(2011,10,27,19,8),
|
232
|
+
:preparation_command => "export J2_FAIL=true")
|
233
|
+
@execution.should_receive(:ack).with(an_instance_of(Tengine::Job::Signal))
|
234
|
+
@signal = Tengine::Job::Signal.new(@event)
|
235
|
+
@signal.stub!(:execution).and_return(@execution)
|
236
|
+
@ctx.vertex(:j2).activate(@signal)
|
237
|
+
end
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
end
|