rbbt-util 5.32.10 → 5.32.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/rbbt +1 -0
- data/lib/rbbt/hpc/batch.rb +23 -7
- data/lib/rbbt/hpc/slurm.rb +27 -12
- data/lib/rbbt/resource.rb +51 -49
- data/lib/rbbt/tsv/csv.rb +2 -2
- data/lib/rbbt/util/cmd.rb +40 -18
- data/lib/rbbt/util/simpleDSL.rb +4 -4
- data/lib/rbbt/workflow.rb +20 -2
- data/lib/rbbt/workflow/accessor.rb +1 -1
- data/lib/rbbt/workflow/step.rb +37 -6
- data/lib/rbbt/workflow/step/accessor.rb +2 -2
- data/share/rbbt_commands/hpc/list +2 -2
- data/share/rbbt_commands/hpc/orchestrate +3 -0
- data/share/rbbt_commands/hpc/task +3 -0
- data/share/rbbt_commands/lsf/list +2 -2
- data/share/rbbt_commands/lsf/orchestrate +3 -0
- data/share/rbbt_commands/lsf/task +3 -0
- data/share/rbbt_commands/slurm/list +2 -2
- data/share/rbbt_commands/slurm/orchestrate +3 -0
- data/share/rbbt_commands/slurm/task +3 -0
- data/share/rbbt_commands/workflow/forget_deps +5 -4
- data/test/rbbt/util/test_simpleDSL.rb +3 -3
- metadata +82 -83
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fab4cf5fb60bb998eeed28a4e07758efd68f1103de0eff61a5b5c1d4a9fd2583
|
4
|
+
data.tar.gz: 47c9a2bdc555645ebc833c2a3b92a3452df259546c1dbf200d77dcee04b8969f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 92121d5df854b036a37413c27d2244cef0325874c018433abce1a93887c93efc650474e059c13b84c0be9a708d6fdc735daba6f861e1d05a670950fea3d32916
|
7
|
+
data.tar.gz: 0d24d99a64101fd33f2ac5774c30267f238c81d6479a754445fc02424384ba716e4c672b8a7c0d1c6f22b9f16c2ac1e1104ba9d35f7697bf4a9631e3a776bb02
|
data/bin/rbbt
CHANGED
data/lib/rbbt/hpc/batch.rb
CHANGED
@@ -95,14 +95,15 @@ module HPC
|
|
95
95
|
|
96
96
|
task = Symbol === job.overriden ? job.overriden : job.task_name
|
97
97
|
|
98
|
-
if job.overriden
|
99
|
-
override_deps = job.rec_dependencies.
|
100
|
-
|
98
|
+
if job.overriden?
|
99
|
+
#override_deps = job.rec_dependencies.
|
100
|
+
# select{|dep| Symbol === dep.overriden }.
|
101
|
+
|
102
|
+
override_deps = job.overriden_deps.
|
101
103
|
collect do |dep|
|
102
|
-
|
103
104
|
name = [dep.workflow.to_s, dep.task_name] * "#"
|
104
105
|
[name, dep.path] * "="
|
105
|
-
end * ","
|
106
|
+
end.uniq * ","
|
106
107
|
|
107
108
|
options[:override_deps] = override_deps unless override_deps.empty?
|
108
109
|
end
|
@@ -156,10 +157,15 @@ EOF
|
|
156
157
|
:singularity_ruby_inline,
|
157
158
|
:sync,
|
158
159
|
:task_cpus,
|
160
|
+
:mem,
|
161
|
+
:mem_per_cpu,
|
162
|
+
:licenses,
|
163
|
+
:contraints,
|
159
164
|
:time,
|
160
165
|
:user_group,
|
161
166
|
:wipe_container,
|
162
167
|
:workdir,
|
168
|
+
:purge_deps
|
163
169
|
]
|
164
170
|
|
165
171
|
keys.each do |key|
|
@@ -378,9 +384,9 @@ echo "user_scratch: #{scratch_group_dir}/#{user}/{PKGDIR}/{TOPLEVEL}/{SUBPATH}"
|
|
378
384
|
end
|
379
385
|
|
380
386
|
def execute(options)
|
381
|
-
exec_cmd, job_cmd = options.values_at :exec_cmd, :rbbt_cmd
|
387
|
+
exec_cmd, job_cmd, task_cpus = options.values_at :exec_cmd, :rbbt_cmd, :task_cpus
|
382
388
|
|
383
|
-
|
389
|
+
script=<<-EOF
|
384
390
|
step_path=$(
|
385
391
|
#{exec_cmd} #{job_cmd} --printpath
|
386
392
|
)
|
@@ -388,7 +394,10 @@ exit_status=$?
|
|
388
394
|
|
389
395
|
[[ -z $BATCH_JOB_ID ]] || #{exec_cmd} workflow write_info --recursive --force=false --check_pid "$step_path" batch_job $BATCH_JOB_ID
|
390
396
|
[[ -z $BATCH_SYSTEM ]] || #{exec_cmd} workflow write_info --recursive --force=false --check_pid "$step_path" batch_system $BATCH_SYSTEM
|
397
|
+
#{exec_cmd} workflow write_info --recursive --force=false --check_pid "$step_path" batch_cpus #{task_cpus}
|
391
398
|
EOF
|
399
|
+
|
400
|
+
script
|
392
401
|
end
|
393
402
|
|
394
403
|
def sync_environment(options = {})
|
@@ -409,6 +418,13 @@ fi
|
|
409
418
|
|
410
419
|
def cleanup_environment(options = {})
|
411
420
|
cleanup_environment = ""
|
421
|
+
|
422
|
+
cleanup_environment +=<<-EOF if options[:purge_deps]
|
423
|
+
if [ $exit_status == '0' ]; then
|
424
|
+
#{options[:exec_cmd]} workflow forget_deps --purge --recursive_purge "$step_path" 2>1 >> '#{options[:fsync]}'
|
425
|
+
fi
|
426
|
+
EOF
|
427
|
+
|
412
428
|
if options[:sync]
|
413
429
|
if options[:wipe_container] == 'force'
|
414
430
|
cleanup_environment +=<<-EOF
|
data/lib/rbbt/hpc/slurm.rb
CHANGED
@@ -31,6 +31,9 @@ export BATCH_SYSTEM=SLURM
|
|
31
31
|
licenses = Misc.process_options options, :licenses
|
32
32
|
constraint = Misc.process_options options, :constraint
|
33
33
|
|
34
|
+
mem = Misc.process_options options, :mem
|
35
|
+
mem_per_cpu = Misc.process_options options, :mem_per_cpu
|
36
|
+
|
34
37
|
batch_dir = Misc.process_options options, :batch_dir
|
35
38
|
batch_name = Misc.process_options options, :batch_name
|
36
39
|
|
@@ -39,22 +42,34 @@ export BATCH_SYSTEM=SLURM
|
|
39
42
|
|
40
43
|
time = Misc.format_seconds Misc.timespan(time) unless time.include? ":"
|
41
44
|
|
45
|
+
sbatch_params = {"job-name" => batch_name,
|
46
|
+
"output" => fout,
|
47
|
+
"error" => ferr,
|
48
|
+
"cpus-per-task" => task_cpus,
|
49
|
+
"nodes" => nodes,
|
50
|
+
"time" => time,
|
51
|
+
"exclusive" => exclusive,
|
52
|
+
"licenses" => licenses,
|
53
|
+
"mem" => mem,
|
54
|
+
"mem-per-cpu" => mem_per_cpu,
|
55
|
+
}
|
56
|
+
|
42
57
|
header =<<-EOF
|
43
58
|
#!/bin/bash
|
44
|
-
#SBATCH --job-name="#{batch_name}"
|
45
|
-
#SBATCH --workdir="#{workdir}"
|
46
|
-
#SBATCH --output="#{fout}"
|
47
|
-
#SBATCH --error="#{ferr}"
|
48
|
-
#SBATCH --qos="#{queue}"
|
49
|
-
#SBATCH --cpus-per-task="#{task_cpus}"
|
50
|
-
#SBATCH --time="#{time}"
|
51
|
-
#SBATCH --nodes="#{nodes}"
|
52
59
|
EOF
|
53
60
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
61
|
+
sbatch_params.each do |name,value|
|
62
|
+
next if value.nil? || value == ""
|
63
|
+
if TrueClass === value
|
64
|
+
header << "#SBATCH --#{name}" << "\n"
|
65
|
+
elsif Array === value
|
66
|
+
value.each do |v|
|
67
|
+
header << "#SBATCH --#{name}=\"#{v}\"" << "\n"
|
68
|
+
end
|
69
|
+
else
|
70
|
+
header << "#SBATCH --#{name}=\"#{value}\"" << "\n"
|
71
|
+
end
|
72
|
+
end
|
58
73
|
|
59
74
|
header
|
60
75
|
end
|
data/lib/rbbt/resource.rb
CHANGED
@@ -87,65 +87,67 @@ module Resource
|
|
87
87
|
lock_filename = nil # it seems like this was locked already.
|
88
88
|
|
89
89
|
Misc.lock lock_filename do
|
90
|
-
|
91
|
-
|
92
|
-
http = Net::HTTP.new(uri.host, uri.port)
|
93
|
-
|
94
|
-
if uri.scheme == "https"
|
95
|
-
http.use_ssl = true
|
96
|
-
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
97
|
-
http.instance_variable_set("@ssl_options", OpenSSL::SSL::OP_NO_SSLv2 + OpenSSL::SSL::OP_NO_SSLv3 + OpenSSL::SSL::OP_NO_COMPRESSION)
|
98
|
-
end
|
90
|
+
begin
|
91
|
+
uri = URI(url)
|
99
92
|
|
100
|
-
|
101
|
-
http.read_timeout = timeout
|
102
|
-
http.open_timeout = timeout
|
103
|
-
request = Net::HTTP::Get.new(uri.request_uri)
|
104
|
-
http.request request do |response|
|
105
|
-
filename = if response["Content-Disposition"]
|
106
|
-
response["Content-Disposition"].split(";").select{|f| f.include? "filename"}.collect{|f| f.split("=").last.gsub('"','')}.first
|
107
|
-
else
|
108
|
-
nil
|
109
|
-
end
|
93
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
110
94
|
|
111
|
-
if
|
112
|
-
|
113
|
-
|
95
|
+
if uri.scheme == "https"
|
96
|
+
http.use_ssl = true
|
97
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
98
|
+
http.instance_variable_set("@ssl_options", OpenSSL::SSL::OP_NO_SSLv2 + OpenSSL::SSL::OP_NO_SSLv3 + OpenSSL::SSL::OP_NO_COMPRESSION)
|
114
99
|
end
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
100
|
+
|
101
|
+
timeout = 60 * 10
|
102
|
+
http.read_timeout = timeout
|
103
|
+
http.open_timeout = timeout
|
104
|
+
request = Net::HTTP::Get.new(uri.request_uri)
|
105
|
+
http.request request do |response|
|
106
|
+
filename = if response["Content-Disposition"]
|
107
|
+
response["Content-Disposition"].split(";").select{|f| f.include? "filename"}.collect{|f| f.split("=").last.gsub('"','')}.first
|
108
|
+
else
|
109
|
+
nil
|
110
|
+
end
|
111
|
+
|
112
|
+
if filename && filename =~ /\.b?gz$/ && final_path !~ /\.b?gz$/
|
113
|
+
extension = filename.split(".").last
|
114
|
+
final_path += '.' + extension
|
121
115
|
end
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
TmpFile.with_file do |tmp_dir|
|
128
|
-
Misc.in_dir tmp_dir do
|
129
|
-
CMD.cmd('tar xvfz -', :in => Open.open(location, :nocache => true))
|
116
|
+
case response
|
117
|
+
when Net::HTTPSuccess, Net::HTTPOK
|
118
|
+
Misc.sensiblewrite(final_path) do |file|
|
119
|
+
response.read_body do |chunk|
|
120
|
+
file.write chunk
|
130
121
|
end
|
131
|
-
FileUtils.mv tmp_dir, final_path
|
132
122
|
end
|
123
|
+
when Net::HTTPRedirection, Net::HTTPFound
|
124
|
+
location = response['location']
|
125
|
+
if location.include? 'get_directory'
|
126
|
+
Log.debug("Feching directory from: #{location}. Into: #{final_path}")
|
127
|
+
FileUtils.mkdir_p final_path unless File.exist? final_path
|
128
|
+
TmpFile.with_file do |tmp_dir|
|
129
|
+
Misc.in_dir tmp_dir do
|
130
|
+
CMD.cmd('tar xvfz -', :in => Open.open(location, :nocache => true))
|
131
|
+
end
|
132
|
+
FileUtils.mv tmp_dir, final_path
|
133
|
+
end
|
134
|
+
else
|
135
|
+
url = location
|
136
|
+
raise TryAgain
|
137
|
+
#Open.open(location, :nocache => true) do |s|
|
138
|
+
# Misc.sensiblewrite(final_path, s)
|
139
|
+
#end
|
140
|
+
end
|
141
|
+
when Net::HTTPInternalServerError
|
142
|
+
@server_missing_resource_cache << url
|
143
|
+
raise "Resource Not Found"
|
133
144
|
else
|
134
|
-
|
135
|
-
raise TryAgain
|
136
|
-
#Open.open(location, :nocache => true) do |s|
|
137
|
-
# Misc.sensiblewrite(final_path, s)
|
138
|
-
#end
|
145
|
+
raise "Response not understood: #{response.inspect}"
|
139
146
|
end
|
140
|
-
when Net::HTTPInternalServerError
|
141
|
-
@server_missing_resource_cache << url
|
142
|
-
raise "Resource Not Found"
|
143
|
-
else
|
144
|
-
raise "Response not understood: #{response.inspect}"
|
145
147
|
end
|
148
|
+
rescue TryAgain
|
149
|
+
retry
|
146
150
|
end
|
147
|
-
rescue TryAgain
|
148
|
-
retry
|
149
151
|
end
|
150
152
|
rescue
|
151
153
|
Log.warn "Could not retrieve (#{self.to_s}) #{ path } from #{ remote_server }"
|
data/lib/rbbt/tsv/csv.rb
CHANGED
data/lib/rbbt/util/cmd.rb
CHANGED
@@ -192,25 +192,48 @@ module CMD
|
|
192
192
|
|
193
193
|
ConcurrentStream.setup sout, :pids => pids, :autojoin => no_wait, :no_fail => no_fail
|
194
194
|
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
195
|
+
if (Integer === stderr and log) || bar
|
196
|
+
err_thread = Thread.new do
|
197
|
+
while line = serr.gets
|
198
|
+
bar.process(line) if bar
|
199
|
+
sout.log = line
|
200
|
+
Log.log "STDERR [#{pid}]: " + line, stderr if log
|
201
|
+
end
|
202
|
+
serr.close
|
203
|
+
end
|
204
|
+
else
|
205
|
+
Misc.consume_stream(serr, true)
|
206
|
+
err_thread = nil
|
202
207
|
end
|
203
208
|
|
204
209
|
sout.threads = [in_thread, err_thread, wait_thr].compact
|
205
210
|
|
206
211
|
sout
|
207
212
|
else
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
213
|
+
|
214
|
+
if bar
|
215
|
+
err = ""
|
216
|
+
err_thread = Thread.new do
|
217
|
+
while not serr.eof?
|
218
|
+
line = serr.gets
|
219
|
+
bar.process(line)
|
220
|
+
err << line if Integer === stderr and log
|
221
|
+
end
|
222
|
+
serr.close
|
212
223
|
end
|
213
|
-
|
224
|
+
elsif log and Integer === stderr
|
225
|
+
err = ""
|
226
|
+
err_thread = Thread.new do
|
227
|
+
while not serr.eof?
|
228
|
+
err << serr.gets
|
229
|
+
end
|
230
|
+
serr.close
|
231
|
+
end
|
232
|
+
else
|
233
|
+
Misc.consume_stream(serr, true)
|
234
|
+
#serr.close
|
235
|
+
err_thread = nil
|
236
|
+
err = ""
|
214
237
|
end
|
215
238
|
|
216
239
|
ConcurrentStream.setup sout, :pids => pids, :threads => [in_thread, err_thread].compact, :autojoin => no_wait, :no_fail => no_fail
|
@@ -220,7 +243,11 @@ module CMD
|
|
220
243
|
|
221
244
|
status = wait_thr.value
|
222
245
|
if not status.success? and not no_fail
|
223
|
-
|
246
|
+
if !err.empty?
|
247
|
+
raise ProcessFailed.new "Command [#{pid}] #{cmd} failed with error status #{status.exitstatus}.\n#{err}"
|
248
|
+
else
|
249
|
+
raise ProcessFailed.new "Command [#{pid}] #{cmd} failed with error status #{status.exitstatus}"
|
250
|
+
end
|
224
251
|
else
|
225
252
|
Log.log err, stderr if Integer === stderr and log
|
226
253
|
end
|
@@ -263,11 +290,6 @@ module CMD
|
|
263
290
|
if c == "\n"
|
264
291
|
bar.process(line) if bar
|
265
292
|
starting = true
|
266
|
-
#if pid
|
267
|
-
# Log.logn "STDOUT [#{pid}]: ", level
|
268
|
-
#else
|
269
|
-
# Log.logn "STDOUT: ", level
|
270
|
-
#end
|
271
293
|
line = "" if bar
|
272
294
|
end
|
273
295
|
end
|
data/lib/rbbt/util/simpleDSL.rb
CHANGED
@@ -38,13 +38,13 @@ module SimpleDSL
|
|
38
38
|
hook_method(method)
|
39
39
|
|
40
40
|
# Execute
|
41
|
+
@config ||= {}
|
41
42
|
if actions.is_a? Proc
|
42
43
|
begin
|
43
|
-
require '
|
44
|
-
|
45
|
-
require 'ruby2ruby'
|
46
|
-
@config[@@method_name] = actions.to_ruby.collect[1..-2].join
|
44
|
+
require 'method_source'
|
45
|
+
@config[@@method_name] = actions.source.split("\n")[1..-2] * "\n"
|
47
46
|
rescue Exception
|
47
|
+
Log.exception $!
|
48
48
|
@config[@@method_name] = NoRuby2Ruby.new "The gem ruby2ruby is not installed. It will not work on ruby 1.9."
|
49
49
|
end
|
50
50
|
|
data/lib/rbbt/workflow.rb
CHANGED
@@ -347,6 +347,11 @@ module Workflow
|
|
347
347
|
|
348
348
|
inputs = IndiferentHash.setup(inputs)
|
349
349
|
|
350
|
+
not_overriden = inputs.delete :not_overriden
|
351
|
+
if not_overriden
|
352
|
+
inputs[:not_overriden] = :not_overriden_dep
|
353
|
+
end
|
354
|
+
|
350
355
|
Workflow.resolve_locals(inputs)
|
351
356
|
|
352
357
|
task_info = task_info(taskname)
|
@@ -400,7 +405,11 @@ module Workflow
|
|
400
405
|
jobname = DEFAULT_NAME if jobname.nil? or jobname.empty?
|
401
406
|
|
402
407
|
dependencies = real_dependencies(task, jobname, defaults.merge(inputs), task_dependencies[taskname] || [])
|
403
|
-
|
408
|
+
|
409
|
+
overriden_deps = dependencies.select{|d| d.overriden }
|
410
|
+
true_overriden_deps = overriden_deps.select{|d| TrueClass === d.overriden }
|
411
|
+
|
412
|
+
overriden = has_overriden_inputs || overriden_deps.any?
|
404
413
|
|
405
414
|
if real_inputs.empty? && Workflow::TAG != :inputs && ! overriden
|
406
415
|
step_path = step_path taskname, jobname, [], [], task.extension
|
@@ -413,7 +422,16 @@ module Workflow
|
|
413
422
|
job = get_job_step step_path, task, input_values, dependencies
|
414
423
|
job.workflow = self
|
415
424
|
job.clean_name = jobname
|
416
|
-
|
425
|
+
|
426
|
+
case not_overriden
|
427
|
+
when TrueClass
|
428
|
+
job.overriden = has_overriden_inputs || true_overriden_deps.any?
|
429
|
+
when :not_overriden_dep
|
430
|
+
job.overriden = true if has_overriden_inputs || true_overriden_deps.any?
|
431
|
+
else
|
432
|
+
job.overriden = true if has_overriden_inputs || overriden_deps.any?
|
433
|
+
end
|
434
|
+
|
417
435
|
job.real_inputs = real_inputs.keys
|
418
436
|
job
|
419
437
|
end
|
@@ -302,7 +302,7 @@ module Workflow
|
|
302
302
|
workflow, task = m.values_at 1, 2
|
303
303
|
workflow = self.to_s if workflow.empty?
|
304
304
|
override_dependencies[workflow] ||= IndiferentHash.setup({})
|
305
|
-
override_dependencies[workflow][task] = value
|
305
|
+
override_dependencies[workflow][task] = value.dup
|
306
306
|
end
|
307
307
|
end
|
308
308
|
override_dependencies
|
data/lib/rbbt/workflow/step.rb
CHANGED
@@ -34,13 +34,40 @@ class Step
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
+
|
38
|
+
def overriden?
|
39
|
+
return true if @overriden
|
40
|
+
return true if dependencies.select{|dep| dep.overriden? }.any?
|
41
|
+
info[:archived_info].each do |f,i|
|
42
|
+
return true if i[:overriden] || i["overriden"]
|
43
|
+
end if info[:archived_info]
|
44
|
+
return false
|
45
|
+
end
|
46
|
+
|
37
47
|
def overriden
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
48
|
+
@overriden
|
49
|
+
#if @overriden.nil?
|
50
|
+
# return false if dependencies.nil?
|
51
|
+
# dependencies.select{|dep| dep.overriden? }.any?
|
52
|
+
#else
|
53
|
+
# @overriden
|
54
|
+
#end
|
55
|
+
end
|
56
|
+
|
57
|
+
def overriden_deps
|
58
|
+
ord = []
|
59
|
+
deps = dependencies.dup
|
60
|
+
while dep = deps.shift
|
61
|
+
case dep.overriden
|
62
|
+
when FalseClass
|
63
|
+
next
|
64
|
+
when Symbol
|
65
|
+
ord << dep
|
66
|
+
else
|
67
|
+
deps += dep.dependencies
|
68
|
+
end
|
43
69
|
end
|
70
|
+
ord
|
44
71
|
end
|
45
72
|
|
46
73
|
def initialize(path, task = nil, inputs = nil, dependencies = nil, bindings = nil, clean_name = nil)
|
@@ -134,7 +161,11 @@ class Step
|
|
134
161
|
|
135
162
|
archived_info = {}
|
136
163
|
dependencies.each do |dep|
|
137
|
-
|
164
|
+
if Symbol === dep.overriden
|
165
|
+
archived_info[dep.path] = dep.overriden
|
166
|
+
else
|
167
|
+
archived_info[dep.path] = dep.info
|
168
|
+
end
|
138
169
|
archived_info.merge!(dep.archived_info)
|
139
170
|
end if dependencies
|
140
171
|
|
@@ -248,7 +248,7 @@ class Step
|
|
248
248
|
def init_info(force = false)
|
249
249
|
return nil if @exec || info_file.nil? || (Open.exists?(info_file) && ! force)
|
250
250
|
Open.lock(info_file, :lock => info_lock) do
|
251
|
-
i = {:status => :waiting, :pid => Process.pid, :path => path, :real_inputs => real_inputs}
|
251
|
+
i = {:status => :waiting, :pid => Process.pid, :path => path, :real_inputs => real_inputs, :overriden => overriden}
|
252
252
|
i[:dependencies] = dependencies.collect{|dep| [dep.task_name, dep.name, dep.path]} if dependencies
|
253
253
|
Misc.sensiblewrite(info_file, Step.serialize_info(i), :force => true, :lock => false)
|
254
254
|
@info_cache = IndiferentHash.setup(i)
|
@@ -551,7 +551,7 @@ class Step
|
|
551
551
|
|
552
552
|
def aborted?
|
553
553
|
status = self.status
|
554
|
-
status == :aborted || ((status != :dependencies && status != :cleaned && status != :noinfo && status != :setup && status != :noinfo) && nopid?)
|
554
|
+
status == :aborted || ((status != :ending && status != :dependencies && status != :cleaned && status != :noinfo && status != :setup && status != :noinfo) && nopid?)
|
555
555
|
end
|
556
556
|
|
557
557
|
# {{{ INFO
|
@@ -206,9 +206,9 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
206
206
|
puts Log.color(:magenta, "BATCH parameters: ")
|
207
207
|
case job_batch_system
|
208
208
|
when 'slurm'
|
209
|
-
text = CMD.cmd('grep "^#SBATCH"
|
209
|
+
text = CMD.cmd('grep "^#SBATCH" ', :in => Open.read(fcmd)).read.strip
|
210
210
|
when 'lsf'
|
211
|
-
text = CMD.cmd('grep "^#BSUB"
|
211
|
+
text = CMD.cmd('grep "^#BSUB" ', :in => Open.read(fcmd)).read.strip
|
212
212
|
else
|
213
213
|
text = ""
|
214
214
|
end
|
@@ -19,6 +19,7 @@ $slurm_options = SOPT.get <<EOF
|
|
19
19
|
-e--exclusive Make exclusive use of the node
|
20
20
|
-hm--highmem Make use of highmem cores
|
21
21
|
-wc--wipe_container* Wipe the jobs from the contain directory
|
22
|
+
-pd--purge_deps Purge job dependencies
|
22
23
|
-CS--contain_and_sync Contain and sync to default locations
|
23
24
|
-ci--copy_image When using a container directory, copy image there
|
24
25
|
-t--tail Tail the logs
|
@@ -26,6 +27,8 @@ $slurm_options = SOPT.get <<EOF
|
|
26
27
|
-q--queue* Queue
|
27
28
|
-t--task_cpus* Tasks
|
28
29
|
-tm--time* Time
|
30
|
+
-m--mem* SLURM minimum memory
|
31
|
+
-mcpu--mem_per_cpu* SLURM minimum memory per CPU
|
29
32
|
-lin--licenses* SLURM licenses
|
30
33
|
-cons--constraint* SLURM constraint
|
31
34
|
-W--workflows* Additional workflows
|
@@ -18,6 +18,7 @@ $slurm_options = SOPT.get <<EOF
|
|
18
18
|
-e--exclusive Make exclusive use of the node
|
19
19
|
-hm--highmem Make use of highmem cores
|
20
20
|
-wc--wipe_container* Wipe the jobs from the contain directory
|
21
|
+
-pd--purge_deps Purge job dependencies
|
21
22
|
-CS--contain_and_sync Contain and sync to default locations
|
22
23
|
-ci--copy_image When using a container directory, copy image there
|
23
24
|
-t--tail Tail the logs
|
@@ -25,6 +26,8 @@ $slurm_options = SOPT.get <<EOF
|
|
25
26
|
-q--queue* Queue
|
26
27
|
-t--task_cpus* Tasks
|
27
28
|
-tm--time* Time
|
29
|
+
-m--mem* SLURM minimum memory
|
30
|
+
-mcpu--mem_per_cpu* SLURM minimum memory per CPU
|
28
31
|
-lin--licenses* SLURM licenses
|
29
32
|
-cons--constraint* SLURM constraint
|
30
33
|
-W--workflows* Additional workflows
|
@@ -206,9 +206,9 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
206
206
|
puts Log.color(:magenta, "BATCH parameters: ")
|
207
207
|
case job_batch_system
|
208
208
|
when 'slurm'
|
209
|
-
text = CMD.cmd('grep "^#SBATCH"
|
209
|
+
text = CMD.cmd('grep "^#SBATCH" ', :in => Open.read(fcmd)).read.strip
|
210
210
|
when 'lsf'
|
211
|
-
text = CMD.cmd('grep "^#BSUB"
|
211
|
+
text = CMD.cmd('grep "^#BSUB" ', :in => Open.read(fcmd)).read.strip
|
212
212
|
else
|
213
213
|
text = ""
|
214
214
|
end
|
@@ -19,6 +19,7 @@ $slurm_options = SOPT.get <<EOF
|
|
19
19
|
-e--exclusive Make exclusive use of the node
|
20
20
|
-hm--highmem Make use of highmem cores
|
21
21
|
-wc--wipe_container* Wipe the jobs from the contain directory
|
22
|
+
-pd--purge_deps Purge job dependencies
|
22
23
|
-CS--contain_and_sync Contain and sync to default locations
|
23
24
|
-ci--copy_image When using a container directory, copy image there
|
24
25
|
-t--tail Tail the logs
|
@@ -26,6 +27,8 @@ $slurm_options = SOPT.get <<EOF
|
|
26
27
|
-q--queue* Queue
|
27
28
|
-t--task_cpus* Tasks
|
28
29
|
-tm--time* Time
|
30
|
+
-m--mem* SLURM minimum memory
|
31
|
+
-mcpu--mem_per_cpu* SLURM minimum memory per CPU
|
29
32
|
-lin--licenses* SLURM licenses
|
30
33
|
-cons--constraint* SLURM constraint
|
31
34
|
-W--workflows* Additional workflows
|
@@ -18,6 +18,7 @@ $slurm_options = SOPT.get <<EOF
|
|
18
18
|
-e--exclusive Make exclusive use of the node
|
19
19
|
-hm--highmem Make use of highmem cores
|
20
20
|
-wc--wipe_container* Wipe the jobs from the contain directory
|
21
|
+
-pd--purge_deps Purge job dependencies
|
21
22
|
-CS--contain_and_sync Contain and sync to default locations
|
22
23
|
-ci--copy_image When using a container directory, copy image there
|
23
24
|
-t--tail Tail the logs
|
@@ -25,6 +26,8 @@ $slurm_options = SOPT.get <<EOF
|
|
25
26
|
-q--queue* Queue
|
26
27
|
-t--task_cpus* Tasks
|
27
28
|
-tm--time* Time
|
29
|
+
-m--mem* SLURM minimum memory
|
30
|
+
-mcpu--mem_per_cpu* SLURM minimum memory per CPU
|
28
31
|
-lin--licenses* SLURM licenses
|
29
32
|
-cons--constraint* SLURM constraint
|
30
33
|
-W--workflows* Additional workflows
|
@@ -206,9 +206,9 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
206
206
|
puts Log.color(:magenta, "BATCH parameters: ")
|
207
207
|
case job_batch_system
|
208
208
|
when 'slurm'
|
209
|
-
text = CMD.cmd('grep "^#SBATCH"
|
209
|
+
text = CMD.cmd('grep "^#SBATCH" ', :in => Open.read(fcmd)).read.strip
|
210
210
|
when 'lsf'
|
211
|
-
text = CMD.cmd('grep "^#BSUB"
|
211
|
+
text = CMD.cmd('grep "^#BSUB" ', :in => Open.read(fcmd)).read.strip
|
212
212
|
else
|
213
213
|
text = ""
|
214
214
|
end
|
@@ -19,6 +19,7 @@ $slurm_options = SOPT.get <<EOF
|
|
19
19
|
-e--exclusive Make exclusive use of the node
|
20
20
|
-hm--highmem Make use of highmem cores
|
21
21
|
-wc--wipe_container* Wipe the jobs from the contain directory
|
22
|
+
-pd--purge_deps Purge job dependencies
|
22
23
|
-CS--contain_and_sync Contain and sync to default locations
|
23
24
|
-ci--copy_image When using a container directory, copy image there
|
24
25
|
-t--tail Tail the logs
|
@@ -26,6 +27,8 @@ $slurm_options = SOPT.get <<EOF
|
|
26
27
|
-q--queue* Queue
|
27
28
|
-t--task_cpus* Tasks
|
28
29
|
-tm--time* Time
|
30
|
+
-m--mem* SLURM minimum memory
|
31
|
+
-mcpu--mem_per_cpu* SLURM minimum memory per CPU
|
29
32
|
-lin--licenses* SLURM licenses
|
30
33
|
-cons--constraint* SLURM constraint
|
31
34
|
-W--workflows* Additional workflows
|
@@ -18,6 +18,7 @@ $slurm_options = SOPT.get <<EOF
|
|
18
18
|
-e--exclusive Make exclusive use of the node
|
19
19
|
-hm--highmem Make use of highmem cores
|
20
20
|
-wc--wipe_container* Wipe the jobs from the contain directory
|
21
|
+
-pd--purge_deps Purge job dependencies
|
21
22
|
-CS--contain_and_sync Contain and sync to default locations
|
22
23
|
-ci--copy_image When using a container directory, copy image there
|
23
24
|
-t--tail Tail the logs
|
@@ -25,6 +26,8 @@ $slurm_options = SOPT.get <<EOF
|
|
25
26
|
-q--queue* Queue
|
26
27
|
-t--task_cpus* Tasks
|
27
28
|
-tm--time* Time
|
29
|
+
-m--mem* SLURM minimum memory
|
30
|
+
-mcpu--mem_per_cpu* SLURM minimum memory per CPU
|
28
31
|
-lin--licenses* SLURM licenses
|
29
32
|
-cons--constraint* SLURM constraint
|
30
33
|
-W--workflows* Additional workflows
|
@@ -38,11 +38,11 @@ step.copy_files_dir
|
|
38
38
|
dependencies = step.dependencies
|
39
39
|
|
40
40
|
if remove && remove.any?
|
41
|
-
|
42
|
-
|
43
|
-
|
41
|
+
remove_paths = dependencies.select do |dep|
|
42
|
+
remove.include?(dep.task_name) || remove.include?([dep.workflow.to_s, dep.task_name] * "#")
|
43
|
+
end.collect{|dep| dep.path }
|
44
44
|
else
|
45
|
-
|
45
|
+
remove_paths = dependencies.collect{|dep| dep.path }
|
46
46
|
end
|
47
47
|
|
48
48
|
step.set_info :dependencies, step.info[:dependencies].reject{|info| remove_paths.include? info.last}
|
@@ -50,6 +50,7 @@ step.set_info :dependencies, step.info[:dependencies].reject{|info| remove_paths
|
|
50
50
|
if options[:purge] || options[:recursive_purge]
|
51
51
|
dependencies.each do |dependency|
|
52
52
|
next unless remove_paths.include? dependency.path
|
53
|
+
next unless Open.exists?(dependency.info_file)
|
53
54
|
Step.purge(dependency.path, options[:recursive_purge])
|
54
55
|
end
|
55
56
|
end
|
@@ -35,12 +35,12 @@ class TestDSL < Test::Unit::TestCase
|
|
35
35
|
|
36
36
|
def test_config
|
37
37
|
config = <<-EOC
|
38
|
-
action1
|
39
|
-
action2
|
38
|
+
action1 "Hello"
|
39
|
+
action2 "Good bye"
|
40
40
|
EOC
|
41
41
|
|
42
42
|
begin
|
43
|
-
|
43
|
+
assert_equal config.split("\n").collect{|l| l.strip}, @parser.config(:action).split("\n").collect{|l| l.strip}
|
44
44
|
rescue SimpleDSL::NoRuby2Ruby
|
45
45
|
end
|
46
46
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rbbt-util
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.32.
|
4
|
+
version: 5.32.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Miguel Vazquez
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-05-
|
11
|
+
date: 2021-05-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -555,7 +555,7 @@ homepage: http://github.com/mikisvaz/rbbt-util
|
|
555
555
|
licenses:
|
556
556
|
- MIT
|
557
557
|
metadata: {}
|
558
|
-
post_install_message:
|
558
|
+
post_install_message:
|
559
559
|
rdoc_options: []
|
560
560
|
require_paths:
|
561
561
|
- lib
|
@@ -570,104 +570,103 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
570
570
|
- !ruby/object:Gem::Version
|
571
571
|
version: '0'
|
572
572
|
requirements: []
|
573
|
-
|
574
|
-
|
575
|
-
signing_key:
|
573
|
+
rubygems_version: 3.1.4
|
574
|
+
signing_key:
|
576
575
|
specification_version: 4
|
577
576
|
summary: Utilities for the Ruby Bioinformatics Toolkit (rbbt)
|
578
577
|
test_files:
|
579
|
-
- test/test_helper.rb
|
580
|
-
- test/rbbt/entity/test_identifiers.rb
|
581
|
-
- test/rbbt/test_resource.rb
|
582
|
-
- test/rbbt/test_association.rb
|
583
|
-
- test/rbbt/hpc/test_slurm.rb
|
584
|
-
- test/rbbt/hpc/test_batch.rb
|
585
|
-
- test/rbbt/persist/test_tsv.rb
|
586
|
-
- test/rbbt/persist/tsv/test_kyotocabinet.rb
|
587
|
-
- test/rbbt/persist/tsv/test_lmdb.rb
|
588
|
-
- test/rbbt/persist/tsv/test_tokyocabinet.rb
|
589
|
-
- test/rbbt/persist/tsv/test_cdb.rb
|
590
|
-
- test/rbbt/persist/tsv/test_leveldb.rb
|
591
|
-
- test/rbbt/persist/tsv/test_sharder.rb
|
592
|
-
- test/rbbt/test_packed_index.rb
|
593
578
|
- test/rbbt/test_entity.rb
|
594
|
-
- test/rbbt/test_fix_width_table.rb
|
595
579
|
- test/rbbt/workflow/test_remote_workflow.rb
|
596
|
-
- test/rbbt/workflow/test_doc.rb
|
597
|
-
- test/rbbt/workflow/step/test_dependencies.rb
|
598
|
-
- test/rbbt/workflow/test_schedule.rb
|
599
580
|
- test/rbbt/workflow/util/test_archive.rb
|
600
581
|
- test/rbbt/workflow/util/test_orchestrator.rb
|
601
|
-
- test/rbbt/workflow/
|
582
|
+
- test/rbbt/workflow/test_doc.rb
|
583
|
+
- test/rbbt/workflow/test_schedule.rb
|
602
584
|
- test/rbbt/workflow/test_step.rb
|
603
|
-
- test/rbbt/
|
604
|
-
- test/rbbt/
|
605
|
-
- test/rbbt/
|
606
|
-
- test/rbbt/util/test_migrate.rb
|
607
|
-
- test/rbbt/util/test_simpleDSL.rb
|
608
|
-
- test/rbbt/util/concurrency/processes/test_socket.rb
|
609
|
-
- test/rbbt/util/concurrency/test_processes.rb
|
610
|
-
- test/rbbt/util/concurrency/test_threads.rb
|
611
|
-
- test/rbbt/util/test_filecache.rb
|
612
|
-
- test/rbbt/util/simpleopt/test_get.rb
|
613
|
-
- test/rbbt/util/simpleopt/test_parse.rb
|
614
|
-
- test/rbbt/util/simpleopt/test_setup.rb
|
615
|
-
- test/rbbt/util/test_misc.rb
|
616
|
-
- test/rbbt/util/test_excel2tsv.rb
|
617
|
-
- test/rbbt/util/test_semaphore.rb
|
618
|
-
- test/rbbt/util/test_procpath.rb
|
619
|
-
- test/rbbt/util/R/test_model.rb
|
620
|
-
- test/rbbt/util/R/test_eval.rb
|
621
|
-
- test/rbbt/util/R/test_plot.rb
|
622
|
-
- test/rbbt/util/test_open.rb
|
623
|
-
- test/rbbt/util/test_tmpfile.rb
|
624
|
-
- test/rbbt/util/test_cmd.rb
|
625
|
-
- test/rbbt/util/test_concurrency.rb
|
585
|
+
- test/rbbt/workflow/step/test_dependencies.rb
|
586
|
+
- test/rbbt/workflow/test_task.rb
|
587
|
+
- test/rbbt/resource/test_path.rb
|
626
588
|
- test/rbbt/util/test_colorize.rb
|
627
|
-
- test/rbbt/util/
|
628
|
-
- test/rbbt/util/
|
629
|
-
- test/rbbt/util/test_simpleopt.rb
|
630
|
-
- test/rbbt/util/test_python.rb
|
631
|
-
- test/rbbt/util/test_chain_methods.rb
|
589
|
+
- test/rbbt/util/test_procpath.rb
|
590
|
+
- test/rbbt/util/misc/test_development.rb
|
632
591
|
- test/rbbt/util/misc/test_omics.rb
|
592
|
+
- test/rbbt/util/misc/test_pipes.rb
|
593
|
+
- test/rbbt/util/misc/test_format.rb
|
633
594
|
- test/rbbt/util/misc/test_lock.rb
|
634
595
|
- test/rbbt/util/misc/test_multipart_payload.rb
|
635
596
|
- test/rbbt/util/misc/test_bgzf.rb
|
636
|
-
- test/rbbt/util/
|
637
|
-
- test/rbbt/util/
|
638
|
-
- test/rbbt/util/
|
597
|
+
- test/rbbt/util/test_concurrency.rb
|
598
|
+
- test/rbbt/util/test_cmd.rb
|
599
|
+
- test/rbbt/util/R/test_plot.rb
|
600
|
+
- test/rbbt/util/R/test_eval.rb
|
601
|
+
- test/rbbt/util/R/test_model.rb
|
602
|
+
- test/rbbt/util/test_config.rb
|
603
|
+
- test/rbbt/util/test_log.rb
|
604
|
+
- test/rbbt/util/test_simpleDSL.rb
|
639
605
|
- test/rbbt/util/log/test_progress.rb
|
606
|
+
- test/rbbt/util/test_tmpfile.rb
|
640
607
|
- test/rbbt/util/test_R.rb
|
641
|
-
- test/rbbt/
|
642
|
-
- test/rbbt/
|
643
|
-
- test/rbbt/
|
644
|
-
- test/rbbt/
|
645
|
-
- test/rbbt/
|
646
|
-
- test/rbbt/
|
647
|
-
- test/rbbt/
|
648
|
-
- test/rbbt/
|
649
|
-
- test/rbbt/
|
650
|
-
- test/rbbt/
|
651
|
-
- test/rbbt/
|
652
|
-
- test/rbbt/
|
653
|
-
- test/rbbt/
|
654
|
-
- test/rbbt/
|
655
|
-
- test/rbbt/
|
656
|
-
- test/rbbt/
|
657
|
-
- test/rbbt/
|
608
|
+
- test/rbbt/util/test_excel2tsv.rb
|
609
|
+
- test/rbbt/util/test_misc.rb
|
610
|
+
- test/rbbt/util/test_open.rb
|
611
|
+
- test/rbbt/util/test_simpleopt.rb
|
612
|
+
- test/rbbt/util/simpleopt/test_parse.rb
|
613
|
+
- test/rbbt/util/simpleopt/test_setup.rb
|
614
|
+
- test/rbbt/util/simpleopt/test_get.rb
|
615
|
+
- test/rbbt/util/test_python.rb
|
616
|
+
- test/rbbt/util/test_filecache.rb
|
617
|
+
- test/rbbt/util/concurrency/test_processes.rb
|
618
|
+
- test/rbbt/util/concurrency/test_threads.rb
|
619
|
+
- test/rbbt/util/concurrency/processes/test_socket.rb
|
620
|
+
- test/rbbt/util/test_semaphore.rb
|
621
|
+
- test/rbbt/util/test_chain_methods.rb
|
622
|
+
- test/rbbt/util/test_migrate.rb
|
623
|
+
- test/rbbt/test_resource.rb
|
624
|
+
- test/rbbt/test_packed_index.rb
|
625
|
+
- test/rbbt/tsv/test_change_id.rb
|
626
|
+
- test/rbbt/tsv/test_attach.rb
|
627
|
+
- test/rbbt/tsv/test_filter.rb
|
658
628
|
- test/rbbt/tsv/test_parser.rb
|
659
629
|
- test/rbbt/tsv/test_csv.rb
|
660
|
-
- test/rbbt/tsv/
|
630
|
+
- test/rbbt/tsv/test_accessor.rb
|
631
|
+
- test/rbbt/tsv/test_matrix.rb
|
661
632
|
- test/rbbt/tsv/test_field_index.rb
|
662
633
|
- test/rbbt/tsv/test_util.rb
|
663
|
-
- test/rbbt/tsv/
|
664
|
-
- test/rbbt/tsv/test_filter.rb
|
665
|
-
- test/rbbt/tsv/test_stream.rb
|
634
|
+
- test/rbbt/tsv/test_index.rb
|
666
635
|
- test/rbbt/tsv/test_parallel.rb
|
667
|
-
- test/rbbt/tsv/
|
668
|
-
- test/rbbt/tsv/test_attach.rb
|
636
|
+
- test/rbbt/tsv/test_manipulate.rb
|
669
637
|
- test/rbbt/tsv/test_excel.rb
|
670
|
-
- test/rbbt/tsv/test_change_id.rb
|
671
|
-
- test/rbbt/tsv/test_index.rb
|
672
|
-
- test/rbbt/tsv/parallel/test_traverse.rb
|
673
638
|
- test/rbbt/tsv/parallel/test_through.rb
|
639
|
+
- test/rbbt/tsv/parallel/test_traverse.rb
|
640
|
+
- test/rbbt/tsv/test_stream.rb
|
641
|
+
- test/rbbt/test_association.rb
|
642
|
+
- test/rbbt/hpc/test_batch.rb
|
643
|
+
- test/rbbt/hpc/test_slurm.rb
|
644
|
+
- test/rbbt/association/test_database.rb
|
645
|
+
- test/rbbt/association/test_item.rb
|
646
|
+
- test/rbbt/association/test_open.rb
|
647
|
+
- test/rbbt/association/test_util.rb
|
648
|
+
- test/rbbt/association/test_index.rb
|
649
|
+
- test/rbbt/test_knowledge_base.rb
|
650
|
+
- test/rbbt/persist/tsv/test_kyotocabinet.rb
|
651
|
+
- test/rbbt/persist/tsv/test_cdb.rb
|
652
|
+
- test/rbbt/persist/tsv/test_lmdb.rb
|
653
|
+
- test/rbbt/persist/tsv/test_sharder.rb
|
654
|
+
- test/rbbt/persist/tsv/test_leveldb.rb
|
655
|
+
- test/rbbt/persist/tsv/test_tokyocabinet.rb
|
656
|
+
- test/rbbt/persist/test_tsv.rb
|
657
|
+
- test/rbbt/test_tsv.rb
|
658
|
+
- test/rbbt/test_annotations.rb
|
659
|
+
- test/rbbt/test_fix_width_table.rb
|
660
|
+
- test/rbbt/test_workflow.rb
|
661
|
+
- test/rbbt/entity/test_identifiers.rb
|
662
|
+
- test/rbbt/annotations/test_util.rb
|
663
|
+
- test/rbbt/test_hpc.rb
|
664
|
+
- test/rbbt/test_monitor.rb
|
665
|
+
- test/rbbt/test_persist.rb
|
666
|
+
- test/rbbt/knowledge_base/test_entity.rb
|
667
|
+
- test/rbbt/knowledge_base/test_registry.rb
|
668
|
+
- test/rbbt/knowledge_base/test_syndicate.rb
|
669
|
+
- test/rbbt/knowledge_base/test_query.rb
|
670
|
+
- test/rbbt/knowledge_base/test_enrichment.rb
|
671
|
+
- test/rbbt/knowledge_base/test_traverse.rb
|
672
|
+
- test/test_helper.rb
|