rbbt-util 5.23.35 → 5.23.36
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rbbt/monitor.rb +34 -7
- data/lib/rbbt/persist/tsv/adapter.rb +0 -2
- data/lib/rbbt/util/open.rb +24 -8
- data/lib/rbbt/workflow/archive.rb +1 -1
- data/share/rbbt_commands/system/clean +2 -2
- data/share/rbbt_commands/system/status +48 -17
- data/share/rbbt_commands/workflow/prov +17 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a48bd703a6bcf70e3b03ea0a80df3d9e419d2a5d
|
4
|
+
data.tar.gz: e5ddc970668f140bd1923ce200b2754d352c8e61
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2023508ca619102a57ecc4927e08b97c14b2429cea38c57e14c75ce743006772080ab8daad7e7d17a721a11646da7806a9376dbb17e6f25686129418b2fa04db
|
7
|
+
data.tar.gz: 5439545d3471476c701f42c133398d8211bb1cfd5adc4a6d802954ece07fb0a509d0f0c59fa07085f9b7f4ec6097390d9c0cd527e2c90ff735eca8d7e84c0ad4
|
data/lib/rbbt/monitor.rb
CHANGED
@@ -138,18 +138,45 @@ module Rbbt
|
|
138
138
|
dirs.collect do |dir|
|
139
139
|
next unless Open.exists? dir
|
140
140
|
|
141
|
-
|
141
|
+
workflowdirs = if (dir_sub_path = Open.find_repo_dir(workflowdir))
|
142
|
+
repo_dir, sub_path = dir_sub_path
|
143
|
+
Open.list_repo_files(*dir_sub_path).collect{|f| f.split("/").first}.uniq.collect{|f| File.join(repo_dir, f)}.uniq
|
144
|
+
else
|
145
|
+
dir.glob("*")
|
146
|
+
end
|
147
|
+
|
148
|
+
workflowdirs.collect do |workflowdir|
|
142
149
|
workflow = File.basename(workflowdir)
|
143
150
|
next if workflows and not workflows.include? workflow
|
144
151
|
|
145
|
-
|
152
|
+
tasks_dirs = if (dir_sub_path = Open.find_repo_dir(workflowdir))
|
153
|
+
repo_dir, sub_path = dir_sub_path
|
154
|
+
Open.list_repo_files(*dir_sub_path).collect{|f| f.split("/").first}.uniq.collect{|f| File.join(repo_dir, f)}.uniq
|
155
|
+
else
|
156
|
+
workflowdir.glob("*")
|
157
|
+
end
|
158
|
+
|
159
|
+
tasks_dirs.collect do |taskdir|
|
146
160
|
task = File.basename(taskdir)
|
147
161
|
next if tasks and not tasks.include? task
|
148
162
|
|
149
|
-
#cmd = "find -L '#{ taskdir }/' -not \\( -path \"#{taskdir}/*.files/*\" -prune \\) -not -name '*.pid' -not -name '*.notify' -not -name '\\.*' 2>/dev/null"
|
150
|
-
cmd = "find -L '#{ taskdir }/' -not \\( -path \"#{taskdir}/.info/*\" -prune \\) -not \\( -path \"#{taskdir}/*.files/*\" -prune \\) -not -name '*.pid' -not -name '*.notify' -not -name '\\.*' \\( -not -type d -o -name '*.files' \\) 2>/dev/null"
|
151
163
|
|
152
|
-
files =
|
164
|
+
files = if (dir_sub_path = Open.find_repo_dir(taskdir))
|
165
|
+
repo_dir, sub_path = dir_sub_path
|
166
|
+
Open.list_repo_files(*dir_sub_path).reject do |f|
|
167
|
+
f.include?("/.info/") ||
|
168
|
+
f.include?(".files/") ||
|
169
|
+
f.include?(".pid/") ||
|
170
|
+
File.directory?(f)
|
171
|
+
end.collect do |f|
|
172
|
+
File.join(repo_dir, f)
|
173
|
+
end
|
174
|
+
else
|
175
|
+
#cmd = "find -L '#{ taskdir }/' -not \\( -path \"#{taskdir}/*.files/*\" -prune \\) -not -name '*.pid' -not -name '*.notify' -not -name '\\.*' 2>/dev/null"
|
176
|
+
cmd = "find -L '#{ taskdir }/' -not \\( -path \"#{taskdir}/.info/*\" -prune \\) -not \\( -path \"#{taskdir}/*.files/*\" -prune \\) -not -name '*.pid' -not -name '*.notify' -not -name '\\.*' \\( -not -type d -o -name '*.files' \\) 2>/dev/null"
|
177
|
+
|
178
|
+
CMD.cmd(cmd, :pipe => true)
|
179
|
+
end
|
153
180
|
TSV.traverse files, :type => :array, :into => jobs, :_bar => "Finding jobs in #{ taskdir }" do |file|
|
154
181
|
_files << file
|
155
182
|
if m = file.match(/(.*)\.(info|pid|files)$/)
|
@@ -167,10 +194,10 @@ module Rbbt
|
|
167
194
|
info[:task] = task
|
168
195
|
info[:name] = name
|
169
196
|
|
170
|
-
if
|
197
|
+
if Open.exists? file
|
171
198
|
info = info.merge(file_time(file))
|
172
199
|
info[:done] = true
|
173
|
-
info[:info_file] =
|
200
|
+
info[:info_file] = Open.exist?(info_file) ? info_file : nil
|
174
201
|
else
|
175
202
|
info = info.merge({:info_file => info_file, :done => false})
|
176
203
|
end
|
data/lib/rbbt/util/open.rb
CHANGED
@@ -207,6 +207,15 @@ module Open
|
|
207
207
|
end
|
208
208
|
end
|
209
209
|
|
210
|
+
def self.list_repo_files(dir, sub_path = nil)
|
211
|
+
repo = get_repo_from_dir(dir)
|
212
|
+
files = repo.keys
|
213
|
+
files.reject!{|f| f[0] == "."}
|
214
|
+
return files unless sub_path
|
215
|
+
|
216
|
+
files.select{|file| file.start_with?(sub_path) }
|
217
|
+
end
|
218
|
+
|
210
219
|
def self.exists_in_repo(dir, sub_path, content)
|
211
220
|
repo = get_repo_from_dir(dir)
|
212
221
|
repo.read_and_close do
|
@@ -219,7 +228,7 @@ module Open
|
|
219
228
|
dir = dir + '/' unless dir.chars[-1] == "/"
|
220
229
|
|
221
230
|
begin
|
222
|
-
if file.start_with? dir
|
231
|
+
if file.start_with?(dir) || file == dir[0..-2]
|
223
232
|
sub_path = file.to_s[dir.length..-1]
|
224
233
|
return [dir, sub_path]
|
225
234
|
else
|
@@ -376,10 +385,12 @@ module Open
|
|
376
385
|
repo_source = get_repo_from_dir(dir_sub_path_source[0])
|
377
386
|
repo_target = get_repo_from_dir(dir_sub_path_target[0])
|
378
387
|
|
379
|
-
repo_source.read_and_close do
|
380
|
-
repo_target
|
381
|
-
|
382
|
-
|
388
|
+
content = repo_source.read_and_close do
|
389
|
+
repo_target[dir_sub_path_target[1]]
|
390
|
+
end
|
391
|
+
|
392
|
+
repo_target.write_and_close do
|
393
|
+
repo_source[dir_sub_path_source[1]] = content
|
383
394
|
end
|
384
395
|
|
385
396
|
return nil
|
@@ -410,10 +421,15 @@ module Open
|
|
410
421
|
repo_source = get_repo_from_dir(dir_sub_path_source[0])
|
411
422
|
repo_target = get_repo_from_dir(dir_sub_path_target[0])
|
412
423
|
|
424
|
+
content = repo_source.read_and_close do
|
425
|
+
repo_target[dir_sub_path_target[1]]
|
426
|
+
end
|
427
|
+
|
428
|
+
repo_target.write_and_close do
|
429
|
+
repo_source[dir_sub_path_source[1]] = content
|
430
|
+
end
|
431
|
+
|
413
432
|
repo_source.write_and_close do
|
414
|
-
repo_target.write_and_close do
|
415
|
-
repo_source[dir_sub_path_source[1]] = repo_target[dir_sub_path_target[1]]
|
416
|
-
end
|
417
433
|
repo_source.delete dir_sub_path_source[1]
|
418
434
|
end
|
419
435
|
|
@@ -9,7 +9,7 @@ class Step
|
|
9
9
|
return if target_dir[workflow][task][name].exists? || File.symlink?(target_dir[workflow][task][name].find)
|
10
10
|
Log.debug "Linking #{ path }"
|
11
11
|
FileUtils.mkdir_p target_dir[workflow][task] unless target_dir[workflow][task].exists?
|
12
|
-
FileUtils.ln_s path, target_dir[workflow][task][name].find
|
12
|
+
FileUtils.ln_s path, target_dir[workflow][task][name].find if File.exists?(path)
|
13
13
|
FileUtils.ln_s path + '.files', target_dir[workflow][task][name].find + '.files' if File.exists?(path + '.files')
|
14
14
|
FileUtils.ln_s path + '.info', target_dir[workflow][task][name].find + '.info' if File.exists?(path + '.info')
|
15
15
|
end
|
@@ -118,8 +118,8 @@ TSV.traverse jobs, :_bar => "Checking job status" do |file,i|
|
|
118
118
|
status = status.to_s
|
119
119
|
end
|
120
120
|
|
121
|
-
if time and
|
122
|
-
old = Time.now -
|
121
|
+
if time and Open.exists?(file)
|
122
|
+
old = Time.now - Open.atime(file)
|
123
123
|
if old > time
|
124
124
|
status = 'old'
|
125
125
|
end
|
@@ -67,6 +67,35 @@ def status_msg(status)
|
|
67
67
|
end
|
68
68
|
Log.color(color, status.to_s)
|
69
69
|
end
|
70
|
+
|
71
|
+
def input_msg(file, inputs)
|
72
|
+
|
73
|
+
str = ""
|
74
|
+
job_inputs = Workflow.load_step(file).recursive_inputs.to_hash
|
75
|
+
IndiferentHash.setup(job_inputs)
|
76
|
+
|
77
|
+
inputs.each do |input|
|
78
|
+
value = job_inputs[input]
|
79
|
+
next if value.nil?
|
80
|
+
value_str = Misc.fingerprint(value)
|
81
|
+
str << "\t#{Log.color :magenta, input}=#{value_str}"
|
82
|
+
end
|
83
|
+
str
|
84
|
+
end
|
85
|
+
|
86
|
+
def info_msg(info, info_fields)
|
87
|
+
|
88
|
+
str = ""
|
89
|
+
info_fields.each do |field|
|
90
|
+
value = info[field]
|
91
|
+
next if value.nil?
|
92
|
+
value_str = Misc.fingerprint(value)
|
93
|
+
str << "\t#{Log.color :magenta, field}=#{value_str}"
|
94
|
+
end
|
95
|
+
str
|
96
|
+
end
|
97
|
+
|
98
|
+
|
70
99
|
puts Log.color(:magenta, "# System report")
|
71
100
|
puts
|
72
101
|
sort_files = Proc.new do |a,b|
|
@@ -143,6 +172,21 @@ workflows.sort.each do |workflow,tasks|
|
|
143
172
|
if options[:quick] and i[:done]
|
144
173
|
status = 'done'
|
145
174
|
str << " #{ status_msg status }"
|
175
|
+
if inputs and inputs.any?
|
176
|
+
str << input_msg(file, inputs)
|
177
|
+
end
|
178
|
+
|
179
|
+
if info_fields and info_fields.any?
|
180
|
+
info = begin
|
181
|
+
Open.open(i[:info_file]) do |f|
|
182
|
+
Step::INFO_SERIALIAZER.load(f)
|
183
|
+
end
|
184
|
+
rescue
|
185
|
+
{:status => :noinfo}
|
186
|
+
end
|
187
|
+
IndiferentHash.setup(info)
|
188
|
+
str << info_msg(info, info_fields)
|
189
|
+
end
|
146
190
|
else
|
147
191
|
info = begin
|
148
192
|
Open.open(i[:info_file]) do |f|
|
@@ -155,7 +199,7 @@ workflows.sort.each do |workflow,tasks|
|
|
155
199
|
|
156
200
|
pid = info[:pid]
|
157
201
|
status = info[:status]
|
158
|
-
status = :missing if status == :done and not
|
202
|
+
status = :missing if status == :done and not Open.exist? file
|
159
203
|
status = status.to_s
|
160
204
|
if status != "done" and pid and not Misc.pid_exists?(pid)
|
161
205
|
if File.exist? file
|
@@ -167,25 +211,12 @@ workflows.sort.each do |workflow,tasks|
|
|
167
211
|
str << " #{ status_msg status }"
|
168
212
|
str << " (dirty)" if status == 'done' && Workflow.load_step(file).dirty?
|
169
213
|
|
170
|
-
if inputs and inputs.any?
|
171
|
-
|
172
|
-
IndiferentHash.setup(job_inputs)
|
173
|
-
|
174
|
-
inputs.each do |input|
|
175
|
-
value = job_inputs[input]
|
176
|
-
next if value.nil?
|
177
|
-
value_str = Misc.fingerprint(value)
|
178
|
-
str << "\t#{Log.color :magenta, input}=#{value_str}"
|
179
|
-
end
|
214
|
+
if inputs and inputs.any?
|
215
|
+
str << input_msg(file, inputs)
|
180
216
|
end
|
181
217
|
|
182
218
|
if info_fields and info_fields.any?
|
183
|
-
|
184
|
-
value = info[field]
|
185
|
-
next if value.nil?
|
186
|
-
value_str = Misc.fingerprint(value)
|
187
|
-
str << "\t#{Log.color :magenta, field}=#{value_str}"
|
188
|
-
end
|
219
|
+
str << info_msg(info, info_fields)
|
189
220
|
end
|
190
221
|
end
|
191
222
|
str << "; #{pid_msg pid}" unless status == "done"
|
@@ -22,6 +22,7 @@ $ rbbt workflow prov <job-result>
|
|
22
22
|
-p--plot* draw the dependency plot into <file.png>
|
23
23
|
-i--inputs* List of inputs to print
|
24
24
|
-if--info_fields* List of info fields to print
|
25
|
+
-t--touch Update modification times to be consistent
|
25
26
|
EOF
|
26
27
|
|
27
28
|
SOPT.usage if options[:help]
|
@@ -106,6 +107,18 @@ def report_msg(status, name, path, info = nil)
|
|
106
107
|
str << "\n"
|
107
108
|
end
|
108
109
|
|
110
|
+
def touch(step)
|
111
|
+
return unless File.exists?(step.path)
|
112
|
+
step.dependencies.each do |dep|
|
113
|
+
next unless Open.exists?(dep.path)
|
114
|
+
touch(dep)
|
115
|
+
if Open.mtime(step.path) < Open.mtime(dep.path)
|
116
|
+
Log.debug("Updating #{step.path} to #{dep.path}")
|
117
|
+
CMD.cmd("touch -r '#{dep.path}' '#{step.path}'")
|
118
|
+
end
|
119
|
+
end if step.dependencies
|
120
|
+
end
|
121
|
+
|
109
122
|
def report(step, offset = 0, task = nil)
|
110
123
|
info = step.info || {}
|
111
124
|
info[:task_name] = task
|
@@ -164,6 +177,10 @@ def adjacency(step)
|
|
164
177
|
[id, edges, node_info]
|
165
178
|
end
|
166
179
|
|
180
|
+
if options[:touch]
|
181
|
+
touch(step)
|
182
|
+
end
|
183
|
+
|
167
184
|
if options[:plot]
|
168
185
|
id, edges, node_info = adjacency(step)
|
169
186
|
node_info[id][:color] = 'red'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rbbt-util
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.23.
|
4
|
+
version: 5.23.36
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Miguel Vazquez
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-11-
|
11
|
+
date: 2018-11-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|