comana 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/Gemfile +1 -1
- data/VERSION +1 -1
- data/comana.gemspec +5 -5
- data/lib/comana/machineinfo.rb +4 -1
- data/lib/comana/queuesubmitter.rb +125 -35
- data/memo.txt +5 -1
- data/spec/machineinfo_spec.rb +0 -13
- data/spec/queuesubmitter_spec.rb +151 -77
- metadata +14 -14
data/Gemfile
CHANGED
@@ -6,7 +6,7 @@ source "http://rubygems.org"
|
|
6
6
|
# Add dependencies to develop your gem here.
|
7
7
|
# Include everything needed to run rake, tests, features, etc.
|
8
8
|
group :development do
|
9
|
-
gem "rspec", ">= 2.
|
9
|
+
gem "rspec", ">= 2.10.0"
|
10
10
|
gem "rdoc", ">= 3.12"
|
11
11
|
gem "bundler", ">= 1.1.3"
|
12
12
|
gem "jeweler", ">= 1.8.3"
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.8
|
data/comana.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "comana"
|
8
|
-
s.version = "0.0.
|
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 = ["ippei94da"]
|
12
|
-
s.date = "2012-05-
|
12
|
+
s.date = "2012-05-18"
|
13
13
|
s.description = "Comana, COmputation MANAger,\n is a software to provide a framework of\n managing scientific computing.\n Researchers on computing have to check calculation and\n generate new calculation and execute, repeatedly.\n The abstract class that this gem provide would help the work.\n "
|
14
14
|
s.email = "ippei94da@gmail.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -61,20 +61,20 @@ Gem::Specification.new do |s|
|
|
61
61
|
s.specification_version = 3
|
62
62
|
|
63
63
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
64
|
-
s.add_development_dependency(%q<rspec>, [">= 2.
|
64
|
+
s.add_development_dependency(%q<rspec>, [">= 2.10.0"])
|
65
65
|
s.add_development_dependency(%q<rdoc>, [">= 3.12"])
|
66
66
|
s.add_development_dependency(%q<bundler>, [">= 1.1.3"])
|
67
67
|
s.add_development_dependency(%q<jeweler>, [">= 1.8.3"])
|
68
68
|
s.add_development_dependency(%q<simplecov>, [">= 0"])
|
69
69
|
else
|
70
|
-
s.add_dependency(%q<rspec>, [">= 2.
|
70
|
+
s.add_dependency(%q<rspec>, [">= 2.10.0"])
|
71
71
|
s.add_dependency(%q<rdoc>, [">= 3.12"])
|
72
72
|
s.add_dependency(%q<bundler>, [">= 1.1.3"])
|
73
73
|
s.add_dependency(%q<jeweler>, [">= 1.8.3"])
|
74
74
|
s.add_dependency(%q<simplecov>, [">= 0"])
|
75
75
|
end
|
76
76
|
else
|
77
|
-
s.add_dependency(%q<rspec>, [">= 2.
|
77
|
+
s.add_dependency(%q<rspec>, [">= 2.10.0"])
|
78
78
|
s.add_dependency(%q<rdoc>, [">= 3.12"])
|
79
79
|
s.add_dependency(%q<bundler>, [">= 1.1.3"])
|
80
80
|
s.add_dependency(%q<jeweler>, [">= 1.8.3"])
|
data/lib/comana/machineinfo.rb
CHANGED
@@ -1,46 +1,98 @@
|
|
1
1
|
#! /usr/bin/env ruby
|
2
2
|
# coding: utf-8
|
3
3
|
|
4
|
+
require "fileutils"
|
4
5
|
require "comana/computationmanager.rb"
|
5
6
|
require "comana/machineinfo.rb"
|
7
|
+
require "optparse"
|
6
8
|
|
7
9
|
#
|
8
10
|
#
|
9
11
|
#
|
10
12
|
class QueueSubmitter < ComputationManager
|
11
|
-
|
13
|
+
SCRIPT = "script.sh"
|
14
|
+
PROLOGUE = "prologue_script.sh"
|
15
|
+
EPILOGUE = "epilogue_script.sh"
|
12
16
|
WALLTIME = "7:00:00:00" # day:hour:minute:second
|
13
17
|
|
14
18
|
class PrepareNextError < Exception; end
|
15
19
|
class InitializeError < Exception; end
|
20
|
+
class InvalidArgumentError < Exception; end
|
16
21
|
|
17
22
|
# opts is a hash includes data belows:
|
18
|
-
# :
|
19
|
-
# :
|
20
|
-
# :n => name of cluster.
|
21
|
-
# :s => flag for speed prior mode (option).
|
23
|
+
# :command => command line.
|
24
|
+
# :cluster => name of cluster.
|
22
25
|
# :machineinfo => MachineInfo class instance.
|
23
|
-
#
|
24
|
-
#
|
26
|
+
# :directory => calculation as ComputationManager subclass.
|
27
|
+
# Note that this is not directory name, to check to be calculatable.
|
25
28
|
def initialize(opts)
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
@
|
33
|
-
@
|
34
|
-
@
|
35
|
-
@
|
36
|
-
|
29
|
+
[:directory, :command, :number, :cluster, :fileserver].each do |symbol|
|
30
|
+
raise InitializeError, "No #{symbol}" unless opts.has_key?(symbol)
|
31
|
+
end
|
32
|
+
|
33
|
+
super(opts[:directory].dir)
|
34
|
+
@command = opts[:command]
|
35
|
+
@cluster = opts[:cluster]
|
36
|
+
@number = opts[:number]
|
37
|
+
@fileserver = opts[:fileserver]
|
38
|
+
@lockdir = "lock_queuesubmitter"
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.parse_options(ary, machineinfo)
|
42
|
+
## option analysis
|
43
|
+
opts = {}
|
44
|
+
op = OptionParser.new
|
45
|
+
op.on("-c cluster", "--cluster" , "Cluster name."){|v| opts[:cluster] = v }
|
46
|
+
op.on("-n number", "--number", "Indicate node number, or key in ~/.machineinfo."){|v|
|
47
|
+
opts[:number] = v
|
48
|
+
}
|
49
|
+
op.parse!(ary)
|
50
|
+
|
51
|
+
unless ary.size == 1
|
52
|
+
raise InitializeError, "Not one directory indicated: #{ary.join(", ")}."
|
53
|
+
end
|
54
|
+
|
55
|
+
opts[:fileserver] = machineinfo.get_info("fileserver")
|
56
|
+
|
57
|
+
unless opts[:cluster]
|
58
|
+
raise InvalidArgumentError,
|
59
|
+
"-c option not set."
|
60
|
+
end
|
61
|
+
|
62
|
+
# Number of nodes: number, key string, or default value(1).
|
63
|
+
if opts[:number].to_i > 0
|
64
|
+
opts[:number] = opts[:number].to_i
|
65
|
+
else
|
66
|
+
number = machineinfo.get_info(opts[:cluster])[opts[:number]]
|
67
|
+
if number
|
68
|
+
opts[:number] = number
|
69
|
+
else
|
70
|
+
raise InvalidArgumentError,
|
71
|
+
"No entry '#{opts[:number]}' in machineinfo: #{machineinfo.inspect}."
|
72
|
+
end
|
73
|
+
end
|
74
|
+
opts[:number] ||= 1
|
75
|
+
|
76
|
+
opts
|
37
77
|
end
|
38
78
|
|
39
79
|
def calculate
|
40
|
-
|
41
|
-
|
80
|
+
# prologue
|
81
|
+
prologue_path = "#{@dir}/#{PROLOGUE}"
|
82
|
+
File.open(prologue_path, "w") { |io| dump_prologue(io) }
|
83
|
+
FileUtils.chmod(0700, prologue_path)
|
84
|
+
|
85
|
+
# epilogue
|
86
|
+
epilogue_path = "#{@dir}/#{EPILOGUE}"
|
87
|
+
File.open(epilogue_path, "w") { |io| dump_epilogue(io) }
|
88
|
+
FileUtils.chmod(0700, epilogue_path)
|
42
89
|
|
43
|
-
|
90
|
+
# script
|
91
|
+
script_path = "#{@dir}/#{SCRIPT}"
|
92
|
+
File.open(script_path, "w") { |io| dump_script(io) }
|
93
|
+
|
94
|
+
# run
|
95
|
+
system("cd #{@dir}; qsub -l prologue=#{prologue_path} -l epilogue=#{epilogue_path} #{script_path}")
|
44
96
|
end
|
45
97
|
|
46
98
|
# Raise QueueSubmitter::PrepareNextError when called.
|
@@ -55,25 +107,40 @@ class QueueSubmitter < ComputationManager
|
|
55
107
|
|
56
108
|
private
|
57
109
|
|
58
|
-
def
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
110
|
+
def dump_prologue(io = nil)
|
111
|
+
str = [
|
112
|
+
'#! /bin/sh',
|
113
|
+
'LOGFILE="${PBS_O_WORKDIR}/prologue_script.log"',
|
114
|
+
'echo "hostname : `hostname`" >> $LOGFILE',
|
115
|
+
'echo "job id : $1" >> $LOGFILE',
|
116
|
+
'echo "job execution user name : $2" >> $LOGFILE',
|
117
|
+
'echo "job execution group name : $3" >> $LOGFILE',
|
118
|
+
'echo "job name : $4" >> $LOGFILE',
|
119
|
+
'echo "list of requested resource limits: $5" >> $LOGFILE',
|
120
|
+
'echo "job execution queue : $6" >> $LOGFILE',
|
121
|
+
'echo "job account : $7" >> $LOGFILE',
|
122
|
+
'echo "PBS_O_WORKDIR : ${PBS_O_WORKDIR}" >> $LOGFILE',
|
123
|
+
'echo "nodes in pbs_nodefile : " >> $LOGFILE',
|
124
|
+
'cat ${PBS_NODEFILE} >> $LOGFILE',
|
125
|
+
'exit 0',
|
126
|
+
].join("\n")
|
63
127
|
|
128
|
+
if io
|
129
|
+
io.puts str
|
130
|
+
else
|
131
|
+
return str
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def dump_script(io = nil)
|
64
136
|
str = [
|
65
137
|
"#! /bin/sh",
|
66
138
|
"#PBS -N #{@dir}",
|
67
|
-
"#PBS -l nodes=#{
|
139
|
+
"#PBS -l nodes=#{@number}:ppn=1:#{@cluster},walltime=#{WALLTIME}",
|
68
140
|
"#PBS -j oe",
|
69
|
-
"
|
70
|
-
"rsync -azq --delete #{fs}:${PBS_O_WORKDIR}/ ${PBS_O_WORKDIR} && \\",
|
71
|
-
"cp ${PBS_NODEFILE} ${PBS_O_WORKDIR}/pbs_nodefile && \\",
|
141
|
+
"",
|
72
142
|
"cd ${PBS_O_WORKDIR} && \\",
|
73
|
-
"#{@command}
|
74
|
-
"rsync -azq --delete ${PBS_O_WORKDIR}/ #{fs}:${PBS_O_WORKDIR} && \\",
|
75
|
-
"#rm -rf ${PBS_O_WORKDIR}",
|
76
|
-
"mv ${PBS_O_WORKDIR} ~/.trash",
|
143
|
+
"#{@command}",
|
77
144
|
].join("\n")
|
78
145
|
|
79
146
|
if io
|
@@ -82,6 +149,29 @@ class QueueSubmitter < ComputationManager
|
|
82
149
|
return str
|
83
150
|
end
|
84
151
|
end
|
85
|
-
end
|
86
152
|
|
153
|
+
def dump_epilogue(io = nil)
|
154
|
+
str = [
|
155
|
+
'#! /bin/sh',
|
156
|
+
'LOGFILE="${PBS_O_WORKDIR}/epilogue_script.log"',
|
157
|
+
'echo "job id : $1" >> $LOGFILE',
|
158
|
+
'echo "job execution user name : $2" >> $LOGFILE',
|
159
|
+
'echo "job execution group name : $3" >> $LOGFILE',
|
160
|
+
'echo "job name : $4" >> $LOGFILE',
|
161
|
+
'echo "session id : $5" >> $LOGFILE',
|
162
|
+
'echo "list of requested resource limits: $6" >> $LOGFILE',
|
163
|
+
'echo "list of resources used by job : $7" >> $LOGFILE',
|
164
|
+
'echo "job execution queue : $8" >> $LOGFILE',
|
165
|
+
'echo "job account : $9" >> $LOGFILE',
|
166
|
+
'echo "job exit code : $10" >> $LOGFILE',
|
167
|
+
'exit 0',
|
168
|
+
].join("\n")
|
169
|
+
|
170
|
+
if io
|
171
|
+
io.puts str
|
172
|
+
else
|
173
|
+
return str
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
87
177
|
|
data/memo.txt
CHANGED
@@ -4,7 +4,11 @@ Comana don't have information of output files.
|
|
4
4
|
Because it is difficult to define final output and to deal systematically.
|
5
5
|
e.g., repeated calculation till convergence.
|
6
6
|
|
7
|
-
0.0.
|
7
|
+
0.0.8 release
|
8
|
+
Changed queuesubmitter option. (long name symbol)
|
9
|
+
Add prologue and epilogue to QueueSubmitter.
|
10
|
+
|
11
|
+
0.0.7 release
|
8
12
|
Bugfix of danger to rsync large directory:
|
9
13
|
- bin/submitqueue is removed.
|
10
14
|
- lib/queuesubmitter.rb is modified.
|
data/spec/machineinfo_spec.rb
CHANGED
@@ -10,23 +10,10 @@ describe MachineInfo do
|
|
10
10
|
describe "#load_file" do
|
11
11
|
context "not exist machineinfo file" do
|
12
12
|
DATA_FILE = "spec/machineinfo"
|
13
|
-
#DATA_FILE = "spec/dummy.yaml"
|
14
|
-
#data = {
|
15
|
-
# "SeriesA" => { "data1" => "A-1", "data2" => "A-2" },
|
16
|
-
# "SeriesB" => { "data1" => "B-1", "data2" => "B-2" },
|
17
|
-
#}
|
18
|
-
#io = File.open(DATA_FILE, "w")
|
19
|
-
#YAML.dump(data, io)
|
20
|
-
#io.close
|
21
|
-
|
22
|
-
#pp File.open(DATA_FILE, "r").readlines
|
23
|
-
|
24
13
|
it { lambda{MachineInfo.load_file(DATA_FILE)}.should_not raise_error}
|
25
14
|
|
26
15
|
mi00 = MachineInfo.load_file(DATA_FILE)
|
27
16
|
it {mi00.get_info("SeriesA").should == { "data1" => "A-1", "data2" => "A-2" } }
|
28
|
-
|
29
|
-
#FileUtils.rm DATA_FILE
|
30
17
|
end
|
31
18
|
|
32
19
|
context "not exist machineinfo file" do
|
data/spec/queuesubmitter_spec.rb
CHANGED
@@ -3,87 +3,145 @@
|
|
3
3
|
|
4
4
|
require File.expand_path(File.dirname(__FILE__) + "/spec_helper")
|
5
5
|
require "comana/queuesubmitter.rb"
|
6
|
+
require "comana/computationmanager.rb"
|
6
7
|
require "comana/machineinfo.rb"
|
7
8
|
|
8
9
|
class QueueSubmitter < ComputationManager
|
9
|
-
public :
|
10
|
+
public :dump_prologue
|
11
|
+
public :dump_script
|
12
|
+
public :dump_epilogue
|
10
13
|
end
|
11
14
|
|
12
15
|
#describe QueueSubmitter, "with chars to be escaped" do
|
13
16
|
describe QueueSubmitter do
|
14
17
|
describe "#initialize" do
|
15
|
-
context "opts not have :
|
18
|
+
context "opts not have :directory" do
|
16
19
|
opts = {
|
17
|
-
#:
|
18
|
-
:
|
19
|
-
:
|
20
|
-
:
|
21
|
-
:
|
22
|
-
"fileserver" => "FS",
|
23
|
-
"Nodes" => { "speed_nodes" => 4, "economy_nodes" => 1, }
|
24
|
-
)
|
20
|
+
#:directory => "dir_name",
|
21
|
+
:command => "command_line",
|
22
|
+
:cluster => "Nodes",
|
23
|
+
:number => 4,
|
24
|
+
:fileserver => "FS",
|
25
25
|
}
|
26
26
|
it {lambda{QueueSubmitter.new(opts)}.should raise_error(
|
27
27
|
QueueSubmitter::InitializeError)}
|
28
28
|
end
|
29
29
|
|
30
|
-
context "opts not have :
|
30
|
+
context "opts not have :command" do
|
31
31
|
opts = {
|
32
|
-
:
|
33
|
-
#:
|
34
|
-
:
|
35
|
-
:
|
36
|
-
:
|
37
|
-
"fileserver" => "FS",
|
38
|
-
"Nodes" => { "speed_nodes" => 4, "economy_nodes" => 1, }
|
39
|
-
)
|
32
|
+
:directory => ComputationManager.new("dir_name"),
|
33
|
+
#:command => "command_line",
|
34
|
+
:cluster => "Nodes",
|
35
|
+
:number => 4,
|
36
|
+
:fileserver => "FS",
|
40
37
|
}
|
41
38
|
it {lambda{QueueSubmitter.new(opts)}.should raise_error(
|
42
39
|
QueueSubmitter::InitializeError)}
|
43
40
|
end
|
44
41
|
|
45
|
-
context "opts not have :
|
42
|
+
context "opts not have :cluster" do
|
46
43
|
opts = {
|
47
|
-
:
|
48
|
-
:
|
49
|
-
#:
|
50
|
-
:
|
51
|
-
:
|
52
|
-
"fileserver" => "FS",
|
53
|
-
"Nodes" => { "speed_nodes" => 4, "economy_nodes" => 1, }
|
54
|
-
)
|
44
|
+
:directory => ComputationManager.new("dir_name"),
|
45
|
+
:command => "command_line",
|
46
|
+
#:cluster => "Nodes",
|
47
|
+
:number => 4,
|
48
|
+
:fileserver => "FS",
|
55
49
|
}
|
56
50
|
it {lambda{QueueSubmitter.new(opts)}.should raise_error(
|
57
51
|
QueueSubmitter::InitializeError)}
|
58
52
|
end
|
59
53
|
|
60
|
-
context "opts not have :
|
54
|
+
context "opts not have :command" do
|
61
55
|
opts = {
|
62
|
-
:
|
63
|
-
|
64
|
-
:
|
65
|
-
:
|
66
|
-
|
67
|
-
# "fileserver" => "FS",
|
68
|
-
# "Nodes" => { "speed_nodes" => 4, "economy_nodes" => 1, }
|
69
|
-
#)
|
56
|
+
:directory => ComputationManager.new("dir_name"),
|
57
|
+
#:command => "command_line",
|
58
|
+
:cluster => "Nodes",
|
59
|
+
:number => 4,
|
60
|
+
:fileserver => "FS",
|
70
61
|
}
|
71
62
|
it {lambda{QueueSubmitter.new(opts)}.should raise_error(
|
72
63
|
QueueSubmitter::InitializeError)}
|
73
64
|
end
|
74
65
|
end
|
75
66
|
|
76
|
-
describe "#
|
67
|
+
describe "#self.parse_options" do
|
77
68
|
before do
|
78
|
-
|
79
|
-
|
80
|
-
:c => "command_line",
|
81
|
-
:n => "Nodes",
|
82
|
-
:s => true,
|
83
|
-
:machineinfo => MachineInfo.new(
|
69
|
+
@machine_info = MachineInfo.new(
|
70
|
+
{
|
84
71
|
"fileserver" => "FS",
|
85
|
-
"
|
86
|
-
|
72
|
+
"CLUSTER" => {
|
73
|
+
"speed" => 2,
|
74
|
+
"economy" => 1,
|
75
|
+
},
|
76
|
+
}
|
77
|
+
)
|
78
|
+
end
|
79
|
+
|
80
|
+
context "-c not indicated" do
|
81
|
+
ary = %w( a -n 1 )
|
82
|
+
it {lambda{QueueSubmitter.parse_options(ary, @machine_info)}.should raise_error(
|
83
|
+
QueueSubmitter::InvalidArgumentError)}
|
84
|
+
end
|
85
|
+
|
86
|
+
#context "-n not indicated" do
|
87
|
+
# ary = %w( a -c CLUSTER_DUMMY )
|
88
|
+
# it {lambda{QueueSubmitter.parse_options(ary, @machine_info)}.should raise_error(MachineInfo::NoEntryError)}
|
89
|
+
#end
|
90
|
+
|
91
|
+
context "-n not indicated" do
|
92
|
+
ary = %w( a -c CLUSTER )
|
93
|
+
it {lambda{QueueSubmitter.parse_options(ary, @machine_info)}.should raise_error(QueueSubmitter::InvalidArgumentError)}
|
94
|
+
end
|
95
|
+
|
96
|
+
context "-c and -n number indicated" do
|
97
|
+
ary = %w( a -c CLUSTER -n 1 )
|
98
|
+
it {lambda{QueueSubmitter.parse_options(ary, @machine_info)}.should_not raise_error}
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
102
|
+
|
103
|
+
describe "#dump_prologue" do
|
104
|
+
before do
|
105
|
+
opts = {
|
106
|
+
:directory => ComputationManager.new("spec/not_started"),
|
107
|
+
:command => "command_line",
|
108
|
+
:cluster => "Nodes",
|
109
|
+
:number => 4,
|
110
|
+
:fileserver => "FS",
|
111
|
+
}
|
112
|
+
@qs00 = QueueSubmitter.new(opts)
|
113
|
+
|
114
|
+
@correct = [
|
115
|
+
'#! /bin/sh',
|
116
|
+
'LOGFILE="${PBS_O_WORKDIR}/prologue_script.log"',
|
117
|
+
'echo "hostname : `hostname`" >> $LOGFILE',
|
118
|
+
'echo "job id : $1" >> $LOGFILE',
|
119
|
+
'echo "job execution user name : $2" >> $LOGFILE',
|
120
|
+
'echo "job execution group name : $3" >> $LOGFILE',
|
121
|
+
'echo "job name : $4" >> $LOGFILE',
|
122
|
+
'echo "list of requested resource limits: $5" >> $LOGFILE',
|
123
|
+
'echo "job execution queue : $6" >> $LOGFILE',
|
124
|
+
'echo "job account : $7" >> $LOGFILE',
|
125
|
+
'echo "PBS_O_WORKDIR : ${PBS_O_WORKDIR}" >> $LOGFILE',
|
126
|
+
'echo "nodes in pbs_nodefile : " >> $LOGFILE',
|
127
|
+
'cat ${PBS_NODEFILE} >> $LOGFILE',
|
128
|
+
'exit 0',
|
129
|
+
].join("\n")
|
130
|
+
end
|
131
|
+
|
132
|
+
context "speed mode" do
|
133
|
+
it { @qs00.dump_prologue.should == @correct}
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
describe "#dump_script" do
|
138
|
+
before do
|
139
|
+
opts = {
|
140
|
+
:directory => ComputationManager.new("spec/not_started"),
|
141
|
+
:command => "command_line",
|
142
|
+
:cluster => "Nodes",
|
143
|
+
:number => 4,
|
144
|
+
:fileserver => "FS",
|
87
145
|
}
|
88
146
|
@qs00 = QueueSubmitter.new(opts)
|
89
147
|
|
@@ -92,42 +150,61 @@ describe QueueSubmitter do
|
|
92
150
|
"#PBS -N spec/not_started",
|
93
151
|
"#PBS -l nodes=4:ppn=1:Nodes,walltime=7:00:00:00",
|
94
152
|
"#PBS -j oe",
|
95
|
-
"
|
96
|
-
"rsync -azq --delete FS:${PBS_O_WORKDIR}/ ${PBS_O_WORKDIR} && \\",
|
97
|
-
"cp ${PBS_NODEFILE} ${PBS_O_WORKDIR}/pbs_nodefile && \\",
|
153
|
+
"",
|
98
154
|
"cd ${PBS_O_WORKDIR} && \\",
|
99
|
-
"command_line
|
100
|
-
"rsync -azq --delete ${PBS_O_WORKDIR}/ FS:${PBS_O_WORKDIR} && \\",
|
101
|
-
"#rm -rf ${PBS_O_WORKDIR}",
|
102
|
-
"mv ${PBS_O_WORKDIR} ~/.trash",
|
155
|
+
"command_line",
|
103
156
|
].join("\n")
|
104
157
|
end
|
105
158
|
|
106
159
|
context "speed mode" do
|
107
|
-
it { @qs00.
|
160
|
+
it { @qs00.dump_script.should == @correct}
|
161
|
+
end
|
162
|
+
end
|
108
163
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
164
|
+
describe "#dump_epilogue" do
|
165
|
+
before do
|
166
|
+
opts = {
|
167
|
+
:directory => ComputationManager.new("spec/not_started"),
|
168
|
+
:command => "command_line",
|
169
|
+
:cluster => "Nodes",
|
170
|
+
:number => 4,
|
171
|
+
:fileserver => "FS",
|
172
|
+
}
|
173
|
+
@qs00 = QueueSubmitter.new(opts)
|
174
|
+
|
175
|
+
@correct = [
|
176
|
+
'#! /bin/sh',
|
177
|
+
'LOGFILE="${PBS_O_WORKDIR}/epilogue_script.log"',
|
178
|
+
'echo "job id : $1" >> $LOGFILE',
|
179
|
+
'echo "job execution user name : $2" >> $LOGFILE',
|
180
|
+
'echo "job execution group name : $3" >> $LOGFILE',
|
181
|
+
'echo "job name : $4" >> $LOGFILE',
|
182
|
+
'echo "session id : $5" >> $LOGFILE',
|
183
|
+
'echo "list of requested resource limits: $6" >> $LOGFILE',
|
184
|
+
'echo "list of resources used by job : $7" >> $LOGFILE',
|
185
|
+
'echo "job execution queue : $8" >> $LOGFILE',
|
186
|
+
'echo "job account : $9" >> $LOGFILE',
|
187
|
+
'echo "job exit code : $10" >> $LOGFILE',
|
188
|
+
'exit 0',
|
189
|
+
].join("\n")
|
190
|
+
end
|
191
|
+
|
192
|
+
context "speed mode" do
|
193
|
+
it { @qs00.dump_epilogue.should == @correct}
|
116
194
|
end
|
117
195
|
end
|
118
196
|
|
197
|
+
|
198
|
+
|
119
199
|
describe "#finished?" do
|
120
200
|
context "locked" do
|
121
201
|
it do
|
122
202
|
opts = {
|
123
|
-
:
|
124
|
-
:
|
125
|
-
:
|
126
|
-
:
|
127
|
-
:
|
128
|
-
"fileserver" => "FS",
|
129
|
-
"Nodes" => { "speed_nodes" => 4, "economy_nodes" => 1, }
|
130
|
-
)
|
203
|
+
:directory => ComputationManager.new("spec/queuesubmitter/locked"),
|
204
|
+
:command => "command_line",
|
205
|
+
:cluster => "Nodes",
|
206
|
+
:number => 4,
|
207
|
+
:fileserver => "FS",
|
131
208
|
}
|
132
209
|
@qs00 = QueueSubmitter.new(opts)
|
133
210
|
|
@@ -138,14 +215,11 @@ describe QueueSubmitter do
|
|
138
215
|
context "unlocked" do
|
139
216
|
it do
|
140
217
|
opts = {
|
141
|
-
:
|
142
|
-
:
|
143
|
-
:
|
144
|
-
:
|
145
|
-
:
|
146
|
-
"fileserver" => "FS",
|
147
|
-
"Nodes" => { "speed_nodes" => 4, "economy_nodes" => 1, }
|
148
|
-
)
|
218
|
+
:directory => ComputationManager.new("spec/queuesubmitter/unlocked"),
|
219
|
+
:command => "command_line",
|
220
|
+
:cluster => "Nodes",
|
221
|
+
:number => 4,
|
222
|
+
:fileserver => "FS",
|
149
223
|
}
|
150
224
|
@qs00 = QueueSubmitter.new(opts)
|
151
225
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: comana
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,22 +9,22 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-05-
|
12
|
+
date: 2012-05-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: &
|
16
|
+
requirement: &71401920 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 2.
|
21
|
+
version: 2.10.0
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *71401920
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rdoc
|
27
|
-
requirement: &
|
27
|
+
requirement: &71401380 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '3.12'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *71401380
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: bundler
|
38
|
-
requirement: &
|
38
|
+
requirement: &71400960 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 1.1.3
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *71400960
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: jeweler
|
49
|
-
requirement: &
|
49
|
+
requirement: &71400540 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 1.8.3
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *71400540
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: simplecov
|
60
|
-
requirement: &
|
60
|
+
requirement: &71399840 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,7 +65,7 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *71399840
|
69
69
|
description: ! "Comana, COmputation MANAger,\n is a software to provide a framework
|
70
70
|
of\n managing scientific computing.\n Researchers on computing have to check
|
71
71
|
calculation and\n generate new calculation and execute, repeatedly.\n The
|
@@ -125,7 +125,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
125
125
|
version: '0'
|
126
126
|
segments:
|
127
127
|
- 0
|
128
|
-
hash:
|
128
|
+
hash: 49117789
|
129
129
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
130
130
|
none: false
|
131
131
|
requirements:
|