drbqs 0.0.19 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. checksums.yaml +7 -0
  2. data/docs/TestProfiler.md +30 -0
  3. data/drbqs.gemspec +2 -1
  4. data/{example → examples}/README.md +0 -0
  5. data/{example → examples}/command/server_def.rb +1 -1
  6. data/{example → examples}/error_server/error.rb +0 -0
  7. data/{example → examples}/error_server/server_def.rb +0 -0
  8. data/{example → examples}/error_task/error.rb +0 -0
  9. data/{example → examples}/error_task/server_def.rb +1 -1
  10. data/examples/execute/README.md +7 -0
  11. data/examples/execute/execute.rb +10 -0
  12. data/examples/execute/server.rb +27 -0
  13. data/{example/sum → examples/execute}/sum.rb +0 -0
  14. data/{example → examples}/group/execute.rb +5 -2
  15. data/{example → examples}/group/server.rb +0 -0
  16. data/{example → examples}/group/sum.rb +0 -0
  17. data/{example → examples}/mandelbrot/README.md +0 -0
  18. data/{example → examples}/mandelbrot/execute.rb +4 -1
  19. data/{example → examples}/mandelbrot/mandelbrot.rb +0 -0
  20. data/{example → examples}/mandelbrot/server.rb +0 -0
  21. data/examples/server/server.rb +20 -0
  22. data/{example → examples}/simple/README.md +0 -0
  23. data/{example → examples}/simple/execute.rb +0 -0
  24. data/{example → examples}/simple/server.rb +0 -0
  25. data/{example → examples}/simple/task.rb +0 -0
  26. data/{example → examples}/sum/server_def.rb +5 -1
  27. data/examples/sum/sum.rb +10 -0
  28. data/{example → examples}/sum2/execute_def.rb +0 -0
  29. data/{example → examples}/sum2/server_def.rb +3 -4
  30. data/{example → examples}/sum2/sum.rb +0 -0
  31. data/{example → examples}/transfer/file.rb +0 -0
  32. data/{example → examples}/transfer/server_def.rb +0 -0
  33. data/lib/drbqs.rb +5 -0
  34. data/lib/drbqs/command_line/command_execute.rb +1 -0
  35. data/lib/drbqs/command_line/command_server.rb +1 -1
  36. data/lib/drbqs/config/process_list.rb +9 -7
  37. data/lib/drbqs/execute/process_define.rb +109 -18
  38. data/lib/drbqs/execute/register.rb +41 -33
  39. data/lib/drbqs/ext/task/command_task.rb +20 -17
  40. data/lib/drbqs/node/connection.rb +1 -2
  41. data/lib/drbqs/node/node.rb +3 -4
  42. data/lib/drbqs/server/server.rb +9 -3
  43. data/lib/drbqs/setting/base.rb +1 -0
  44. data/lib/drbqs/setting/data_container.rb +2 -2
  45. data/lib/drbqs/setting/execute.rb +9 -2
  46. data/lib/drbqs/setting/node.rb +7 -1
  47. data/lib/drbqs/setting/server.rb +4 -1
  48. data/lib/drbqs/task/registrar.rb +1 -2
  49. data/lib/drbqs/utility/misc.rb +6 -1
  50. data/lib/drbqs/utility/temporary.rb +27 -34
  51. data/lib/drbqs/version.rb +1 -1
  52. data/lib/drbqs/worker/worker_process_set.rb +3 -1
  53. data/spec/command_line/command_base_spec.rb +2 -2
  54. data/spec/config/config_spec.rb +5 -4
  55. data/spec/config/ssh_host_spec.rb +1 -1
  56. data/spec/execute/process_define_spec.rb +65 -18
  57. data/spec/execute/register_spec.rb +31 -9
  58. data/spec/ext/task/command_task_spec.rb +3 -5
  59. data/spec/integration_test/09_server_process_data_spec.rb +1 -1
  60. data/spec/node/node_spec.rb +3 -3
  61. data/spec/node/task_client_spec.rb +10 -10
  62. data/spec/server/history_spec.rb +22 -10
  63. data/spec/server/queue_spec.rb +11 -11
  64. data/spec/server/server_spec.rb +2 -2
  65. data/spec/server/transfer_setting_spec.rb +1 -1
  66. data/spec/setting/source_spec.rb +11 -10
  67. data/spec/task/task_spec.rb +5 -5
  68. data/spec/utility/misc_spec.rb +1 -1
  69. data/spec/utility/temporary_spec.rb +1 -7
  70. data/spec/utility/transfer/transfer_client_connect_spec.rb +4 -4
  71. data/spec/utility/transfer/transfer_file_list_spec.rb +2 -2
  72. data/spec/utility/transfer/transfer_spec.rb +23 -8
  73. metadata +108 -70
  74. data/example/execute/execute.rb +0 -41
  75. data/example/execute/server.rb +0 -14
  76. data/example/execute/task.rb +0 -0
  77. data/example/server/server.rb +0 -11
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d97c7024904ace9423e4447cf220ee2c2b6a5b32
4
+ data.tar.gz: e2ea40c666d2033eebe43659f833ea032f05a720
5
+ SHA512:
6
+ metadata.gz: 6cb2dfd423583c9426ce5138144dd46a37455c62208164c3ef26425578f991ce8e9e69998897170fb00e2cd13147846a89135d8a8048d6e7d48c413bd2944445
7
+ data.tar.gz: 069f933a4cdc05074e70e9a4081fe33e289a6f7959c9e9949f34f5e229bd4e968acb6ed9f594c4dc394923ee738eb79f033fe70231aa21a72abccff4f3492e9d
@@ -0,0 +1,30 @@
1
+ # Test and profiler
2
+
3
+ ## Test
4
+
5
+ When we are developing program,
6
+ we want to execute tasks in single process and check errors.
7
+ For that purpose we use the option --test.
8
+ For example,
9
+
10
+ drbqs-server server.rb --test exec
11
+
12
+ In order to execute only two tasks, we type
13
+
14
+ drbqs-server server.rb --test exec,2
15
+
16
+ ## Profiler
17
+
18
+ At a time we can use profiler.
19
+
20
+ drbqs-server server.rb --test exec --profile
21
+
22
+ Then drbqs creates drbqs_prof.txt that has profile data.
23
+
24
+ To profile a program and show the result by kcachegrind,
25
+
26
+ drbqs-server server.rb --test exec --profile --profile-printer calltree
27
+
28
+ and then
29
+
30
+ kcachegrind drbqs_prof.txt
data/drbqs.gemspec CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |s|
19
19
  s.require_paths = ["lib"]
20
20
 
21
21
  # specify any dependencies here; for example:
22
- s.add_development_dependency "rspec", ">= 2.6.0"
22
+ s.add_development_dependency "rspec", ">= 2.14.1"
23
23
  s.add_development_dependency "yard", ">= 0.7.2"
24
24
  s.add_runtime_dependency 'filename', '>= 0.1.0'
25
25
  s.add_runtime_dependency "user_config", ">= 0.0.2"
@@ -27,4 +27,5 @@ Gem::Specification.new do |s|
27
27
  s.add_runtime_dependency 'net-ssh-shell', '>= 0.2.0'
28
28
  s.add_runtime_dependency "net-sftp", ">= 2.0.5"
29
29
  s.add_runtime_dependency "sys-proctable"
30
+ s.add_runtime_dependency "activesupport"
30
31
  end
File without changes
@@ -7,7 +7,7 @@ DRbQS.define_server do |server, argv, opts|
7
7
  sleep_time = 2
8
8
  server.task_generator do |reg|
9
9
  3.times do |i|
10
- reg.add(DRbQS::CommandTask.new(["sleep #{sleep_time}", 'echo hello world']))
10
+ reg.add(DRbQS::CommandTask.new("sleep #{sleep_time}", "echo 'hello world (#{i})'"))
11
11
  end
12
12
  end
13
13
  end
File without changes
File without changes
File without changes
@@ -1,7 +1,7 @@
1
1
  require_relative 'error.rb'
2
2
 
3
3
  DRbQS.define_server(:check_alive => 300) do |server, argv, opts|
4
- server.queue.add(DRbQS::Task.new(TaskError, :exec))
4
+ server.queue.add(DRbQS::Task.new(TaskError.new, :exec))
5
5
  server.add_hook(:finish) do |serv|
6
6
  serv.exit
7
7
  end
@@ -0,0 +1,7 @@
1
+ ## Usage
2
+
3
+ bin/drbqs-execute example/execute/execute.rb
4
+
5
+ ## Result
6
+
7
+ Result is output in ../../example_execute.log
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env drbqs-execute
2
+
3
+ usage message: "Message of this file", server: File.join(File.dirname(__FILE__), 'server.rb')
4
+
5
+ default server: :server, log: "/tmp/drbqs_log"
6
+
7
+ server :server do |server|
8
+ server.load File.join(File.dirname(__FILE__), "server.rb")
9
+ server.log_level "debug"
10
+ end
@@ -0,0 +1,27 @@
1
+ require_relative 'sum.rb'
2
+
3
+ DRbQS.option_parser do |opt, hash|
4
+ opt.on('--step NUM', Integer) do |v|
5
+ hash[:step] = v
6
+ end
7
+ end
8
+
9
+ output_path = File.expand_path(File.join(File.dirname(__FILE__), "../../example_execute.log"))
10
+
11
+ DRbQS.define_server(:check_alive => 5) do |server, argv, opts|
12
+ start_num = (argv[0] || 10).to_i
13
+ end_num = (argv[1] || 50).to_i
14
+ step_num = opts[:step] || 10
15
+ start_num.step(end_num, step_num) do |i|
16
+ task = DRbQS::Task.new(Sum.new(i - 10, i), :exec, :args => [], :note => "#{i-10} to #{i}") do |srv, ret|
17
+ open(output_path, "a+") do |f|
18
+ f.puts "Receive: #{ret.inspect}"
19
+ end
20
+ end
21
+ server.queue.add(task)
22
+ end
23
+
24
+ server.add_hook(:finish) do |serv|
25
+ serv.exit
26
+ end
27
+ end
File without changes
@@ -1,8 +1,11 @@
1
- default :server => :server_local, :port => 13789, :log => '/tmp/drbqs_execute'
1
+ default :server => :server_local, :port => 13789, :node => [:node_odd, :node_even], :log => '/tmp/drbqs_execute'
2
2
 
3
3
  current_dir = File.expand_path(File.dirname(__FILE__))
4
4
 
5
- usage :message => "Calculate sum of numbers", :server => File.join(current_dir, 'server.rb')
5
+ usage :message => <<MES, :server => File.join(current_dir, 'server.rb')
6
+ Calculate sum of numbers.
7
+ Results are output to logs in /tmp/drbqs_execute
8
+ MES
6
9
 
7
10
  server :server, "localhost" do |server|
8
11
  server.load File.expand_path(File.join(File.dirname(__FILE__), 'server.rb'))
File without changes
File without changes
File without changes
@@ -2,7 +2,10 @@ DIR = File.dirname(__FILE__)
2
2
 
3
3
  current_dir = File.expand_path(File.dirname(__FILE__))
4
4
 
5
- usage :message => "Calculate Mandelbrot set", :server => File.join(current_dir, 'server.rb')
5
+ usage :message => <<MES, :server => File.join(current_dir, 'server.rb')
6
+ Calculate Mandelbrot set.
7
+ Result is output to the directory "result_mandelbrot".
8
+ MES
6
9
 
7
10
  server :local_server, "localhost" do |srv|
8
11
  srv.load File.join(DIR, 'server.rb')
File without changes
File without changes
@@ -0,0 +1,20 @@
1
+ #
2
+ # Start server:
3
+ # drbqs-server examples/server/server.rb
4
+ # Start node:
5
+ # drbqs-node bin/drbqs-node druby://:13501
6
+ # Stop server:
7
+ # drbqs-manage signal druby://:13501 server-exit
8
+ #
9
+
10
+ server = DRbQS::Server.new(:port => 13501)
11
+ server.task_generator do |reg|
12
+ 5.times do |i|
13
+ reg.create_add(i, :to_s)
14
+ end
15
+ end
16
+ server.set_initialization_task(DRbQS::Task.new(Kernel, :puts, :args => ['hook: initialize']))
17
+ server.set_finalization_task(DRbQS::Task.new(Kernel, :puts, :args => ['hook: finalize']))
18
+ server.set_signal_trap
19
+ server.start
20
+ server.wait
File without changes
File without changes
File without changes
File without changes
@@ -1,8 +1,12 @@
1
1
  #
2
2
  # Usage:
3
+ # * Start only server
3
4
  # drbqs-server server_def.rb -- 30 50
4
5
  # drbqs-server server_def.rb -- 100 500 --step 100
5
6
  #
7
+ # * Start server with 2 nodes
8
+ # drbqs-server examples/sum/server_def.rb --execute-node 2
9
+ #
6
10
 
7
11
  require_relative 'sum.rb'
8
12
 
@@ -17,7 +21,7 @@ DRbQS.define_server(:check_alive => 5) do |server, argv, opts|
17
21
  end_num = (argv[1] || 50).to_i
18
22
  step_num = opts[:step] || 10
19
23
  start_num.step(end_num, step_num) do |i|
20
- task = DRbQS::Task.new(Sum.new(i - 10, i), :exec, [], "#{i-10} to #{i}") do |srv, ret|
24
+ task = DRbQS::Task.new(Sum.new(i - 10, i), :exec, :note => "#{i-10} to #{i}") do |srv, ret|
21
25
  puts "Receive: #{ret.inspect}"
22
26
  end
23
27
  server.queue.add(task)
@@ -0,0 +1,10 @@
1
+ class Sum
2
+ def initialize(start_num, end_num)
3
+ @num = [start_num, end_num]
4
+ end
5
+
6
+ def exec
7
+ sleep(3) # Waiting time to interrupt
8
+ (@num[0]..@num[1]).inject(0) { |sum, i| sum += i }
9
+ end
10
+ end
File without changes
@@ -13,16 +13,15 @@ DRbQS.option_parser do |opt, hash|
13
13
  end
14
14
 
15
15
  DRbQS.define_server do |server, argv, opts|
16
- start_num = (argv[0] || 10).to_i,
17
- end_num = (argv[1] || 100).to_i,
16
+ start_num = (argv[0] || 10).to_i
17
+ end_num = (argv[1] || 100).to_i
18
18
  step_num = opts[:step] || 10
19
19
 
20
20
  server.task_generator do |reg|
21
- start_num.step(end_num, step_num) do |i|
21
+ (start_num..end_num).step(step_num) do |i|
22
22
  reg.create_add(Sum.new(i - 10, i), :exec) do |srv, ret|
23
23
  puts "Receive: #{ret.inspect}"
24
24
  end
25
25
  end
26
26
  end
27
- server.add_task_generator(tgen)
28
27
  end
File without changes
File without changes
File without changes
data/lib/drbqs.rb CHANGED
@@ -13,11 +13,16 @@ require 'drbqs/version'
13
13
  require 'drbqs/execute/server_define'
14
14
  require 'drbqs/utility/misc'
15
15
 
16
+ require 'active_support/core_ext/hash/keys'
17
+ require 'active_support/core_ext/array/extract_options'
18
+
16
19
  module DRbQS
17
20
  autoload :Server, 'drbqs/server/server'
18
21
  autoload :Node, 'drbqs/node/node'
19
22
  autoload :Config, 'drbqs/config/config'
20
23
  autoload :Setting, 'drbqs/setting/setting'
24
+ autoload :Temporary, 'drbqs/utility/temporary'
25
+ autoload :CommandTask, 'drbqs/ext/task'
21
26
 
22
27
  ROOT_DEFAULT_PORT = 13500
23
28
  end
@@ -20,6 +20,7 @@ HELP
20
20
  set(:node, '-n STR', '--node STR', String, 'Set the comma sparated key of nodes.')
21
21
  set(:no_server, '--no-server', 'Not execute server.')
22
22
  set(:no_node, '--no-node', 'Not execute node.')
23
+ set(:wait_server_finish, "--wait-server-finish", "Wait finish of server process.")
23
24
  set(:information, '-i', '--information', 'Show information.')
24
25
  set(:help, '-h', '--help', 'Show this command help and usage of definition file.') do |opt|
25
26
  $stdout.print opt
@@ -26,7 +26,7 @@ HELP
26
26
  set(:sftp_host, '--sftp-host HOST', String, 'Set the host of sftp destination.')
27
27
  set(:profile, '--profile', 'Use profile for test exec.')
28
28
  set(:profile_printer, '--profile-printer PRINTER', String,
29
- 'Set the printer type for profile. The value is :flat, :graph, :graphhtml, or :calltree.')
29
+ 'Set the printer type for profile. The value is flat, graph, graphhtml, or calltree.')
30
30
  set(:test, '--test STR', String, 'Execute test.')
31
31
  set(:execute_node, '--execute-node NUM', Integer, 'Execute nodes.')
32
32
  set(:help, '-h', '--help', 'Show this command help and server specific help.') do |opt|
@@ -1,3 +1,5 @@
1
+ require "cgi"
2
+
1
3
  module DRbQS
2
4
  class ProcessList
3
5
  PROCESS_ROOT_DIRECTORY = 'process'
@@ -68,9 +70,9 @@ module DRbQS
68
70
  def uri_to_file(uri)
69
71
  case uri
70
72
  when /^druby.*:(\d+)$/
71
- "druby_#{Regexp.last_match[1]}.yaml"
72
- when /^drbunix:(.*)$/
73
- "drbunix#{Regexp.last_match[1].gsub(/\//, '_')}.yaml"
73
+ "druby_#{CGI.escape(Regexp.last_match[1])}.yaml"
74
+ when /^drbunix:(.+)$/
75
+ "drbunix_#{CGI.escape(Regexp.last_match[1])}.yaml"
74
76
  else
75
77
  raise ArgumentError, "Invalid uri of drbqs server: #{uri}"
76
78
  end
@@ -80,10 +82,10 @@ module DRbQS
80
82
  def file_to_uri(file)
81
83
  s = file.sub(/\.yaml$/, '')
82
84
  case s
83
- when /^druby/
84
- s.sub(/_/, '://:')
85
- when /^drbunix$/
86
- s.gsub(/_/, '/')
85
+ when /^druby_(.+)$/
86
+ "druby://:#{CGI.unescape(Regexp.last_match[1])}"
87
+ when /^drbunix_(.+)$/
88
+ "drbunix:#{CGI.unescape(Regexp.last_match[1])}"
87
89
  else
88
90
  raise ArgumentError, "Invalid file name in process list: #{file}"
89
91
  end
@@ -5,6 +5,10 @@ module DRbQS
5
5
 
6
6
  attr_reader :register
7
7
 
8
+ # @param [Symbol] server Symbol of server name
9
+ # @param [Array] node An array of Symbol which means node name
10
+ # @param [String] port Port number
11
+ # @param [IO,nil] io IO object to output
8
12
  def initialize(server, node, port, io = nil)
9
13
  @server = server
10
14
  @node = node
@@ -97,14 +101,35 @@ module DRbQS
97
101
  private :server_port
98
102
 
99
103
  def server_uri(name)
104
+ uri = nil
100
105
  if ary = get_server_setting(name)
101
- DRbQS::Misc.create_uri(:host => ary[1][:args][0], :port => server_port)
102
- else
103
- nil
106
+ data = ary[1]
107
+ if data[:unix_domain_socket]
108
+ uri = DRbQS::Misc.uri_drbunix(data[:setting].value.unix.first)
109
+ else
110
+ uri = DRbQS::Misc.create_uri(:host => data[:args][0], :port => server_port)
111
+ end
104
112
  end
113
+ uri
105
114
  end
106
115
  private :server_uri
107
116
 
117
+ PATH_CPUINFO = "/proc/cpuinfo"
118
+
119
+ def get_suitable_process_num
120
+ n = 0
121
+ if File.exist?(PATH_CPUINFO)
122
+ n = File.read(PATH_CPUINFO).lines.count { |l| /^processor/ =~ l }
123
+ end
124
+ if n <= 0
125
+ n = 1
126
+ puts_progress "Can not determine suitable process number, that is, can not count 'processor' lines in /proc/cpuinfo"
127
+ end
128
+ puts_progress "Execute #{n} processes to deal with tasks"
129
+ n
130
+ end
131
+ private :get_suitable_process_num
132
+
108
133
  def execute_server(server_args)
109
134
  if ary = get_server_setting(@server)
110
135
  name = ary[0].to_s
@@ -121,9 +146,18 @@ module DRbQS
121
146
  server_setting.value.daemon FileName.create(local_log_directory, "server_execute.log", :position => :middle)
122
147
  end
123
148
  server_setting.set_server_argument(*server_args)
124
- server_setting.value.port server_port
125
- unless server_setting.set?(:sftp_host)
126
- server_setting.value.sftp_host hostname
149
+ if data[:unix_domain_socket]
150
+ unless server_setting.value.unix
151
+ server_setting.value.unix DRbQS::Temporary.socket_path
152
+ end
153
+ unless server_setting.value.execute_node
154
+ server_setting.value.execute_node get_suitable_process_num
155
+ end
156
+ else
157
+ server_setting.value.port server_port
158
+ unless server_setting.set?(:sftp_host)
159
+ server_setting.value.sftp_host hostname
160
+ end
127
161
  end
128
162
  setting.parse!
129
163
  unless data[:ssh]
@@ -158,12 +192,15 @@ module DRbQS
158
192
  setting.value.connect name.to_s
159
193
  end
160
194
  else
161
- node_log_dir = FileName.create(local_log_directory, 'node_execute_log', :directory => :self)
195
+ node_log_dir = FileName.create(local_log_directory, "node_#{name}_log", :directory => :self)
162
196
  setting.clear :log_stdout
163
197
  setting.value.log_prefix File.join(node_log_dir, 'node')
164
198
  setting.value.daemon File.join(node_log_dir, 'execute.log')
165
199
  end
166
200
  setting.parse!
201
+ # TODO:
202
+ # If node is on localhost then program is terminated here,
203
+ # because the node is executed as daemon process.
167
204
  setting.exec
168
205
  rescue Exception => err
169
206
  puts_progress "Fail to execute node '#{name.to_s}'"
@@ -183,10 +220,16 @@ module DRbQS
183
220
  end
184
221
  private :each_node_to_execute
185
222
 
223
+ TIME_INTERVAL_EXECUTE_NODE = 1
224
+
186
225
  def execute_node
187
226
  uri = server_uri(@server)
188
- each_node_to_execute do |name, data|
189
- execute_one_node(name, data, uri)
227
+ if uri && /^drbunix/ !~ uri
228
+ each_node_to_execute do |name, data|
229
+ execute_one_node(name, data, uri)
230
+ # If there is no time interval then drb does not work properly.
231
+ sleep(TIME_INTERVAL_EXECUTE_NODE)
232
+ end
190
233
  end
191
234
  end
192
235
 
@@ -222,25 +265,39 @@ module DRbQS
222
265
  end
223
266
  string_name_size = ary.max
224
267
  info[:server].each do |name, data|
225
- prop = (data[:ssh] ? 'ssh' : 'local')
226
- prop << ',template' if data[:template]
227
- str << (data[:template] ? " - " : (info[:default][:server] == name ? " * " : " "))
268
+ if data[:unix_domain_socket]
269
+ prop = "local(unix socket domain)"
270
+ elsif data[:ssh]
271
+ prop = "ssh"
272
+ else
273
+ prop = "local(ssh)"
274
+ end
275
+ str << (info[:default][:server] == name ? " * " : (data[:template] ? " - " : " "))
228
276
  str << sprintf("%- #{string_name_size}s %s\n", name, prop)
229
277
  end
230
- str << "Node:\n"
278
+ str << "\nNode:\n"
231
279
  info[:node].each do |name, data|
232
280
  if data[:type] == :group
233
281
  prop = 'group: ' << data[:args].map(&:to_s).join(',')
234
282
  else
235
283
  prop = (data[:ssh] ? 'ssh' : 'local')
236
- if data[:template]
237
- prop << ',template'
238
- end
239
284
  end
240
- str << (data[:template] ? " - " : (info[:default][:node].include?(name) ? " * " : " "))
285
+ if info[:default][:node].include?(name)
286
+ str << " * "
287
+ elsif data[:type] == :group
288
+ str << " # "
289
+ elsif data[:template]
290
+ str << " - "
291
+ else
292
+ str << " "
293
+ end
241
294
  str << sprintf("%- #{string_name_size}s %s\n", name, prop)
242
295
  end
243
- str << "Port: #{info[:default][:port]}"
296
+ str << "\nDefault port:\n #{info[:default][:port]}"
297
+ str << "\n\nHelp:\n"
298
+ str << " ssh: Process over SSH\n"
299
+ str << " local: Process on localhost\n"
300
+ str << " *: default, -: template, #: node group"
244
301
  end
245
302
 
246
303
  def usage
@@ -257,5 +314,39 @@ module DRbQS
257
314
  ''
258
315
  end
259
316
  end
317
+
318
+ def test_consistency
319
+ # Test existence of default server
320
+ if @server && !get_server_setting(@server)
321
+ raise "Invalid default server: #{@server.inspect}"
322
+ end
323
+ # Test existences of default nodes
324
+ if node_names = default_value(:node)
325
+ all_node_find_p = true
326
+ node_names.each do |node|
327
+ unless get_node_data(node)
328
+ all_node_find_p = false
329
+ $stderr.puts "Node definition #{node.inspect} does not exist!"
330
+ end
331
+ end
332
+ unless all_node_find_p
333
+ raise "Invalid default node."
334
+ end
335
+ end
336
+ end
337
+
338
+ TIME_INTERVAL_WAIT_SERVER_FINISH = 3
339
+
340
+ def wait_server_finish
341
+ if uri = server_uri(@server)
342
+ puts_progress "Wait finish of server #{uri}"
343
+ manage = DRbQS::Manage.new(:uri => uri)
344
+ while manage.server_respond?
345
+ sleep(TIME_INTERVAL_EXECUTE_NODE)
346
+ end
347
+ else
348
+ puts_progress "We tried to wait finish, however, we can not determine server uri"
349
+ end
350
+ end
260
351
  end
261
352
  end