scout-gear 10.11.4 → 10.11.7
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/.vimproject +17 -2
- data/VERSION +1 -1
- data/bin/scout +10 -10
- data/lib/scout/association/fields.rb +15 -15
- data/lib/scout/association/index.rb +6 -6
- data/lib/scout/association/item.rb +18 -8
- data/lib/scout/association.rb +4 -4
- data/lib/scout/entity/identifiers.rb +5 -5
- data/lib/scout/entity/property.rb +2 -2
- data/lib/scout/entity.rb +1 -1
- data/lib/scout/knowledge_base/description.rb +10 -10
- data/lib/scout/knowledge_base/entity.rb +6 -6
- data/lib/scout/knowledge_base/list.rb +1 -1
- data/lib/scout/knowledge_base/query.rb +4 -4
- data/lib/scout/knowledge_base/registry.rb +6 -6
- data/lib/scout/knowledge_base/traverse.rb +7 -40
- data/lib/scout/persist/engine/fix_width_table.rb +6 -6
- data/lib/scout/persist/engine/packed_index.rb +2 -2
- data/lib/scout/persist/engine/sharder.rb +4 -4
- data/lib/scout/persist/engine/tkrzw.rb +1 -1
- data/lib/scout/persist/engine/tokyocabinet.rb +2 -2
- data/lib/scout/persist/tsv/adapter/fix_width_table.rb +1 -1
- data/lib/scout/persist/tsv/adapter/packed_index.rb +1 -1
- data/lib/scout/persist/tsv/adapter/tkrzw.rb +1 -1
- data/lib/scout/persist/tsv/adapter/tokyocabinet.rb +3 -3
- data/lib/scout/persist/tsv/serialize.rb +3 -3
- data/lib/scout/persist/tsv.rb +1 -1
- data/lib/scout/semaphore.rb +100 -17
- data/lib/scout/tsv/annotation/repo.rb +4 -4
- data/lib/scout/tsv/annotation.rb +2 -2
- data/lib/scout/tsv/attach.rb +7 -7
- data/lib/scout/tsv/change_id/translate.rb +1 -1
- data/lib/scout/tsv/csv.rb +3 -3
- data/lib/scout/tsv/dumper.rb +8 -8
- data/lib/scout/tsv/index.rb +1 -1
- data/lib/scout/tsv/open.rb +3 -3
- data/lib/scout/tsv/stream.rb +2 -2
- data/lib/scout/tsv/traverse.rb +4 -4
- data/lib/scout/tsv/util/filter.rb +9 -9
- data/lib/scout/tsv/util/process.rb +2 -2
- data/lib/scout/tsv/util/reorder.rb +2 -2
- data/lib/scout/tsv/util/select.rb +3 -3
- data/lib/scout/tsv/util/unzip.rb +2 -2
- data/lib/scout/tsv/util.rb +1 -1
- data/lib/scout/tsv.rb +2 -2
- data/lib/scout/work_queue/socket.rb +3 -2
- data/lib/scout/work_queue/worker.rb +4 -4
- data/lib/scout/work_queue.rb +7 -7
- data/lib/scout/workflow/definition.rb +18 -16
- data/lib/scout/workflow/deployment/local.rb +81 -62
- data/lib/scout/workflow/deployment/orchestrator/batches.rb +66 -5
- data/lib/scout/workflow/deployment/orchestrator/chains.rb +47 -30
- data/lib/scout/workflow/deployment/orchestrator/rules.rb +3 -3
- data/lib/scout/workflow/deployment/orchestrator/workload.rb +11 -22
- data/lib/scout/workflow/deployment/scheduler/job.rb +34 -36
- data/lib/scout/workflow/deployment/scheduler/lfs.rb +1 -1
- data/lib/scout/workflow/deployment/scheduler/pbs.rb +4 -4
- data/lib/scout/workflow/deployment/scheduler/slurm.rb +2 -2
- data/lib/scout/workflow/deployment/scheduler.rb +23 -12
- data/lib/scout/workflow/deployment/trace.rb +2 -2
- data/lib/scout/workflow/documentation.rb +4 -4
- data/lib/scout/workflow/export.rb +1 -1
- data/lib/scout/workflow/path.rb +2 -2
- data/lib/scout/workflow/step/children.rb +1 -1
- data/lib/scout/workflow/step/dependencies.rb +36 -3
- data/lib/scout/workflow/step/info.rb +5 -19
- data/lib/scout/workflow/step/inputs.rb +1 -1
- data/lib/scout/workflow/step/progress.rb +2 -2
- data/lib/scout/workflow/step/provenance.rb +4 -4
- data/lib/scout/workflow/step/status.rb +23 -9
- data/lib/scout/workflow/step.rb +21 -19
- data/lib/scout/workflow/task/dependencies.rb +10 -3
- data/lib/scout/workflow/task/info.rb +3 -3
- data/lib/scout/workflow/task/inputs.rb +8 -8
- data/lib/scout/workflow/task.rb +37 -22
- data/lib/scout/workflow/usage.rb +13 -13
- data/lib/scout/workflow/util.rb +1 -1
- data/lib/scout/workflow.rb +6 -6
- data/scout-gear.gemspec +4 -3
- data/scout_commands/alias +1 -1
- data/scout_commands/batch/clean +12 -12
- data/scout_commands/batch/list +26 -25
- data/scout_commands/batch/tail +9 -5
- data/scout_commands/cat +1 -1
- data/scout_commands/doc +2 -2
- data/scout_commands/entity +4 -4
- data/scout_commands/find +1 -1
- data/scout_commands/kb/config +1 -1
- data/scout_commands/kb/entities +1 -1
- data/scout_commands/kb/list +1 -1
- data/scout_commands/kb/query +2 -2
- data/scout_commands/kb/register +1 -1
- data/scout_commands/kb/show +1 -1
- data/scout_commands/kb/traverse +1 -1
- data/scout_commands/log +6 -6
- data/scout_commands/resource/produce +2 -2
- data/scout_commands/resource/sync +1 -1
- data/scout_commands/system/clean +7 -7
- data/scout_commands/system/status +4 -4
- data/scout_commands/template +1 -1
- data/scout_commands/update +1 -1
- data/scout_commands/workflow/cmd +2 -1
- data/scout_commands/workflow/example +123 -0
- data/scout_commands/workflow/info +10 -1
- data/scout_commands/workflow/install +1 -1
- data/scout_commands/workflow/list +2 -2
- data/scout_commands/workflow/process +2 -2
- data/scout_commands/workflow/prov +3 -3
- data/scout_commands/workflow/task +36 -11
- data/scout_commands/workflow/trace +1 -1
- data/scout_commands/workflow/write_info +2 -2
- data/share/templates/command +1 -1
- data/test/scout/association/test_item.rb +5 -0
- data/test/scout/entity/test_property.rb +3 -3
- data/test/scout/knowledge_base/test_description.rb +1 -1
- data/test/scout/knowledge_base/test_traverse.rb +2 -2
- data/test/scout/persist/engine/test_packed_index.rb +6 -6
- data/test/scout/persist/test_tsv.rb +4 -4
- data/test/scout/persist/tsv/adapter/test_packed_index.rb +4 -4
- data/test/scout/persist/tsv/adapter/test_sharder.rb +23 -23
- data/test/scout/persist/tsv/adapter/test_tokyocabinet.rb +1 -1
- data/test/scout/persist/tsv/test_serialize.rb +1 -1
- data/test/scout/test_association.rb +1 -1
- data/test/scout/test_tsv.rb +2 -2
- data/test/scout/test_workflow.rb +2 -2
- data/test/scout/tsv/test_annotation.rb +4 -4
- data/test/scout/tsv/test_index.rb +1 -1
- data/test/scout/tsv/test_open.rb +2 -2
- data/test/scout/tsv/test_parser.rb +2 -2
- data/test/scout/tsv/test_stream.rb +1 -1
- data/test/scout/tsv/test_transformer.rb +1 -1
- data/test/scout/tsv/util/test_filter.rb +1 -1
- data/test/scout/tsv/util/test_melt.rb +1 -1
- data/test/scout/tsv/util/test_reorder.rb +1 -1
- data/test/scout/work_queue/test_socket.rb +3 -3
- data/test/scout/work_queue/test_worker.rb +2 -2
- data/test/scout/workflow/deployment/orchestrator/test_batches.rb +13 -3
- data/test/scout/workflow/deployment/orchestrator/test_chains.rb +15 -13
- data/test/scout/workflow/deployment/orchestrator/test_workload.rb +1 -1
- data/test/scout/workflow/deployment/test_local.rb +2 -2
- data/test/scout/workflow/deployment/test_scheduler.rb +1 -2
- data/test/scout/workflow/step/test_children.rb +1 -1
- data/test/scout/workflow/step/test_dependencies.rb +36 -1
- data/test/scout/workflow/step/test_info.rb +3 -35
- data/test/scout/workflow/step/test_load.rb +1 -1
- data/test/scout/workflow/step/test_provenance.rb +1 -1
- data/test/scout/workflow/step/test_status.rb +33 -1
- data/test/scout/workflow/task/test_dependencies.rb +9 -7
- data/test/scout/workflow/task/test_inputs.rb +1 -1
- data/test/scout/workflow/test_definition.rb +1 -1
- data/test/scout/workflow/test_documentation.rb +1 -1
- data/test/scout/workflow/test_entity.rb +2 -2
- data/test/scout/workflow/test_step.rb +13 -13
- data/test/scout/workflow/test_usage.rb +1 -1
- data/test/test_helper.rb +1 -1
- metadata +3 -2
data/lib/scout/workflow/task.rb
CHANGED
|
@@ -44,10 +44,23 @@ module Task
|
|
|
44
44
|
|
|
45
45
|
memory_inputs = nil if Array === memory_inputs && memory_inputs.compact.empty?
|
|
46
46
|
memory_inputs = nil if Hash === memory_inputs && memory_inputs.empty?
|
|
47
|
-
Persist.memory("Task job #{self.name}", repo: Workflow.job_cache, other: {task: self.name, id: id, provided_inputs: memory_inputs}) do
|
|
47
|
+
Persist.memory("Task job #{self.name}", repo: Workflow.job_cache, other: {workflow: self.workflow, task: self.name, id: id, provided_inputs: memory_inputs}) do
|
|
48
|
+
|
|
49
|
+
#{{{ Provided inputs and ID
|
|
48
50
|
provided_inputs, id = id, nil if (provided_inputs.nil? || provided_inputs.empty?) && (Hash === id || Array === id)
|
|
49
51
|
provided_inputs = {} if provided_inputs.nil?
|
|
50
|
-
IndiferentHash.setup(provided_inputs)
|
|
52
|
+
IndiferentHash.setup(provided_inputs) if Hash === provided_inputs
|
|
53
|
+
|
|
54
|
+
provided_inputs = load_inputs(provided_inputs.delete(:load_inputs)).merge(provided_inputs) if Hash === provided_inputs && provided_inputs[:load_inputs]
|
|
55
|
+
|
|
56
|
+
provided_input_names = case provided_inputs
|
|
57
|
+
when nil
|
|
58
|
+
[]
|
|
59
|
+
when Array
|
|
60
|
+
inputs.collect{|name,*| name }[0..provided_inputs.length]
|
|
61
|
+
when Hash
|
|
62
|
+
provided_inputs.keys
|
|
63
|
+
end
|
|
51
64
|
|
|
52
65
|
jobname_input = nil
|
|
53
66
|
inputs.each do |name,type,desc,default,input_options|
|
|
@@ -56,12 +69,14 @@ module Task
|
|
|
56
69
|
end
|
|
57
70
|
|
|
58
71
|
id = provided_inputs[jobname_input] if jobname_input && id.nil?
|
|
59
|
-
|
|
72
|
+
id = DEFAULT_NAME if id.nil?
|
|
73
|
+
id = Path.sanitize_filename(id, 150)
|
|
60
74
|
|
|
75
|
+
#{{{ Missing inputs
|
|
61
76
|
missing_inputs = []
|
|
62
77
|
self.inputs.each do |input,type,desc,val,options|
|
|
63
78
|
next unless options && options[:required]
|
|
64
|
-
missing_inputs << input unless
|
|
79
|
+
missing_inputs << input unless provided_input_names.include?(input.to_s) || provided_input_names.include?(input.to_sym)
|
|
65
80
|
end if self.inputs
|
|
66
81
|
|
|
67
82
|
if missing_inputs.length == 1
|
|
@@ -72,25 +87,32 @@ module Task
|
|
|
72
87
|
raise ParameterException, "Inputs #{Misc.humanize_list(missing_inputs)} are required but were not provided or are nil"
|
|
73
88
|
end
|
|
74
89
|
|
|
75
|
-
|
|
76
|
-
|
|
90
|
+
#{{{ Process inputs
|
|
77
91
|
job_inputs, non_default_inputs, input_digest_str = process_inputs provided_inputs, id
|
|
92
|
+
non_default_inputs.uniq!
|
|
93
|
+
NamedArray.setup(job_inputs, @inputs.collect{|i| i[0] }) if @inputs
|
|
94
|
+
step_provided_inputs = Hash === provided_inputs ? provided_inputs.slice(*non_default_inputs) : provided_inputs
|
|
78
95
|
|
|
96
|
+
#{{{ Dependencies
|
|
79
97
|
compute = {}
|
|
80
98
|
dependencies = dependencies(id, provided_inputs, non_default_inputs, compute)
|
|
81
99
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
100
|
+
#{{{ Overrides
|
|
101
|
+
override_inputs = provided_input_names.select{|k| (String === k) && k.include?("#") }
|
|
102
|
+
overriden = override_inputs.any? && dependencies.select{|dep| dep.overrider? || dep.overriden? }.any?
|
|
85
103
|
|
|
86
|
-
|
|
104
|
+
non_default_inputs.delete_if{|input| override_inputs.include? input }
|
|
105
|
+
non_default_provided_inputs = non_default_inputs & provided_input_names
|
|
106
|
+
non_default_provided_inputs.delete jobname_input if provided_inputs[jobname_input] == id
|
|
87
107
|
|
|
88
|
-
|
|
89
|
-
if
|
|
108
|
+
#{{{ Hash and Path
|
|
109
|
+
if overriden || non_default_provided_inputs.any?
|
|
90
110
|
hash = Misc.digest(:inputs => input_digest_str, :dependencies => dependencies)
|
|
91
|
-
name
|
|
111
|
+
Log.debug "ID #{self.name} #{id} - #{hash}: #{Log.fingerprint(:input_digest => input_digest_str, :non_default_inputs => non_default_inputs, :dependencies => dependencies, overriden: override_inputs)}"
|
|
112
|
+
name = [id, hash] * "_"
|
|
92
113
|
else
|
|
93
|
-
name
|
|
114
|
+
Log.debug "ID #{self.name} #{id} - Clean"
|
|
115
|
+
name = id
|
|
94
116
|
end
|
|
95
117
|
|
|
96
118
|
extension = self.extension
|
|
@@ -110,17 +132,10 @@ module Task
|
|
|
110
132
|
end
|
|
111
133
|
|
|
112
134
|
path = directory[name]
|
|
113
|
-
|
|
114
135
|
path = path.set_extension(extension) if extension
|
|
115
136
|
|
|
116
|
-
if hash
|
|
117
|
-
Log.debug "ID #{self.name} #{id} - #{hash}: #{Log.fingerprint(:input_digest => input_digest_str, :non_default_inputs => non_default_inputs, :dependencies => dependencies)}"
|
|
118
|
-
else
|
|
119
|
-
Log.debug "ID #{self.name} #{id} - Clean"
|
|
120
|
-
end
|
|
121
|
-
NamedArray.setup(job_inputs, @inputs.collect{|i| i[0] }) if @inputs
|
|
122
137
|
step_provided_inputs = Hash === provided_inputs ? provided_inputs.slice(*non_default_inputs) : provided_inputs
|
|
123
|
-
Step.new path.find, job_inputs, dependencies, id, non_default_inputs, step_provided_inputs, compute, &self
|
|
138
|
+
Step.new path.find, job_inputs, dependencies, id, non_default_inputs, step_provided_inputs, compute, overriden, &self
|
|
124
139
|
end
|
|
125
140
|
end
|
|
126
141
|
|
data/lib/scout/workflow/usage.rb
CHANGED
|
@@ -5,19 +5,19 @@ module Task
|
|
|
5
5
|
str = StringIO.new
|
|
6
6
|
|
|
7
7
|
if description
|
|
8
|
-
title, paragraph = description.
|
|
8
|
+
title, _, paragraph = description.partition("\n\n")
|
|
9
9
|
if title.length < Misc::MAX_TTY_LINE_WIDTH
|
|
10
10
|
title = self.name.to_s + " - " + title
|
|
11
11
|
str.puts Log.color :yellow, title
|
|
12
12
|
str.puts Log.color :yellow, "-" * title.length
|
|
13
13
|
if paragraph
|
|
14
|
-
str.puts "\n" << Misc.format_paragraph(paragraph)
|
|
14
|
+
str.puts "\n" << Misc.format_paragraph(paragraph)
|
|
15
15
|
end
|
|
16
16
|
else
|
|
17
17
|
title = self.name.to_s
|
|
18
18
|
str.puts Log.color :yellow, title
|
|
19
19
|
str.puts Log.color :yellow, "-" * title.length
|
|
20
|
-
str.puts "\n" << Misc.format_paragraph(description)
|
|
20
|
+
str.puts "\n" << Misc.format_paragraph(description)
|
|
21
21
|
end
|
|
22
22
|
else
|
|
23
23
|
title = self.name.to_s
|
|
@@ -92,7 +92,7 @@ module Task
|
|
|
92
92
|
str.puts
|
|
93
93
|
str.puts Log.color(:magenta, "Input select options")
|
|
94
94
|
selects.collect{|p| p}.uniq.each do |input,options|
|
|
95
|
-
str.puts
|
|
95
|
+
str.puts
|
|
96
96
|
str.puts Log.color(:blue, input.to_s + ": ") << Misc.format_paragraph(options.collect{|o| Array === o ? o.first.to_s : o.to_s} * ", ") << "\n"
|
|
97
97
|
end
|
|
98
98
|
end
|
|
@@ -164,7 +164,7 @@ module Workflow
|
|
|
164
164
|
end
|
|
165
165
|
|
|
166
166
|
def _prov_tasks(tree)
|
|
167
|
-
tasks = []
|
|
167
|
+
tasks = []
|
|
168
168
|
heap = tree.values
|
|
169
169
|
heap = [tree]
|
|
170
170
|
while heap.any?
|
|
@@ -199,7 +199,7 @@ module Workflow
|
|
|
199
199
|
else
|
|
200
200
|
description += ";" + task_name.to_s
|
|
201
201
|
end
|
|
202
|
-
|
|
202
|
+
|
|
203
203
|
seen << [workflow, task_name]
|
|
204
204
|
end
|
|
205
205
|
description
|
|
@@ -212,9 +212,9 @@ module Workflow
|
|
|
212
212
|
|
|
213
213
|
offset_str = " " * offset
|
|
214
214
|
|
|
215
|
-
lines << offset_str
|
|
215
|
+
lines << offset_str
|
|
216
216
|
|
|
217
|
-
tree.each do |p,dtree|
|
|
217
|
+
tree.each do |p,dtree|
|
|
218
218
|
next if seen.include?(p)
|
|
219
219
|
seen.push(p)
|
|
220
220
|
workflow, task = p
|
|
@@ -233,7 +233,7 @@ module Workflow
|
|
|
233
233
|
str.puts Log.color :magenta, title
|
|
234
234
|
str.puts Log.color :magenta, "=" * title.length
|
|
235
235
|
else
|
|
236
|
-
str.puts Log.color :magenta, self.name
|
|
236
|
+
str.puts Log.color :magenta, self.name
|
|
237
237
|
str.puts Log.color :magenta, "=" * self.name.length
|
|
238
238
|
end
|
|
239
239
|
|
|
@@ -244,14 +244,14 @@ module Workflow
|
|
|
244
244
|
elsif task.nil?
|
|
245
245
|
|
|
246
246
|
if self.documentation[:description] and not self.documentation[:description].empty?
|
|
247
|
-
str.puts Misc.format_paragraph self.documentation[:description]
|
|
247
|
+
str.puts Misc.format_paragraph self.documentation[:description]
|
|
248
248
|
str.puts
|
|
249
249
|
end
|
|
250
250
|
|
|
251
251
|
str.puts Log.color :magenta, "## TASKS"
|
|
252
252
|
if self.documentation[:task_description] and not self.documentation[:task_description].empty?
|
|
253
253
|
str.puts
|
|
254
|
-
str.puts Misc.format_paragraph self.documentation[:task_description]
|
|
254
|
+
str.puts Misc.format_paragraph self.documentation[:task_description]
|
|
255
255
|
end
|
|
256
256
|
str.puts
|
|
257
257
|
|
|
@@ -276,7 +276,7 @@ module Workflow
|
|
|
276
276
|
|
|
277
277
|
prov_string = prov_string(dep_tree(name))
|
|
278
278
|
str.puts Misc.format_paragraph Log.color(:blue, "->" + prov_string) if prov_string && ! prov_string.empty?
|
|
279
|
-
end
|
|
279
|
+
end
|
|
280
280
|
|
|
281
281
|
else
|
|
282
282
|
|
|
@@ -302,7 +302,7 @@ module Workflow
|
|
|
302
302
|
offset, workflow, task_name = m.values_at 1, 2, 3
|
|
303
303
|
str.puts [offset, Log.color(:magenta, workflow), "#", Log.color(:yellow, task_name)] * ""
|
|
304
304
|
else
|
|
305
|
-
str.puts Log.color :blue, line
|
|
305
|
+
str.puts Log.color :blue, line
|
|
306
306
|
end
|
|
307
307
|
end
|
|
308
308
|
str.puts
|
data/lib/scout/workflow/util.rb
CHANGED
data/lib/scout/workflow.rb
CHANGED
|
@@ -27,9 +27,9 @@ module Workflow
|
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
def workflow_dir
|
|
30
|
-
@workflow_dir ||
|
|
31
|
-
ENV["SCOUT_WORKFLOW_DIR"] ||
|
|
32
|
-
begin
|
|
30
|
+
@workflow_dir ||
|
|
31
|
+
ENV["SCOUT_WORKFLOW_DIR"] ||
|
|
32
|
+
begin
|
|
33
33
|
workflow_dir_config = Path.setup("etc/workflow_dir")
|
|
34
34
|
if workflow_dir_config.exists?
|
|
35
35
|
Path.setup(workflow_dir_config.read.strip)
|
|
@@ -40,9 +40,9 @@ module Workflow
|
|
|
40
40
|
end
|
|
41
41
|
|
|
42
42
|
def workflow_repo
|
|
43
|
-
@workflow_repo ||
|
|
44
|
-
ENV["SCOUT_WORKFLOW_REPO"] ||
|
|
45
|
-
begin
|
|
43
|
+
@workflow_repo ||
|
|
44
|
+
ENV["SCOUT_WORKFLOW_REPO"] ||
|
|
45
|
+
begin
|
|
46
46
|
workflow_repo_config = Path.setup("etc/workflow_repo")
|
|
47
47
|
if workflow_repo_config.exists?
|
|
48
48
|
workflow_repo_config.read.strip
|
data/scout-gear.gemspec
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
|
3
3
|
# Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
|
|
4
4
|
# -*- encoding: utf-8 -*-
|
|
5
|
-
# stub: scout-gear 10.11.
|
|
5
|
+
# stub: scout-gear 10.11.7 ruby lib
|
|
6
6
|
|
|
7
7
|
Gem::Specification.new do |s|
|
|
8
8
|
s.name = "scout-gear".freeze
|
|
9
|
-
s.version = "10.11.
|
|
9
|
+
s.version = "10.11.7".freeze
|
|
10
10
|
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
|
12
12
|
s.require_paths = ["lib".freeze]
|
|
@@ -169,6 +169,7 @@ Gem::Specification.new do |s|
|
|
|
169
169
|
"scout_commands/template",
|
|
170
170
|
"scout_commands/update",
|
|
171
171
|
"scout_commands/workflow/cmd",
|
|
172
|
+
"scout_commands/workflow/example",
|
|
172
173
|
"scout_commands/workflow/info",
|
|
173
174
|
"scout_commands/workflow/install",
|
|
174
175
|
"scout_commands/workflow/list",
|
|
@@ -283,7 +284,7 @@ Gem::Specification.new do |s|
|
|
|
283
284
|
]
|
|
284
285
|
s.homepage = "http://github.com/mikisvaz/scout-gear".freeze
|
|
285
286
|
s.licenses = ["MIT".freeze]
|
|
286
|
-
s.rubygems_version = "3.7.
|
|
287
|
+
s.rubygems_version = "3.7.2".freeze
|
|
287
288
|
s.summary = "basic gear for scouts".freeze
|
|
288
289
|
|
|
289
290
|
s.specification_version = 4
|
data/scout_commands/alias
CHANGED
data/scout_commands/batch/clean
CHANGED
|
@@ -25,7 +25,7 @@ $ #{$0} [<options>] <filename> [<other|->]*
|
|
|
25
25
|
EOF
|
|
26
26
|
if options[:help]
|
|
27
27
|
if defined? scout_usage
|
|
28
|
-
scout_usage
|
|
28
|
+
scout_usage
|
|
29
29
|
else
|
|
30
30
|
puts SOPT.doc
|
|
31
31
|
end
|
|
@@ -109,7 +109,7 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
109
109
|
end
|
|
110
110
|
|
|
111
111
|
if File.exist?(fstatus = File.join(dir, 'job.status'))
|
|
112
|
-
fstatus_txt = Open.read(fstatus)
|
|
112
|
+
fstatus_txt = Open.read(fstatus)
|
|
113
113
|
begin
|
|
114
114
|
if job_batch_system == "lsf"
|
|
115
115
|
nodes = Open.read(fstatus).split("\n").last.split(/\s+/)[5].split(",")
|
|
@@ -140,28 +140,28 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
140
140
|
aborted = error = true if ! done && aborted.nil? && error.nil?
|
|
141
141
|
#if done || error || aborted || running || queued || jobid || search
|
|
142
142
|
# select = false
|
|
143
|
-
# select = true if done && exit_status && exit_status.to_i == 0
|
|
144
|
-
# select = true if error && exit_status && exit_status.to_i != 0
|
|
143
|
+
# select = true if done && exit_status && exit_status.to_i == 0
|
|
144
|
+
# select = true if error && exit_status && exit_status.to_i != 0
|
|
145
145
|
# select = true if aborted && (exit_status.nil? && ! running_jobs.include?(id))
|
|
146
|
-
# select = select && jobid.split(",").include?(id) if jobid
|
|
146
|
+
# select = select && jobid.split(",").include?(id) if jobid
|
|
147
147
|
# select = select && cmd.match(/#{search}/) if search
|
|
148
|
-
# next unless select
|
|
148
|
+
# next unless select
|
|
149
149
|
#end
|
|
150
150
|
|
|
151
|
-
if done || error || aborted || queued || jobid
|
|
151
|
+
if done || error || aborted || queued || jobid
|
|
152
152
|
select = false
|
|
153
153
|
select = true if done && exit_status == 0
|
|
154
|
-
select = true if error && exit_status && exit_status != 0
|
|
154
|
+
select = true if error && exit_status && exit_status != 0
|
|
155
155
|
select = true if aborted && (exit_status.nil? && ! running_jobs.include?(id))
|
|
156
156
|
is_running = exit_status.nil? && ( (running_jobs.include?(id) && (!deps || (running_jobs & deps).empty?)) || different_system )
|
|
157
157
|
select = true if queued && deps && (running_jobs & deps).any? || queued && is_running && nodes.empty?
|
|
158
158
|
select = true if jobid && jobid.split(",").include?(id)
|
|
159
159
|
select = select && cmd.match(/#{search}/) if search
|
|
160
|
-
next unless select
|
|
160
|
+
next unless select
|
|
161
161
|
elsif search
|
|
162
162
|
select = false
|
|
163
163
|
select = true if search && cmd.match(/#{search}/)
|
|
164
|
-
next unless select
|
|
164
|
+
next unless select
|
|
165
165
|
end
|
|
166
166
|
|
|
167
167
|
|
|
@@ -180,7 +180,7 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
180
180
|
|
|
181
181
|
if options[:batch_parameters]
|
|
182
182
|
puts Log.color(:magenta, "BATCH parameters: ")
|
|
183
|
-
case job_batch_system
|
|
183
|
+
case job_batch_system
|
|
184
184
|
when 'slurm'
|
|
185
185
|
puts Log.color :blue, CMD.cmd('grep "^#SBATCH" |tail -n +6', :in => Open.read(fcmd)).read.strip
|
|
186
186
|
when 'lsf'
|
|
@@ -206,6 +206,6 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
206
206
|
Open.rm_rf dir unless dry_run
|
|
207
207
|
end
|
|
208
208
|
|
|
209
|
-
puts
|
|
209
|
+
puts
|
|
210
210
|
puts "Found #{count} jobs"
|
|
211
211
|
|
data/scout_commands/batch/list
CHANGED
|
@@ -12,7 +12,7 @@ List all batch jobs
|
|
|
12
12
|
|
|
13
13
|
$ #{$0} [<options>] <filename> [<other|->]*
|
|
14
14
|
|
|
15
|
-
$ rbbt slurm list [options]
|
|
15
|
+
$ rbbt slurm list [options]
|
|
16
16
|
|
|
17
17
|
-h--help Print this help
|
|
18
18
|
-d--done Done jobs only
|
|
@@ -33,7 +33,7 @@ $ rbbt slurm list [options]
|
|
|
33
33
|
EOF
|
|
34
34
|
if options[:help]
|
|
35
35
|
if defined? scout_usage
|
|
36
|
-
scout_usage
|
|
36
|
+
scout_usage
|
|
37
37
|
else
|
|
38
38
|
puts SOPT.doc
|
|
39
39
|
end
|
|
@@ -132,7 +132,7 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
132
132
|
end
|
|
133
133
|
|
|
134
134
|
if File.exist?(fstatus = File.join(dir, 'job.status'))
|
|
135
|
-
fstatus_txt = Open.read(fstatus)
|
|
135
|
+
fstatus_txt = Open.read(fstatus)
|
|
136
136
|
begin
|
|
137
137
|
if job_batch_system == "lsf"
|
|
138
138
|
nodes = Open.read(fstatus).split("\n").last.split(/\s+/)[5].split(",")
|
|
@@ -170,47 +170,47 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
170
170
|
cadeps = Open.read(fcadep).split("\n") if File.exist?(fcadep)
|
|
171
171
|
|
|
172
172
|
is_running = exit_status.nil? && ( (running_jobs.include?(id) && (deps.nil? || (running_jobs & deps).empty?)) || different_system )
|
|
173
|
-
if done || error || aborted || running || queued || jobid
|
|
173
|
+
if done || error || aborted || running || queued || jobid
|
|
174
174
|
select = false
|
|
175
175
|
select = true if done && exit_status == 0
|
|
176
|
-
select = true if error && exit_status && exit_status != 0
|
|
176
|
+
select = true if error && exit_status && exit_status != 0
|
|
177
177
|
select = true if aborted && (exit_status.nil? && ! running_jobs.include?(id))
|
|
178
178
|
select = true if queued && deps && (running_jobs & deps).any? || queued && is_running && nodes.empty?
|
|
179
179
|
select = true if running && nodes.any? && (exit_status.nil? && running_jobs.include?(id)) && (!deps || (running_jobs & deps).empty?)
|
|
180
180
|
select = true if jobid && jobid.split(",").include?(id)
|
|
181
181
|
select = select && step_path.match(/#{search}/) if search
|
|
182
|
-
next unless select
|
|
182
|
+
next unless select
|
|
183
183
|
elsif search
|
|
184
184
|
select = false
|
|
185
185
|
select = true if search && cmd.match(/#{search}/)
|
|
186
|
-
next unless select
|
|
186
|
+
next unless select
|
|
187
187
|
end
|
|
188
188
|
|
|
189
189
|
|
|
190
190
|
count += 1
|
|
191
191
|
|
|
192
192
|
if options[:compressed] && tail.nil?
|
|
193
|
-
status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) : Log.color(:green, id)
|
|
193
|
+
status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) : Log.color(:green, id)
|
|
194
194
|
if different_system
|
|
195
|
-
status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) + " (#{ id })" : Log.color(:green, id)
|
|
195
|
+
status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) + " (#{ id })" : Log.color(:green, id)
|
|
196
196
|
else
|
|
197
197
|
#status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) + " (#{ id })" : (running_jobs.include?(id) || $norunningjobs ? Log.color(:green, id) : Log.color(:red, id) )
|
|
198
|
-
status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) + " (#{ id })" :
|
|
199
|
-
(running_jobs.include?(id) || $norunningjobs ?
|
|
200
|
-
(is_running ? Log.color(:cyan, id) : Log.color(:yellow, id) ) :
|
|
198
|
+
status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) + " (#{ id })" :
|
|
199
|
+
(running_jobs.include?(id) || $norunningjobs ?
|
|
200
|
+
(is_running ? Log.color(:cyan, id) : Log.color(:yellow, id) ) :
|
|
201
201
|
Log.color(:red, id) )
|
|
202
|
-
end
|
|
202
|
+
end
|
|
203
203
|
prog_rep = []
|
|
204
|
-
if options[:progress]
|
|
204
|
+
if options[:progress]
|
|
205
205
|
step_line = Open.read(fcmd).split("\n").select{|line| line =~ /^#STEP_PATH:/}.first
|
|
206
206
|
if step_line
|
|
207
207
|
step_path = step_line.split(": ").last.strip
|
|
208
208
|
step = Step.new step_path
|
|
209
209
|
has_bar = false
|
|
210
210
|
[step].reverse.each do |j|
|
|
211
|
-
next if j.done?
|
|
211
|
+
next if j.done?
|
|
212
212
|
if j.file(:progress).exists?
|
|
213
|
-
bar = Log::ProgressBar.new
|
|
213
|
+
bar = Log::ProgressBar.new
|
|
214
214
|
bar.load(j.file(:progress).yaml)
|
|
215
215
|
rep = bar.report_msg.split("·")[1]
|
|
216
216
|
rep = rep.sub(/.*?(\d+%)/, Log.color(:blue,'\1')).sub(/\-.*/,'')
|
|
@@ -238,7 +238,7 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
238
238
|
puts Log.color(:magenta, "Job ID (#{Log.color(:red, job_batch_system)}): ") << (exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) + " (#{ id })" : Log.color(:green, id) )
|
|
239
239
|
else
|
|
240
240
|
puts Log.color(:magenta, "Job ID: ") << (exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) + " (#{ id })" : (running_jobs.include?(id) || $norunningjobs ? Log.color(:green, id) : Log.color(:red, id) ))
|
|
241
|
-
end
|
|
241
|
+
end
|
|
242
242
|
puts Log.color(:magenta, "Dependencies: ") << deps * ", " if deps
|
|
243
243
|
puts Log.color(:magenta, "Dependencies (can fail): ") << cadeps * ", " if cadeps
|
|
244
244
|
puts Log.color(:magenta, "Nodes: ") << nodes * ", " if long
|
|
@@ -247,7 +247,7 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
247
247
|
|
|
248
248
|
if options[:batch_parameters]
|
|
249
249
|
puts Log.color(:magenta, "BATCH parameters: ")
|
|
250
|
-
case job_batch_system
|
|
250
|
+
case job_batch_system
|
|
251
251
|
when 'slurm'
|
|
252
252
|
text = CMD.cmd('grep "^#SBATCH" ', :in => Open.read(fcmd)).read.strip
|
|
253
253
|
when 'lsf'
|
|
@@ -295,14 +295,14 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
295
295
|
ticks = 1 if ticks == 0
|
|
296
296
|
time_elapsed = 1 if time_elapsed == 0
|
|
297
297
|
puts Log.color(:yellow, "CPU average: ") + "%.2f" % ( ticks / clock_ticks / time_elapsed * 100).to_s
|
|
298
|
-
puts Log.color(:yellow, "RSS average: ") + "%.2f GB" % Misc.mean(rss_average.collect{|t,l| Misc.sum(l) / (1024 * 1024 * 1024)}).to_s
|
|
298
|
+
puts Log.color(:yellow, "RSS average: ") + "%.2f GB" % Misc.mean(rss_average.collect{|t,l| Misc.sum(l) / (1024 * 1024 * 1024)}).to_s
|
|
299
299
|
puts Log.color(:yellow, "Time: ") + Misc.format_seconds((eend - start))
|
|
300
300
|
|
|
301
301
|
end
|
|
302
302
|
|
|
303
303
|
if options[:sacct_peformance]
|
|
304
304
|
begin
|
|
305
|
-
raise "sacct not supported for LSF" unless batch_system == 'slurm'
|
|
305
|
+
raise "sacct not supported for LSF" unless batch_system == 'slurm'
|
|
306
306
|
tsv = TSV.open(CMD.cmd("sacct -j #{id} -o 'jobid,AveRSS,MaxRSS,MaxDiskRead,MaxDiskWrite' -P|grep 'JobID\\|\.batch'"), :header_hash => '', :sep => "|", :type => :list)
|
|
307
307
|
values = tsv[tsv.keys.first]
|
|
308
308
|
if values.compact.any?
|
|
@@ -324,20 +324,21 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
324
324
|
puts CMD.cmd("grep -i -w 'Completed step' #{File.join(dir, 'std.err')} | grep -v 'Retrying dep.' | tail -n #{tail.to_i}", :no_fail => true).read
|
|
325
325
|
else
|
|
326
326
|
puts Log.color(:magenta, "Log tail: ")
|
|
327
|
-
|
|
327
|
+
pad_tail = 1000 + tail.to_i
|
|
328
|
+
puts CMD.cmd("tail -n #{pad_tail} #{File.join(dir, 'std.err')} | grep -v '^[^\\s:]*\\[3.m' | grep -v -e '^[[:space:]]*$' | grep -v \"\\(STDOUT\\|STDERR\\):[[:space:]]*$\" | tail -n #{tail.to_i} ").read
|
|
328
329
|
end
|
|
329
330
|
end
|
|
330
331
|
|
|
331
|
-
if options[:progress]
|
|
332
|
+
if options[:progress]
|
|
332
333
|
step_line = Open.read(fcmd).split("\n").select{|line| line =~ /^#STEP_PATH:/}.first
|
|
333
334
|
if step_line
|
|
334
335
|
step_path = step_line.split(": ").last.strip
|
|
335
336
|
step = Step.new step_path
|
|
336
337
|
has_bar = false
|
|
337
338
|
(step.rec_dependencies.to_a + [step]).reverse.each do |j|
|
|
338
|
-
next if j.done?
|
|
339
|
+
next if j.done?
|
|
339
340
|
if j.file(:progress).exists?
|
|
340
|
-
bar = Log::ProgressBar.new
|
|
341
|
+
bar = Log::ProgressBar.new
|
|
341
342
|
bar.load(j.file(:progress).yaml)
|
|
342
343
|
puts Log.color(:magenta, "Progress: ") + bar.report_msg + " " + Log.color(:yellow, j.task_signature)
|
|
343
344
|
has_bar = true
|
|
@@ -352,6 +353,6 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
352
353
|
|
|
353
354
|
end
|
|
354
355
|
|
|
355
|
-
puts
|
|
356
|
+
puts
|
|
356
357
|
puts Log.color :clear, "Found #{count} jobs"
|
|
357
358
|
|
data/scout_commands/batch/tail
CHANGED
|
@@ -8,14 +8,14 @@ options = SOPT.setup <<EOF
|
|
|
8
8
|
|
|
9
9
|
Queue a job in Marenostrum
|
|
10
10
|
|
|
11
|
-
$ rbbt slurm tail <directory|jobid> [options]
|
|
11
|
+
$ rbbt slurm tail <directory|jobid|step> [options]
|
|
12
12
|
|
|
13
13
|
-h--help Print this help
|
|
14
14
|
EOF
|
|
15
15
|
|
|
16
16
|
if options[:help]
|
|
17
17
|
if defined? rbbt_usage
|
|
18
|
-
rbbt_usage
|
|
18
|
+
rbbt_usage
|
|
19
19
|
else
|
|
20
20
|
puts SOPT.doc
|
|
21
21
|
end
|
|
@@ -29,18 +29,22 @@ directory = ARGV.shift
|
|
|
29
29
|
|
|
30
30
|
raise ParameterException if directory.nil?
|
|
31
31
|
|
|
32
|
+
workdir = File.expand_path('~/scout-batch')
|
|
33
|
+
Path.setup(workdir)
|
|
34
|
+
|
|
32
35
|
if directory =~ /^[0-9]*$/
|
|
33
|
-
workdir = File.expand_path('~/scout-batch')
|
|
34
|
-
Path.setup(workdir)
|
|
35
36
|
|
|
36
37
|
workdir.glob("**/job.id").each do |file|
|
|
37
38
|
next unless directory == Open.read(file).strip
|
|
38
39
|
directory = File.dirname(file)
|
|
39
40
|
break
|
|
40
41
|
end
|
|
42
|
+
elsif ! File.exist?(File.join(directory, 'command.batch'))
|
|
43
|
+
out = CMD.cmd("grep -r -l 'STEP_PATH: .*#{directory}' '#{workdir}'").read.split("\n").first
|
|
44
|
+
directory = out.sub("/command.batch", '') if out and not out.empty?
|
|
41
45
|
end
|
|
42
46
|
|
|
43
|
-
raise ParameterException, "Could not identify job #{directory}" unless File.exist?(directory)
|
|
47
|
+
raise ParameterException, "Could not identify job #{directory}" unless File.exist?(File.join(directory, 'command.batch'))
|
|
44
48
|
|
|
45
49
|
require 'rbbt/hpc/slurm'
|
|
46
50
|
|
data/scout_commands/cat
CHANGED
data/scout_commands/doc
CHANGED
|
@@ -16,7 +16,7 @@ If you don't specify the module it prints those available
|
|
|
16
16
|
EOF
|
|
17
17
|
if options[:help]
|
|
18
18
|
if defined? scout_usage
|
|
19
|
-
scout_usage
|
|
19
|
+
scout_usage
|
|
20
20
|
else
|
|
21
21
|
puts SOPT.doc
|
|
22
22
|
end
|
|
@@ -26,7 +26,7 @@ end
|
|
|
26
26
|
|
|
27
27
|
module_name = ARGV.first
|
|
28
28
|
if module_name.nil?
|
|
29
|
-
puts Scout.doc.lib.scout.glob("**/*.md").collect{|f|
|
|
29
|
+
puts Scout.doc.lib.scout.glob("**/*.md").collect{|f|
|
|
30
30
|
f.find.unset_extension.sub(Scout.doc.lib.scout.find + "/", '')
|
|
31
31
|
} * "\n"
|
|
32
32
|
else
|
data/scout_commands/entity
CHANGED
|
@@ -21,7 +21,7 @@ type, property, entity = ARGV
|
|
|
21
21
|
|
|
22
22
|
if options[:help] and type.nil?
|
|
23
23
|
if defined? scout_usage
|
|
24
|
-
scout_usage
|
|
24
|
+
scout_usage
|
|
25
25
|
else
|
|
26
26
|
puts SOPT.doc
|
|
27
27
|
end
|
|
@@ -63,12 +63,12 @@ end
|
|
|
63
63
|
entity_module = Kernel.const_get type
|
|
64
64
|
|
|
65
65
|
entity_module.annotations.uniq.each do |attr|
|
|
66
|
-
SOPT.register attr.slice(0,1).to_s, attr, true, "Entity attribute"
|
|
66
|
+
SOPT.register attr.slice(0,1).to_s, attr, true, "Entity attribute"
|
|
67
67
|
end
|
|
68
68
|
|
|
69
69
|
if options[:help] and property.nil?
|
|
70
70
|
if defined? scout_usage
|
|
71
|
-
scout_usage
|
|
71
|
+
scout_usage
|
|
72
72
|
else
|
|
73
73
|
puts SOPT.doc
|
|
74
74
|
end
|
|
@@ -99,7 +99,7 @@ if options[:help]
|
|
|
99
99
|
end * " "
|
|
100
100
|
|
|
101
101
|
SOPT.synopsys['[<property_parameters>]*'] = property_str
|
|
102
|
-
|
|
102
|
+
|
|
103
103
|
if defined? scout_usage
|
|
104
104
|
scout_usage
|
|
105
105
|
else
|
data/scout_commands/find
CHANGED
data/scout_commands/kb/config
CHANGED
data/scout_commands/kb/entities
CHANGED