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.
Files changed (157) hide show
  1. checksums.yaml +4 -4
  2. data/.vimproject +17 -2
  3. data/VERSION +1 -1
  4. data/bin/scout +10 -10
  5. data/lib/scout/association/fields.rb +15 -15
  6. data/lib/scout/association/index.rb +6 -6
  7. data/lib/scout/association/item.rb +18 -8
  8. data/lib/scout/association.rb +4 -4
  9. data/lib/scout/entity/identifiers.rb +5 -5
  10. data/lib/scout/entity/property.rb +2 -2
  11. data/lib/scout/entity.rb +1 -1
  12. data/lib/scout/knowledge_base/description.rb +10 -10
  13. data/lib/scout/knowledge_base/entity.rb +6 -6
  14. data/lib/scout/knowledge_base/list.rb +1 -1
  15. data/lib/scout/knowledge_base/query.rb +4 -4
  16. data/lib/scout/knowledge_base/registry.rb +6 -6
  17. data/lib/scout/knowledge_base/traverse.rb +7 -40
  18. data/lib/scout/persist/engine/fix_width_table.rb +6 -6
  19. data/lib/scout/persist/engine/packed_index.rb +2 -2
  20. data/lib/scout/persist/engine/sharder.rb +4 -4
  21. data/lib/scout/persist/engine/tkrzw.rb +1 -1
  22. data/lib/scout/persist/engine/tokyocabinet.rb +2 -2
  23. data/lib/scout/persist/tsv/adapter/fix_width_table.rb +1 -1
  24. data/lib/scout/persist/tsv/adapter/packed_index.rb +1 -1
  25. data/lib/scout/persist/tsv/adapter/tkrzw.rb +1 -1
  26. data/lib/scout/persist/tsv/adapter/tokyocabinet.rb +3 -3
  27. data/lib/scout/persist/tsv/serialize.rb +3 -3
  28. data/lib/scout/persist/tsv.rb +1 -1
  29. data/lib/scout/semaphore.rb +100 -17
  30. data/lib/scout/tsv/annotation/repo.rb +4 -4
  31. data/lib/scout/tsv/annotation.rb +2 -2
  32. data/lib/scout/tsv/attach.rb +7 -7
  33. data/lib/scout/tsv/change_id/translate.rb +1 -1
  34. data/lib/scout/tsv/csv.rb +3 -3
  35. data/lib/scout/tsv/dumper.rb +8 -8
  36. data/lib/scout/tsv/index.rb +1 -1
  37. data/lib/scout/tsv/open.rb +3 -3
  38. data/lib/scout/tsv/stream.rb +2 -2
  39. data/lib/scout/tsv/traverse.rb +4 -4
  40. data/lib/scout/tsv/util/filter.rb +9 -9
  41. data/lib/scout/tsv/util/process.rb +2 -2
  42. data/lib/scout/tsv/util/reorder.rb +2 -2
  43. data/lib/scout/tsv/util/select.rb +3 -3
  44. data/lib/scout/tsv/util/unzip.rb +2 -2
  45. data/lib/scout/tsv/util.rb +1 -1
  46. data/lib/scout/tsv.rb +2 -2
  47. data/lib/scout/work_queue/socket.rb +3 -2
  48. data/lib/scout/work_queue/worker.rb +4 -4
  49. data/lib/scout/work_queue.rb +7 -7
  50. data/lib/scout/workflow/definition.rb +18 -16
  51. data/lib/scout/workflow/deployment/local.rb +81 -62
  52. data/lib/scout/workflow/deployment/orchestrator/batches.rb +66 -5
  53. data/lib/scout/workflow/deployment/orchestrator/chains.rb +47 -30
  54. data/lib/scout/workflow/deployment/orchestrator/rules.rb +3 -3
  55. data/lib/scout/workflow/deployment/orchestrator/workload.rb +11 -22
  56. data/lib/scout/workflow/deployment/scheduler/job.rb +34 -36
  57. data/lib/scout/workflow/deployment/scheduler/lfs.rb +1 -1
  58. data/lib/scout/workflow/deployment/scheduler/pbs.rb +4 -4
  59. data/lib/scout/workflow/deployment/scheduler/slurm.rb +2 -2
  60. data/lib/scout/workflow/deployment/scheduler.rb +23 -12
  61. data/lib/scout/workflow/deployment/trace.rb +2 -2
  62. data/lib/scout/workflow/documentation.rb +4 -4
  63. data/lib/scout/workflow/export.rb +1 -1
  64. data/lib/scout/workflow/path.rb +2 -2
  65. data/lib/scout/workflow/step/children.rb +1 -1
  66. data/lib/scout/workflow/step/dependencies.rb +36 -3
  67. data/lib/scout/workflow/step/info.rb +5 -19
  68. data/lib/scout/workflow/step/inputs.rb +1 -1
  69. data/lib/scout/workflow/step/progress.rb +2 -2
  70. data/lib/scout/workflow/step/provenance.rb +4 -4
  71. data/lib/scout/workflow/step/status.rb +23 -9
  72. data/lib/scout/workflow/step.rb +21 -19
  73. data/lib/scout/workflow/task/dependencies.rb +10 -3
  74. data/lib/scout/workflow/task/info.rb +3 -3
  75. data/lib/scout/workflow/task/inputs.rb +8 -8
  76. data/lib/scout/workflow/task.rb +37 -22
  77. data/lib/scout/workflow/usage.rb +13 -13
  78. data/lib/scout/workflow/util.rb +1 -1
  79. data/lib/scout/workflow.rb +6 -6
  80. data/scout-gear.gemspec +4 -3
  81. data/scout_commands/alias +1 -1
  82. data/scout_commands/batch/clean +12 -12
  83. data/scout_commands/batch/list +26 -25
  84. data/scout_commands/batch/tail +9 -5
  85. data/scout_commands/cat +1 -1
  86. data/scout_commands/doc +2 -2
  87. data/scout_commands/entity +4 -4
  88. data/scout_commands/find +1 -1
  89. data/scout_commands/kb/config +1 -1
  90. data/scout_commands/kb/entities +1 -1
  91. data/scout_commands/kb/list +1 -1
  92. data/scout_commands/kb/query +2 -2
  93. data/scout_commands/kb/register +1 -1
  94. data/scout_commands/kb/show +1 -1
  95. data/scout_commands/kb/traverse +1 -1
  96. data/scout_commands/log +6 -6
  97. data/scout_commands/resource/produce +2 -2
  98. data/scout_commands/resource/sync +1 -1
  99. data/scout_commands/system/clean +7 -7
  100. data/scout_commands/system/status +4 -4
  101. data/scout_commands/template +1 -1
  102. data/scout_commands/update +1 -1
  103. data/scout_commands/workflow/cmd +2 -1
  104. data/scout_commands/workflow/example +123 -0
  105. data/scout_commands/workflow/info +10 -1
  106. data/scout_commands/workflow/install +1 -1
  107. data/scout_commands/workflow/list +2 -2
  108. data/scout_commands/workflow/process +2 -2
  109. data/scout_commands/workflow/prov +3 -3
  110. data/scout_commands/workflow/task +36 -11
  111. data/scout_commands/workflow/trace +1 -1
  112. data/scout_commands/workflow/write_info +2 -2
  113. data/share/templates/command +1 -1
  114. data/test/scout/association/test_item.rb +5 -0
  115. data/test/scout/entity/test_property.rb +3 -3
  116. data/test/scout/knowledge_base/test_description.rb +1 -1
  117. data/test/scout/knowledge_base/test_traverse.rb +2 -2
  118. data/test/scout/persist/engine/test_packed_index.rb +6 -6
  119. data/test/scout/persist/test_tsv.rb +4 -4
  120. data/test/scout/persist/tsv/adapter/test_packed_index.rb +4 -4
  121. data/test/scout/persist/tsv/adapter/test_sharder.rb +23 -23
  122. data/test/scout/persist/tsv/adapter/test_tokyocabinet.rb +1 -1
  123. data/test/scout/persist/tsv/test_serialize.rb +1 -1
  124. data/test/scout/test_association.rb +1 -1
  125. data/test/scout/test_tsv.rb +2 -2
  126. data/test/scout/test_workflow.rb +2 -2
  127. data/test/scout/tsv/test_annotation.rb +4 -4
  128. data/test/scout/tsv/test_index.rb +1 -1
  129. data/test/scout/tsv/test_open.rb +2 -2
  130. data/test/scout/tsv/test_parser.rb +2 -2
  131. data/test/scout/tsv/test_stream.rb +1 -1
  132. data/test/scout/tsv/test_transformer.rb +1 -1
  133. data/test/scout/tsv/util/test_filter.rb +1 -1
  134. data/test/scout/tsv/util/test_melt.rb +1 -1
  135. data/test/scout/tsv/util/test_reorder.rb +1 -1
  136. data/test/scout/work_queue/test_socket.rb +3 -3
  137. data/test/scout/work_queue/test_worker.rb +2 -2
  138. data/test/scout/workflow/deployment/orchestrator/test_batches.rb +13 -3
  139. data/test/scout/workflow/deployment/orchestrator/test_chains.rb +15 -13
  140. data/test/scout/workflow/deployment/orchestrator/test_workload.rb +1 -1
  141. data/test/scout/workflow/deployment/test_local.rb +2 -2
  142. data/test/scout/workflow/deployment/test_scheduler.rb +1 -2
  143. data/test/scout/workflow/step/test_children.rb +1 -1
  144. data/test/scout/workflow/step/test_dependencies.rb +36 -1
  145. data/test/scout/workflow/step/test_info.rb +3 -35
  146. data/test/scout/workflow/step/test_load.rb +1 -1
  147. data/test/scout/workflow/step/test_provenance.rb +1 -1
  148. data/test/scout/workflow/step/test_status.rb +33 -1
  149. data/test/scout/workflow/task/test_dependencies.rb +9 -7
  150. data/test/scout/workflow/task/test_inputs.rb +1 -1
  151. data/test/scout/workflow/test_definition.rb +1 -1
  152. data/test/scout/workflow/test_documentation.rb +1 -1
  153. data/test/scout/workflow/test_entity.rb +2 -2
  154. data/test/scout/workflow/test_step.rb +13 -13
  155. data/test/scout/workflow/test_usage.rb +1 -1
  156. data/test/test_helper.rb +1 -1
  157. metadata +3 -2
@@ -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
- #id = provided_inputs[:id] if provided_inputs.include?(:id)
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 provided_inputs.include?(input)
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
- provided_inputs = load_inputs(provided_inputs.delete(:load_inputs)).merge(provided_inputs) if Hash === provided_inputs && provided_inputs[:load_inputs]
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
- non_default_inputs.uniq!
83
-
84
- non_default_inputs.delete_if{|k| k.to_s.include? "#" } unless dependencies.select{|d| d.overriden? }.any?
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
- id = DEFAULT_NAME if id.nil?
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
- sanitized_id = Path.sanitize_filename(id, 150)
89
- if non_default_inputs.any? && !(non_default_inputs == [jobname_input] && provided_inputs[jobname_input] == id)
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 = [sanitized_id, hash] * "_"
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 = sanitized_id
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
 
@@ -5,19 +5,19 @@ module Task
5
5
  str = StringIO.new
6
6
 
7
7
  if description
8
- title, paragraph = description.split("\n\n")
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
@@ -18,7 +18,7 @@ module Workflow
18
18
  end
19
19
 
20
20
  def all_tasks
21
- tasks.keys
21
+ tasks.nil? ? [] : tasks.keys
22
22
  end
23
23
 
24
24
  def self.list
@@ -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.4 ruby lib
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.4".freeze
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.0.dev".freeze
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
@@ -17,7 +17,7 @@ earlier, like --dev or --log. Edit #{Scout.ect.cmd_alias.find} to fine tune.
17
17
  EOF
18
18
  if options[:help]
19
19
  if defined? scout_usage
20
- scout_usage
20
+ scout_usage
21
21
  else
22
22
  puts SOPT.doc
23
23
  end
@@ -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
 
@@ -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
- puts CMD.cmd(" cat #{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
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
 
@@ -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
@@ -17,7 +17,7 @@ $ #{$0} [<options>] (<resource> <path>|<path>)
17
17
  EOF
18
18
  if options[:help]
19
19
  if defined? scout_usage
20
- scout_usage
20
+ scout_usage
21
21
  else
22
22
  puts SOPT.doc
23
23
  end
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
@@ -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
@@ -17,7 +17,7 @@ $ #{$0} [<options>] (<resource> <path>|<path>)
17
17
  EOF
18
18
  if options[:help]
19
19
  if defined? scout_usage
20
- scout_usage
20
+ scout_usage
21
21
  else
22
22
  puts SOPT.doc
23
23
  end
@@ -18,7 +18,7 @@ $ #{$0} [<options>] <name> [knowledge_base]
18
18
  EOF
19
19
  if options.delete :help
20
20
  if defined? scout_usage
21
- scout_usage
21
+ scout_usage
22
22
  else
23
23
  puts SOPT.doc
24
24
  end
@@ -16,7 +16,7 @@ $ #{$0} [<options>] <entity> <identifier_files>
16
16
  EOF
17
17
  if options.delete :help
18
18
  if defined? scout_usage
19
- scout_usage
19
+ scout_usage
20
20
  else
21
21
  puts SOPT.doc
22
22
  end
@@ -16,7 +16,7 @@ $ #{$0} [<options>] <filename> [<other|->]*
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