rbbt-util 5.34.26 → 5.35.1
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.
- checksums.yaml +4 -4
- data/lib/rbbt/hpc/batch.rb +31 -4
- data/lib/rbbt/hpc/lsf.rb +5 -1
- data/lib/rbbt/hpc/orchestrate.old.rb +1 -1
- data/lib/rbbt/hpc/orchestrate.rb +11 -3
- data/lib/rbbt/hpc/slurm.rb +10 -2
- data/lib/rbbt/monitor.rb +3 -3
- data/lib/rbbt/persist.rb +1 -3
- data/lib/rbbt/resource/path.rb +1 -1
- data/lib/rbbt/resource.rb +1 -0
- data/lib/rbbt/tsv/attach/util.rb +8 -4
- data/lib/rbbt/util/R/model.rb +1 -1
- data/lib/rbbt/util/R/plot.rb +2 -0
- data/lib/rbbt/util/R.rb +1 -1
- data/lib/rbbt/util/cmd.rb +5 -3
- data/lib/rbbt/util/misc/concurrent_stream.rb +12 -11
- data/lib/rbbt/util/misc/development.rb +3 -2
- data/lib/rbbt/util/misc/exceptions.rb +26 -3
- data/lib/rbbt/util/misc/inspect.rb +1 -1
- data/lib/rbbt/util/misc/serialize.rb +26 -0
- data/lib/rbbt/util/misc.rb +2 -0
- data/lib/rbbt/util/simpleopt/get.rb +9 -6
- data/lib/rbbt/workflow/integration/ansible.rb +1 -1
- data/lib/rbbt/workflow/remote_workflow/driver/ssh.rb +34 -9
- data/lib/rbbt/workflow/remote_workflow/remote_step/ssh.rb +7 -2
- data/lib/rbbt/workflow/remote_workflow/remote_step.rb +2 -0
- data/lib/rbbt/workflow/step/accessor.rb +5 -1
- data/lib/rbbt/workflow/step/run.rb +1 -1
- data/lib/rbbt/workflow/step/save_load_inputs.rb +2 -1
- data/lib/rbbt/workflow/step/status.rb +1 -1
- data/lib/rbbt/workflow.rb +3 -4
- data/share/install/software/lib/install_helpers +3 -2
- data/share/rbbt_commands/ansible +0 -1
- data/share/rbbt_commands/hpc/orchestrate +15 -3
- data/share/rbbt_commands/hpc/task +13 -2
- data/share/rbbt_commands/lsf/orchestrate +15 -3
- data/share/rbbt_commands/lsf/task +13 -2
- data/share/rbbt_commands/slurm/orchestrate +15 -3
- data/share/rbbt_commands/slurm/task +13 -2
- data/share/rbbt_commands/system/clean +1 -1
- data/share/rbbt_commands/workflow/task +3 -2
- data/test/rbbt/hpc/test_batch.rb +4 -4
- data/test/rbbt/util/misc/test_serialize.rb +24 -0
- metadata +5 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 5efc019e19e967e30d83a08aa3ed45debe5036dac45f644ec0c7195100112e08
|
|
4
|
+
data.tar.gz: 1b7f34c9cb59d5936762531df4e004728071a90f4fcf3a4dce009e58071d7ffa
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: e0282a5eb3e8ec139b2cfc60face60d9bbd83d3597291df4e37fe9b8c4b2bca78a5fac23eb0c2ed4948d7cc61005c0625d992faaa67e265cd12443ee509f3037
|
|
7
|
+
data.tar.gz: a1e058254ad80b23409bb8f4618f14949089d6fbb355228fbf7abf82919d55a4ee86f47cdb1684014079a00f65831a5ea1900e63808fe21e863de3c67e121e86
|
data/lib/rbbt/hpc/batch.rb
CHANGED
|
@@ -378,17 +378,17 @@ function batch_sync_contain_dir(){
|
|
|
378
378
|
prepare_environment +=<<-EOF
|
|
379
379
|
# Load singularity modules
|
|
380
380
|
command -v singularity &> /dev/null || module load singularity
|
|
381
|
-
mkdir -p "#{singularity_opt_dir}"
|
|
381
|
+
mkdir -p "#{File.expand_path singularity_opt_dir}"
|
|
382
382
|
EOF
|
|
383
383
|
|
|
384
384
|
if contain && options[:hardened]
|
|
385
385
|
|
|
386
386
|
prepare_environment +=<<-EOF
|
|
387
387
|
# Prepare container for singularity
|
|
388
|
-
mkdir -p "#{contain}/.rbbt/etc/
|
|
388
|
+
mkdir -p "#{contain}"/.rbbt/etc/
|
|
389
389
|
|
|
390
390
|
for dir in .ruby_inline git home; do
|
|
391
|
-
mkdir -p "#{contain}/$dir
|
|
391
|
+
mkdir -p "#{contain}"/$dir
|
|
392
392
|
done
|
|
393
393
|
|
|
394
394
|
for tmpd in persist_locks produce_locks R_sockets sensiblewrite sensiblewrite_locks step_info_locks tsv_open_locks; do
|
|
@@ -560,6 +560,16 @@ env > #{batch_options[:fenv]}
|
|
|
560
560
|
def run_job(job, options = {})
|
|
561
561
|
system = self.to_s.split("::").last
|
|
562
562
|
|
|
563
|
+
if (batch_job = job.info[:batch_job]) && job_queued(batch_job)
|
|
564
|
+
Log.info "Job #{job.short_path} already queued in #{batch_job}"
|
|
565
|
+
return batch_job
|
|
566
|
+
end
|
|
567
|
+
|
|
568
|
+
if job.running?
|
|
569
|
+
Log.info "Job #{job.short_path} already running in #{job.info[:pid]}"
|
|
570
|
+
return job.info[:batch_job]
|
|
571
|
+
end
|
|
572
|
+
|
|
563
573
|
batch_base_dir, clean_batch_job, remove_batch_dir, procpath, tail, batch_dependencies, dry_run = Misc.process_options options,
|
|
564
574
|
:batch_base_dir, :clean_batch_job, :remove_batch_dir, :batch_procpath, :tail, :batch_dependencies, :dry_run,
|
|
565
575
|
:batch_base_dir => File.expand_path(File.join('~/rbbt-batch'))
|
|
@@ -583,6 +593,8 @@ env > #{batch_options[:fenv]}
|
|
|
583
593
|
|
|
584
594
|
batch_job = run_template(batch_dir, dry_run)
|
|
585
595
|
|
|
596
|
+
hold_dependencies(job, batch_job) unless dry_run
|
|
597
|
+
|
|
586
598
|
return [batch_job, batch_dir] unless tail
|
|
587
599
|
|
|
588
600
|
t_monitor = Thread.new do
|
|
@@ -603,6 +615,17 @@ env > #{batch_options[:fenv]}
|
|
|
603
615
|
end
|
|
604
616
|
end
|
|
605
617
|
|
|
618
|
+
def hold_dependencies(job, batch_job)
|
|
619
|
+
job.set_info :batch_job, batch_job
|
|
620
|
+
job.set_info :batch_system, self.batch_system
|
|
621
|
+
job.dependencies.each do |dep|
|
|
622
|
+
next unless dep.waiting?
|
|
623
|
+
next if (dep_batch_job = dep.info[:batch_job]) && job_queued(dep_batch_job)
|
|
624
|
+
|
|
625
|
+
hold_dependencies(dep, batch_job)
|
|
626
|
+
end
|
|
627
|
+
end
|
|
628
|
+
|
|
606
629
|
def follow_job(batch_dir, tail = true)
|
|
607
630
|
fjob = File.join(batch_dir, 'job.id')
|
|
608
631
|
fout = File.join(batch_dir, 'std.out')
|
|
@@ -672,7 +695,7 @@ env > #{batch_options[:fenv]}
|
|
|
672
695
|
terr = Misc.consume_stream(err, true, STDERR) if err
|
|
673
696
|
tout = Misc.consume_stream(out, true, STDOUT) if out
|
|
674
697
|
|
|
675
|
-
sleep 3 while
|
|
698
|
+
sleep 3 while job_queued(job)
|
|
676
699
|
rescue Aborted
|
|
677
700
|
ensure
|
|
678
701
|
begin
|
|
@@ -692,6 +715,10 @@ env > #{batch_options[:fenv]}
|
|
|
692
715
|
end
|
|
693
716
|
end
|
|
694
717
|
|
|
718
|
+
def job_queued(job)
|
|
719
|
+
job_status(job).split(/\s+/).include?(job.to_s)
|
|
720
|
+
end
|
|
721
|
+
|
|
695
722
|
def wait_for_job(batch_dir, time = 1)
|
|
696
723
|
fexit = File.join(batch_dir, 'exit.status')
|
|
697
724
|
fjob = File.join(batch_dir, 'job.id')
|
data/lib/rbbt/hpc/lsf.rb
CHANGED
|
@@ -5,6 +5,10 @@ module HPC
|
|
|
5
5
|
extend HPC::TemplateGeneration
|
|
6
6
|
extend HPC::Orchestration
|
|
7
7
|
|
|
8
|
+
def self.batch_system
|
|
9
|
+
"LSF"
|
|
10
|
+
end
|
|
11
|
+
|
|
8
12
|
def self.batch_system_variables
|
|
9
13
|
<<-EOF
|
|
10
14
|
let TOTAL_PROCESORS="$(cat /proc/cpuinfo|grep ^processor |wc -l)"
|
|
@@ -13,7 +17,7 @@ let MAX_MEMORY_DEFAULT="$(grep MemTotal /proc/meminfo|grep -o "[[:digit:]]*") /
|
|
|
13
17
|
export MAX_MEMORY_DEFAULT
|
|
14
18
|
export MAX_MEMORY
|
|
15
19
|
export BATCH_JOB_ID=$LSF_JOBID
|
|
16
|
-
export BATCH_SYSTEM
|
|
20
|
+
export BATCH_SYSTEM=#{batch_system}
|
|
17
21
|
EOF
|
|
18
22
|
end
|
|
19
23
|
|
|
@@ -206,7 +206,7 @@ module HPC
|
|
|
206
206
|
options.delete "detach"
|
|
207
207
|
options.delete "jobname"
|
|
208
208
|
|
|
209
|
-
rules =
|
|
209
|
+
rules = Misc.load_yaml(options[:orchestration_rules]) if options[:orchestration_rules]
|
|
210
210
|
rules ||= {}
|
|
211
211
|
IndiferentHash.setup(rules)
|
|
212
212
|
|
data/lib/rbbt/hpc/orchestrate.rb
CHANGED
|
@@ -36,10 +36,18 @@ module HPC
|
|
|
36
36
|
Log.high "Prepare for exec"
|
|
37
37
|
prepare_for_execution(job)
|
|
38
38
|
|
|
39
|
-
if options[:orchestration_rules]
|
|
40
|
-
|
|
39
|
+
if orchestration_rules_file = options[:orchestration_rules]
|
|
40
|
+
if Open.exists?(orchestration_rules_file)
|
|
41
|
+
rules = Misc.load_yaml(orchestration_rules_file)
|
|
42
|
+
elsif Rbbt.etc.slurm(orchestration_rules_file).exists?
|
|
43
|
+
rules = Misc.load_yaml(Rbbt.etc.slurm(orchestration_rules_file))
|
|
44
|
+
elsif Rbbt.etc.slurm(orchestration_rules_file + '.yaml').exists?
|
|
45
|
+
rules = Misc.load_yaml(Rbbt.etc.slurm(orchestration_rules_file + '.yaml'))
|
|
46
|
+
else
|
|
47
|
+
raise "Orchestration rules file not found: #{options[:orchestration_rules]}"
|
|
48
|
+
end
|
|
41
49
|
elsif Rbbt.etc.slurm["default.yaml"].exists?
|
|
42
|
-
rules =
|
|
50
|
+
rules = Misc.load_yaml(Rbbt.etc.slurm["default.yaml"])
|
|
43
51
|
else
|
|
44
52
|
rules = {}
|
|
45
53
|
end
|
data/lib/rbbt/hpc/slurm.rb
CHANGED
|
@@ -6,6 +6,10 @@ module HPC
|
|
|
6
6
|
extend HPC::TemplateGeneration
|
|
7
7
|
extend HPC::Orchestration
|
|
8
8
|
|
|
9
|
+
def self.batch_system
|
|
10
|
+
"SLURM"
|
|
11
|
+
end
|
|
12
|
+
|
|
9
13
|
def self.batch_system_variables
|
|
10
14
|
<<-EOF
|
|
11
15
|
let TOTAL_PROCESORS="$(cat /proc/cpuinfo|grep ^processor |wc -l)"
|
|
@@ -16,7 +20,7 @@ MAX_MEMORY="$MAX_MEMORY_DEFAULT"
|
|
|
16
20
|
export MAX_MEMORY_DEFAULT
|
|
17
21
|
export MAX_MEMORY
|
|
18
22
|
export BATCH_JOB_ID=$SLURM_JOB_ID
|
|
19
|
-
export BATCH_SYSTEM
|
|
23
|
+
export BATCH_SYSTEM=#{batch_system}
|
|
20
24
|
EOF
|
|
21
25
|
end
|
|
22
26
|
|
|
@@ -145,7 +149,11 @@ export BATCH_SYSTEM=SLURM
|
|
|
145
149
|
if job.nil?
|
|
146
150
|
CMD.cmd("squeue").read
|
|
147
151
|
else
|
|
148
|
-
|
|
152
|
+
begin
|
|
153
|
+
CMD.cmd("squeue --job #{job}").read
|
|
154
|
+
rescue
|
|
155
|
+
""
|
|
156
|
+
end
|
|
149
157
|
end
|
|
150
158
|
end
|
|
151
159
|
|
data/lib/rbbt/monitor.rb
CHANGED
|
@@ -64,14 +64,14 @@ module Rbbt
|
|
|
64
64
|
lock_info[f].merge!(file_time(f))
|
|
65
65
|
if File.size(f) > 0
|
|
66
66
|
info = Open.open(f) do |s|
|
|
67
|
-
|
|
67
|
+
Misc.load_yaml(s)
|
|
68
68
|
end
|
|
69
69
|
IndiferentHash.setup(info)
|
|
70
70
|
lock_info[f][:pid] = info[:pid]
|
|
71
71
|
lock_info[f][:ppid] = info[:ppid]
|
|
72
72
|
end
|
|
73
73
|
rescue Exception
|
|
74
|
-
|
|
74
|
+
Log.exception $!
|
|
75
75
|
end
|
|
76
76
|
end
|
|
77
77
|
lock_info
|
|
@@ -272,7 +272,7 @@ module Rbbt
|
|
|
272
272
|
def self.load_lock(lock)
|
|
273
273
|
begin
|
|
274
274
|
info = Misc.insist 3 do
|
|
275
|
-
|
|
275
|
+
Misc.load_yaml(lock)
|
|
276
276
|
end
|
|
277
277
|
info.values_at "pid", "ppid", "time"
|
|
278
278
|
rescue Exception
|
data/lib/rbbt/persist.rb
CHANGED
data/lib/rbbt/resource/path.rb
CHANGED
|
@@ -150,7 +150,7 @@ module Path
|
|
|
150
150
|
search_path_file = File.join(ENV['HOME'], '.rbbt/etc/search_paths')
|
|
151
151
|
if File.exist?(search_path_file)
|
|
152
152
|
begin
|
|
153
|
-
|
|
153
|
+
Misc.load_yaml(search_path_file).each do |where, location|
|
|
154
154
|
SEARCH_PATHS[where.to_sym] = location
|
|
155
155
|
end
|
|
156
156
|
rescue
|
data/lib/rbbt/resource.rb
CHANGED
data/lib/rbbt/tsv/attach/util.rb
CHANGED
|
@@ -105,7 +105,7 @@ module TSV
|
|
|
105
105
|
if other.include? source_key
|
|
106
106
|
v = case other.type
|
|
107
107
|
when :flat
|
|
108
|
-
other[source_key]
|
|
108
|
+
other[source_key]
|
|
109
109
|
when :single
|
|
110
110
|
[other[source_key]]
|
|
111
111
|
when :double
|
|
@@ -135,8 +135,12 @@ module TSV
|
|
|
135
135
|
if pos == :key
|
|
136
136
|
source_key
|
|
137
137
|
else
|
|
138
|
-
if other.include?
|
|
139
|
-
|
|
138
|
+
if other.include?(source_key)
|
|
139
|
+
if other.type == :single
|
|
140
|
+
v = other[source_key]
|
|
141
|
+
else
|
|
142
|
+
v = other[source_key][pos]
|
|
143
|
+
end
|
|
140
144
|
Array === v ? v.first : v
|
|
141
145
|
else
|
|
142
146
|
nil
|
|
@@ -192,7 +196,7 @@ module TSV
|
|
|
192
196
|
end
|
|
193
197
|
end
|
|
194
198
|
new_values.collect!{|v| v.nil? ? [[]] : [v]} if type == :double and not other.type == :double
|
|
195
|
-
new_values.collect!{|v| v.nil? ? nil : (other.type == :single ? v : v.first)} if not type == :double and
|
|
199
|
+
new_values.collect!{|v| v.nil? ? nil : (other.type == :single ? v : v.first)} if not type == :double and other.type == :double
|
|
196
200
|
new_values.flatten! if type == :flat
|
|
197
201
|
all_new_values << new_values
|
|
198
202
|
end
|
data/lib/rbbt/util/R/model.rb
CHANGED
|
@@ -42,7 +42,7 @@ module R
|
|
|
42
42
|
def colClasses(tsv)
|
|
43
43
|
return nil unless TSV === tsv
|
|
44
44
|
"c('character', " <<
|
|
45
|
-
(tsv.fields.collect{|f| R.ruby2R(@options[f] ? @options[f].to_s : "
|
|
45
|
+
(tsv.fields.collect{|f| R.ruby2R(@options[f] ? @options[f].to_s : "NA") } * ", ") <<
|
|
46
46
|
")"
|
|
47
47
|
end
|
|
48
48
|
|
data/lib/rbbt/util/R/plot.rb
CHANGED
data/lib/rbbt/util/R.rb
CHANGED
data/lib/rbbt/util/cmd.rb
CHANGED
|
@@ -112,6 +112,7 @@ module CMD
|
|
|
112
112
|
no_wait = options.delete(:no_wait)
|
|
113
113
|
xvfb = options.delete(:xvfb)
|
|
114
114
|
bar = options.delete(:progress_bar)
|
|
115
|
+
save_stderr = options.delete(:save_stderr)
|
|
115
116
|
|
|
116
117
|
dont_close_in = options.delete(:dont_close_in)
|
|
117
118
|
|
|
@@ -154,7 +155,7 @@ module CMD
|
|
|
154
155
|
Open3.popen3(ENV, cmd)
|
|
155
156
|
rescue
|
|
156
157
|
Log.warn $!.message
|
|
157
|
-
raise ProcessFailed, cmd unless no_fail
|
|
158
|
+
raise ProcessFailed, nil, cmd unless no_fail
|
|
158
159
|
return
|
|
159
160
|
end
|
|
160
161
|
pid = wait_thr.pid
|
|
@@ -198,6 +199,7 @@ module CMD
|
|
|
198
199
|
while line = serr.gets
|
|
199
200
|
bar.process(line) if bar
|
|
200
201
|
sout.log = line
|
|
202
|
+
sout.std_err << line if save_stderr
|
|
201
203
|
Log.log "STDERR [#{pid}]: " + line, stderr if log
|
|
202
204
|
end
|
|
203
205
|
serr.close
|
|
@@ -244,9 +246,9 @@ module CMD
|
|
|
244
246
|
status = wait_thr.value
|
|
245
247
|
if not status.success? and not no_fail
|
|
246
248
|
if !err.empty?
|
|
247
|
-
raise ProcessFailed.new
|
|
249
|
+
raise ProcessFailed.new pid, "#{cmd} failed with error status #{status.exitstatus}.\n#{err}"
|
|
248
250
|
else
|
|
249
|
-
raise ProcessFailed.new
|
|
251
|
+
raise ProcessFailed.new pid, "#{cmd} failed with error status #{status.exitstatus}"
|
|
250
252
|
end
|
|
251
253
|
else
|
|
252
254
|
Log.log err, stderr if Integer === stderr and log
|
|
@@ -7,7 +7,7 @@ module AbortedStream
|
|
|
7
7
|
end
|
|
8
8
|
|
|
9
9
|
module ConcurrentStream
|
|
10
|
-
attr_accessor :threads, :pids, :callback, :abort_callback, :filename, :joined, :aborted, :autojoin, :lockfile, :no_fail, :pair, :thread, :stream_exception, :log
|
|
10
|
+
attr_accessor :threads, :pids, :callback, :abort_callback, :filename, :joined, :aborted, :autojoin, :lockfile, :no_fail, :pair, :thread, :stream_exception, :log, :std_err
|
|
11
11
|
|
|
12
12
|
def self.setup(stream, options = {}, &block)
|
|
13
13
|
|
|
@@ -20,6 +20,7 @@ module ConcurrentStream
|
|
|
20
20
|
stream.pids.concat(Array === pids ? pids : [pids]) unless pids.nil? or pids.empty?
|
|
21
21
|
stream.autojoin = autojoin unless autojoin.nil?
|
|
22
22
|
stream.no_fail = no_fail unless no_fail.nil?
|
|
23
|
+
stream.std_err = ""
|
|
23
24
|
|
|
24
25
|
stream.pair = pair unless pair.nil?
|
|
25
26
|
|
|
@@ -81,12 +82,16 @@ module ConcurrentStream
|
|
|
81
82
|
begin
|
|
82
83
|
t.join
|
|
83
84
|
if Process::Status === t.value
|
|
84
|
-
if
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
85
|
+
if ! (t.value.success? || no_fail)
|
|
86
|
+
|
|
87
|
+
if log
|
|
88
|
+
msg = "Error joining #{self.filename || self.inspect}. Last log line: #{log}"
|
|
89
|
+
else
|
|
90
|
+
msg = "Error joining #{self.filename || self.inspect}"
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
raise ConcurrentStreamProcessFailed.new t.pid, msg, self
|
|
88
94
|
end
|
|
89
|
-
raise ProcessFailed.new "Error joining process #{t.pid} in #{self.filename || self.inspect}. Last log line: #{log}" if ! (t.value.success? || no_fail)
|
|
90
95
|
end
|
|
91
96
|
rescue Exception
|
|
92
97
|
if no_fail
|
|
@@ -106,11 +111,7 @@ module ConcurrentStream
|
|
|
106
111
|
@pids.each do |pid|
|
|
107
112
|
begin
|
|
108
113
|
Process.waitpid(pid, Process::WUNTRACED)
|
|
109
|
-
|
|
110
|
-
stream_raise_exception ProcessFailed.new "Error joining process #{pid} in #{self.filename || self.inspect}. Last log line: #{log}" unless $?.success? or no_fail
|
|
111
|
-
else
|
|
112
|
-
stream_raise_exception ProcessFailed.new "Error joining process #{pid} in #{self.filename || self.inspect}" unless $?.success? or no_fail
|
|
113
|
-
end
|
|
114
|
+
stream_raise_exception ConcurrentStreamProcessFailed.new(pid, "Error in waitpid", self) unless $?.success? or no_fail
|
|
114
115
|
rescue Errno::ECHILD
|
|
115
116
|
end
|
|
116
117
|
end
|
|
@@ -420,7 +420,8 @@ def self.add_libdir(dir=nil)
|
|
|
420
420
|
def self.ssh_run(server, script = nil)
|
|
421
421
|
Log.debug "Run ssh script in #{server}:\n#{script}"
|
|
422
422
|
|
|
423
|
-
CMD.cmd("ssh '#{server}' 'shopt -s expand_aliases; bash -l -c \"ruby\"' ", :in => script, :log => true).read
|
|
423
|
+
#CMD.cmd("ssh '#{server}' 'shopt -s expand_aliases; bash -l -c \"ruby\"' ", :in => script, :log => true).read
|
|
424
|
+
CMD.cmd("ssh '#{server}' ruby", :in => script, :log => true).read
|
|
424
425
|
end
|
|
425
426
|
|
|
426
427
|
def self.ssh_connection(server, reset = false)
|
|
@@ -437,7 +438,7 @@ def self.add_libdir(dir=nil)
|
|
|
437
438
|
end
|
|
438
439
|
end
|
|
439
440
|
|
|
440
|
-
def self.
|
|
441
|
+
def self.ssh_run_alt(server, script = nil)
|
|
441
442
|
Log.debug "Run ssh script in #{server}:\n#{script}"
|
|
442
443
|
|
|
443
444
|
write, master, pid = ssh_connection(server)
|
|
@@ -1,16 +1,39 @@
|
|
|
1
1
|
class RbbtException < StandardError; end
|
|
2
2
|
class ParameterException < RbbtException; end
|
|
3
3
|
|
|
4
|
+
class MissingParameterException < ParameterException
|
|
5
|
+
def initialize(parameter)
|
|
6
|
+
super("Missing parameter '#{parameter}'")
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
|
|
4
10
|
class FieldNotFoundError < StandardError;end
|
|
5
11
|
class ClosedStream < StandardError; end
|
|
6
12
|
|
|
7
13
|
class ProcessFailed < StandardError;
|
|
8
|
-
|
|
14
|
+
attr_accessor :pid, :msg
|
|
15
|
+
def initialize(pid = Process.pid, msg = nil)
|
|
9
16
|
@pid = pid
|
|
10
|
-
@msg =
|
|
11
|
-
|
|
17
|
+
@msg = msg
|
|
18
|
+
if @pid
|
|
19
|
+
if @msg
|
|
20
|
+
message = "Process #{@pid} failed - #{@msg}"
|
|
21
|
+
else
|
|
22
|
+
message = "Process #{@pid} failed"
|
|
23
|
+
end
|
|
24
|
+
else
|
|
25
|
+
message = "Failed to run #{@msg}"
|
|
26
|
+
end
|
|
27
|
+
super(message)
|
|
12
28
|
end
|
|
29
|
+
end
|
|
13
30
|
|
|
31
|
+
class ConcurrentStreamProcessFailed < ProcessFailed
|
|
32
|
+
attr_accessor :concurrent_stream
|
|
33
|
+
def initialize(pid = Process.pid, msg = nil, concurrent_stream = nil)
|
|
34
|
+
super(pid, msg)
|
|
35
|
+
@concurrent_stream = concurrent_stream
|
|
36
|
+
end
|
|
14
37
|
end
|
|
15
38
|
|
|
16
39
|
class Aborted < StandardError; end
|
|
@@ -276,7 +276,7 @@ module Misc
|
|
|
276
276
|
|
|
277
277
|
def self.step_file?(path)
|
|
278
278
|
return true if defined?(Step) && Step === path.resource
|
|
279
|
-
return false unless path
|
|
279
|
+
return false unless path =~ /\.files(?:\/|$)/
|
|
280
280
|
parts = path.split("/")
|
|
281
281
|
job = parts.select{|p| p =~ /\.files$/}.first
|
|
282
282
|
if job
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
module Misc
|
|
2
|
+
def self.load_yaml(yaml)
|
|
3
|
+
case yaml
|
|
4
|
+
when IO, StringIO
|
|
5
|
+
if YAML.respond_to?(:unsafe_load)
|
|
6
|
+
YAML.unsafe_load(yaml)
|
|
7
|
+
else
|
|
8
|
+
YAML.load(yaml)
|
|
9
|
+
end
|
|
10
|
+
when (defined?(Path) && Path)
|
|
11
|
+
yaml.open do |io|
|
|
12
|
+
load_yaml(io)
|
|
13
|
+
end
|
|
14
|
+
when String
|
|
15
|
+
if Misc.is_filename?(yaml)
|
|
16
|
+
File.open(yaml) do |io|
|
|
17
|
+
load_yaml(io)
|
|
18
|
+
end
|
|
19
|
+
else
|
|
20
|
+
load_yaml(StringIO.new(yaml))
|
|
21
|
+
end
|
|
22
|
+
else
|
|
23
|
+
raise "Unkown YAML object: #{Misc.fingerprint yaml}"
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
data/lib/rbbt/util/misc.rb
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
module SOPT
|
|
2
2
|
GOT_OPTIONS= IndiferentHash.setup({})
|
|
3
|
+
def self.current_options=(options)
|
|
4
|
+
@@current_options = options
|
|
5
|
+
end
|
|
3
6
|
def self.consume(args = ARGV)
|
|
4
7
|
i = 0
|
|
5
|
-
|
|
8
|
+
@@current_options ||= {}
|
|
6
9
|
while i < args.length do
|
|
7
10
|
current = args[i]
|
|
8
11
|
break if current == "--"
|
|
@@ -25,20 +28,20 @@ module SOPT
|
|
|
25
28
|
|
|
26
29
|
if input_types[input] == :string
|
|
27
30
|
value = args.delete_at(i) if value.nil?
|
|
28
|
-
|
|
31
|
+
@@current_options[input] = value
|
|
29
32
|
else
|
|
30
33
|
if value.nil? and %w(F false FALSE no).include?(args[i])
|
|
31
34
|
Log.warn "Boolean values are best specified as #{current}=[true|false], not #{ current } [true|false]. Token '#{args[i]}' following '#{current}' automatically assigned as value"
|
|
32
35
|
value = args.delete_at(i)
|
|
33
36
|
end
|
|
34
|
-
|
|
37
|
+
@@current_options[input] = %w(F false FALSE no).include?(value)? false : true
|
|
35
38
|
end
|
|
36
39
|
end
|
|
37
40
|
|
|
38
|
-
IndiferentHash.setup
|
|
39
|
-
GOT_OPTIONS.merge!
|
|
41
|
+
IndiferentHash.setup @@current_options
|
|
42
|
+
GOT_OPTIONS.merge! @@current_options
|
|
40
43
|
|
|
41
|
-
|
|
44
|
+
@@current_options
|
|
42
45
|
end
|
|
43
46
|
|
|
44
47
|
def self.get(opt_str)
|
|
@@ -48,7 +48,7 @@ module Ansible
|
|
|
48
48
|
end
|
|
49
49
|
|
|
50
50
|
def self.playbook(file, task = nil, options = {})
|
|
51
|
-
task =
|
|
51
|
+
task = task.to_sym if String === task
|
|
52
52
|
|
|
53
53
|
workflow = Workflow === file ? file : Workflow.require_workflow(file)
|
|
54
54
|
task = workflow.tasks.keys.last if workflow.tasks[task].nil?
|
|
@@ -85,7 +85,9 @@ job = wf.job(task, jobname, job_inputs)
|
|
|
85
85
|
STDOUT.write res.to_json
|
|
86
86
|
EOF
|
|
87
87
|
|
|
88
|
-
|
|
88
|
+
json = Misc.ssh_run(server, script)
|
|
89
|
+
Log.debug "JSON (#{ url }): #{json}"
|
|
90
|
+
JSON.parse(json)
|
|
89
91
|
end
|
|
90
92
|
|
|
91
93
|
def self.get_raw(url, params)
|
|
@@ -118,19 +120,40 @@ STDOUT.write job.path
|
|
|
118
120
|
script += job_script(input_id, jobname)
|
|
119
121
|
script +=<<-EOF
|
|
120
122
|
ENV["RBBT_UPDATE"]="#{(ENV["RBBT_UPDATE"] || false).to_s}"
|
|
121
|
-
job.
|
|
123
|
+
job.clean if job.error? and job.recoverable_error?
|
|
124
|
+
job.run unless job.done? || job.error?
|
|
122
125
|
STDOUT.write job.path
|
|
123
126
|
EOF
|
|
124
127
|
Misc.ssh_run(server, script)
|
|
125
128
|
end
|
|
126
129
|
|
|
127
|
-
def self.run_slurm_job(url, input_id, jobname = nil)
|
|
130
|
+
def self.run_slurm_job(url, input_id, jobname = nil, slurm_options = {})
|
|
128
131
|
server, path = parse_url(url)
|
|
129
132
|
|
|
130
133
|
script = path_script(path)
|
|
131
134
|
script += job_script(input_id, jobname)
|
|
132
135
|
script +=<<-EOF
|
|
133
|
-
|
|
136
|
+
require 'rbbt/hpc'
|
|
137
|
+
HPC::BATCH_MODULE = HPC.batch_system "SLURM"
|
|
138
|
+
slurm_options = JSON.parse(%q(#{slurm_options.to_json}))
|
|
139
|
+
job.clean if job.error? and job.recoverable_error?
|
|
140
|
+
HPC::BATCH_MODULE.run_job(job, slurm_options) unless job.done? || job.error?
|
|
141
|
+
STDOUT.write job.path
|
|
142
|
+
EOF
|
|
143
|
+
Misc.ssh_run(server, script)
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def self.orchestrate_slurm_job(url, input_id, jobname = nil, slurm_options = {})
|
|
147
|
+
server, path = parse_url(url)
|
|
148
|
+
|
|
149
|
+
script = path_script(path)
|
|
150
|
+
script += job_script(input_id, jobname)
|
|
151
|
+
script +=<<-EOF
|
|
152
|
+
require 'rbbt/hpc'
|
|
153
|
+
HPC::BATCH_MODULE = HPC.batch_system "SLURM"
|
|
154
|
+
slurm_options = JSON.parse(%q(#{slurm_options.to_json}))
|
|
155
|
+
job.clean if job.error? and job.recoverable_error?
|
|
156
|
+
HPC::BATCH_MODULE.orchestrate_job(job, slurm_options) unless job.done? || job.error?
|
|
134
157
|
STDOUT.write job.path
|
|
135
158
|
EOF
|
|
136
159
|
Misc.ssh_run(server, script)
|
|
@@ -190,18 +213,20 @@ job.clean
|
|
|
190
213
|
produce = true if migrate
|
|
191
214
|
|
|
192
215
|
workflow_name = job.workflow.to_s
|
|
193
|
-
inputs = job.
|
|
216
|
+
inputs = job.recursive_inputs.to_hash
|
|
217
|
+
|
|
194
218
|
job.dependencies.each do |dep|
|
|
195
|
-
dep.produce
|
|
196
|
-
|
|
219
|
+
dep.produce
|
|
220
|
+
end if options[:produce_dependencies]
|
|
197
221
|
|
|
198
|
-
|
|
222
|
+
job.rec_dependencies.each do |dep|
|
|
223
|
+
Step.migrate(dep.path, search_path, :target => server) if dep.done?
|
|
199
224
|
end
|
|
200
225
|
|
|
201
226
|
remote_workflow = RemoteWorkflow.new("ssh://#{server}:#{job.workflow.to_s}", "#{job.workflow.to_s}")
|
|
202
227
|
rjob = remote_workflow.job(job.task_name.to_s, job.clean_name, inputs)
|
|
203
228
|
|
|
204
|
-
override_dependencies = job.
|
|
229
|
+
override_dependencies = job.rec_dependencies.select{|dep| dep.done? }.collect{|dep| [dep.workflow.to_s, dep.task_name.to_s] * "#" << "=" << Rbbt.identify(dep.path)}
|
|
205
230
|
rjob.override_dependencies = override_dependencies
|
|
206
231
|
|
|
207
232
|
if options[:migrate]
|
|
@@ -50,15 +50,20 @@ class RemoteStep
|
|
|
50
50
|
"ssh://" + @server + ":" + ["var/jobs", self.workflow.to_s, task_name.to_s, @name] * "/"
|
|
51
51
|
end
|
|
52
52
|
end
|
|
53
|
+
|
|
54
|
+
def _run
|
|
55
|
+
RemoteWorkflow::SSH.run_job(File.join(base_url, task.to_s), @input_id, @base_name)
|
|
56
|
+
end
|
|
53
57
|
|
|
54
58
|
def produce(*args)
|
|
55
59
|
input_types = {}
|
|
56
60
|
init_job
|
|
57
|
-
@remote_path =
|
|
61
|
+
@remote_path = _run
|
|
58
62
|
@started = true
|
|
59
|
-
while ! done?
|
|
63
|
+
while ! (done? || error?)
|
|
60
64
|
sleep 1
|
|
61
65
|
end
|
|
66
|
+
raise self.get_exception if error?
|
|
62
67
|
self
|
|
63
68
|
end
|
|
64
69
|
|
|
@@ -143,8 +143,12 @@ class Step
|
|
|
143
143
|
|
|
144
144
|
def init_info(force = false)
|
|
145
145
|
return nil if @exec || info_file.nil? || (Open.exists?(info_file) && ! force)
|
|
146
|
+
batch_job = info[:batch_job] if Open.exists?(info_file)
|
|
147
|
+
batch_system = info[:batch_system] if Open.exists?(info_file)
|
|
146
148
|
Open.lock(info_file, :lock => info_lock) do
|
|
147
149
|
i = {:status => :waiting, :pid => Process.pid, :path => path, :real_inputs => real_inputs, :overriden => overriden}
|
|
150
|
+
i[:batch_job] = batch_job if batch_job
|
|
151
|
+
i[:batch_system] = batch_system if batch_system
|
|
148
152
|
i[:dependencies] = dependencies.collect{|dep| [dep.task_name, dep.name, dep.path]} if dependencies
|
|
149
153
|
Misc.sensiblewrite(info_file, Step.serialize_info(i), :force => true, :lock => false)
|
|
150
154
|
@info_cache = IndiferentHash.setup(i)
|
|
@@ -253,7 +257,7 @@ class Step
|
|
|
253
257
|
#Open.read(file(name)).split /\n|,\s*/
|
|
254
258
|
Open.read(file(name)).split "\n"
|
|
255
259
|
when :yaml
|
|
256
|
-
|
|
260
|
+
Misc.load_yaml(file(name))
|
|
257
261
|
when :marshal
|
|
258
262
|
Marshal.load(Open.open(file(name)))
|
|
259
263
|
else
|
|
@@ -82,7 +82,7 @@ module Workflow
|
|
|
82
82
|
when :file, :binary
|
|
83
83
|
Log.debug "Pointing #{ input } to #{file}"
|
|
84
84
|
if file =~ /\.yaml/
|
|
85
|
-
inputs[input.to_sym] =
|
|
85
|
+
inputs[input.to_sym] = Misc.load_yaml(file)
|
|
86
86
|
else
|
|
87
87
|
if File.symlink?(file)
|
|
88
88
|
link_target = File.expand_path(File.readlink(file), File.dirname(file))
|
|
@@ -201,6 +201,7 @@ class Step
|
|
|
201
201
|
|
|
202
202
|
def self.save_inputs(inputs, input_types, dir)
|
|
203
203
|
inputs.each do |name,value|
|
|
204
|
+
next if value.nil?
|
|
204
205
|
type = input_types[name]
|
|
205
206
|
type = type.to_s if type
|
|
206
207
|
|
|
@@ -15,7 +15,7 @@ class Step
|
|
|
15
15
|
raise "DO NOT CLEAN"
|
|
16
16
|
end
|
|
17
17
|
|
|
18
|
-
if (Open.exists?(path) or Open.broken_link?(path)) or Open.exists?(pid_file) or Open.exists?(info_file) or Open.exists?(files_dir) or Open.broken_link?(files_dir)
|
|
18
|
+
if (Open.exists?(path) or Open.broken_link?(path)) or Open.exists?(pid_file) or Open.exists?(info_file) or Open.exists?(files_dir) or Open.broken_link?(files_dir) or Open.exists?(pid_file)
|
|
19
19
|
|
|
20
20
|
@result = nil
|
|
21
21
|
@pid = nil
|
data/lib/rbbt/workflow.rb
CHANGED
|
@@ -520,6 +520,7 @@ module Workflow
|
|
|
520
520
|
end
|
|
521
521
|
|
|
522
522
|
def job(taskname, jobname = nil, inputs = {})
|
|
523
|
+
inputs, jobname = jobname, nil if Hash === jobname
|
|
523
524
|
begin
|
|
524
525
|
_job(taskname, jobname, inputs)
|
|
525
526
|
ensure
|
|
@@ -834,8 +835,7 @@ module Workflow
|
|
|
834
835
|
end
|
|
835
836
|
|
|
836
837
|
def self.load_remote_tasks(filename)
|
|
837
|
-
|
|
838
|
-
remote_workflow_tasks = YAML.load(yaml_text)
|
|
838
|
+
remote_workflow_tasks = Misc.load_yaml(filename)
|
|
839
839
|
Workflow.process_remote_tasks(remote_workflow_tasks)
|
|
840
840
|
end
|
|
841
841
|
|
|
@@ -859,8 +859,7 @@ module Workflow
|
|
|
859
859
|
end
|
|
860
860
|
|
|
861
861
|
def self.load_relay_tasks(filename)
|
|
862
|
-
|
|
863
|
-
relay_workflow_tasks = YAML.load(yaml_text)
|
|
862
|
+
relay_workflow_tasks = Misc.load_yaml(filename)
|
|
864
863
|
Workflow.process_relay_tasks(relay_workflow_tasks)
|
|
865
864
|
end
|
|
866
865
|
end
|
|
@@ -85,7 +85,7 @@ uncompress_pkg(){
|
|
|
85
85
|
mkdir -p "$OPT_BUILD_DIR"
|
|
86
86
|
cd "$OPT_BUILD_DIR"
|
|
87
87
|
|
|
88
|
-
(tar xvfz $pkg || tar xvfJ $pkg || tar xvfj $pkg || unzip $pkg || (echo "Error decompressing" & cd &
|
|
88
|
+
(tar xvfz $pkg || tar xvfJ $pkg || tar xvfj $pkg || unzip $pkg || (echo "Error decompressing" & cd & exit -1 ) ) 2> /dev/null
|
|
89
89
|
|
|
90
90
|
cd "$old_pwd"
|
|
91
91
|
}
|
|
@@ -178,7 +178,7 @@ clean_build(){
|
|
|
178
178
|
}
|
|
179
179
|
|
|
180
180
|
build_dir(){
|
|
181
|
-
echo $OPT_BUILD_DIR
|
|
181
|
+
echo $OPT_BUILD_DIR/$(ls $OPT_BUILD_DIR |head -n 1)
|
|
182
182
|
}
|
|
183
183
|
|
|
184
184
|
compile(){
|
|
@@ -211,6 +211,7 @@ prepare_make(){
|
|
|
211
211
|
local extra="$@"
|
|
212
212
|
|
|
213
213
|
local old_pwd="`expand_path $(pwd)`"
|
|
214
|
+
|
|
214
215
|
cd "`build_dir`"
|
|
215
216
|
|
|
216
217
|
[ -f bootstrap ] && (./bootstrap || exit -1)
|
data/share/rbbt_commands/ansible
CHANGED
|
@@ -3,10 +3,13 @@
|
|
|
3
3
|
require 'rbbt/util/simpleopt'
|
|
4
4
|
require 'rbbt/workflow'
|
|
5
5
|
require 'rbbt/workflow/usage'
|
|
6
|
+
require 'rbbt/workflow/remote_workflow'
|
|
6
7
|
require 'rbbt/hpc'
|
|
7
8
|
require 'rbbt/hpc/orchestrate'
|
|
8
9
|
require 'time'
|
|
9
10
|
|
|
11
|
+
rbbt_options = SOPT::GOT_OPTIONS
|
|
12
|
+
|
|
10
13
|
$slurm_options = SOPT.get <<EOF
|
|
11
14
|
-dr--dry_run Print only the template
|
|
12
15
|
-cj--clean_job Clean job
|
|
@@ -46,6 +49,8 @@ EOF
|
|
|
46
49
|
batch_system = $slurm_options.delete :batch_system
|
|
47
50
|
batch_system ||= 'auto'
|
|
48
51
|
|
|
52
|
+
$slurm_options[:config_keys] = SOPT::GOT_OPTIONS[:config_keys]
|
|
53
|
+
|
|
49
54
|
HPC::BATCH_MODULE = HPC.batch_system batch_system
|
|
50
55
|
|
|
51
56
|
raise ParameterException.new("Could not detect batch_system: #{Misc.fingerprint batch_system}") if HPC::BATCH_MODULE.nil?
|
|
@@ -61,7 +66,6 @@ class Step
|
|
|
61
66
|
else
|
|
62
67
|
begin
|
|
63
68
|
Log.debug "Issuing SLURM job for #{self.path}"
|
|
64
|
-
#@batch_job_id, @batch_job_dir = HPC::BATCH_MODULE.orchestrate_job(self, SOPT::GOT_OPTIONS.merge($slurm_options))
|
|
65
69
|
@batch_job_id, @batch_job_dir = HPC::BATCH_MODULE.orchestrate_job(self, $slurm_options)
|
|
66
70
|
if no_load
|
|
67
71
|
self
|
|
@@ -75,6 +79,14 @@ class Step
|
|
|
75
79
|
end
|
|
76
80
|
end
|
|
77
81
|
|
|
78
|
-
|
|
79
|
-
|
|
82
|
+
module RemoteStep::SSH
|
|
83
|
+
|
|
84
|
+
def _run
|
|
85
|
+
RemoteWorkflow::SSH.orchestrate_slurm_job(File.join(base_url, task.to_s), @input_id, @base_name, $slurm_options)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
SOPT.current_options = rbbt_options
|
|
91
|
+
|
|
80
92
|
load Rbbt.share.rbbt_commands.workflow.task.find
|
|
@@ -3,9 +3,12 @@
|
|
|
3
3
|
require 'rbbt/util/simpleopt'
|
|
4
4
|
require 'rbbt/workflow'
|
|
5
5
|
require 'rbbt/workflow/usage'
|
|
6
|
+
require 'rbbt/workflow/remote_workflow'
|
|
6
7
|
require 'rbbt/hpc'
|
|
7
8
|
require 'time'
|
|
8
9
|
|
|
10
|
+
rbbt_options = SOPT::GOT_OPTIONS
|
|
11
|
+
|
|
9
12
|
$slurm_options = SOPT.get <<EOF
|
|
10
13
|
-dr--dry_run Print only the template
|
|
11
14
|
-cj--clean_job Clean job
|
|
@@ -56,12 +59,20 @@ class Step
|
|
|
56
59
|
else
|
|
57
60
|
begin
|
|
58
61
|
Log.debug "Issuing SLURM job for #{self.path}"
|
|
59
|
-
HPC::BATCH_MODULE.run_job(self,
|
|
62
|
+
HPC::BATCH_MODULE.run_job(self, $slurm_options)
|
|
60
63
|
rescue HPC::SBATCH
|
|
61
64
|
end
|
|
62
65
|
end
|
|
63
66
|
end
|
|
64
67
|
end
|
|
65
68
|
|
|
66
|
-
|
|
69
|
+
module RemoteStep::SSH
|
|
70
|
+
|
|
71
|
+
def _run
|
|
72
|
+
RemoteWorkflow::SSH.run_slurm_job(File.join(base_url, task.to_s), @input_id, @base_name, $slurm_options)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
SOPT.current_options = rbbt_options
|
|
67
78
|
load Rbbt.share.rbbt_commands.workflow.task.find
|
|
@@ -3,10 +3,13 @@
|
|
|
3
3
|
require 'rbbt/util/simpleopt'
|
|
4
4
|
require 'rbbt/workflow'
|
|
5
5
|
require 'rbbt/workflow/usage'
|
|
6
|
+
require 'rbbt/workflow/remote_workflow'
|
|
6
7
|
require 'rbbt/hpc'
|
|
7
8
|
require 'rbbt/hpc/orchestrate'
|
|
8
9
|
require 'time'
|
|
9
10
|
|
|
11
|
+
rbbt_options = SOPT::GOT_OPTIONS
|
|
12
|
+
|
|
10
13
|
$slurm_options = SOPT.get <<EOF
|
|
11
14
|
-dr--dry_run Print only the template
|
|
12
15
|
-cj--clean_job Clean job
|
|
@@ -46,6 +49,8 @@ EOF
|
|
|
46
49
|
batch_system = $slurm_options.delete :batch_system
|
|
47
50
|
batch_system ||= 'auto'
|
|
48
51
|
|
|
52
|
+
$slurm_options[:config_keys] = SOPT::GOT_OPTIONS[:config_keys]
|
|
53
|
+
|
|
49
54
|
HPC::BATCH_MODULE = HPC.batch_system batch_system
|
|
50
55
|
|
|
51
56
|
raise ParameterException.new("Could not detect batch_system: #{Misc.fingerprint batch_system}") if HPC::BATCH_MODULE.nil?
|
|
@@ -61,7 +66,6 @@ class Step
|
|
|
61
66
|
else
|
|
62
67
|
begin
|
|
63
68
|
Log.debug "Issuing SLURM job for #{self.path}"
|
|
64
|
-
#@batch_job_id, @batch_job_dir = HPC::BATCH_MODULE.orchestrate_job(self, SOPT::GOT_OPTIONS.merge($slurm_options))
|
|
65
69
|
@batch_job_id, @batch_job_dir = HPC::BATCH_MODULE.orchestrate_job(self, $slurm_options)
|
|
66
70
|
if no_load
|
|
67
71
|
self
|
|
@@ -75,6 +79,14 @@ class Step
|
|
|
75
79
|
end
|
|
76
80
|
end
|
|
77
81
|
|
|
78
|
-
|
|
79
|
-
|
|
82
|
+
module RemoteStep::SSH
|
|
83
|
+
|
|
84
|
+
def _run
|
|
85
|
+
RemoteWorkflow::SSH.orchestrate_slurm_job(File.join(base_url, task.to_s), @input_id, @base_name, $slurm_options)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
SOPT.current_options = rbbt_options
|
|
91
|
+
|
|
80
92
|
load Rbbt.share.rbbt_commands.workflow.task.find
|
|
@@ -3,9 +3,12 @@
|
|
|
3
3
|
require 'rbbt/util/simpleopt'
|
|
4
4
|
require 'rbbt/workflow'
|
|
5
5
|
require 'rbbt/workflow/usage'
|
|
6
|
+
require 'rbbt/workflow/remote_workflow'
|
|
6
7
|
require 'rbbt/hpc'
|
|
7
8
|
require 'time'
|
|
8
9
|
|
|
10
|
+
rbbt_options = SOPT::GOT_OPTIONS
|
|
11
|
+
|
|
9
12
|
$slurm_options = SOPT.get <<EOF
|
|
10
13
|
-dr--dry_run Print only the template
|
|
11
14
|
-cj--clean_job Clean job
|
|
@@ -56,12 +59,20 @@ class Step
|
|
|
56
59
|
else
|
|
57
60
|
begin
|
|
58
61
|
Log.debug "Issuing SLURM job for #{self.path}"
|
|
59
|
-
HPC::BATCH_MODULE.run_job(self,
|
|
62
|
+
HPC::BATCH_MODULE.run_job(self, $slurm_options)
|
|
60
63
|
rescue HPC::SBATCH
|
|
61
64
|
end
|
|
62
65
|
end
|
|
63
66
|
end
|
|
64
67
|
end
|
|
65
68
|
|
|
66
|
-
|
|
69
|
+
module RemoteStep::SSH
|
|
70
|
+
|
|
71
|
+
def _run
|
|
72
|
+
RemoteWorkflow::SSH.run_slurm_job(File.join(base_url, task.to_s), @input_id, @base_name, $slurm_options)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
SOPT.current_options = rbbt_options
|
|
67
78
|
load Rbbt.share.rbbt_commands.workflow.task.find
|
|
@@ -3,10 +3,13 @@
|
|
|
3
3
|
require 'rbbt/util/simpleopt'
|
|
4
4
|
require 'rbbt/workflow'
|
|
5
5
|
require 'rbbt/workflow/usage'
|
|
6
|
+
require 'rbbt/workflow/remote_workflow'
|
|
6
7
|
require 'rbbt/hpc'
|
|
7
8
|
require 'rbbt/hpc/orchestrate'
|
|
8
9
|
require 'time'
|
|
9
10
|
|
|
11
|
+
rbbt_options = SOPT::GOT_OPTIONS
|
|
12
|
+
|
|
10
13
|
$slurm_options = SOPT.get <<EOF
|
|
11
14
|
-dr--dry_run Print only the template
|
|
12
15
|
-cj--clean_job Clean job
|
|
@@ -46,6 +49,8 @@ EOF
|
|
|
46
49
|
batch_system = $slurm_options.delete :batch_system
|
|
47
50
|
batch_system ||= 'auto'
|
|
48
51
|
|
|
52
|
+
$slurm_options[:config_keys] = SOPT::GOT_OPTIONS[:config_keys]
|
|
53
|
+
|
|
49
54
|
HPC::BATCH_MODULE = HPC.batch_system batch_system
|
|
50
55
|
|
|
51
56
|
raise ParameterException.new("Could not detect batch_system: #{Misc.fingerprint batch_system}") if HPC::BATCH_MODULE.nil?
|
|
@@ -61,7 +66,6 @@ class Step
|
|
|
61
66
|
else
|
|
62
67
|
begin
|
|
63
68
|
Log.debug "Issuing SLURM job for #{self.path}"
|
|
64
|
-
#@batch_job_id, @batch_job_dir = HPC::BATCH_MODULE.orchestrate_job(self, SOPT::GOT_OPTIONS.merge($slurm_options))
|
|
65
69
|
@batch_job_id, @batch_job_dir = HPC::BATCH_MODULE.orchestrate_job(self, $slurm_options)
|
|
66
70
|
if no_load
|
|
67
71
|
self
|
|
@@ -75,6 +79,14 @@ class Step
|
|
|
75
79
|
end
|
|
76
80
|
end
|
|
77
81
|
|
|
78
|
-
|
|
79
|
-
|
|
82
|
+
module RemoteStep::SSH
|
|
83
|
+
|
|
84
|
+
def _run
|
|
85
|
+
RemoteWorkflow::SSH.orchestrate_slurm_job(File.join(base_url, task.to_s), @input_id, @base_name, $slurm_options)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
SOPT.current_options = rbbt_options
|
|
91
|
+
|
|
80
92
|
load Rbbt.share.rbbt_commands.workflow.task.find
|
|
@@ -3,9 +3,12 @@
|
|
|
3
3
|
require 'rbbt/util/simpleopt'
|
|
4
4
|
require 'rbbt/workflow'
|
|
5
5
|
require 'rbbt/workflow/usage'
|
|
6
|
+
require 'rbbt/workflow/remote_workflow'
|
|
6
7
|
require 'rbbt/hpc'
|
|
7
8
|
require 'time'
|
|
8
9
|
|
|
10
|
+
rbbt_options = SOPT::GOT_OPTIONS
|
|
11
|
+
|
|
9
12
|
$slurm_options = SOPT.get <<EOF
|
|
10
13
|
-dr--dry_run Print only the template
|
|
11
14
|
-cj--clean_job Clean job
|
|
@@ -56,12 +59,20 @@ class Step
|
|
|
56
59
|
else
|
|
57
60
|
begin
|
|
58
61
|
Log.debug "Issuing SLURM job for #{self.path}"
|
|
59
|
-
HPC::BATCH_MODULE.run_job(self,
|
|
62
|
+
HPC::BATCH_MODULE.run_job(self, $slurm_options)
|
|
60
63
|
rescue HPC::SBATCH
|
|
61
64
|
end
|
|
62
65
|
end
|
|
63
66
|
end
|
|
64
67
|
end
|
|
65
68
|
|
|
66
|
-
|
|
69
|
+
module RemoteStep::SSH
|
|
70
|
+
|
|
71
|
+
def _run
|
|
72
|
+
RemoteWorkflow::SSH.run_slurm_job(File.join(base_url, task.to_s), @input_id, @base_name, $slurm_options)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
SOPT.current_options = rbbt_options
|
|
67
78
|
load Rbbt.share.rbbt_commands.workflow.task.find
|
|
@@ -46,7 +46,7 @@ if locks.any?
|
|
|
46
46
|
puts
|
|
47
47
|
puts Log.color(:magenta, "Locks:")
|
|
48
48
|
locks.each do |file,info|
|
|
49
|
-
if force or (info[:pid]
|
|
49
|
+
if force or (info[:pid] && ! Misc.pid_exists?(info[:pid]))
|
|
50
50
|
puts " Removing #{ file }"
|
|
51
51
|
File.unlink file
|
|
52
52
|
end
|
|
@@ -547,7 +547,8 @@ if job_file = options.delete(:job_file)
|
|
|
547
547
|
end
|
|
548
548
|
|
|
549
549
|
case res
|
|
550
|
-
when (defined?(WorkflowRemoteClient) and WorkflowRemoteClient::RemoteStep)
|
|
550
|
+
#when (defined?(WorkflowRemoteClient) and WorkflowRemoteClient::RemoteStep)
|
|
551
|
+
when (defined?(RemoteStep) and RemoteStep)
|
|
551
552
|
res = job.result
|
|
552
553
|
if res.respond_to? :gets
|
|
553
554
|
begin
|
|
@@ -598,7 +599,7 @@ when Step
|
|
|
598
599
|
elsif detach
|
|
599
600
|
exit! 0
|
|
600
601
|
else
|
|
601
|
-
|
|
602
|
+
res.join if res.running?
|
|
602
603
|
if %w(float integer string boolean).include?(res.result_type.to_s)
|
|
603
604
|
out.puts res.load
|
|
604
605
|
else
|
data/test/rbbt/hpc/test_batch.rb
CHANGED
|
@@ -6,7 +6,7 @@ Workflow.require_workflow "Sample"
|
|
|
6
6
|
Workflow.require_workflow "HTS"
|
|
7
7
|
class TestSLURM < Test::Unit::TestCase
|
|
8
8
|
|
|
9
|
-
def
|
|
9
|
+
def test_batch_options
|
|
10
10
|
job = Sample.job(:mutect2, "small", :reference => "hg38")
|
|
11
11
|
|
|
12
12
|
TmpFile.with_file do |batch_dir|
|
|
@@ -17,7 +17,7 @@ class TestSLURM < Test::Unit::TestCase
|
|
|
17
17
|
end
|
|
18
18
|
end
|
|
19
19
|
|
|
20
|
-
def
|
|
20
|
+
def test_template
|
|
21
21
|
job = Sample.job(:mutect2, "small", :reference => "hg38")
|
|
22
22
|
|
|
23
23
|
TmpFile.with_file do |batch_dir|
|
|
@@ -28,7 +28,7 @@ class TestSLURM < Test::Unit::TestCase
|
|
|
28
28
|
end
|
|
29
29
|
end
|
|
30
30
|
|
|
31
|
-
def
|
|
31
|
+
def test_template_singularity
|
|
32
32
|
job = Sample.job(:mutect2, "small", :reference => "hg38")
|
|
33
33
|
|
|
34
34
|
TmpFile.with_file do |batch_dir|
|
|
@@ -39,7 +39,7 @@ class TestSLURM < Test::Unit::TestCase
|
|
|
39
39
|
end
|
|
40
40
|
end
|
|
41
41
|
|
|
42
|
-
def
|
|
42
|
+
def test_template_contain
|
|
43
43
|
job = Sample.job(:mutect2, "small", :reference => "hg38")
|
|
44
44
|
|
|
45
45
|
TmpFile.with_file do |batch_dir|
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
require File.join(File.expand_path(File.dirname(__FILE__)), '../../..', 'test_helper.rb')
|
|
2
|
+
require 'rbbt/util/misc/serialize'
|
|
3
|
+
|
|
4
|
+
class TestClass < Test::Unit::TestCase
|
|
5
|
+
def test_load_yaml
|
|
6
|
+
yaml_txt=<<-EOF
|
|
7
|
+
---
|
|
8
|
+
a: b
|
|
9
|
+
EOF
|
|
10
|
+
yaml_sio = StringIO.new yaml_txt
|
|
11
|
+
|
|
12
|
+
assert_equal "b", Misc.load_yaml(yaml_txt)["a"]
|
|
13
|
+
assert_equal "b", Misc.load_yaml(yaml_sio)["a"]
|
|
14
|
+
|
|
15
|
+
TmpFile.with_file yaml_txt do |yaml_file|
|
|
16
|
+
assert_equal "b", Misc.load_yaml(yaml_file)["a"]
|
|
17
|
+
Open.open(yaml_file) do |yaml_io|
|
|
18
|
+
assert_equal "b", Misc.load_yaml(yaml_io)["a"]
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
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.
|
|
4
|
+
version: 5.35.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Miguel Vazquez
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2023-01-23 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rake
|
|
@@ -323,6 +323,7 @@ files:
|
|
|
323
323
|
- lib/rbbt/util/misc/omics.rb
|
|
324
324
|
- lib/rbbt/util/misc/options.rb
|
|
325
325
|
- lib/rbbt/util/misc/pipes.rb
|
|
326
|
+
- lib/rbbt/util/misc/serialize.rb
|
|
326
327
|
- lib/rbbt/util/misc/system.rb
|
|
327
328
|
- lib/rbbt/util/named_array.rb
|
|
328
329
|
- lib/rbbt/util/open.rb
|
|
@@ -559,6 +560,7 @@ files:
|
|
|
559
560
|
- test/rbbt/util/misc/test_multipart_payload.rb
|
|
560
561
|
- test/rbbt/util/misc/test_omics.rb
|
|
561
562
|
- test/rbbt/util/misc/test_pipes.rb
|
|
563
|
+
- test/rbbt/util/misc/test_serialize.rb
|
|
562
564
|
- test/rbbt/util/python/test_util.rb
|
|
563
565
|
- test/rbbt/util/simpleopt/test_get.rb
|
|
564
566
|
- test/rbbt/util/simpleopt/test_parse.rb
|
|
@@ -634,6 +636,7 @@ test_files:
|
|
|
634
636
|
- test/rbbt/util/misc/test_development.rb
|
|
635
637
|
- test/rbbt/util/misc/test_omics.rb
|
|
636
638
|
- test/rbbt/util/misc/test_pipes.rb
|
|
639
|
+
- test/rbbt/util/misc/test_serialize.rb
|
|
637
640
|
- test/rbbt/util/misc/test_format.rb
|
|
638
641
|
- test/rbbt/util/misc/test_communication.rb
|
|
639
642
|
- test/rbbt/util/misc/test_lock.rb
|