drbqs 0.0.15 → 0.0.16
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/.document +3 -0
- data/README.md +137 -128
- data/VERSION +1 -1
- data/docs/FormatExecute.md +119 -0
- data/docs/GettingStarted.md +242 -0
- data/drbqs.gemspec +36 -13
- data/example/command/server_def.rb +4 -5
- data/example/execute/execute.rb +41 -0
- data/example/execute/server.rb +14 -0
- data/example/execute/task.rb +0 -0
- data/example/mandelbrot/README.md +15 -0
- data/example/mandelbrot/execute.rb +10 -0
- data/example/mandelbrot/mandelbrot.rb +56 -0
- data/example/mandelbrot/server.rb +49 -0
- data/example/server/server.rb +3 -6
- data/example/simple/README.md +18 -0
- data/example/simple/execute.rb +11 -0
- data/example/simple/server.rb +8 -0
- data/example/simple/task.rb +11 -0
- data/example/sum/server_def.rb +1 -1
- data/example/sum2/execute_def.rb +21 -8
- data/example/sum2/server_def.rb +8 -7
- data/example/transfer/file.rb +42 -8
- data/example/transfer/server_def.rb +43 -9
- data/lib/drbqs.rb +1 -1
- data/lib/drbqs/command_line/command_execute.rb +3 -3
- data/lib/drbqs/command_line/command_line.rb +1 -1
- data/lib/drbqs/execute/execute_node.rb +50 -0
- data/lib/drbqs/execute/process_define.rb +102 -54
- data/lib/drbqs/execute/register.rb +241 -87
- data/lib/drbqs/execute/server_define.rb +69 -58
- data/lib/drbqs/ext/task.rb +2 -0
- data/lib/drbqs/ext/task/command_task.rb +43 -0
- data/lib/drbqs/manage/manage.rb +5 -4
- data/lib/drbqs/manage/ssh_shell.rb +2 -8
- data/lib/drbqs/node/connection.rb +1 -1
- data/lib/drbqs/node/node.rb +8 -14
- data/lib/drbqs/node/task_client.rb +1 -1
- data/lib/drbqs/server/history.rb +5 -1
- data/lib/drbqs/server/message.rb +7 -34
- data/lib/drbqs/server/queue.rb +14 -2
- data/lib/drbqs/server/server.rb +86 -43
- data/lib/drbqs/server/server_hook.rb +3 -0
- data/lib/drbqs/server/test/node.rb +1 -1
- data/lib/drbqs/server/test/prof.rb +50 -0
- data/lib/drbqs/server/test/server.rb +2 -2
- data/lib/drbqs/server/transfer_setting.rb +23 -11
- data/lib/drbqs/setting/base.rb +15 -0
- data/lib/drbqs/setting/data_container.rb +1 -1
- data/lib/drbqs/setting/execute.rb +3 -3
- data/lib/drbqs/setting/node.rb +1 -1
- data/lib/drbqs/setting/server.rb +2 -2
- data/lib/drbqs/task/registrar.rb +39 -0
- data/lib/drbqs/task/task.rb +139 -59
- data/lib/drbqs/task/task_generator.rb +93 -116
- data/lib/drbqs/utility/misc.rb +15 -10
- data/lib/drbqs/utility/temporary.rb +7 -2
- data/lib/drbqs/utility/transfer/transfer.rb +81 -0
- data/lib/drbqs/utility/transfer/transfer_client.rb +68 -69
- data/lib/drbqs/utility/transfer/transfer_client_connect.rb +83 -0
- data/lib/drbqs/utility/transfer/transfer_file_list.rb +40 -0
- data/spec/execute/def/execute1.rb +4 -4
- data/spec/execute/def/execute2.rb +24 -0
- data/spec/execute/process_define_spec.rb +43 -6
- data/spec/execute/register_spec.rb +403 -9
- data/spec/execute/server_define_spec.rb +1 -1
- data/spec/ext/task/command_task_spec.rb +16 -0
- data/spec/integration_test/01_basic_usage_spec.rb +1 -1
- data/spec/integration_test/02_use_generator_spec.rb +2 -2
- data/spec/integration_test/04_use_unix_domain_spec.rb +1 -1
- data/spec/integration_test/05_server_exit_signal_spec.rb +1 -1
- data/spec/integration_test/06_node_exit_after_task_spec.rb +4 -4
- data/spec/integration_test/08_shutdown_unused_nodes_spec.rb +2 -2
- data/spec/integration_test/09_server_process_data_spec.rb +1 -1
- data/spec/integration_test/definition/server01.rb +4 -5
- data/spec/integration_test/definition/server02.rb +2 -4
- data/spec/node/node_spec.rb +34 -0
- data/spec/server/message_spec.rb +1 -1
- data/spec/server/queue_spec.rb +34 -7
- data/spec/server/server_spec.rb +21 -9
- data/spec/server/transfer_setting_spec.rb +59 -24
- data/spec/setting/base_spec.rb +11 -0
- data/spec/setting/data_container_spec.rb +8 -0
- data/spec/spec_helper.rb +1 -7
- data/spec/task/registrar_spec.rb +34 -0
- data/spec/task/task_generator_spec.rb +15 -15
- data/spec/task/task_spec.rb +132 -23
- data/spec/utility/misc_spec.rb +2 -2
- data/spec/utility/transfer/transfer_client_connect_spec.rb +90 -0
- data/spec/utility/transfer/transfer_file_list_spec.rb +27 -0
- data/spec/{task/file_transfer_spec.rb → utility/transfer/transfer_spec.rb} +24 -24
- metadata +66 -45
- data/lib/drbqs/manage/execute_node.rb +0 -50
- data/lib/drbqs/server/prof.rb +0 -48
- data/lib/drbqs/task/command_task.rb +0 -43
- data/lib/drbqs/utility/transfer/file_transfer.rb +0 -73
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'net/sftp'
|
2
|
+
|
3
|
+
module DRbQS
|
4
|
+
class Transfer
|
5
|
+
class Client
|
6
|
+
class Base
|
7
|
+
def initialize(server_directory)
|
8
|
+
@directory = server_directory
|
9
|
+
end
|
10
|
+
|
11
|
+
def upload_name(path)
|
12
|
+
File.join(@directory, File.basename(path))
|
13
|
+
end
|
14
|
+
private :upload_name
|
15
|
+
|
16
|
+
def directory_for_download(path)
|
17
|
+
dir = DRbQS::Temporary.directory
|
18
|
+
[dir, File.join(dir, File.basename(path))]
|
19
|
+
end
|
20
|
+
private :directory_for_download
|
21
|
+
end
|
22
|
+
|
23
|
+
# Transfer files to directory on DRbQS server over sftp.
|
24
|
+
# Note that after we transfer files we delete the original files.
|
25
|
+
class SFTP < DRbQS::Transfer::Client::Base
|
26
|
+
attr_reader :user, :host, :directory
|
27
|
+
|
28
|
+
def initialize(user, host, directory)
|
29
|
+
super(directory)
|
30
|
+
@user = user
|
31
|
+
@host = host
|
32
|
+
end
|
33
|
+
|
34
|
+
def start_sftp(&block)
|
35
|
+
Net::SFTP.start(@host, @user, &block)
|
36
|
+
end
|
37
|
+
private :start_sftp
|
38
|
+
|
39
|
+
# Transfer and delete +files+.
|
40
|
+
def transfer(files)
|
41
|
+
start_sftp do |sftp|
|
42
|
+
files.each do |path|
|
43
|
+
sftp.upload(path, upload_name(path))
|
44
|
+
FileUtils.rm_r(path)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
rescue => err
|
48
|
+
raise err.class, "user=#{@user}, host=#{@host}, directory=#{@directory}; #{err.to_s}", err.backtrace
|
49
|
+
end
|
50
|
+
|
51
|
+
def download(files)
|
52
|
+
moved = []
|
53
|
+
start_sftp do |sftp|
|
54
|
+
files.each do |path|
|
55
|
+
dir, downloaded_path = directory_for_download(path)
|
56
|
+
sftp.download(path, dir, :recursive => true)
|
57
|
+
moved << downloaded_path
|
58
|
+
end
|
59
|
+
end
|
60
|
+
moved
|
61
|
+
rescue => err
|
62
|
+
raise err.class, "user=#{@user}, host=#{@host}, directory=#{@directory}; #{err.to_s}", err.backtrace
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
class Local < DRbQS::Transfer::Client::Base
|
67
|
+
def transfer(files)
|
68
|
+
files.each do |path|
|
69
|
+
FileUtils.mv(path, upload_name(path))
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def download(files)
|
74
|
+
files.map do |path|
|
75
|
+
dir, downloaded_path = directory_for_download(path)
|
76
|
+
FileUtils.cp_r(path, dir)
|
77
|
+
downloaded_path
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module DRbQS
|
2
|
+
# Class for path of files to send from server to a node.
|
3
|
+
class Transfer
|
4
|
+
class FileList
|
5
|
+
# Initialization is executed on server.
|
6
|
+
# If :readonly option is true, nodes on same computer as server
|
7
|
+
# does not copy files.
|
8
|
+
# Therefore, if we edit the files then the change remains.
|
9
|
+
# If :readonly option is not true then the files is copied,
|
10
|
+
# so the original files are not changed.
|
11
|
+
def initialize(*files)
|
12
|
+
opts = (Hash === files[-1] ? files.pop : {})
|
13
|
+
@readonly = opts[:readonly]
|
14
|
+
@files = files.map do |path|
|
15
|
+
epath = File.expand_path(path)
|
16
|
+
unless File.exist?(epath)
|
17
|
+
raise ArgumentError, "#{epath} does not exist."
|
18
|
+
end
|
19
|
+
epath
|
20
|
+
end
|
21
|
+
@downloaded = nil
|
22
|
+
@path = nil
|
23
|
+
end
|
24
|
+
|
25
|
+
# This method is executed on a node.
|
26
|
+
def download
|
27
|
+
@downloaded = true
|
28
|
+
@path = DRbQS::Transfer::Client.get.download(@files, @readonly)
|
29
|
+
end
|
30
|
+
private :download
|
31
|
+
|
32
|
+
# Return an array of paths of downloaded files.
|
33
|
+
# Note that this method is executed on a node.
|
34
|
+
def path
|
35
|
+
download unless @downloaded
|
36
|
+
@path
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -5,20 +5,20 @@ usage message: "Usage of this definition.", server: server_file
|
|
5
5
|
|
6
6
|
default log: '/tmp/drbqs_tmp_log'
|
7
7
|
|
8
|
-
|
8
|
+
server 'server_local', 'localhost' do |server|
|
9
9
|
server.load server_file
|
10
10
|
end
|
11
11
|
|
12
|
-
|
12
|
+
server 'server_ssh', 'example.com' do |server, ssh|
|
13
13
|
ssh.connect "example.com"
|
14
14
|
server.load 'server.rb'
|
15
15
|
end
|
16
16
|
|
17
|
-
|
17
|
+
node 'node_local' do |node|
|
18
18
|
node.log_level = Logger::DEBUG
|
19
19
|
end
|
20
20
|
|
21
|
-
|
21
|
+
node 'node_ssh' do |node, ssh|
|
22
22
|
ssh.connect "example.com"
|
23
23
|
node.log_level = Logger::DEBUG
|
24
24
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# Use in process_define_spec.rb
|
2
|
+
|
3
|
+
server_file = File.join(File.dirname(__FILE__), '../../integration_test/definition/server02.rb')
|
4
|
+
usage message: "Usage of this definition.", server: server_file
|
5
|
+
|
6
|
+
default log: '/tmp/drbqs_tmp_log', node: [:node_ssh]
|
7
|
+
|
8
|
+
server 'server_local', 'localhost' do |server|
|
9
|
+
server.load server_file
|
10
|
+
end
|
11
|
+
|
12
|
+
server 'server_ssh', 'example.com' do |server, ssh|
|
13
|
+
ssh.connect "example.com"
|
14
|
+
server.load 'server.rb'
|
15
|
+
end
|
16
|
+
|
17
|
+
node 'node_local' do |node|
|
18
|
+
node.log_level = Logger::DEBUG
|
19
|
+
end
|
20
|
+
|
21
|
+
node 'node_ssh' do |node, ssh|
|
22
|
+
ssh.connect "example.com"
|
23
|
+
node.log_level = Logger::DEBUG
|
24
|
+
end
|
@@ -18,13 +18,27 @@ describe DRbQS::ProcessDefinition do
|
|
18
18
|
end
|
19
19
|
|
20
20
|
it "should get server list." do
|
21
|
-
|
22
|
-
|
21
|
+
data = @info[:server].assoc(:server_local)[1]
|
22
|
+
data[:type].should == :server
|
23
|
+
data[:ssh].should_not be_true
|
24
|
+
data[:args].should == ["localhost"]
|
25
|
+
|
26
|
+
data = @info[:server].assoc(:server_ssh)[1]
|
27
|
+
data[:type].should == :server
|
28
|
+
data[:ssh].should be_true
|
29
|
+
data[:args].should == ["example.com"]
|
23
30
|
end
|
24
31
|
|
25
32
|
it "should get node list." do
|
26
|
-
|
27
|
-
|
33
|
+
data = @info[:node].assoc(:node_local)[1]
|
34
|
+
data[:type].should == :node
|
35
|
+
data[:ssh].should_not be_true
|
36
|
+
data[:args].should == []
|
37
|
+
|
38
|
+
data = @info[:node].assoc(:node_ssh)[1]
|
39
|
+
data[:type].should == :node
|
40
|
+
data[:ssh].should be_true
|
41
|
+
data[:args].should == []
|
28
42
|
end
|
29
43
|
|
30
44
|
it "should get default server." do
|
@@ -103,7 +117,7 @@ describe DRbQS::ProcessDefinition do
|
|
103
117
|
@tmp = '/tmp/drbqs_tmp_log' # defined in execute1.rb
|
104
118
|
@process_def = DRbQS::ProcessDefinition.new(nil, nil, @port)
|
105
119
|
@process_def.load(definition_file('execute1.rb'))
|
106
|
-
@server_setting = subject.__send__(:get_server_setting)[:setting]
|
120
|
+
@server_setting = subject.__send__(:get_server_setting)[1][:setting]
|
107
121
|
@node_local_setting = subject.__send__(:get_node_data, :node_local)[:setting]
|
108
122
|
@node_ssh_setting = subject.__send__(:get_node_data, :node_ssh)[:setting]
|
109
123
|
end
|
@@ -139,7 +153,7 @@ describe DRbQS::ProcessDefinition do
|
|
139
153
|
@tmp = '/tmp/drbqs_tmp_log' # defined in execute1.rb
|
140
154
|
@process_def = DRbQS::ProcessDefinition.new(nil, [:node_local], nil)
|
141
155
|
@process_def.load(definition_file('execute1.rb'))
|
142
|
-
@server_setting = subject.__send__(:get_server_setting)[:setting]
|
156
|
+
@server_setting = subject.__send__(:get_server_setting)[1][:setting]
|
143
157
|
@node_local_setting = subject.__send__(:get_node_data, :node_local)[:setting]
|
144
158
|
end
|
145
159
|
|
@@ -164,4 +178,27 @@ describe DRbQS::ProcessDefinition do
|
|
164
178
|
FileUtils.rm_r(@tmp)
|
165
179
|
end
|
166
180
|
end
|
181
|
+
|
182
|
+
context "when execute default nodes" do
|
183
|
+
before(:all) do
|
184
|
+
@port = DRbQS::ROOT_DEFAULT_PORT
|
185
|
+
@hostname = 'localhost' # defined in execute1.rb
|
186
|
+
@tmp = '/tmp/drbqs_tmp_log' # defined in execute1.rb
|
187
|
+
@process_def = DRbQS::ProcessDefinition.new(nil, nil, nil)
|
188
|
+
@process_def.load(definition_file('execute2.rb'))
|
189
|
+
@server_setting = subject.__send__(:get_server_setting)[1][:setting]
|
190
|
+
@node_local_setting = subject.__send__(:get_node_data, :node_local)[:setting]
|
191
|
+
@node_ssh_setting = subject.__send__(:get_node_data, :node_ssh)[:setting]
|
192
|
+
end
|
193
|
+
|
194
|
+
subject do
|
195
|
+
@process_def
|
196
|
+
end
|
197
|
+
|
198
|
+
it "should check port number set in node." do
|
199
|
+
@node_local_setting.should_not_receive(:exec)
|
200
|
+
@node_ssh_setting.should_receive(:exec)
|
201
|
+
subject.execute_node
|
202
|
+
end
|
203
|
+
end
|
167
204
|
end
|
@@ -10,53 +10,424 @@ describe DRbQS::ProcessDefinition::Register do
|
|
10
10
|
context "when registering a server" do
|
11
11
|
it "should define a server on localhost." do
|
12
12
|
load_file = 'file.rb'
|
13
|
-
subject.
|
13
|
+
subject.server(:server1, "example.com") do |server|
|
14
14
|
server.load load_file
|
15
15
|
end
|
16
16
|
name, data = subject.__server__.assoc(:server1)
|
17
17
|
data[:type].should == :server
|
18
|
-
data[:
|
18
|
+
data[:ssh].should be_false
|
19
|
+
data[:template].should be_false
|
20
|
+
setting = data[:setting]
|
21
|
+
setting.get(:load).should == [load_file]
|
22
|
+
setting.should be_an_instance_of DRbQS::Setting::Server
|
19
23
|
end
|
20
24
|
|
21
25
|
it "should define a server over ssh." do
|
22
26
|
dest = "user@example.com"
|
23
27
|
load_file = 'file.rb'
|
24
|
-
subject.
|
28
|
+
subject.server(:server2, "example.com") do |server, ssh|
|
25
29
|
server.load load_file
|
26
30
|
ssh.connect dest
|
27
31
|
end
|
28
|
-
name, data = subject.__server__.assoc(:
|
29
|
-
data[:type].should == :
|
32
|
+
name, data = subject.__server__.assoc(:server2)
|
33
|
+
data[:type].should == :server
|
34
|
+
data[:ssh].should be_true
|
35
|
+
data[:template].should be_false
|
30
36
|
setting = data[:setting]
|
37
|
+
setting.should be_an_instance_of DRbQS::Setting::SSH
|
31
38
|
setting.get(:connect).should == [dest]
|
32
39
|
setting.mode_setting.get(:load).should == [load_file]
|
33
40
|
end
|
41
|
+
|
42
|
+
it "should raise error for arguments without hostname." do
|
43
|
+
load_file = 'file.rb'
|
44
|
+
lambda do
|
45
|
+
subject.server(:server3) do |server|
|
46
|
+
server.load load_file
|
47
|
+
end
|
48
|
+
end.should raise_error
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should set template." do
|
52
|
+
load_file = 'file.rb'
|
53
|
+
subject.server(:server4, :template => true) do |server|
|
54
|
+
server.load load_file
|
55
|
+
end
|
56
|
+
name, data = subject.__server__.assoc(:server4)
|
57
|
+
data[:template].should be_true
|
58
|
+
data[:ssh].should be_false
|
59
|
+
data[:type].should == :server
|
60
|
+
setting = data[:setting]
|
61
|
+
setting.get(:load).should == [load_file]
|
62
|
+
setting.should be_an_instance_of DRbQS::Setting::Server
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should define a server over ssh." do
|
66
|
+
load_file = 'file.rb'
|
67
|
+
bash = "bash"
|
68
|
+
subject.server(:server5, :template => true) do |server, ssh|
|
69
|
+
server.load load_file
|
70
|
+
ssh.shell bash
|
71
|
+
end
|
72
|
+
name, data = subject.__server__.assoc(:server5)
|
73
|
+
data[:type].should == :server
|
74
|
+
data[:ssh].should be_true
|
75
|
+
data[:template].should be_true
|
76
|
+
setting = data[:setting]
|
77
|
+
setting.should be_an_instance_of DRbQS::Setting::SSH
|
78
|
+
setting.get(:shell).should == [bash]
|
79
|
+
setting.mode_setting.get(:load).should == [load_file]
|
80
|
+
end
|
34
81
|
end
|
35
82
|
|
36
83
|
context "when registering a node" do
|
37
84
|
it "should define a node on localhost." do
|
38
85
|
uri = 'druby://:12345'
|
39
|
-
subject.
|
86
|
+
subject.node(:node1) do |node|
|
40
87
|
node.connect uri
|
41
88
|
end
|
42
89
|
name, data = subject.__node__.assoc(:node1)
|
43
90
|
data[:type].should == :node
|
44
|
-
data[:
|
91
|
+
data[:ssh].should be_false
|
92
|
+
data[:template].should be_false
|
93
|
+
setting = data[:setting]
|
94
|
+
setting.should be_an_instance_of DRbQS::Setting::Node
|
95
|
+
setting.get(:connect).should == [uri]
|
45
96
|
end
|
46
97
|
|
47
98
|
it "should define a node over ssh." do
|
48
99
|
dest = "user@example.com"
|
49
100
|
uri = 'druby://:12345'
|
50
|
-
subject.
|
101
|
+
subject.node(:node2) do |node, ssh|
|
51
102
|
node.connect uri
|
52
103
|
ssh.connect dest
|
53
104
|
end
|
54
105
|
name, data = subject.__node__.assoc(:node2)
|
55
|
-
data[:type].should == :
|
106
|
+
data[:type].should == :node
|
107
|
+
data[:ssh].should be_true
|
108
|
+
data[:template].should be_false
|
109
|
+
setting = data[:setting]
|
110
|
+
setting.should be_an_instance_of DRbQS::Setting::SSH
|
111
|
+
setting.get(:connect).should == [dest]
|
112
|
+
setting.mode_setting.get(:connect).should == [uri]
|
113
|
+
end
|
114
|
+
|
115
|
+
it "should define a node template." do
|
116
|
+
uri = 'druby://:12345'
|
117
|
+
subject.node(:node3, :template => true) do |node|
|
118
|
+
node.connect uri
|
119
|
+
end
|
120
|
+
name, data = subject.__node__.assoc(:node3)
|
121
|
+
data[:type].should == :node
|
122
|
+
data[:ssh].should be_false
|
123
|
+
data[:template].should be_true
|
124
|
+
setting = data[:setting]
|
125
|
+
setting.should be_an_instance_of DRbQS::Setting::Node
|
126
|
+
setting.get(:connect).should == [uri]
|
127
|
+
end
|
128
|
+
|
129
|
+
it "should define a node over ssh." do
|
130
|
+
dest = "user@example.com"
|
131
|
+
uri = 'druby://:12345'
|
132
|
+
subject.node(:node4, :template => true) do |node, ssh|
|
133
|
+
node.connect uri
|
134
|
+
ssh.connect dest
|
135
|
+
end
|
136
|
+
name, data = subject.__node__.assoc(:node4)
|
137
|
+
data[:type].should == :node
|
138
|
+
data[:ssh].should be_true
|
139
|
+
data[:template].should be_true
|
56
140
|
setting = data[:setting]
|
141
|
+
setting.should be_an_instance_of DRbQS::Setting::SSH
|
57
142
|
setting.get(:connect).should == [dest]
|
58
143
|
setting.mode_setting.get(:connect).should == [uri]
|
59
144
|
end
|
145
|
+
|
146
|
+
it "should set node group." do
|
147
|
+
nodes = [:node1, :node2]
|
148
|
+
subject.node(:node_group, :group => nodes)
|
149
|
+
name, data = subject.__node__.assoc(:node_group)
|
150
|
+
data[:type].should == :group
|
151
|
+
data[:template].should be_true
|
152
|
+
data[:ssh].should_not be_true
|
153
|
+
data[:args].should == nodes
|
154
|
+
end
|
155
|
+
|
156
|
+
it "should raise error for invalid node group." do
|
157
|
+
lambda do
|
158
|
+
subject.node(:node_group, :group => :node_error)
|
159
|
+
end.should raise_error
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
context "when loading other server difinition" do
|
164
|
+
it "should load server definition." do
|
165
|
+
subject.server :parent, template: true do |server|
|
166
|
+
server.log_level "debug"
|
167
|
+
end
|
168
|
+
subject.server :child, 'example.com', load: :parent do |server|
|
169
|
+
server.load "file.rb"
|
170
|
+
end
|
171
|
+
|
172
|
+
name, data = subject.__server__.assoc(:parent)
|
173
|
+
setting = data[:setting]
|
174
|
+
setting.value.load.should be_nil
|
175
|
+
|
176
|
+
name, data = subject.__server__.assoc(:child)
|
177
|
+
setting = data[:setting]
|
178
|
+
setting.value.log_level.should == ["debug"]
|
179
|
+
setting.value.load.should == ["file.rb"]
|
180
|
+
end
|
181
|
+
|
182
|
+
it "should load server definition that is over ssh." do
|
183
|
+
subject.server :parent, template: true do |server, ssh|
|
184
|
+
server.log_level "debug"
|
185
|
+
ssh.rvm "ruby-head"
|
186
|
+
end
|
187
|
+
subject.server :child, 'example.com', load: :parent do |server, ssh|
|
188
|
+
server.load "file.rb"
|
189
|
+
ssh.nice 20
|
190
|
+
end
|
191
|
+
|
192
|
+
name, data = subject.__server__.assoc(:parent)
|
193
|
+
setting = data[:setting]
|
194
|
+
setting.value.nice.should be_nil
|
195
|
+
setting.mode_setting.value.load.should be_nil
|
196
|
+
|
197
|
+
name, data = subject.__server__.assoc(:child)
|
198
|
+
setting = data[:setting]
|
199
|
+
setting.value.rvm.should == ["ruby-head"]
|
200
|
+
setting.value.nice.should == [20]
|
201
|
+
setting.mode_setting.value.log_level.should == ["debug"]
|
202
|
+
setting.mode_setting.value.load.should == ["file.rb"]
|
203
|
+
end
|
204
|
+
|
205
|
+
it "should load server definition on localhost for definition over ssh." do
|
206
|
+
subject.server :parent, template: true do |server|
|
207
|
+
server.log_level "debug"
|
208
|
+
end
|
209
|
+
subject.server :child, 'example.com', load: :parent do |server, ssh|
|
210
|
+
server.load "file.rb"
|
211
|
+
ssh.nice 20
|
212
|
+
end
|
213
|
+
|
214
|
+
name, data = subject.__server__.assoc(:parent)
|
215
|
+
setting = data[:setting]
|
216
|
+
setting.value.log.should be_nil
|
217
|
+
|
218
|
+
name, data = subject.__server__.assoc(:child)
|
219
|
+
setting = data[:setting]
|
220
|
+
setting.value.nice.should == [20]
|
221
|
+
setting.mode_setting.value.log_level.should == ["debug"]
|
222
|
+
setting.mode_setting.value.load.should == ["file.rb"]
|
223
|
+
end
|
224
|
+
|
225
|
+
it "should raise error because definition on localhost loads that over ssh." do
|
226
|
+
subject.server :parent, template: true do |server, ssh|
|
227
|
+
server.log_level "debug"
|
228
|
+
ssh.rvm "ruby-head"
|
229
|
+
end
|
230
|
+
lambda do
|
231
|
+
subject.server :child, 'example.com', load: :parent do |server|
|
232
|
+
end
|
233
|
+
end.should raise_error
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
context "when loading other node difinition" do
|
238
|
+
it "should load node definition." do
|
239
|
+
subject.node :parent, template: true do |node|
|
240
|
+
node.log_level "debug"
|
241
|
+
end
|
242
|
+
subject.node :child, load: :parent do |node|
|
243
|
+
node.load "file.rb"
|
244
|
+
end
|
245
|
+
|
246
|
+
name, data = subject.__node__.assoc(:parent)
|
247
|
+
setting = data[:setting]
|
248
|
+
setting.value.load.should be_nil
|
249
|
+
|
250
|
+
name, data = subject.__node__.assoc(:child)
|
251
|
+
setting = data[:setting]
|
252
|
+
setting.value.log_level.should == ["debug"]
|
253
|
+
setting.value.load.should == ["file.rb"]
|
254
|
+
end
|
255
|
+
|
256
|
+
it "should load node definition that is over ssh." do
|
257
|
+
subject.node :parent, template: true do |node, ssh|
|
258
|
+
node.log_level "debug"
|
259
|
+
ssh.rvm "ruby-head"
|
260
|
+
end
|
261
|
+
subject.node :child, load: :parent do |node, ssh|
|
262
|
+
node.load "file.rb"
|
263
|
+
ssh.nice 20
|
264
|
+
end
|
265
|
+
|
266
|
+
name, data = subject.__node__.assoc(:parent)
|
267
|
+
setting = data[:setting]
|
268
|
+
setting.value.nice.should be_nil
|
269
|
+
setting.mode_setting.value.load.should be_nil
|
270
|
+
|
271
|
+
name, data = subject.__node__.assoc(:child)
|
272
|
+
setting = data[:setting]
|
273
|
+
setting.value.rvm.should == ["ruby-head"]
|
274
|
+
setting.value.nice.should == [20]
|
275
|
+
setting.mode_setting.value.log_level.should == ["debug"]
|
276
|
+
setting.mode_setting.value.load.should == ["file.rb"]
|
277
|
+
end
|
278
|
+
|
279
|
+
it "should load node definition on localhost for definition over ssh." do
|
280
|
+
subject.node :parent, template: true do |node|
|
281
|
+
node.log_level "debug"
|
282
|
+
end
|
283
|
+
subject.node :child, load: :parent do |node, ssh|
|
284
|
+
node.load "file.rb"
|
285
|
+
ssh.nice 20
|
286
|
+
end
|
287
|
+
|
288
|
+
name, data = subject.__node__.assoc(:parent)
|
289
|
+
setting = data[:setting]
|
290
|
+
setting.value.log.should be_nil
|
291
|
+
|
292
|
+
name, data = subject.__node__.assoc(:child)
|
293
|
+
setting = data[:setting]
|
294
|
+
setting.value.nice.should == [20]
|
295
|
+
setting.mode_setting.value.log_level.should == ["debug"]
|
296
|
+
setting.mode_setting.value.load.should == ["file.rb"]
|
297
|
+
end
|
298
|
+
|
299
|
+
it "should raise error because definition on localhost loads that over ssh." do
|
300
|
+
subject.node :parent, template: true do |node, ssh|
|
301
|
+
node.log_level "debug"
|
302
|
+
ssh.rvm "ruby-head"
|
303
|
+
end
|
304
|
+
lambda do
|
305
|
+
subject.node :child, load: :parent do |node|
|
306
|
+
end
|
307
|
+
end.should raise_error
|
308
|
+
end
|
309
|
+
|
310
|
+
it "should raise error because group definition is loaded." do
|
311
|
+
subject.node :parent, group: [:node1, :node2, :node3]
|
312
|
+
lambda do
|
313
|
+
subject.node :child, load: :parent do |node|
|
314
|
+
end
|
315
|
+
end.should raise_error
|
316
|
+
end
|
317
|
+
end
|
318
|
+
|
319
|
+
context "when reconfiguring server" do
|
320
|
+
it "should reconfigure definition." do
|
321
|
+
load_file = 'file.rb'
|
322
|
+
subject.server(:server1, "example.com") do |server|
|
323
|
+
server.load load_file
|
324
|
+
end
|
325
|
+
subject.server(:server1, "example.com") do |server|
|
326
|
+
server.log_level 'info'
|
327
|
+
end
|
328
|
+
|
329
|
+
name, data = subject.__server__.assoc(:server1)
|
330
|
+
data[:type].should == :server
|
331
|
+
data[:ssh].should be_false
|
332
|
+
data[:template].should be_false
|
333
|
+
setting = data[:setting]
|
334
|
+
setting.get(:load).should == [load_file]
|
335
|
+
setting.get(:log_level).should == ['info']
|
336
|
+
end
|
337
|
+
|
338
|
+
it "should raise error for simultaneous reconfiguring and loading." do
|
339
|
+
subject.server(:server2, "example.com") do |server|
|
340
|
+
end
|
341
|
+
lambda do
|
342
|
+
subject.server(:server2, "example.com", load: :some_definition) do |server|
|
343
|
+
end
|
344
|
+
end.should raise_error
|
345
|
+
end
|
346
|
+
end
|
347
|
+
|
348
|
+
context "when reconfiguring node" do
|
349
|
+
it "should reconfigure definition." do
|
350
|
+
load_file = 'file.rb'
|
351
|
+
subject.node(:node1) do |node|
|
352
|
+
node.load load_file
|
353
|
+
end
|
354
|
+
subject.node(:node1) do |node|
|
355
|
+
node.log_level 'info'
|
356
|
+
end
|
357
|
+
|
358
|
+
name, data = subject.__node__.assoc(:node1)
|
359
|
+
data[:type].should == :node
|
360
|
+
data[:ssh].should be_false
|
361
|
+
data[:template].should be_false
|
362
|
+
setting = data[:setting]
|
363
|
+
setting.get(:load).should == [load_file]
|
364
|
+
setting.get(:log_level).should == ['info']
|
365
|
+
end
|
366
|
+
|
367
|
+
it "should raise error to change type of group." do
|
368
|
+
nodes = [:node1, :node2]
|
369
|
+
nodes2 = [:node3, :node4, :node5]
|
370
|
+
subject.node(:node_group, :group => nodes)
|
371
|
+
subject.node(:node_group, :group => nodes2)
|
372
|
+
name, data = subject.__node__.assoc(:node_group)
|
373
|
+
data[:type].should == :group
|
374
|
+
data[:template].should be_true
|
375
|
+
data[:ssh].should_not be_true
|
376
|
+
data[:args].should == nodes2
|
377
|
+
end
|
378
|
+
|
379
|
+
it "should raise error for simultaneous reconfiguring and loading." do
|
380
|
+
subject.node(:node2) do |node|
|
381
|
+
end
|
382
|
+
lambda do
|
383
|
+
subject.node(:node2, load: :some_definition) do |node|
|
384
|
+
end
|
385
|
+
end.should raise_error
|
386
|
+
end
|
387
|
+
|
388
|
+
it "should raise error to change type of group." do
|
389
|
+
subject.node(:node_group, group: [:node1, :node2])
|
390
|
+
lambda do
|
391
|
+
subject.node(:node_group) do |node|
|
392
|
+
end
|
393
|
+
end.should raise_error
|
394
|
+
end
|
395
|
+
|
396
|
+
it "should raise error to change type of process." do
|
397
|
+
subject.node(:node) do |node|
|
398
|
+
end
|
399
|
+
lambda do
|
400
|
+
subject.node(:node, group: [:node1, :node2])
|
401
|
+
end.should raise_error
|
402
|
+
end
|
403
|
+
end
|
404
|
+
|
405
|
+
context "when clearing" do
|
406
|
+
it "should clear servers" do
|
407
|
+
subject.server(:server1, "example.com") do |server|
|
408
|
+
end
|
409
|
+
subject.server(:server2, "example.com") do |server|
|
410
|
+
end
|
411
|
+
subject.server(:server3, "example.com") do |server|
|
412
|
+
end
|
413
|
+
subject.clear_server(:server1, :server3)
|
414
|
+
subject.__server__.assoc(:server1).should_not be_true
|
415
|
+
subject.__server__.assoc(:server2).should be_true
|
416
|
+
subject.__server__.assoc(:server3).should_not be_true
|
417
|
+
end
|
418
|
+
|
419
|
+
it "should clear nodes" do
|
420
|
+
subject.node(:node1) do |node|
|
421
|
+
end
|
422
|
+
subject.node(:node2) do |node|
|
423
|
+
end
|
424
|
+
subject.node(:node3) do |node|
|
425
|
+
end
|
426
|
+
subject.clear_node(:node1, :node3)
|
427
|
+
subject.__node__.assoc(:node1).should_not be_true
|
428
|
+
subject.__node__.assoc(:node2).should be_true
|
429
|
+
subject.__node__.assoc(:node3).should_not be_true
|
430
|
+
end
|
60
431
|
end
|
61
432
|
|
62
433
|
context "when setting default" do
|
@@ -73,5 +444,28 @@ describe DRbQS::ProcessDefinition::Register do
|
|
73
444
|
h[:server].should == :server2
|
74
445
|
h[:port].should == 12345
|
75
446
|
end
|
447
|
+
|
448
|
+
it "should set default nodes." do
|
449
|
+
nodes = [:node1, :node2]
|
450
|
+
subject.default(:node => nodes)
|
451
|
+
h = subject.__default__
|
452
|
+
h[:node].should == nodes
|
453
|
+
end
|
454
|
+
|
455
|
+
it "should set default value for some keys." do
|
456
|
+
subject.default(:log => '/tmp/drbqs/log', :some_key => 'some_value')
|
457
|
+
h = subject.__default__
|
458
|
+
h[:log].should == '/tmp/drbqs/log'
|
459
|
+
h[:some_key].should == 'some_value'
|
460
|
+
end
|
461
|
+
|
462
|
+
it "should clear values." do
|
463
|
+
subject.default(key1: 'val1', key2: 'val2', key3: 'val3')
|
464
|
+
subject.default_clear(:key1, :key2)
|
465
|
+
h = subject.__default__
|
466
|
+
h[:key1].should be_nil
|
467
|
+
h[:key2].should be_nil
|
468
|
+
h[:key3].should == 'val3'
|
469
|
+
end
|
76
470
|
end
|
77
471
|
end
|