rbbt-util 5.26.25 → 5.26.26

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: eea6acf557d41ef03bb50ae2565fd439fe14d931411f50d987d62f03a2c3e237
4
- data.tar.gz: cedb1643ebd4ada535fdc6def7f68d9cacf9baa451fab705d9fcb0ef5b4781c9
3
+ metadata.gz: 1e656caf6f822514da2a5b9bf3b951ea4c5f6178cd8fd6da6059b4a940d7835b
4
+ data.tar.gz: e27dfec559b548efcd10dd9fa676168c330b085b50cdc7628b19c1308ee175fe
5
5
  SHA512:
6
- metadata.gz: 52e1bd11d7624124e339036b89c671f5bb6aac72a7292400587c6233e481a0622d7d1b8f385d0cf7ae412bacd4d55d006868c0ce3148c3b2562283319a54faee
7
- data.tar.gz: 5f41b94e6e1683aa4f7360263581b8e9e0c1fe73a8584b2a3cab944f5c16f3f2ff1b770d1e3ad8c4896f17d62ede5c2e67f46665823a09519be9b1d9a4c602d2
6
+ metadata.gz: e55b8f3c14ac1e581a655deb456a5c373733efe59b9d901134992066f70e4110acd1b9d6752487cf5e8cf83fae0aae7283c7c9a5a6e437f32d97400a498ec7e4
7
+ data.tar.gz: 6b84830391a26b793a531452b76c96e57fc9b00dc937087eec1269ed6f312dfa7aa0ef07aa48930600cc57c8fe1eab63a48a393ff576abe499ad5563f157a582
data/lib/rbbt/hpc.rb CHANGED
@@ -22,6 +22,12 @@ module Marenostrum
22
22
  copy_image = options.delete :copy_image
23
23
  exclusive = options.delete :exclusive
24
24
  highmem = options.delete :highmem
25
+
26
+ queue = options.delete(:queue) || 'bsc_ls'
27
+ task_cpus = options.delete(:task_cpus) || 1
28
+ nodes = options.delete(:nodes) || 1
29
+ time = options.delete(:time) || "0:00:10"
30
+
25
31
  inputs_dir = options.delete :inputs_dir
26
32
  config_keys = options.delete :config_keys
27
33
 
@@ -36,30 +42,40 @@ module Marenostrum
36
42
 
37
43
 
38
44
  name = options[:name] ||= Misc.obj2digest({:options => options.collect{|k,v| [k,v]}.sort_by{|k,v| k.to_s }, :args => args})
39
- workdir = options[:workdir] ||= File.expand_path(File.join('~/rbbt-workdir', name)) if workdir.nil?
45
+ options.delete(:name)
46
+ slurm_basedir = options[:slurm_basedir] ||= File.expand_path(File.join('~/rbbt-slurm', name)) if slurm_basedir.nil?
47
+ options.delete(:slurm_basedir)
40
48
 
41
49
  rbbt_cmd = args.reject{|e| e == '--' }.collect{|e| e.include?(" ")? '"' + e + '"' : e } * " "
42
50
 
51
+ rbbt_cmd += " " << options.collect do |o,v|
52
+ o = o.to_s
53
+ case v
54
+ when TrueClass
55
+ '--' << o
56
+ when FalseClass
57
+ '--' << o << "=false"
58
+ else
59
+ ['--' << o, "'#{v}'"] * " "
60
+ end
61
+ end * " "
62
+
43
63
  rbbt_cmd << " --config_keys='#{config_keys}'" if config_keys and not config_keys.empty?
44
64
 
45
- queue = options[:queue] || 'bsc_ls'
46
- task_cpus = options[:task_cpus] || 1
47
- nodes = options[:nodes] || 1
48
- time = options[:time] || "0:00:10"
49
65
 
50
66
  time = Misc.format_seconds Misc.timespan(time) unless time.include? ":"
51
67
 
52
68
 
53
69
  #{{{ PREPARE LOCAL LOGFILES
54
70
 
55
- Open.mkdir workdir
71
+ Open.mkdir slurm_basedir
56
72
 
57
- fout = File.join(workdir, 'std.out')
58
- ferr = File.join(workdir, 'std.err')
59
- fjob = File.join(workdir, 'job.id')
60
- fexit = File.join(workdir, 'exit.status')
61
- fsync = File.join(workdir, 'sync.log')
62
- fcmd = File.join(workdir, 'command.slurm')
73
+ fout = File.join(slurm_basedir, 'std.out')
74
+ ferr = File.join(slurm_basedir, 'std.err')
75
+ fjob = File.join(slurm_basedir, 'job.id')
76
+ fexit = File.join(slurm_basedir, 'exit.status')
77
+ fsync = File.join(slurm_basedir, 'sync.log')
78
+ fcmd = File.join(slurm_basedir, 'command.slurm')
63
79
 
64
80
  #{{{ GENERATE TEMPLATE
65
81
 
@@ -115,13 +131,17 @@ mkdir -p "$SINGULARITY_RUBY_INLINE"
115
131
 
116
132
  if contain
117
133
  user = ENV['USER'] || `whoami`.strip
134
+ group = File.basename(File.dirname(ENV['HOME']))
135
+ scratch_group_dir = File.join('/gpfs/scratch/', group)
136
+ projects_group_dir = File.join('/gpfs/projects/', group)
137
+
118
138
  env +=<<-EOF
119
139
 
120
140
  # Prepare container dir
121
141
  CONTAINER_DIR="#{contain}"
122
142
  mkdir -p $CONTAINER_DIR/.rbbt/etc/
123
143
 
124
- for dir in .ruby_inline git scratch home projects; do
144
+ for dir in .ruby_inline git home; do
125
145
  mkdir -p $CONTAINER_DIR/$dir
126
146
  done
127
147
 
@@ -140,19 +160,24 @@ echo "group_scratch: $CONTAINER_DIR/scratch/{PKGDIR}/{TOPLEVEL}/{SUBPATH}" >> $C
140
160
  echo "user_projects: $CONTAINER_DIR/projects/#{user}/{PKGDIR}/{TOPLEVEL}/{SUBPATH}" >> $CONTAINER_DIR/.rbbt/etc/search_paths
141
161
  echo "user_scratch: $CONTAINER_DIR/scratch/#{user}/{PKGDIR}/{TOPLEVEL}/{SUBPATH}" >> $CONTAINER_DIR/.rbbt/etc/search_paths
142
162
  echo "/scratch/tmp/rbbt/projects/rbbt/workflows/" > $CONTAINER_DIR/.rbbt/etc/workflow_dir
163
+
164
+ [[ -f "$CONTAINER_DIR/projects" ]] || ln -s '#{projects_group_dir}' "$CONTAINER_DIR/projects"
165
+ [[ -f "$CONTAINER_DIR/scratch" ]] || ln -s '#{scratch_group_dir}' "$CONTAINER_DIR/scratch"
143
166
  EOF
144
167
 
145
168
  if inputs_dir
146
169
  env +=<<-EOF
147
170
 
148
171
  # Copy inputs
149
- cp -R '#{inputs_dir}' $CONTAINER_DIR/inputs
172
+ [[ -d '#{inputs_dir}' ]] && cp -R '#{inputs_dir}' $CONTAINER_DIR/inputs
150
173
  EOF
151
174
  rbbt_cmd = rbbt_cmd.sub(inputs_dir, "#{contain}/inputs")
152
175
  end
153
176
 
154
177
  if copy_image
155
178
  env +=<<EOF
179
+
180
+ # Copy image
156
181
  rsync -avz "$SINGULARITY_IMG" "$CONTAINER_DIR/rbbt.singularity.img"
157
182
  SINGULARITY_IMG="$CONTAINER_DIR/rbbt.singularity.img"
158
183
  EOF
@@ -160,8 +185,11 @@ EOF
160
185
 
161
186
  if wipe_container == "pre" || wipe_container == "both"
162
187
  env +=<<-EOF
188
+
189
+ # Clean container pre
163
190
  singularity exec -e -C -H "$CONTAINER_DIR" "$SINGULARITY_IMG" rm -Rfv .rbbt/var/jobs &>> #{fsync}
164
191
  singularity exec -e -C -H "$CONTAINER_DIR" "$SINGULARITY_IMG" rbbt system clean -f &>> #{fsync}
192
+ singularity exec -e -C -H "$CONTAINER_DIR" "$SINGULARITY_IMG" rm -Rfv tmp/ &>> #{fsync}
165
193
  EOF
166
194
  end
167
195
  end
@@ -171,10 +199,16 @@ EOF
171
199
 
172
200
  if singularity
173
201
  if contain
174
- group = File.basename(File.dirname(ENV['HOME']))
175
- scratch_group_dir = File.join('/gpfs/scratch/', group)
176
- projects_group_dir = File.join('/gpfs/projects/', group)
177
- exec_cmd = %(singularity exec -e -C -H "$CONTAINER_DIR" -B /scratch/tmp -B /apps/ -B "$SINGULARITY_RUBY_INLINE":"$CONTAINER_DIR/.ruby_inline":rw -B ~/git:"$CONTAINER_DIR/git":ro -B #{scratch_group_dir}:"$CONTAINER_DIR/scratch":ro -B ~/.rbbt/software/opt/:"/opt/":ro -B ~/.rbbt:"$CONTAINER_DIR/home/":ro -B #{projects_group_dir}:"$CONTAINER_DIR/projects":ro "$SINGULARITY_IMG" env TMPDIR="$CONTAINER_DIR/.rbbt/tmp" env _JAVA_OPTIONS="-Xms1g -Xmx${MAX_MEMORY}m" rbbt)
202
+ exec_cmd = %(singularity exec -e -C -H "$CONTAINER_DIR" \
203
+ -B /apps/ \
204
+ -B /scratch/tmp \
205
+ -B "$SINGULARITY_RUBY_INLINE":"$CONTAINER_DIR/.ruby_inline":rw \
206
+ -B ~/git:"$CONTAINER_DIR/git":ro \
207
+ -B ~/.rbbt/software/opt/:"/opt/":ro \
208
+ -B ~/.rbbt:"$CONTAINER_DIR/home/":ro \
209
+ -B #{scratch_group_dir} \
210
+ -B #{projects_group_dir} \
211
+ "$SINGULARITY_IMG" env TMPDIR="$CONTAINER_DIR/.rbbt/tmp" env _JAVA_OPTIONS="-Xms1g -Xmx${MAX_MEMORY}m" rbbt)
178
212
  else
179
213
  exec_cmd = %(singularity exec -e -B /apps/ -B "$SINGULARITY_RUBY_INLINE":"$HOME/.ruby_inline":rw "$SINGULARITY_IMG" env _JAVA_OPTIONS="-Xms1g -Xmx${MAX_MEMORY}m" rbbt)
180
214
  end
@@ -213,7 +247,15 @@ singularity exec -e -C -H "$CONTAINER_DIR" "$SINGULARITY_IMG" rbbt system clean
213
247
  EOF
214
248
  end
215
249
 
216
- source = File.join(File.expand_path(contain), '.rbbt/var/jobs')
250
+ if sync.include?("=>")
251
+ source, _sep, sync = sync.partition("=>")
252
+ source = source.strip
253
+ sync = sync.strip
254
+ source = File.join(File.expand_path(contain), source)
255
+ else
256
+ source = File.join(File.expand_path(contain), '.rbbt/var/jobs')
257
+ end
258
+
217
259
  target = File.expand_path(sync)
218
260
  coda +=<<-EOF
219
261
  rsync -avt "#{source}/" "#{target}/" &>> #{fsync}
@@ -227,6 +269,7 @@ singularity exec -e -C -H "$CONTAINER_DIR" "$SINGULARITY_IMG" rbbt system clean
227
269
  singularity exec -e -C -H "$CONTAINER_DIR" "$SINGULARITY_IMG" rm -v /dev/shm/sem.*.{in,out,process} /dev/shm/sem.Session-PID.*.sem 2> /dev/null >> #{fsync}
228
270
  if [ $sync_es == '0' ]; then
229
271
  singularity exec -e -C -H "$CONTAINER_DIR" "$SINGULARITY_IMG" rm -Rfv .rbbt/var/jobs &>> #{fsync}
272
+ singularity exec -e -C -H "$CONTAINER_DIR" "$SINGULARITY_IMG" rm -Rfv tmp/ &>> #{fsync}
230
273
  else
231
274
  echo "WARNING: Results could not sync correctly. Job directory not purged"
232
275
  fi
@@ -248,17 +291,17 @@ EOF
248
291
 
249
292
  def self.issue_template(template, options = {})
250
293
 
251
- workdir = options[:workdir]
252
- Open.mkdir workdir
294
+ slurm_basedir = options[:slurm_basedir]
295
+ Open.mkdir slurm_basedir
253
296
 
254
297
  dry_run = options.delete :dry_run
255
298
 
256
- fout = File.join(workdir, 'std.out')
257
- ferr = File.join(workdir, 'std.err')
258
- fjob = File.join(workdir, 'job.id')
259
- fexit = File.join(workdir, 'exit.status')
260
- fsync = File.join(workdir, 'sync.log')
261
- fcmd = File.join(workdir, 'command.slurm')
299
+ fout = File.join(slurm_basedir, 'std.out')
300
+ ferr = File.join(slurm_basedir, 'std.err')
301
+ fjob = File.join(slurm_basedir, 'job.id')
302
+ fexit = File.join(slurm_basedir, 'exit.status')
303
+ fsync = File.join(slurm_basedir, 'sync.log')
304
+ fcmd = File.join(slurm_basedir, 'command.slurm')
262
305
 
263
306
  job = nil
264
307
  if options[:clean_job]
@@ -279,9 +322,9 @@ EOF
279
322
  if File.exists?(fout)
280
323
  return
281
324
  elsif dry_run
282
- STDERR.puts Log.color(:magenta, "To execute run: ") + Log.color(:blue, "sbatch '#{workdir}/command.slurm'")
283
- STDERR.puts Log.color(:magenta, "To monitor progress run (needs local rbbt): ") + Log.color(:blue, "rbbt mn --tail -w '#{workdir}'")
284
- raise Marenostrum::SBATCH, workdir
325
+ STDERR.puts Log.color(:magenta, "To execute run: ") + Log.color(:blue, "sbatch '#{slurm_basedir}/command.slurm'")
326
+ STDERR.puts Log.color(:magenta, "To monitor progress run (needs local rbbt): ") + Log.color(:blue, "rbbt mn --tail -w '#{slurm_basedir}'")
327
+ raise Marenostrum::SBATCH, slurm_basedir
285
328
  else
286
329
  Open.rm fsync
287
330
  Open.rm fexit
@@ -293,11 +336,11 @@ EOF
293
336
  end
294
337
  end
295
338
 
296
- def self.follow_job(workdir, tail = true)
297
- fjob = File.join(workdir, 'job.id')
298
- fout = File.join(workdir, 'std.out')
299
- ferr = File.join(workdir, 'std.err')
300
- fstatus = File.join(workdir, 'job.status')
339
+ def self.follow_job(slurm_basedir, tail = true)
340
+ fjob = File.join(slurm_basedir, 'job.id')
341
+ fout = File.join(slurm_basedir, 'std.out')
342
+ ferr = File.join(slurm_basedir, 'std.err')
343
+ fstatus = File.join(slurm_basedir, 'job.status')
301
344
 
302
345
  job = Open.read(fjob).strip if Open.exists?(fjob)
303
346
 
@@ -309,6 +352,7 @@ EOF
309
352
  end
310
353
 
311
354
  if tail
355
+ Log.severity = 10
312
356
  while ! File.exists? fout
313
357
  if job
314
358
  STDERR.puts
@@ -356,9 +400,9 @@ EOF
356
400
  end
357
401
  end
358
402
 
359
- def self.wait_for_job(workdir, time = 1)
360
- fexit = File.join(workdir, 'exit.status')
361
- fjob = File.join(workdir, 'job.id')
403
+ def self.wait_for_job(slurm_basedir, time = 1)
404
+ fexit = File.join(slurm_basedir, 'exit.status')
405
+ fjob = File.join(slurm_basedir, 'job.id')
362
406
  job = Open.read(fjob) if Open.exists?(fjob)
363
407
 
364
408
 
@@ -368,33 +412,34 @@ EOF
368
412
  end
369
413
 
370
414
  def self.run_job(job, options = {})
415
+ options = IndiferentHash.setup(options.dup)
416
+
417
+ dry_run = options.delete :dry_run
418
+
371
419
  workflow = job.workflow
372
420
  task = job.task_name
373
- name = job.clean_name
374
- keep_workdir = options.delete :keep_SLURM_workdir
421
+
422
+ keep_slurm_basedir = options.delete :keep_SLURM_slurm_basedir
375
423
  slurm_basedir = options.delete :SLURM_basedir
376
- slurm_basedir = "~/rbbt-workdir" if slurm_basedir.nil?
377
- TmpFile.with_file(nil, !keep_workdir, :tmpdir => slurm_basedir, :prefix => "SLURM_rbbt_job-") do |tmp_directory|
378
- workdir = options[:workdir] ||= File.join(tmp_directory, 'workdir')
424
+ slurm_basedir = "~/rbbt-slurm" if slurm_basedir.nil?
425
+ TmpFile.with_file(nil, !keep_slurm_basedir, :tmpdir => slurm_basedir, :prefix => "SLURM_rbbt_job-") do |tmp_directory|
426
+ options[:slurm_basedir] ||= File.join(tmp_directory, 'workdir')
427
+ slurm_basedir = options[:slurm_basedir]
379
428
  inputs_dir = File.join(tmp_directory, 'inputs_dir')
380
429
  Step.save_job_inputs(job, inputs_dir)
381
430
  options[:inputs_dir] = inputs_dir
382
- cmd = ['workflow', 'task', workflow.to_s, task.to_s, '-pf', '-jn', name, '--load_inputs', inputs_dir, '--log', (options[:log] || Log.severity).to_s]
431
+ cmd = ['workflow', 'task', workflow.to_s, task.to_s, '-pf', '--load_inputs', inputs_dir, '--log', (options[:log] || Log.severity).to_s]
383
432
 
384
- %w(workflows requires remote_workflow_tasks override_deps).each do |key|
385
- next unless options[key]
386
- cmd += ["--#{key.to_s}", options[key]]
387
- end
388
433
 
389
434
  template = self.template(cmd, options)
390
- self.issue_template(template, options)
435
+ self.issue_template(template, options.merge(:slurm_basedir => slurm_basedir, :dry_run => dry_run))
391
436
  t_monitor = Thread.new do
392
- self.follow_job(workdir, :STDERR)
437
+ self.follow_job(slurm_basedir, :STDERR)
393
438
  end
394
- self.wait_for_job(workdir)
439
+ self.wait_for_job(slurm_basedir)
395
440
  t_monitor.raise Aborted
396
- return unless Open.read(File.join(workdir, 'exit.status')).strip == '0'
397
- path = Open.read(File.join(workdir, 'std.out')).strip
441
+ return unless Open.read(File.join(slurm_basedir, 'exit.status')).strip == '0'
442
+ path = Open.read(File.join(slurm_basedir, 'std.out')).strip
398
443
  if Open.exists?(path) && job.path != path
399
444
  Log.info "Path of SLURM job #{path} is different from original job #{job.path}. Stablishing link."
400
445
  Open.ln path, job.path
@@ -139,7 +139,7 @@ class Step
139
139
 
140
140
  dep.inputs.zip(dep.inputs.fields).each do |v,f|
141
141
  if i.include?(f) && i[f] != v
142
- Log.debug "Conflict in #{ f }: #{[i[f].inspect, v.inspect] * " <-> "}"
142
+ Log.debug "Conflict in #{ f }: #{[Misc.fingerprint(i[f]), Misc.fingerprint(v)] * " <-> "}"
143
143
  i[f] = nil
144
144
  else
145
145
  i[f] = v
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.26.25
4
+ version: 5.26.26
5
5
  platform: ruby
6
6
  authors:
7
7
  - Miguel Vazquez
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-07-05 00:00:00.000000000 Z
11
+ date: 2019-07-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake