comana 0.0.9 → 0.0.10

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 (53) hide show
  1. data/CHANGES +20 -0
  2. data/Gemfile +10 -4
  3. data/Rakefile +26 -9
  4. data/VERSION +1 -1
  5. data/bin/machinestatus +189 -0
  6. data/bin/scpall +64 -0
  7. data/bin/sshall +58 -0
  8. data/example/dot.clustersetting +15 -0
  9. data/lib/comana.rb +12 -1
  10. data/lib/comana/clustersetting.rb +55 -0
  11. data/lib/comana/computationmanager.rb +10 -10
  12. data/lib/comana/hostinspector.rb +4 -0
  13. data/lib/comana/hostinspector/pbsnodes.rb +51 -0
  14. data/lib/comana/hostinspector/ping.rb +34 -0
  15. data/lib/comana/hostselector.rb +45 -0
  16. data/lib/comana/queuesubmitter.rb +39 -64
  17. data/memo.txt +2 -0
  18. data/test/helper.rb +17 -0
  19. data/{spec → test}/locked/input_a +0 -0
  20. data/{spec → test}/locked/input_b +0 -0
  21. data/{spec → test}/locked/lock_comana/dummy +0 -0
  22. data/{spec → test}/locked_outputted/input_a +0 -0
  23. data/{spec → test}/locked_outputted/input_b +0 -0
  24. data/{spec → test}/locked_outputted/lock_comana/dummy +0 -0
  25. data/{spec → test}/locked_outputted/output +0 -0
  26. data/{spec/queuesubmitter/locked/lock_queuesubmitter → test/not_executable}/dummy +0 -0
  27. data/{spec → test}/not_started/input_a +0 -0
  28. data/{spec → test}/not_started/input_b +0 -0
  29. data/{spec → test}/outputted/input_a +0 -0
  30. data/{spec → test}/outputted/input_b +0 -0
  31. data/{spec → test}/outputted/output +0 -0
  32. data/test/pbsnodes/Br09.xml +11 -0
  33. data/test/pbsnodes/Br10.xml +2 -0
  34. data/test/pbsnodes/Ge00.xml +2 -0
  35. data/test/pbsnodes/Ge08.xml +1 -0
  36. data/test/pbsnodes/all.xml +1 -0
  37. data/{spec/queuesubmitter/unlocked → test/queuesubmitter/locked/lock_queuesubmitter}/dummy +0 -0
  38. data/test/queuesubmitter/unlocked/dummy +0 -0
  39. data/test/test_clustersetting.rb +116 -0
  40. data/test/test_computationmanager.rb +131 -0
  41. data/test/test_hostinspector_pbsnodes.rb +92 -0
  42. data/test/test_hostinspector_ping.rb +21 -0
  43. data/test/test_hostselector.rb +57 -0
  44. data/test/test_queuesubmitter.rb +214 -0
  45. metadata +92 -49
  46. data/comana.gemspec +0 -84
  47. data/dot.machineinfo +0 -14
  48. data/lib/comana/machineinfo.rb +0 -44
  49. data/spec/computationmanager_spec.rb +0 -158
  50. data/spec/machineinfo +0 -7
  51. data/spec/machineinfo_spec.rb +0 -52
  52. data/spec/queuesubmitter_spec.rb +0 -263
  53. data/spec/spec_helper.rb +0 -12
@@ -0,0 +1,131 @@
1
+ #! /usr/bin/env ruby
2
+ # coding: utf-8
3
+
4
+ require "fileutils"
5
+ require "helper"
6
+
7
+ #require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
8
+
9
+ NOW = Time.now
10
+
11
+ class Comana::ComputationManager
12
+ #public :latest_modified_time, :started?
13
+ public :started?
14
+ end
15
+
16
+ class TC_ComputationManager < Test::Unit::TestCase
17
+ class CalcYet < Comana::ComputationManager
18
+ def finished? ; false ; end
19
+ end
20
+
21
+ class CalcStarted < Comana::ComputationManager
22
+ def finished? ; false ; end
23
+ end
24
+
25
+ #describe Comana::ComputationManager, "with output, without lock" do
26
+ class CalcStarted < Comana::ComputationManager
27
+ def finished? ; false ; end
28
+ end
29
+
30
+ #describe Comana::ComputationManager, "terminated" do
31
+ class CalcTerminated < Comana::ComputationManager
32
+ def finished? ; false ; end
33
+ def initialize(dir)
34
+ @dir = dir
35
+ @lockdir = "lock_comana"
36
+ @alive_time = 500
37
+ end
38
+ end
39
+
40
+ #describe Comana::ComputationManager, "finished" do
41
+ class CalcFinished < Comana::ComputationManager
42
+ def finished? ; true ; end
43
+ end
44
+
45
+ #describe Comana::ComputationManager, "cannot execute" do
46
+ class CalcNotExecutable < Comana::ComputationManager
47
+ def calculate
48
+ end_status = system "" # notExistCommand
49
+ raise ExecuteError unless end_status
50
+ end
51
+
52
+ def finished?
53
+ return false
54
+ end
55
+
56
+ def prepare_next
57
+ #return false
58
+ raise
59
+ end
60
+ end
61
+
62
+
63
+
64
+
65
+ def setup
66
+ calc_dir = "test/not_started"
67
+ @calc00 = CalcYet.new(calc_dir)
68
+ File.utime(NOW - 1000 ,NOW - 1000, "#{calc_dir}/input_a")
69
+ File.utime(NOW - 2000 ,NOW - 2000, "#{calc_dir}/input_b")
70
+ @lockdir = "#{calc_dir}/lock_comana"
71
+ FileUtils.rm(@lockdir) if File.exist?(@lockdir)
72
+
73
+
74
+ calc_dir = "test/locked"
75
+ @calc01 = CalcStarted .new(calc_dir)
76
+ File.utime(NOW - 1000 ,NOW - 1000, "#{calc_dir}/input_a")
77
+ File.utime(NOW - 2000 ,NOW - 2000, "#{calc_dir}/input_b")
78
+
79
+ calc_dir = "test/outputted"
80
+ @calc02 = CalcStarted .new(calc_dir)
81
+ File.utime(NOW - 1000 ,NOW - 1000, "#{calc_dir}/input_a")
82
+ File.utime(NOW - 2000 ,NOW - 2000, "#{calc_dir}/input_b")
83
+ File.utime(NOW - 2000 ,NOW - 2000, "#{calc_dir}/output")
84
+
85
+ calc_dir = "test/locked_outputted"
86
+ @calc_terminated = CalcTerminated.new(calc_dir)
87
+ File.utime(NOW - 1000 ,NOW - 1000, "#{calc_dir}/input_a")
88
+ File.utime(NOW - 2000 ,NOW - 2000, "#{calc_dir}/input_b")
89
+ File.utime(NOW - 9000 ,NOW - 9000, "#{calc_dir}/output")
90
+ File.utime(NOW - 9000 ,NOW - 9000, "#{calc_dir}/lock_comana")
91
+ File.utime(NOW - 9000 ,NOW - 9000, "#{calc_dir}/lock_comana/dummy")
92
+
93
+ calc_dir = "test/locked_outputted"
94
+ @calc_finished = CalcFinished .new(calc_dir)
95
+ File.utime(NOW - 1000 ,NOW - 1000, "#{calc_dir}/input_a")
96
+ File.utime(NOW - 2000 ,NOW - 2000, "#{calc_dir}/input_b")
97
+
98
+ calc_dir = "test/not_executable"
99
+ @calc_not_exe = CalcNotExecutable .new(calc_dir)
100
+ @lockdir = calc_dir + "/lock_comana"
101
+ Dir.rmdir(@lockdir) if File.exist?(@lockdir)
102
+ end
103
+
104
+ def test_state
105
+ assert_equal(:yet, @calc00.state)
106
+ assert_equal(:started, @calc01.state)
107
+ assert_equal(:yet, @calc02.state)
108
+ assert_equal(:terminated, @calc_terminated.state)
109
+ assert_equal(:finished, @calc_finished.state)
110
+ end
111
+
112
+ def test_latest_modified_time
113
+ #it "should return latest modified time" do
114
+ assert_equal(NOW - 1000, @calc00.latest_modified_time)
115
+ end
116
+
117
+ def test_started?
118
+ #it "should return false without lock." do
119
+ assert_not_nil(@calc00.started?)
120
+ assert_equal(false, @calc00.started?)
121
+
122
+ #it "should return true with lock." do
123
+ assert_equal(false, @calc00.started?)
124
+ end
125
+
126
+ def test_start
127
+ #it "should raise error" do
128
+ assert_raise(Comana::ComputationManager::ExecuteError){ @calc_not_exe.start}
129
+ end
130
+ end
131
+
@@ -0,0 +1,92 @@
1
+ #! /usr/bin/env ruby
2
+ # coding: utf-8
3
+
4
+ require "fileutils"
5
+ require "helper"
6
+
7
+ $TEST = true
8
+
9
+ #describe Comana::HostInspector::do
10
+ class TC_Pbsnodes < Test::Unit::TestCase
11
+
12
+ def setup
13
+ @p00 = Comana::HostInspector::Pbsnodes.new("Br10")
14
+ @p01 = Comana::HostInspector::Pbsnodes.new("Br09")
15
+ @p02 = Comana::HostInspector::Pbsnodes.new("Ge00")
16
+ end
17
+
18
+ def test_state
19
+ assert_equal("Br10", @p00.name)
20
+ assert_equal("free", @p00.state)
21
+ assert_equal("1", @p00.np)
22
+ assert_equal("Br", @p00.properties)
23
+ assert_equal("cluster", @p00.ntype)
24
+ assert_equal(
25
+ {
26
+ "rectime" => "1368099478",
27
+ "varattr" => "",
28
+ "jobs" => "",
29
+ "state" => "free",
30
+ "netload" => "1636471502",
31
+ "gres" => "",
32
+ "loadave" => "0.00",
33
+ "ncpus" => "4",
34
+ "physmem" => "12322444kb",
35
+ "availmem" => "20402856kb",
36
+ "totmem" => "20702856kb",
37
+ "idletime" => "1389153",
38
+ "nusers" => "0",
39
+ "nsessions" => "? 0",
40
+ "sessions" => "? 0",
41
+ "uname" => "Linux Br10 3.0.0-12-server #20-Ubuntu SMP Fri Oct 7 16:36:30 UTC 2011 x86_64",
42
+ "opsys" => "linux"
43
+ },
44
+ @p00.status
45
+ )
46
+ assert_equal("0", @p00.gpus)
47
+
48
+
49
+ assert_equal("Br09",@p01.name)
50
+ assert_equal("down",@p01.state)
51
+ assert_equal("1",@p01.np)
52
+ assert_equal("Br",@p01.properties)
53
+ assert_equal("cluster",@p01.ntype)
54
+ assert_equal({},@p01.status)
55
+ assert_equal("0",@p01.gpus)
56
+
57
+
58
+ assert_equal("Ge00", @p02.name)
59
+ assert_equal("job-exclusive", @p02.state)
60
+ assert_equal("1", @p02.np)
61
+ assert_equal("Ge", @p02.properties)
62
+ assert_equal("cluster", @p02.ntype)
63
+ assert_equal(
64
+ {
65
+ "rectime" => "1368442164",
66
+ "varattr" => "",
67
+ "jobs" => "6073.os.calc.atom",
68
+ "state" => "free",
69
+ "netload" => "18920135352",
70
+ "gres" => "",
71
+ "loadave" => "0.63",
72
+ "ncpus" => "4",
73
+ "physmem" => "4046772kb",
74
+ "availmem" => "12143912kb",
75
+ "totmem" => "12427184kb",
76
+ "idletime" => "2697087",
77
+ "nusers" => "0",
78
+ "nsessions" => "? 0",
79
+ "sessions" => "? 0",
80
+ "uname" => "Linux Ge00 3.0.0-12-server #20-Ubuntu SMP Fri Oct 7 16:36:30 UTC 2011 x86_64",
81
+ "opsys" => "linux"
82
+ },
83
+ @p02.status
84
+ )
85
+ assert_equal("0", @p02.gpus)
86
+
87
+ assert_raise(Comana::HostInspector::Pbsnodes::UnknownNodeError){
88
+ Comana::HostInspector::Pbsnodes.new("Ge08")
89
+ }
90
+ end
91
+ end
92
+
@@ -0,0 +1,21 @@
1
+ #! /usr/bin/env ruby
2
+ # coding: utf-8
3
+
4
+ require "helper"
5
+
6
+ #describe Comana::HostInspector::Ping do
7
+ class TC_Ping < Test::Unit::TestCase
8
+ def setup
9
+ #context 'not exist or down' do
10
+ @hi00 = Comana::HostInspector::Ping.new("")
11
+
12
+ #context 'exist and alive' do
13
+ @hi01 = Comana::HostInspector::Ping.new("localhost")
14
+ end
15
+
16
+ def test_alive?
17
+ assert_equal(false , @hi00.alive?)
18
+ assert_equal(true , @hi01.alive?)
19
+ end
20
+ end
21
+
@@ -0,0 +1,57 @@
1
+ #! /usr/bin/env ruby
2
+ # coding: utf-8
3
+
4
+ require "helper"
5
+
6
+ class Comana::HostSelector
7
+ attr_reader :groups_hosts
8
+ end
9
+
10
+ class TC_HostSelector < Test::Unit::TestCase
11
+ def setup
12
+ groups_hosts = {
13
+ "GroupA" => ["A00", "A01"],
14
+ "GroupB" => ["B00", "B01", "B02"]
15
+ }
16
+ @hs00 = Comana::HostSelector.new(groups_hosts)
17
+
18
+ groups_hosts = {
19
+ "GroupNil" => nil,
20
+ "GroupA" => ["A00", "A01"],
21
+ "GroupB" => ["B00", "B01", "B02"]
22
+ }
23
+ @hs01 = Comana::HostSelector.new(groups_hosts)
24
+ end
25
+
26
+ def test_load_file
27
+ hs = Comana::HostSelector.load_file("example/dot.clustersetting")
28
+ assert_equal(Comana::HostSelector, hs.class)
29
+ #pp hs
30
+ #assert_equal(["A00", "A01", "B00", "B01", "B02"], hs.select_all)
31
+ assert_equal({"A"=>["A00", "A01"], "B"=>["B00", "B01", "B02"]}, hs.groups_hosts)
32
+ end
33
+
34
+ def test_select_all
35
+ #it 'should return all hosts' do
36
+ assert_equal(["A00", "A01", "B00", "B01", "B02"], @hs00.select_all)
37
+
38
+ #it 'should return all hosts without nil' do
39
+ assert_equal(["A00", "A01", "B00", "B01", "B02"], @hs01.select_all)
40
+ end
41
+
42
+ def test_select_group
43
+ #it 'should return hosts in GroupA' do
44
+ assert_equal(["A00", "A01"], @hs00.select_group("GroupA"))
45
+
46
+ #it 'should raise Comana::HostSelector::NoEntryError' do
47
+ assert_raise(Comana::HostSelector::NoEntryError){
48
+ @hs00.select_group("GroupNil")
49
+ }
50
+ end
51
+
52
+ def test_groups
53
+ #it 'should return all groups' do
54
+ assert_equal(["GroupA", "GroupB"], @hs00.groups)
55
+ end
56
+ end
57
+
@@ -0,0 +1,214 @@
1
+ #! /usr/bin/env ruby
2
+ # coding: utf-8
3
+
4
+ require "helper"
5
+ class Comana::QueueSubmitter # < ComputationManager
6
+ public :dump_prologue
7
+ public :dump_script
8
+ public :dump_epilogue
9
+ end
10
+
11
+ class TC_QueueSubmitter < Test::Unit::TestCase
12
+ def setup
13
+ opts = {
14
+ :target => Comana::ComputationManager.new("test/not_started"),
15
+ :command => "command_line",
16
+ :cluster => "Nodes",
17
+ :num_nodes => 4,
18
+ }
19
+ @qs_notstarted = Comana::QueueSubmitter.new(opts)
20
+
21
+ opts = {
22
+ :target => Comana::ComputationManager.new("test/queuesubmitter/locked"),
23
+ :command => "command_line",
24
+ :cluster => "Nodes",
25
+ :num_nodes => 4,
26
+ }
27
+ @qs_locked = Comana::QueueSubmitter.new(opts)
28
+
29
+ opts = {
30
+ :target => Comana::ComputationManager.new("test/queuesubmitter/unlocked"),
31
+ :command => "command_line",
32
+ :cluster => "Nodes",
33
+ :num_nodes => 4,
34
+ }
35
+ @qs_unlocked = Comana::QueueSubmitter.new(opts)
36
+ end
37
+
38
+ def test_initialize
39
+ opts = {
40
+ #:target => "dir_name",
41
+ :command => "command_line",
42
+ :cluster => "Nodes",
43
+ :num_nodes => 4,
44
+ }
45
+ assert_raise(Comana::QueueSubmitter::InitializeError){
46
+ Comana::QueueSubmitter.new(opts)
47
+ }
48
+
49
+ opts = {
50
+ :target => Comana::ComputationManager.new("dir_name"),
51
+ #:command => "command_line",
52
+ :cluster => "Nodes",
53
+ :num_nodes => 4,
54
+ }
55
+ assert_raise(Comana::QueueSubmitter::InitializeError){
56
+ Comana::QueueSubmitter.new(opts)
57
+ }
58
+
59
+ opts = {
60
+ :target => Comana::ComputationManager.new("dir_name"),
61
+ :command => "command_line",
62
+ #:cluster => "Nodes",
63
+ :num_nodes => 4,
64
+ }
65
+ assert_nothing_raised{ Comana::QueueSubmitter.new(opts) }
66
+
67
+ opts = {
68
+ :target => Comana::ComputationManager.new("dir_name"),
69
+ :command => "command_line",
70
+ :cluster => "Nodes",
71
+ #:num_nodes => 4,
72
+ }
73
+ assert_nothing_raised{ Comana::QueueSubmitter.new(opts) }
74
+ end
75
+
76
+ def test_dump_prologue
77
+ #context "speed mode" do
78
+ correct = [
79
+ '#! /bin/sh',
80
+ 'LOGFILE="${PBS_O_WORKDIR}/prologue_script.log"',
81
+ 'echo "hostname : `hostname`" >> $LOGFILE',
82
+ 'echo "job id : $1" >> $LOGFILE',
83
+ 'echo "job execution user name : $2" >> $LOGFILE',
84
+ 'echo "job execution group name : $3" >> $LOGFILE',
85
+ 'echo "job name : $4" >> $LOGFILE',
86
+ 'echo "list of requested resource limits: $5" >> $LOGFILE',
87
+ 'echo "job execution queue : $6" >> $LOGFILE',
88
+ 'echo "job account : $7" >> $LOGFILE',
89
+ 'echo "PBS_O_WORKDIR : ${PBS_O_WORKDIR}" >> $LOGFILE',
90
+ 'echo "nodes in pbs_nodefile : " >> $LOGFILE',
91
+ 'cat ${PBS_NODEFILE} >> $LOGFILE',
92
+ 'exit 0',
93
+ ].join("\n")
94
+ assert_equal(correct, @qs_notstarted.dump_prologue)
95
+ end
96
+
97
+ def test_dump_script
98
+ correct = [
99
+ "#! /bin/sh",
100
+ "#PBS -N test/not_started",
101
+ "#PBS -l nodes=4:ppn=1:Nodes,walltime=7:00:00:00",
102
+ "#PBS -j oe",
103
+ "",
104
+ "cd ${PBS_O_WORKDIR} && \\",
105
+ "command_line",
106
+ ].join("\n")
107
+ assert_equal(correct, @qs_notstarted.dump_script)
108
+
109
+
110
+ opts = {
111
+ :target => Comana::ComputationManager.new("test/not_started"),
112
+ :command => "command_line",
113
+ #:cluster => "Nodes",
114
+ :num_nodes => 4,
115
+ }
116
+ qs = Comana::QueueSubmitter.new(opts)
117
+ correct = [
118
+ "#! /bin/sh",
119
+ "#PBS -N test/not_started",
120
+ "#PBS -l nodes=4:ppn=1,walltime=7:00:00:00",
121
+ "#PBS -j oe",
122
+ "",
123
+ "cd ${PBS_O_WORKDIR} && \\",
124
+ "command_line",
125
+ ].join("\n")
126
+ assert_equal(correct, qs.dump_script)
127
+
128
+
129
+ opts = {
130
+ :target => Comana::ComputationManager.new("test/not_started"),
131
+ :command => "command_line",
132
+ :cluster => "Nodes",
133
+ #:num_nodes => 4,
134
+ }
135
+ qs = Comana::QueueSubmitter.new(opts)
136
+ correct = [
137
+ "#! /bin/sh",
138
+ "#PBS -N test/not_started",
139
+ "#PBS -l nodes=1:ppn=1:Nodes,walltime=7:00:00:00",
140
+ "#PBS -j oe",
141
+ "",
142
+ "cd ${PBS_O_WORKDIR} && \\",
143
+ "command_line",
144
+ ].join("\n")
145
+ assert_equal(correct, qs.dump_script)
146
+
147
+ opts = {
148
+ :target => Comana::ComputationManager.new("test/not_started"),
149
+ :command => "command_line",
150
+ #:cluster => "Nodes",
151
+ #:num_nodes => 4,
152
+ }
153
+ qs = Comana::QueueSubmitter.new(opts)
154
+ correct = [
155
+ "#! /bin/sh",
156
+ "#PBS -N test/not_started",
157
+ "#PBS -l walltime=7:00:00:00",
158
+ "#PBS -j oe",
159
+ "",
160
+ "cd ${PBS_O_WORKDIR} && \\",
161
+ "command_line",
162
+ ].join("\n")
163
+ assert_equal(correct, qs.dump_script)
164
+
165
+ opts = {
166
+ :target => Comana::ComputationManager.new("test/not_started"),
167
+ :command => "command_line",
168
+ #:cluster => "Nodes",
169
+ #:num_nodes => 4,
170
+ :priority => -10,
171
+ }
172
+ qs = Comana::QueueSubmitter.new(opts)
173
+ correct = [
174
+ "#! /bin/sh",
175
+ "#PBS -N test/not_started",
176
+ "#PBS -l walltime=7:00:00:00",
177
+ "#PBS -p -10",
178
+ "#PBS -j oe",
179
+ "",
180
+ "cd ${PBS_O_WORKDIR} && \\",
181
+ "command_line",
182
+ ].join("\n")
183
+ assert_equal(correct, qs.dump_script)
184
+
185
+ end
186
+
187
+ def test_dump_epilogue
188
+ correct = [
189
+ '#! /bin/sh',
190
+ 'LOGFILE="${PBS_O_WORKDIR}/epilogue_script.log"',
191
+ 'echo "job id : $1" >> $LOGFILE',
192
+ 'echo "job execution user name : $2" >> $LOGFILE',
193
+ 'echo "job execution group name : $3" >> $LOGFILE',
194
+ 'echo "job name : $4" >> $LOGFILE',
195
+ 'echo "session id : $5" >> $LOGFILE',
196
+ 'echo "list of requested resource limits: $6" >> $LOGFILE',
197
+ 'echo "list of resources used by job : $7" >> $LOGFILE',
198
+ 'echo "job execution queue : $8" >> $LOGFILE',
199
+ 'echo "job account : $9" >> $LOGFILE',
200
+ 'echo "job exit code : $10" >> $LOGFILE',
201
+ 'exit 0',
202
+ ].join("\n")
203
+
204
+ assert_equal(correct, @qs_notstarted.dump_epilogue)
205
+ end
206
+
207
+ def test_finished?
208
+ #context "locked" do
209
+ assert_equal(true, @qs_locked.finished?)
210
+
211
+ #context "unlocked" do
212
+ assert_equal(false, @qs_unlocked.finished?)
213
+ end
214
+ end