autoflow 0.9.2 → 0.9.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/autoflow.gemspec +5 -5
- data/bin/AutoFlow +6 -2
- data/bin/flow_logger +9 -3
- data/lib/autoflow/queue_manager.rb +14 -2
- 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 +6 -9
- data/lib/autoflow/version.rb +1 -1
- data/lib/autoflow.rb +4 -0
- metadata +21 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
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/autoflow.gemspec
CHANGED
@@ -19,11 +19,11 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
21
|
spec.add_runtime_dependency 'net-ssh', '>= 2.8.0'
|
22
|
-
spec.add_runtime_dependency 'git', '>=
|
22
|
+
spec.add_runtime_dependency 'git', '>= 0.8.1'
|
23
23
|
spec.add_runtime_dependency 'win32console', '>= 1.3.2' if !ENV['OS'].nil? && ENV['OS'].downcase.include?('windows')
|
24
|
-
spec.add_runtime_dependency 'colorize', '
|
25
|
-
spec.add_runtime_dependency 'terminal-table', '
|
26
|
-
spec.add_runtime_dependency 'openssl', '>= 2.0
|
27
|
-
spec.add_development_dependency "bundler", "
|
24
|
+
spec.add_runtime_dependency 'colorize', '>= 0.7.3'
|
25
|
+
spec.add_runtime_dependency 'terminal-table', '>= 2.0.0'
|
26
|
+
spec.add_runtime_dependency 'openssl', '>= 2.2.0'
|
27
|
+
spec.add_development_dependency "bundler", ">= 2.2.7"
|
28
28
|
spec.add_development_dependency "rake"
|
29
29
|
end
|
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
|
|
@@ -108,6 +108,11 @@ optparse = OptionParser.new do |opts|
|
|
108
108
|
options[:external_dependencies] = external_dependencies.split(',')
|
109
109
|
end
|
110
110
|
|
111
|
+
options[:extended_logging] = false
|
112
|
+
opts.on( '-e', '--extended_logging', 'If set the command /usr/bin/time will be used instead of shell built-in version. Data will be saved in process_data file of task folder' ) do
|
113
|
+
options[:extended_logging] = true
|
114
|
+
end
|
115
|
+
|
111
116
|
options[:retry] = false
|
112
117
|
opts.on( '-f', '--force', 'Execute all jobs, including any job commented with %' ) do
|
113
118
|
options[:retry] = true
|
@@ -342,7 +347,6 @@ if !options[:graph].nil?
|
|
342
347
|
stack.draw(template_file, options[:graph])
|
343
348
|
else
|
344
349
|
stack.inspect if options[:verbose]
|
345
|
-
stack.comment_main_command if options[:comment]
|
346
350
|
options[:write_sh] = true # Set in flow logger to FALSE, it is used for relaunch failed jobs
|
347
351
|
manager = QueueManager.select_queue_manager(stack.exec_folder, options, stack.jobs, stack.persist_variables)
|
348
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
|
#################################################################################################
|
@@ -296,6 +293,15 @@ OptionParser.new do |opts|
|
|
296
293
|
opts.on("-H", "--html", "Make a workflow execution full report in html format") do |opt|
|
297
294
|
options[:html] = true
|
298
295
|
end
|
296
|
+
|
297
|
+
# Set a banner, displayed at the top of the help screen.
|
298
|
+
opts.banner = "Usage: flow_logger [options] \n\n"
|
299
|
+
|
300
|
+
# This displays the help screen
|
301
|
+
opts.on( '-h', '--help', 'Display this screen' ) do
|
302
|
+
puts opts
|
303
|
+
exit
|
304
|
+
end
|
299
305
|
end.parse!
|
300
306
|
|
301
307
|
#################################################################################################
|
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'logging'
|
2
1
|
require 'json'
|
3
2
|
class QueueManager
|
4
3
|
|
@@ -15,6 +14,8 @@ class QueueManager
|
|
15
14
|
@write_sh = options[:write_sh]
|
16
15
|
@external_dependencies = options[:external_dependencies]
|
17
16
|
@active_jobs = []
|
17
|
+
@extended_logging = options[:extended_logging]
|
18
|
+
@comment = options[:comment]
|
18
19
|
end
|
19
20
|
|
20
21
|
########################################################################################
|
@@ -35,6 +36,7 @@ class QueueManager
|
|
35
36
|
else
|
36
37
|
queue_manager = select_manager(options)
|
37
38
|
end
|
39
|
+
warn("Selected queue manager: #{queue_manager}")
|
38
40
|
return queue_manager.new(exec_folder, options, jobs, persist_variables)
|
39
41
|
end
|
40
42
|
|
@@ -267,7 +269,17 @@ class QueueManager
|
|
267
269
|
|
268
270
|
def write_job(job, sh_name)
|
269
271
|
write_file(sh_name, job.initialization) if !job.initialization.nil?
|
270
|
-
|
272
|
+
if @comment
|
273
|
+
cmd = '#' + job.parameters
|
274
|
+
else
|
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
|
281
|
+
end
|
282
|
+
write_file(sh_name, cmd)
|
271
283
|
end
|
272
284
|
|
273
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'
|
@@ -77,8 +77,10 @@ class Stack
|
|
77
77
|
line.gsub!(/\s/,'')
|
78
78
|
pairs = line.split(',')
|
79
79
|
pairs.each do |pair|
|
80
|
-
pair =~ /(.+)=(.+)/
|
81
|
-
variable_type[$1] = $2
|
80
|
+
#pair =~ /(.+)=(.+)/
|
81
|
+
#variable_type[$1] = $2
|
82
|
+
var, value = pair.split('=', 2)
|
83
|
+
variable_type[var] = value
|
82
84
|
end
|
83
85
|
end
|
84
86
|
end
|
@@ -223,11 +225,6 @@ class Stack
|
|
223
225
|
return hash
|
224
226
|
end
|
225
227
|
|
226
|
-
def comment_main_command
|
227
|
-
@jobs.each do |name, job|
|
228
|
-
job.parameters = "##{job.parameters}"
|
229
|
-
end
|
230
|
-
end
|
231
228
|
##########################################################################################
|
232
229
|
## WORKFLOW REPRESENTATION
|
233
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
|
-
autorequire:
|
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
|
@@ -30,70 +30,70 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 0.8.1
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 0.8.1
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: colorize
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: 0.7.3
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 0.7.3
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: terminal-table
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: 2.0.0
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
68
|
+
version: 2.0.0
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: openssl
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: 2.0
|
75
|
+
version: 2.2.0
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: 2.0
|
82
|
+
version: 2.2.0
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: bundler
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- - "
|
87
|
+
- - ">="
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version:
|
89
|
+
version: 2.2.7
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- - "
|
94
|
+
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version:
|
96
|
+
version: 2.2.7
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: rake
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -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
|
@@ -145,7 +146,7 @@ homepage: ''
|
|
145
146
|
licenses:
|
146
147
|
- MIT
|
147
148
|
metadata: {}
|
148
|
-
post_install_message:
|
149
|
+
post_install_message:
|
149
150
|
rdoc_options: []
|
150
151
|
require_paths:
|
151
152
|
- lib
|
@@ -160,9 +161,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
160
161
|
- !ruby/object:Gem::Version
|
161
162
|
version: '0'
|
162
163
|
requirements: []
|
163
|
-
|
164
|
-
|
165
|
-
signing_key:
|
164
|
+
rubygems_version: 3.2.15
|
165
|
+
signing_key:
|
166
166
|
specification_version: 4
|
167
167
|
summary: '"This gem take a pipeline and launch it on a queue system"'
|
168
168
|
test_files:
|