drbqs 0.0.7 → 0.0.8

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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.7
1
+ 0.0.8
data/bin/drbqs-manage CHANGED
@@ -6,18 +6,38 @@ require 'optparse'
6
6
  Version = '0.0.1'
7
7
 
8
8
  help_message =<<HELP
9
- Usage: #{File.basename(__FILE__)} <command> <uri>
9
+ Usage: #{File.basename(__FILE__)} <command> [arguments ...]
10
10
  Manage DRbQS server by sending messages.
11
- <command> is 'exit-signal'.
11
+ <command> is 'exit-signal', 'initialize', or 'ssh'.
12
12
 
13
13
  HELP
14
14
 
15
+ command = ARGV[0]
16
+ argv, command_args = DRbQS::Manage.split_arguments(ARGV)
17
+
18
+ options = {}
19
+
15
20
  begin
16
21
  OptionParser.new(help_message) do |opt|
17
22
  opt.on('--debug', 'Set $DEBUG true.') do |v|
18
23
  $DEBUG = true
19
24
  end
20
- opt.parse!(ARGV)
25
+ opt.on('--dir DIR', String, 'Set the base directory over ssh.') do |v|
26
+ options[:dir] = v
27
+ end
28
+ opt.on('--shell STR', String, 'Set the shell over ssh') do |v|
29
+ options[:shell] = v
30
+ end
31
+ opt.on('--rvm STR', String, 'Ruby version to use on RVM over ssh.') do |v|
32
+ options[:rvm] = v
33
+ end
34
+ opt.on('--rvm-init PATH', String, 'Path of script to initialize RVM over ssh.') do |v|
35
+ options[:rvm_init] = v
36
+ end
37
+ opt.on('--output PATH', String, 'File path that stdout and stderr are output to over ssh.') do |v|
38
+ options[:output] = v
39
+ end
40
+ opt.parse!(argv)
21
41
  end
22
42
  rescue OptionParser::InvalidOption
23
43
  $stderr.print <<MES
@@ -33,18 +53,26 @@ MES
33
53
  exit(2)
34
54
  end
35
55
 
36
- if ARGV.size != 2
37
- raise "Invalid arguments number. Please refer '#{File.basename(__FILE__)} -h'."
56
+ def check_argument_size(argv, check_method, n)
57
+ unless argv.size.__send__(check_method, n)
58
+ raise "Invalid arguments number. Please refer '#{File.basename(__FILE__)} -h'."
59
+ end
38
60
  end
39
61
 
40
- command = ARGV[0]
41
- uri = ARGV[1]
42
-
43
- manage = DRbQS::Manage.new(uri)
62
+ manage = DRbQS::Manage.new
44
63
 
45
64
  case command
46
65
  when 'exit-signal'
47
- manage.send_exit_signal
66
+ check_argument_size(argv, :==, 2)
67
+ uri = argv[1]
68
+ manage.send_exit_signal(uri)
69
+ when 'initialize'
70
+ check_argument_size(argv, :==, 1)
71
+ manage.create_config
72
+ when 'ssh'
73
+ check_argument_size(argv, :>=, 2)
74
+ dest = argv[1]
75
+ manage.execute_over_ssh(dest, options, command_args)
48
76
  else
49
77
  raise "Invalid command: #{command}"
50
78
  end
data/bin/drbqs-server CHANGED
@@ -13,16 +13,12 @@ Start DRbQS server of definition files.
13
13
  HELP
14
14
 
15
15
  options = {
16
- :log_file => STDOUT
16
+ :log_file => STDOUT,
17
+ :command_type => :server_start,
18
+ :acl => DRbQS::Config.get_acl_file
17
19
  }
18
20
 
19
- if n = ARGV.index('--')
20
- command_argv = ARGV[0..(n - 1)]
21
- server_argv = ARGV[(n + 1)..-1]
22
- else
23
- command_argv = ARGV
24
- server_argv = []
25
- end
21
+ command_argv, server_argv = DRbQS::Manage.split_arguments(ARGV)
26
22
 
27
23
  begin
28
24
  OptionParser.new(help_message) do |opt|
@@ -46,6 +42,9 @@ begin
46
42
  opt.on('--debug', 'Set $DEBUG true.') do |v|
47
43
  $DEBUG = true
48
44
  end
45
+ opt.on('--test STR', String, 'Execute test.') do |v|
46
+ options[:command_type] = "test_#{v}"
47
+ end
49
48
  opt.parse!(command_argv)
50
49
  end
51
50
  rescue OptionParser::InvalidOption
@@ -72,4 +71,11 @@ command_argv.each do |path|
72
71
  end
73
72
 
74
73
  DRbQS.parse_option(server_argv)
75
- DRbQS.start_server(options)
74
+ case options[:command_type]
75
+ when /^test/
76
+ s = options[:command_type].split('_')[1].split(',')
77
+ type = s[0].intern
78
+ DRbQS.test_server(options, type, s[1..-1])
79
+ else
80
+ DRbQS.start_server(options)
81
+ end
data/drbqs.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{drbqs}
8
- s.version = "0.0.7"
8
+ s.version = "0.0.8"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Takayuki YAMAGUCHI"]
12
- s.date = %q{2011-03-08}
12
+ s.date = %q{2011-03-20}
13
13
  s.description = %q{Task queuing system over network that is implemented by dRuby.}
14
14
  s.email = %q{d@ytak.info}
15
15
  s.executables = ["drbqs-manage", "drbqs-node", "drbqs-server"]
@@ -30,15 +30,19 @@ Gem::Specification.new do |s|
30
30
  "bin/drbqs-server",
31
31
  "drbqs.gemspec",
32
32
  "example/README.md",
33
+ "example/command/server_def.rb",
33
34
  "example/drbqs-manage-test.rb",
34
35
  "example/drbqs-node-test.rb",
35
36
  "example/drbqs-server-test.rb",
36
- "example/server/server_def.rb",
37
+ "example/server/server.rb",
37
38
  "example/sum/server_def.rb",
38
39
  "example/sum/sum.rb",
40
+ "example/sum2/server_def.rb",
41
+ "example/sum2/sum.rb",
39
42
  "lib/drbqs.rb",
40
43
  "lib/drbqs/acl_file.rb",
41
44
  "lib/drbqs/client.rb",
45
+ "lib/drbqs/config.rb",
42
46
  "lib/drbqs/connection.rb",
43
47
  "lib/drbqs/manage.rb",
44
48
  "lib/drbqs/message.rb",
@@ -47,10 +51,12 @@ Gem::Specification.new do |s|
47
51
  "lib/drbqs/server.rb",
48
52
  "lib/drbqs/server_define.rb",
49
53
  "lib/drbqs/server_hook.rb",
54
+ "lib/drbqs/ssh_shell.rb",
50
55
  "lib/drbqs/task.rb",
51
56
  "lib/drbqs/task_client.rb",
52
57
  "lib/drbqs/task_generator.rb",
53
58
  "spec/acl_file_spec.rb",
59
+ "spec/config_spec.rb",
54
60
  "spec/connection_spec.rb",
55
61
  "spec/data/acl.txt",
56
62
  "spec/manage_spec.rb",
@@ -61,6 +67,7 @@ Gem::Specification.new do |s|
61
67
  "spec/server_hook_spec.rb",
62
68
  "spec/server_spec.rb",
63
69
  "spec/spec_helper.rb",
70
+ "spec/ssh_shell_spec.rb",
64
71
  "spec/task_client_spec.rb",
65
72
  "spec/task_generator_spec.rb",
66
73
  "spec/task_spec.rb",
@@ -71,10 +78,11 @@ Gem::Specification.new do |s|
71
78
  s.homepage = %q{http://github.com/ytaka/drbqs}
72
79
  s.licenses = ["GPL3"]
73
80
  s.require_paths = ["lib"]
74
- s.rubygems_version = %q{1.6.1}
81
+ s.rubygems_version = %q{1.5.2}
75
82
  s.summary = %q{dRuby Queueing System}
76
83
  s.test_files = [
77
84
  "spec/acl_file_spec.rb",
85
+ "spec/config_spec.rb",
78
86
  "spec/connection_spec.rb",
79
87
  "spec/manage_spec.rb",
80
88
  "spec/message_spec.rb",
@@ -84,6 +92,7 @@ Gem::Specification.new do |s|
84
92
  "spec/server_hook_spec.rb",
85
93
  "spec/server_spec.rb",
86
94
  "spec/spec_helper.rb",
95
+ "spec/ssh_shell_spec.rb",
87
96
  "spec/task_client_spec.rb",
88
97
  "spec/task_generator_spec.rb",
89
98
  "spec/task_spec.rb",
@@ -0,0 +1,14 @@
1
+ #
2
+ # Usage:
3
+ # drbqs-server server_def.rb
4
+ #
5
+
6
+ DRbQS.define_server(:finish_exit => true) do |server, argv, opts|
7
+ tgen = DRbQS::TaskGenerator.new(:sleep_time => 2)
8
+ tgen.set do
9
+ 3.times do |i|
10
+ add_task(DRbQS::CommandTask.new(["sleep #{@sleep_time}", 'echo hello world']))
11
+ end
12
+ end
13
+ server.add_task_generator(tgen)
14
+ end
@@ -12,12 +12,14 @@ DRbQS.option_parser do |opt, hash|
12
12
  end
13
13
  end
14
14
 
15
- DRbQS.define_server do |server, argv, opts|
15
+ DRbQS.define_server(:check_alive => 5) do |server, argv, opts|
16
16
  start_num = (argv[0] || 10).to_i
17
- end_num = (argv[1] || 100).to_i
17
+ end_num = (argv[1] || 50).to_i
18
18
  step_num = opts[:step] || 10
19
19
  start_num.step(end_num, step_num) do |i|
20
- task = DRbQS::Task.new(Sum.new(i - 10, i), :exec)
20
+ task = DRbQS::Task.new(Sum.new(i - 10, i), :exec) do |srv, ret|
21
+ puts "Receive: #{ret.inspect}"
22
+ end
21
23
  server.queue.add(task)
22
24
  end
23
25
 
data/example/sum/sum.rb CHANGED
@@ -4,6 +4,7 @@ class Sum
4
4
  end
5
5
 
6
6
  def exec
7
+ sleep(3) # Waiting time to interrupt
7
8
  (@num[0]..@num[1]).inject(0) { |sum, i| sum += i }
8
9
  end
9
10
  end
@@ -0,0 +1,27 @@
1
+ #
2
+ # Usage:
3
+ # drbqs-server server_def.rb -- 30 50
4
+ # drbqs-server server_def.rb -- 100 500 --step 100
5
+ #
6
+
7
+ require_relative 'sum.rb'
8
+
9
+ DRbQS.option_parser do |opt, hash|
10
+ opt.on('--step NUM', Integer) do |v|
11
+ hash[:step] = v
12
+ end
13
+ end
14
+
15
+ DRbQS.define_server(:finish_exit => true) do |server, argv, opts|
16
+ tgen = DRbQS::TaskGenerator.new(:start_num => (argv[0] || 10).to_i,
17
+ :end_num => (argv[1] || 100).to_i,
18
+ :step_num => opts[:step] || 10)
19
+ tgen.set do
20
+ @start_num.step(@end_num, @step_num) do |i|
21
+ create_add_task(Sum.new(i - 10, i), :exec) do |srv, ret|
22
+ puts "Receive: #{ret.inspect}"
23
+ end
24
+ end
25
+ end
26
+ server.add_task_generator(tgen)
27
+ end
@@ -0,0 +1,9 @@
1
+ class Sum
2
+ def initialize(start_num, end_num)
3
+ @num = [start_num, end_num]
4
+ end
5
+
6
+ def exec
7
+ (@num[0]..@num[1]).inject(0) { |sum, i| sum += i }
8
+ end
9
+ end
@@ -0,0 +1,52 @@
1
+ require 'fileutils'
2
+ require 'singleton'
3
+
4
+ module DRbQS
5
+
6
+ class Config
7
+
8
+ @@data = {
9
+ :dir => ENV['HOME'] + '/.drbqs/'
10
+ }
11
+
12
+ ACL_SAMPLE =<<SAMPLE
13
+ deny all
14
+ allow localhost
15
+ allow 127.0.0.1
16
+ SAMPLE
17
+
18
+ class << self
19
+ def get_path(name)
20
+ File.join(@@data[:dir], name)
21
+ end
22
+ private :get_path
23
+
24
+ def set_directory(dir)
25
+ @@data[:dir] = dir
26
+ end
27
+
28
+ def check_directory_create
29
+ unless File.exist?(@@data[:dir])
30
+ FileUtils.mkdir_p(@@data[:dir])
31
+ FileUtils.chmod(0700, @@data[:dir])
32
+ end
33
+ end
34
+
35
+ def save_sample
36
+ path = get_path('acl.txt.sample')
37
+ unless File.exist?(path)
38
+ open(path, 'w') { |f| f.print ACL_SAMPLE }
39
+ end
40
+ end
41
+
42
+ def get_acl_file
43
+ path = File.join(@@data[:dir], 'acl.txt')
44
+ if File.exist?(path)
45
+ return path
46
+ end
47
+ return nil
48
+ end
49
+ end
50
+ end
51
+
52
+ end
data/lib/drbqs/manage.rb CHANGED
@@ -3,13 +3,28 @@ require 'socket'
3
3
  module DRbQS
4
4
 
5
5
  class Manage
6
- def initialize(access_uri)
7
- @access_uri = access_uri
6
+ def self.split_arguments(argv, split = '--')
7
+ if n = argv.index(split)
8
+ [argv[0..(n - 1)], argv[(n + 1)..-1]]
9
+ else
10
+ [argv, []]
11
+ end
8
12
  end
9
13
 
10
- def send_exit_signal
11
- obj = DRbObject.new_with_uri(@access_uri)
14
+ def create_config
15
+ Config.check_directory_create
16
+ Config.save_sample
17
+ end
18
+
19
+ def send_exit_signal(access_uri)
20
+ obj = DRbObject.new_with_uri(access_uri)
12
21
  obj[:message].write([:exit_server, "Command of #{Socket.gethostname}"])
13
22
  end
23
+
24
+ def execute_over_ssh(dest, opts, command)
25
+ ssh = DRbQS::SSHShell.new(dest, opts)
26
+ ssh.get_environment
27
+ ssh.start(command)
28
+ end
14
29
  end
15
30
  end
data/lib/drbqs/queue.rb CHANGED
@@ -44,7 +44,10 @@ module DRbQS
44
44
  def requeue_for_deleted_node_id(deleted)
45
45
  deleted.each do |node_id|
46
46
  if task_id_ary = @calculating[node_id]
47
- task_id_ary.each { |task_id| queue_task(task_id) }
47
+ task_id_ary.each do |task_id|
48
+ queue_task(task_id)
49
+ @logger.info("Requeue: task #{task_id}.") if @logger
50
+ end
48
51
  @calculating.delete(node_id)
49
52
  end
50
53
  end
data/lib/drbqs/server.rb CHANGED
@@ -5,8 +5,10 @@ require 'drbqs/server_hook'
5
5
 
6
6
  module DRbQS
7
7
  class CheckAlive
8
+ DEFAULT_INTERVAL_TIME = 300
9
+
8
10
  def initialize(interval)
9
- @interval = interval || 300
11
+ @interval = interval || DEFAULT_INTERVAL_TIME
10
12
  @last = Time.now
11
13
  end
12
14
 
@@ -22,6 +24,9 @@ module DRbQS
22
24
  # When we set both empty_queue_hook and task_generator,
23
25
  # empty_queue_hook is prior to task_generator.
24
26
  class Server
27
+ WAIT_TIME_NODE_EXIT = 3
28
+ WAIT_TIME_NEW_RESULT = 1
29
+
25
30
  attr_reader :queue
26
31
 
27
32
  # :port
@@ -88,7 +93,8 @@ module DRbQS
88
93
  def check_connection(force = nil)
89
94
  if force || @check_alive.significant_interval?
90
95
  @logger.debug("Check connection") if @logger
91
- @message.check_connection
96
+ deleted_node_ids = @message.check_connection
97
+ @queue.requeue_for_deleted_node_id(deleted_node_ids)
92
98
  @check_alive.set_checking
93
99
  end
94
100
  end
@@ -102,7 +108,7 @@ module DRbQS
102
108
  if @task_generator.size > 0 && @queue.empty?
103
109
  if tasks = @task_generator[0].new_tasks
104
110
  tasks.each { |t| @queue.add(t) }
105
- @logger.debug("Generator add #{tasks.size} tasks.") if @logger
111
+ @logger.info("Generator add #{tasks.size} tasks.") if @logger
106
112
  else
107
113
  @task_generator.delete_at(0)
108
114
  @logger.info("Generator creates all tasks and then has been deleted.") if @logger
@@ -141,13 +147,10 @@ module DRbQS
141
147
  end
142
148
  private :exec_hook
143
149
 
144
- WAIT_NODE_EXIT = 3
145
- WAIT_NEW_RESULT = 1
146
-
147
150
  def exit
148
151
  @message.send_exit
149
152
  until @message.node_not_exist?
150
- sleep(WAIT_NODE_EXIT)
153
+ sleep(WAIT_TIME_NODE_EXIT)
151
154
  check_connection(true)
152
155
  end
153
156
  Kernel.exit
@@ -166,8 +169,13 @@ module DRbQS
166
169
  end
167
170
  private :check_message
168
171
 
169
- def wait
172
+ def task_generator_init
170
173
  @task_generator.each { |tgen| tgen.init }
174
+ end
175
+ private :task_generator_init
176
+
177
+ def wait
178
+ task_generator_init
171
179
  loop do
172
180
  check_message
173
181
  check_connection
@@ -175,9 +183,18 @@ module DRbQS
175
183
  exec_hook
176
184
  @logger.debug("Calculating tasks: #{@queue.calculating_task_number}") if @logger
177
185
  if count_results <= 1
178
- sleep(WAIT_NEW_RESULT)
186
+ sleep(WAIT_TIME_NEW_RESULT)
179
187
  end
180
188
  end
181
189
  end
190
+
191
+ def test_task_generator(opts = {})
192
+ task_generator_init
193
+ @task_generator.each_with_index do |t, i|
194
+ puts "Test task generator [#{i}]"
195
+ set_num, task_num = t.debug_all_tasks(opts)
196
+ puts "Create: task sets #{set_num}, all tasks #{task_num}"
197
+ end
198
+ end
182
199
  end
183
200
  end
@@ -12,9 +12,11 @@ HELP
12
12
  @option_parse = nil
13
13
  @opts = {}
14
14
  @argv = nil
15
+ @default_server_opts = nil
15
16
  end
16
17
 
17
- def define_server(&block)
18
+ def define_server(default_opts = {}, &block)
19
+ @default_server_opts = default_opts
18
20
  if @server_create
19
21
  raise ArgumentError, "The server has already defined."
20
22
  end
@@ -38,33 +40,41 @@ HELP
38
40
  @argv = opt_argv
39
41
  end
40
42
 
43
+ def create_server(options)
44
+ server = DRbQS::Server.new(@default_server_opts.merge(options))
45
+ @server_create.call(server, @argv, @opts)
46
+ server.set_signal_trap
47
+ server
48
+ end
49
+ private :create_server
50
+
41
51
  def start_server(options)
42
52
  unless @server_create
43
53
  raise "Can not get server definition."
44
54
  end
45
- server = DRbQS::Server.new(options)
46
- @server_create.call(server, @argv, @opts)
47
- server.set_signal_trap
55
+ server = create_server(options)
48
56
  server.start
49
57
  server.wait
50
58
  end
51
- end
52
-
53
- @@server_def = ServerDefinition.new
54
-
55
- def self.define_server(&block)
56
- @@server_def.define_server(&block)
57
- end
58
59
 
59
- def self.option_parser(&block)
60
- @@server_def.option_parser(&block)
60
+ def test_server(options, type, arg = [])
61
+ server = create_server(options)
62
+ case type
63
+ when :task
64
+ puts "*** Test of Task Generators ***"
65
+ server.test_task_generator(:limit => arg[0] ? arg[0].to_i : nil, :progress => true)
66
+ else
67
+ puts "*** Not be yet implemented ***"
68
+ end
69
+ end
61
70
  end
62
71
 
63
- def self.parse_option(opt_argv)
64
- @@server_def.parse_option(opt_argv)
65
- end
72
+ @@server_def = ServerDefinition.new
66
73
 
67
- def self.start_server(options)
68
- @@server_def.start_server(options)
74
+ class << self
75
+ [:define_server, :option_parser, :parse_option,
76
+ :start_server, :test_server].each do |m|
77
+ define_method(m, &@@server_def.method(m))
78
+ end
69
79
  end
70
80
  end
@@ -0,0 +1,92 @@
1
+ require 'net/ssh'
2
+ require 'net/ssh/shell'
3
+
4
+ module DRbQS
5
+
6
+ # Requirements:
7
+ # bash
8
+ # nohup
9
+ class SSHShell
10
+ class GetInvalidExitStatus < StandardError
11
+ end
12
+
13
+ attr_reader :user, :host, :directory, :port
14
+
15
+ DEFAULT_RVM_SCRIPT = '$HOME/.rvm/scripts/rvm'
16
+ DEFAULT_OUTPUT_FILE = 'drbqs_nohup.log'
17
+
18
+ # :shell shell to use
19
+ # :dir base directory of ssh server
20
+ # :rvm version of ruby on rvm
21
+ # :rvm_init path of script to initialize rvm
22
+ # :output file to output of stdout and stderr
23
+ def initialize(dest, opts = {})
24
+ @user, @host, @port = split_destination(dest)
25
+ if !(@host && @user)
26
+ raise "Invalid destination of ssh server."
27
+ end
28
+ @shell = opts[:shell] || 'bash'
29
+ @rvm = opts[:rvm]
30
+ @rvm_init = opts[:rvm_init]
31
+ if (@rvm || @rvm_init) && !(String === @rvm_init)
32
+ @rvm_init = DEFAULT_RVM_SCRIPT
33
+ end
34
+ @out = opts[:output] || DEFAULT_OUTPUT_FILE
35
+ @directory = opts[:dir]
36
+ end
37
+
38
+ def split_destination(dest)
39
+ if (n = dest.index("@")) && n > 0
40
+ user = dest[0..(n - 1)]
41
+ host_dir = dest[(n + 1)..-1]
42
+ else
43
+ raise "Not include '@': #{dest}"
44
+ end
45
+ if n = host_dir.index(':')
46
+ host = host_dir[0..(n - 1)]
47
+ port = host_dir[(n + 1)..-1]
48
+ else
49
+ host = host_dir
50
+ port = nil
51
+ end
52
+ [user && user.size > 0 ? user : nil,
53
+ host && host.size > 0 ? host : nil,
54
+ port && port.size > 0 ? port.to_i : nil]
55
+ end
56
+ private :split_destination
57
+
58
+ def shell_exec(sh, cmd)
59
+ pr = sh.execute!(cmd)
60
+ if pr.exit_status != 0
61
+ raise GetInvalidExitStatus, "Can not execute '#{cmd}' on #{@host} properly."
62
+ end
63
+ end
64
+ private :shell_exec
65
+
66
+ def execute_command(*cmds)
67
+ Net::SSH.start(@host, @user, :port => @port) do |ssh|
68
+ ssh.shell(@shell) do |sh|
69
+ shell_exec(sh, "cd #{@directory}") if @directory
70
+ shell_exec(sh, "source #{@rvm_init}") if @rvm_init
71
+ shell_exec(sh, "rvm use #{@rvm}") if @rvm
72
+ cmds.each do |c|
73
+ sh.execute c
74
+ end
75
+ sh.execute "exit"
76
+ end
77
+ end
78
+ end
79
+ private :execute_command
80
+
81
+ def get_environment
82
+ execute_command('echo "directory: " `pwd`',
83
+ 'echo "files:"',
84
+ 'ls',
85
+ 'if which rvm > /dev/null; then rvm info; else ruby -v; fi')
86
+ end
87
+
88
+ def start(*args)
89
+ execute_command("nohup #{args.join(' ')} > #{@out} 2>&1 &")
90
+ end
91
+ end
92
+ end
data/lib/drbqs/task.rb CHANGED
@@ -8,7 +8,7 @@ module DRbQS
8
8
  attr_reader :hook
9
9
 
10
10
  # Nodes execute obj.method_sym(*args).
11
- # Server executes &hook with a server instance and an array of result
11
+ # Server executes &hook with a server instance and an object of result
12
12
  # after the server accepts the results from nodes.
13
13
  def initialize(obj, method_sym, args = [], &hook)
14
14
  begin
@@ -35,4 +35,29 @@ module DRbQS
35
35
  end
36
36
  end
37
37
 
38
+ class CommandExecute
39
+ def initialize(cmd)
40
+ @cmd = cmd
41
+ unless (Array === @cmd || String === @cmd)
42
+ raise ArgumentError, "Invalid command: #{@cmd.inspect}"
43
+ end
44
+ end
45
+
46
+ def exec
47
+ case @cmd
48
+ when Array
49
+ @cmd.each { |c| system(c) }
50
+ when String
51
+ system(@cmd)
52
+ end
53
+ $?.exitstatus
54
+ end
55
+ end
56
+
57
+ class CommandTask < Task
58
+ # &hook takes a server instance and exit number of command.
59
+ def initialize(cmd, &hook)
60
+ super(CommandExecute.new(cmd), :exec, &hook)
61
+ end
62
+ end
38
63
  end
@@ -1,4 +1,7 @@
1
1
  module DRbQS
2
+ class DRbQS::TaskCreatingError < StandardError
3
+ end
4
+
2
5
  class TaskGenerator
3
6
  def initialize(data = {})
4
7
  data.each do |key, val|
@@ -32,7 +35,11 @@ module DRbQS
32
35
  @__iterate__ = iterate
33
36
  @__fiber_init__ = lambda do
34
37
  @__fiber__ = Fiber.new do
35
- instance_eval(&block)
38
+ begin
39
+ instance_eval(&block)
40
+ rescue => err
41
+ raise DRbQS::TaskCreatingError, "\n #{err.to_s}"
42
+ end
36
43
  nil
37
44
  end
38
45
  end
@@ -68,8 +75,12 @@ module DRbQS
68
75
  nil
69
76
  end
70
77
 
78
+ DEBUG_TASK_PROGRESS = 1000
79
+
71
80
  # Create all tasks for test and return [group_number, task_number] if all tasks created properly.
72
- def debug_all_tasks(limit = nil)
81
+ def debug_all_tasks(opts = {})
82
+ limit = opts[:limit]
83
+ progress = opts[:progress]
73
84
  group_number = 0
74
85
  task_number = 0
75
86
  while ary = new_tasks
@@ -78,6 +89,12 @@ module DRbQS
78
89
  raise "Invalid #{i}th task: #{t.inspect}"
79
90
  end
80
91
  task_number += 1
92
+ if progress && (task_number % DEBUG_TASK_PROGRESS == 0)
93
+ puts "#{task_number} tasks have been created."
94
+ end
95
+ if limit && task_number > limit
96
+ break
97
+ end
81
98
  end
82
99
  group_number += 1
83
100
  end
data/lib/drbqs.rb CHANGED
@@ -14,6 +14,10 @@ module DRbQS
14
14
  autoload :Task, 'drbqs/task'
15
15
  autoload :TaskGenerator, 'drbqs/task_generator'
16
16
  autoload :Manage, 'drbqs/manage'
17
+ autoload :Config, 'drbqs/config'
18
+ autoload :SSHShell, 'drbqs/ssh_shell'
19
+ autoload :CommandTask, 'drbqs/task'
20
+ autoload :CommandExecute, 'drbqs/task'
17
21
 
18
22
  ROOT_DEFAULT_PORT = 13500
19
23
  end
@@ -0,0 +1,14 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe DRbQS::Config do
4
+ it "should return nil" do
5
+ DRbQS::Config.set_directory(File.dirname(__FILE__) + '/not_exist_path')
6
+ DRbQS::Config.get_acl_file.should be_nil
7
+ end
8
+
9
+ it "should return existing path" do
10
+ path = File.dirname(__FILE__) + '/data'
11
+ DRbQS::Config.set_directory(path)
12
+ DRbQS::Config.get_acl_file.should == File.join(path, 'acl.txt')
13
+ end
14
+ end
data/spec/manage_spec.rb CHANGED
@@ -27,12 +27,12 @@ describe DRbQS do
27
27
 
28
28
  @uri = 'druby://:13501'
29
29
 
30
- @manage = DRbQS::Manage.new(@uri)
30
+ @manage = DRbQS::Manage.new
31
31
  end
32
32
 
33
33
  it "should send exit signal" do
34
34
  lambda do
35
- @manage.send_exit_signal
35
+ @manage.send_exit_signal(@uri)
36
36
  end.should_not raise_error
37
37
  lambda do
38
38
  i = 0
@@ -47,4 +47,11 @@ describe DRbQS do
47
47
  end.should_not raise_error
48
48
  end
49
49
 
50
+ it "should split arguments" do
51
+ ary = ['abc', 'def', '--', '123', '45', '6']
52
+ a1, a2 = DRbQS::Manage.split_arguments(ary)
53
+ a1.should == ['abc', 'def']
54
+ a2.should == ['123', '45', '6']
55
+ end
56
+
50
57
  end
@@ -0,0 +1,40 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ require 'drbqs/ssh_shell'
4
+
5
+ describe DRbQS::SSHShell do
6
+ it "should split destination" do
7
+ ssh = DRbQS::SSHShell.new('user@hostname')
8
+ ssh.user.should == 'user'
9
+ ssh.host.should == 'hostname'
10
+ ssh.port.should be_nil
11
+ ssh.directory.should be_nil
12
+ end
13
+
14
+ it "should split destination including directory" do
15
+ ssh = DRbQS::SSHShell.new('user@hostname:22', :dir => '/path/to/directory')
16
+ ssh.user.should == 'user'
17
+ ssh.host.should == 'hostname'
18
+ ssh.port.should == 22
19
+ ssh.directory.should == '/path/to/directory'
20
+ end
21
+
22
+ it "should raise error: not include '@'" do
23
+ lambda do
24
+ DRbQS::SSHShell.new('userhostname')
25
+ end.should raise_error
26
+ end
27
+
28
+ it "should raise error: empty user name" do
29
+ lambda do
30
+ DRbQS::SSHShell.new('@hostname')
31
+ end.should raise_error
32
+ end
33
+
34
+ it "should raise error: empty host name" do
35
+ lambda do
36
+ DRbQS::SSHShell.new('user:22')
37
+ end.should raise_error
38
+ end
39
+
40
+ end
metadata CHANGED
@@ -1,83 +1,85 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: drbqs
3
- version: !ruby/object:Gem::Version
4
- version: 0.0.7
3
+ version: !ruby/object:Gem::Version
5
4
  prerelease:
5
+ version: 0.0.8
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Takayuki YAMAGUCHI
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-03-08 00:00:00.000000000 +09:00
12
+
13
+ date: 2011-03-20 00:00:00 +09:00
13
14
  default_executable:
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
16
17
  name: rspec
17
- requirement: &84782980 !ruby/object:Gem::Requirement
18
+ requirement: &id001 !ruby/object:Gem::Requirement
18
19
  none: false
19
- requirements:
20
- - - ! '>='
21
- - !ruby/object:Gem::Version
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
22
23
  version: 2.5.0
23
24
  type: :development
24
25
  prerelease: false
25
- version_requirements: *84782980
26
- - !ruby/object:Gem::Dependency
26
+ version_requirements: *id001
27
+ - !ruby/object:Gem::Dependency
27
28
  name: yard
28
- requirement: &84782720 !ruby/object:Gem::Requirement
29
+ requirement: &id002 !ruby/object:Gem::Requirement
29
30
  none: false
30
- requirements:
31
+ requirements:
31
32
  - - ~>
32
- - !ruby/object:Gem::Version
33
+ - !ruby/object:Gem::Version
33
34
  version: 0.6.0
34
35
  type: :development
35
36
  prerelease: false
36
- version_requirements: *84782720
37
- - !ruby/object:Gem::Dependency
37
+ version_requirements: *id002
38
+ - !ruby/object:Gem::Dependency
38
39
  name: bundler
39
- requirement: &84782460 !ruby/object:Gem::Requirement
40
+ requirement: &id003 !ruby/object:Gem::Requirement
40
41
  none: false
41
- requirements:
42
+ requirements:
42
43
  - - ~>
43
- - !ruby/object:Gem::Version
44
+ - !ruby/object:Gem::Version
44
45
  version: 1.0.0
45
46
  type: :development
46
47
  prerelease: false
47
- version_requirements: *84782460
48
- - !ruby/object:Gem::Dependency
48
+ version_requirements: *id003
49
+ - !ruby/object:Gem::Dependency
49
50
  name: jeweler
50
- requirement: &84782210 !ruby/object:Gem::Requirement
51
+ requirement: &id004 !ruby/object:Gem::Requirement
51
52
  none: false
52
- requirements:
53
+ requirements:
53
54
  - - ~>
54
- - !ruby/object:Gem::Version
55
+ - !ruby/object:Gem::Version
55
56
  version: 1.5.2
56
57
  type: :development
57
58
  prerelease: false
58
- version_requirements: *84782210
59
- - !ruby/object:Gem::Dependency
59
+ version_requirements: *id004
60
+ - !ruby/object:Gem::Dependency
60
61
  name: rcov
61
- requirement: &84781940 !ruby/object:Gem::Requirement
62
+ requirement: &id005 !ruby/object:Gem::Requirement
62
63
  none: false
63
- requirements:
64
- - - ! '>='
65
- - !ruby/object:Gem::Version
66
- version: '0'
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: "0"
67
68
  type: :development
68
69
  prerelease: false
69
- version_requirements: *84781940
70
+ version_requirements: *id005
70
71
  description: Task queuing system over network that is implemented by dRuby.
71
72
  email: d@ytak.info
72
- executables:
73
+ executables:
73
74
  - drbqs-manage
74
75
  - drbqs-node
75
76
  - drbqs-server
76
77
  extensions: []
77
- extra_rdoc_files:
78
+
79
+ extra_rdoc_files:
78
80
  - LICENSE.txt
79
81
  - README.rdoc
80
- files:
82
+ files:
81
83
  - .document
82
84
  - .rspec
83
85
  - Gemfile
@@ -90,15 +92,19 @@ files:
90
92
  - bin/drbqs-server
91
93
  - drbqs.gemspec
92
94
  - example/README.md
95
+ - example/command/server_def.rb
93
96
  - example/drbqs-manage-test.rb
94
97
  - example/drbqs-node-test.rb
95
98
  - example/drbqs-server-test.rb
96
- - example/server/server_def.rb
99
+ - example/server/server.rb
97
100
  - example/sum/server_def.rb
98
101
  - example/sum/sum.rb
102
+ - example/sum2/server_def.rb
103
+ - example/sum2/sum.rb
99
104
  - lib/drbqs.rb
100
105
  - lib/drbqs/acl_file.rb
101
106
  - lib/drbqs/client.rb
107
+ - lib/drbqs/config.rb
102
108
  - lib/drbqs/connection.rb
103
109
  - lib/drbqs/manage.rb
104
110
  - lib/drbqs/message.rb
@@ -107,10 +113,12 @@ files:
107
113
  - lib/drbqs/server.rb
108
114
  - lib/drbqs/server_define.rb
109
115
  - lib/drbqs/server_hook.rb
116
+ - lib/drbqs/ssh_shell.rb
110
117
  - lib/drbqs/task.rb
111
118
  - lib/drbqs/task_client.rb
112
119
  - lib/drbqs/task_generator.rb
113
120
  - spec/acl_file_spec.rb
121
+ - spec/config_spec.rb
114
122
  - spec/connection_spec.rb
115
123
  - spec/data/acl.txt
116
124
  - spec/manage_spec.rb
@@ -121,6 +129,7 @@ files:
121
129
  - spec/server_hook_spec.rb
122
130
  - spec/server_spec.rb
123
131
  - spec/spec_helper.rb
132
+ - spec/ssh_shell_spec.rb
124
133
  - spec/task_client_spec.rb
125
134
  - spec/task_generator_spec.rb
126
135
  - spec/task_spec.rb
@@ -129,35 +138,38 @@ files:
129
138
  - spec/test2_spec.rb
130
139
  has_rdoc: true
131
140
  homepage: http://github.com/ytaka/drbqs
132
- licenses:
141
+ licenses:
133
142
  - GPL3
134
143
  post_install_message:
135
144
  rdoc_options: []
136
- require_paths:
145
+
146
+ require_paths:
137
147
  - lib
138
- required_ruby_version: !ruby/object:Gem::Requirement
148
+ required_ruby_version: !ruby/object:Gem::Requirement
139
149
  none: false
140
- requirements:
141
- - - ! '>='
142
- - !ruby/object:Gem::Version
143
- version: '0'
144
- segments:
150
+ requirements:
151
+ - - ">="
152
+ - !ruby/object:Gem::Version
153
+ hash: 3292588984449245047
154
+ segments:
145
155
  - 0
146
- hash: -184598193
147
- required_rubygems_version: !ruby/object:Gem::Requirement
156
+ version: "0"
157
+ required_rubygems_version: !ruby/object:Gem::Requirement
148
158
  none: false
149
- requirements:
150
- - - ! '>='
151
- - !ruby/object:Gem::Version
152
- version: '0'
159
+ requirements:
160
+ - - ">="
161
+ - !ruby/object:Gem::Version
162
+ version: "0"
153
163
  requirements: []
164
+
154
165
  rubyforge_project:
155
- rubygems_version: 1.6.1
166
+ rubygems_version: 1.5.2
156
167
  signing_key:
157
168
  specification_version: 3
158
169
  summary: dRuby Queueing System
159
- test_files:
170
+ test_files:
160
171
  - spec/acl_file_spec.rb
172
+ - spec/config_spec.rb
161
173
  - spec/connection_spec.rb
162
174
  - spec/manage_spec.rb
163
175
  - spec/message_spec.rb
@@ -167,6 +179,7 @@ test_files:
167
179
  - spec/server_hook_spec.rb
168
180
  - spec/server_spec.rb
169
181
  - spec/spec_helper.rb
182
+ - spec/ssh_shell_spec.rb
170
183
  - spec/task_client_spec.rb
171
184
  - spec/task_generator_spec.rb
172
185
  - spec/task_spec.rb
File without changes