drbqs 0.0.19 → 0.1.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.
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