autoflow 0.9.6 → 0.9.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/AutoFlow +1 -2
- data/bin/flow_logger +0 -3
- data/lib/autoflow/queue_manager.rb +11 -5
- data/lib/autoflow/queue_managers/slurm2_manager.rb +66 -0
- data/lib/autoflow/queue_managers/slurm_manager.rb +10 -5
- data/lib/autoflow/stack.rb +2 -7
- data/lib/autoflow/version.rb +1 -1
- data/lib/autoflow.rb +4 -0
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 03720c11e2c6d967b2907823e0de305e34f8e141a792f6f4291ce6db41b3083b
|
4
|
+
data.tar.gz: cf00a1b7ef0f26e6a82c4044792d68b8e66783efe652bff50956c6c706bfa785
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6feeef52e7c4e92f630c2ad9e01d3d08b056a588c562fb87cae587e58dcf213fda8b86e7e61d72df6b507827ec6cb48360c25a3ce8e56fb2c4ed9be899057d52
|
7
|
+
data.tar.gz: 1b27d3309c7e1a30a2e31f01dde55b7b35d9be32bf4ef13c683b002941df60f61bb6385bb57bc6e226325c863f6eceae21170e5d8797f5e2623608da65bf48ce
|
data/bin/AutoFlow
CHANGED
@@ -9,7 +9,7 @@ require 'optparse'
|
|
9
9
|
require 'autoflow'
|
10
10
|
require 'io/console'
|
11
11
|
require 'net/ssh'
|
12
|
-
require 'queue_manager'
|
12
|
+
#require 'queue_manager'
|
13
13
|
require 'fileutils'
|
14
14
|
require 'git'
|
15
15
|
|
@@ -347,7 +347,6 @@ if !options[:graph].nil?
|
|
347
347
|
stack.draw(template_file, options[:graph])
|
348
348
|
else
|
349
349
|
stack.inspect if options[:verbose]
|
350
|
-
stack.comment_main_command if options[:comment]
|
351
350
|
options[:write_sh] = true # Set in flow logger to FALSE, it is used for relaunch failed jobs
|
352
351
|
manager = QueueManager.select_queue_manager(stack.exec_folder, options, stack.jobs, stack.persist_variables)
|
353
352
|
manager.exec
|
data/bin/flow_logger
CHANGED
@@ -7,11 +7,8 @@ $: << File.expand_path(File.join(ROOT_PATH, "..", "lib", "autoflow", "queue_mana
|
|
7
7
|
require 'autoflow'
|
8
8
|
require 'optparse'
|
9
9
|
require 'colorize'
|
10
|
-
require 'logging'
|
11
10
|
require 'json'
|
12
11
|
require 'terminal-table'
|
13
|
-
require 'queue_manager'
|
14
|
-
require 'program'
|
15
12
|
require 'erb'
|
16
13
|
|
17
14
|
#################################################################################################
|
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'logging'
|
2
1
|
require 'json'
|
3
2
|
class QueueManager
|
4
3
|
|
@@ -16,6 +15,7 @@ class QueueManager
|
|
16
15
|
@external_dependencies = options[:external_dependencies]
|
17
16
|
@active_jobs = []
|
18
17
|
@extended_logging = options[:extended_logging]
|
18
|
+
@comment = options[:comment]
|
19
19
|
end
|
20
20
|
|
21
21
|
########################################################################################
|
@@ -36,6 +36,7 @@ class QueueManager
|
|
36
36
|
else
|
37
37
|
queue_manager = select_manager(options)
|
38
38
|
end
|
39
|
+
warn("Selected queue manager: #{queue_manager}")
|
39
40
|
return queue_manager.new(exec_folder, options, jobs, persist_variables)
|
40
41
|
end
|
41
42
|
|
@@ -268,12 +269,17 @@ class QueueManager
|
|
268
269
|
|
269
270
|
def write_job(job, sh_name)
|
270
271
|
write_file(sh_name, job.initialization) if !job.initialization.nil?
|
271
|
-
if @
|
272
|
-
|
272
|
+
if @comment
|
273
|
+
cmd = '#' + job.parameters
|
273
274
|
else
|
274
|
-
|
275
|
+
if @extended_logging
|
276
|
+
log_command = '/usr/bin/time -o process_data -v '
|
277
|
+
else
|
278
|
+
log_command = 'time '
|
279
|
+
end
|
280
|
+
cmd = log_command + job.parameters
|
275
281
|
end
|
276
|
-
write_file(sh_name,
|
282
|
+
write_file(sh_name, cmd)
|
277
283
|
end
|
278
284
|
|
279
285
|
def get_dependencies(job, id = nil)
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'queue_manager'
|
2
|
+
class SlurmManager2 < QueueManager
|
3
|
+
# SLURM 20 or greater
|
4
|
+
def parse_additional_options(string, attribs)
|
5
|
+
expresions = %w[%C %T %M %N ]
|
6
|
+
values = [attribs[:cpu], attribs[:time], attribs[:mem], attribs[:node]]
|
7
|
+
new_string = string.dup
|
8
|
+
expresions.each_with_index do |exp, i|
|
9
|
+
new_string.gsub!(exp, "#{values[i]}")
|
10
|
+
end
|
11
|
+
return new_string
|
12
|
+
end
|
13
|
+
|
14
|
+
def write_header(id, job, sh_name)
|
15
|
+
if !job.attrib[:ntask]
|
16
|
+
write_file(sh_name, "#SBATCH --cpus-per-task=#{job.attrib[:cpu]}")
|
17
|
+
else
|
18
|
+
write_file(sh_name, "#SBATCH --ntasks=#{job.attrib[:cpu]}")
|
19
|
+
write_file(sh_name, "#SBATCH --nodes=#{job.attrib[:multinode]}") if job.attrib[:multinode] > 0
|
20
|
+
end
|
21
|
+
write_file(sh_name, "#SBATCH --mem=#{job.attrib[:mem]}")
|
22
|
+
write_file(sh_name, "#SBATCH --time=#{job.attrib[:time]}")
|
23
|
+
write_file(sh_name, "#SBATCH --constraint=#{job.attrib[:node]}") if !job.attrib[:node].nil?
|
24
|
+
write_file(sh_name, '#SBATCH --error=job.%J.err')
|
25
|
+
write_file(sh_name, '#SBATCH --output=job.%J.out')
|
26
|
+
write_file(sh_name, "#SBATCH --#{job.attrib[:additional_job_options][0]}=#{parse_additional_options(job.attrib[:additional_job_options][1], job.attrib)}") if !job.attrib[:additional_job_options].nil?
|
27
|
+
if job.attrib[:ntask]
|
28
|
+
write_file(sh_name, 'srun hostname -s > workers') if job.attrib[:cpu_asign] == 'list'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
def submit_job(job, ar_dependencies)
|
34
|
+
final_dep = get_all_deps(ar_dependencies)
|
35
|
+
dependencies = nil
|
36
|
+
dependencies='--dependency=afterok:'+final_dep.join(':') if !final_dep.empty?
|
37
|
+
cmd = "sbatch #{dependencies} #{job.name}.sh"
|
38
|
+
STDOUT.puts cmd if @show_submit
|
39
|
+
queue_id = get_queue_system_id(system_call(cmd, job.attrib[:exec_folder]))
|
40
|
+
return queue_id
|
41
|
+
end
|
42
|
+
|
43
|
+
def get_queue_system_id(shell_output)
|
44
|
+
queue_id = nil
|
45
|
+
shell_output.chomp!
|
46
|
+
shell_output =~ /Submitted batch job (\d+)/
|
47
|
+
queue_id = $1
|
48
|
+
raise("A queue id cannot be obtained. The queue manager has given this message:#{shell_output}") if queue_id.nil?
|
49
|
+
return queue_id
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.available?(options)
|
53
|
+
available = false
|
54
|
+
shell_output = system_call("type 'sbatch'", nil, options[:remote], options[:ssh])
|
55
|
+
if !shell_output.empty?
|
56
|
+
shell_output = system_call("sbatch --version", nil, options[:remote], options[:ssh])
|
57
|
+
slurm_version = shell_output.split(' ').last.split('.').first.to_i # "slurm 17.11.4"
|
58
|
+
available = true if slurm_version >= 20
|
59
|
+
end
|
60
|
+
return available
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.priority
|
64
|
+
return 100
|
65
|
+
end
|
66
|
+
end
|
@@ -42,19 +42,24 @@ class SlurmManager < QueueManager
|
|
42
42
|
def get_queue_system_id(shell_output)
|
43
43
|
queue_id = nil
|
44
44
|
shell_output.chomp!
|
45
|
-
|
46
|
-
queue_id =
|
45
|
+
shell_output =~ /Submitted batch job (\d+)/
|
46
|
+
queue_id = $1
|
47
|
+
raise("A queue id cannot be obtained. The queue manager has given this message:#{shell_output}") if queue_id.nil?
|
47
48
|
return queue_id
|
48
49
|
end
|
49
50
|
|
50
51
|
def self.available?(options)
|
51
|
-
available =
|
52
|
+
available = false
|
52
53
|
shell_output = system_call("type 'sbatch'", nil, options[:remote], options[:ssh])
|
53
|
-
|
54
|
+
if !shell_output.empty?
|
55
|
+
shell_output = system_call("sbatch --version", nil, options[:remote], options[:ssh])
|
56
|
+
slurm_version = shell_output.split(' ').last.split('.').first.to_i # "slurm 17.11.4"
|
57
|
+
available = true if slurm_version < 20
|
58
|
+
end
|
54
59
|
return available
|
55
60
|
end
|
56
61
|
|
57
62
|
def self.priority
|
58
|
-
return
|
63
|
+
return 120
|
59
64
|
end
|
60
65
|
end
|
data/lib/autoflow/stack.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
require 'program'
|
2
|
-
require 'batch'
|
1
|
+
#require 'program'
|
2
|
+
#require 'batch'
|
3
3
|
|
4
4
|
require 'win32console' if !ENV['OS'].nil? && ENV['OS'].downcase.include?('windows')
|
5
5
|
require 'colorize'
|
@@ -225,11 +225,6 @@ class Stack
|
|
225
225
|
return hash
|
226
226
|
end
|
227
227
|
|
228
|
-
def comment_main_command
|
229
|
-
@jobs.each do |name, job|
|
230
|
-
job.parameters = "##{job.parameters}"
|
231
|
-
end
|
232
|
-
end
|
233
228
|
##########################################################################################
|
234
229
|
## WORKFLOW REPRESENTATION
|
235
230
|
##########################################################################################
|
data/lib/autoflow/version.rb
CHANGED
data/lib/autoflow.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: autoflow
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pedro Seoane
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-03-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: net-ssh
|
@@ -136,6 +136,7 @@ files:
|
|
136
136
|
- lib/autoflow/program.rb
|
137
137
|
- lib/autoflow/queue_manager.rb
|
138
138
|
- lib/autoflow/queue_managers/bash_manager.rb
|
139
|
+
- lib/autoflow/queue_managers/slurm2_manager.rb
|
139
140
|
- lib/autoflow/queue_managers/slurm_manager.rb
|
140
141
|
- lib/autoflow/stack.rb
|
141
142
|
- lib/autoflow/version.rb
|
@@ -160,7 +161,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
160
161
|
- !ruby/object:Gem::Version
|
161
162
|
version: '0'
|
162
163
|
requirements: []
|
163
|
-
rubygems_version: 3.2.
|
164
|
+
rubygems_version: 3.2.15
|
164
165
|
signing_key:
|
165
166
|
specification_version: 4
|
166
167
|
summary: '"This gem take a pipeline and launch it on a queue system"'
|