rbbt-util 5.26.87 → 5.26.88
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/lib/rbbt/hpc.rb +15 -5
- data/lib/rbbt/workflow/definition.rb +1 -2
- data/lib/rbbt/workflow/remote/ssh/adaptor.rb +8 -25
- data/lib/rbbt/workflow/remote/ssh/driver.rb +147 -0
- data/lib/rbbt/workflow/remote/ssh/get.rb +29 -159
- data/lib/rbbt/workflow/step.rb +6 -1
- data/share/rbbt_commands/migrate +1 -0
- data/test/rbbt/test_hpc.rb +14 -0
- data/test/rbbt/test_workflow.rb +30 -22
- data/test/rbbt/workflow/remote/test_client.rb +13 -0
- metadata +72 -67
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 9ea3940c476d54994086edb928a7f3bd8e0f9106cf702fc5383c10dbf43df2f8
|
|
4
|
+
data.tar.gz: 842453f1c75c7d67307a9d7196273a233cc00d4a4adb27d4cb62d8c41111f748
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 5d679b8414ef4ed9463e2a214edf51375f417c8f6c5b5b576619efda32fd100f9d3fc623164b3e685b6bee31136a1219cf78a4d0955f5c3661c305598addeab8
|
|
7
|
+
data.tar.gz: 88e3ad03874491db2536aad2c64269fb165a92aa944101c98d59013b91eb2f05c47bf0680931f849a2a1de4422fe7bde7b7c261e915604141b8c31ee5026fbeb
|
data/lib/rbbt/hpc.rb
CHANGED
|
@@ -473,11 +473,21 @@ EOF
|
|
|
473
473
|
end
|
|
474
474
|
end
|
|
475
475
|
end
|
|
476
|
-
end
|
|
477
476
|
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
477
|
+
def relay(job, options={})
|
|
478
|
+
options = Misc.add_defaults options, :target => 'mn1', :search_path => 'user'
|
|
479
|
+
done_deps = job.dependencies.select do |dep|
|
|
480
|
+
dep.done?
|
|
481
|
+
end
|
|
482
|
+
|
|
483
|
+
error_deps = job.dependencies.select do |dep|
|
|
484
|
+
dep.error? && ! dep.recoverable_error?
|
|
485
|
+
end
|
|
482
486
|
|
|
487
|
+
(done_deps + error_deps).each do |dep|
|
|
488
|
+
Step.migrate(dep.path, options[:search_path], options)
|
|
489
|
+
end
|
|
490
|
+
|
|
491
|
+
end
|
|
492
|
+
end
|
|
483
493
|
|
|
@@ -73,8 +73,7 @@ module Workflow
|
|
|
73
73
|
set_info :result_type, dep.info[:result_type]
|
|
74
74
|
forget = config :forget_dep_tasks, :forget_dep_tasks, :default => FORGET_DEP_TASKS
|
|
75
75
|
if forget
|
|
76
|
-
self.
|
|
77
|
-
self.set_info :archived_dependencies, info[:dependencies]
|
|
76
|
+
self.archive
|
|
78
77
|
self.dependencies = self.dependencies - [dep]
|
|
79
78
|
Open.rm_rf self.files_dir if Open.exist? self.files_dir
|
|
80
79
|
FileUtils.cp_r dep.files_dir, self.files_dir if Open.exist? dep.files_dir
|
|
@@ -1,20 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
def self.__prepare_inputs_for_restclient(inputs)
|
|
3
|
-
inputs.each do |k,v|
|
|
4
|
-
if v.respond_to? :path and not v.respond_to? :original_filename
|
|
5
|
-
class << v
|
|
6
|
-
def original_filename
|
|
7
|
-
File.expand_path(path)
|
|
8
|
-
end
|
|
9
|
-
end
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
if Array === v and v.empty?
|
|
13
|
-
inputs[k] = "EMPTY_ARRAY"
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
end
|
|
1
|
+
require 'rbbt/workflow/remote/ssh/driver'
|
|
17
2
|
|
|
3
|
+
module WorkflowSSHClient
|
|
18
4
|
def workflow_description
|
|
19
5
|
WorkflowSSHClient.get_raw(File.join(url, 'description'))
|
|
20
6
|
end
|
|
@@ -26,20 +12,20 @@ module WorkflowSSHClient
|
|
|
26
12
|
|
|
27
13
|
def task_info(task)
|
|
28
14
|
@task_info ||= IndiferentHash.setup({})
|
|
29
|
-
@task_info[task]
|
|
30
15
|
|
|
31
16
|
if @task_info[task].nil?
|
|
32
|
-
task_info = WorkflowSSHClient.get_json(File.join(
|
|
17
|
+
task_info = WorkflowSSHClient.get_json(File.join(@base_url, task.to_s))
|
|
33
18
|
task_info = WorkflowSSHClient.fix_hash(task_info)
|
|
34
19
|
|
|
35
|
-
task_info[:result_type] = task_info[:result_type].to_sym
|
|
36
|
-
task_info[:export] = task_info[:export].to_sym
|
|
20
|
+
task_info[:result_type] = task_info[:result_type].to_sym if task_info[:result_type]
|
|
21
|
+
task_info[:export] = task_info[:export].to_sym if task_info[:export]
|
|
37
22
|
task_info[:input_types] = WorkflowSSHClient.fix_hash(task_info[:input_types], true)
|
|
38
23
|
task_info[:inputs] = task_info[:inputs].collect{|input| input.to_sym }
|
|
39
24
|
|
|
40
|
-
@task_info[task] = task_info
|
|
25
|
+
@task_info[task] = IndiferentHash.setup(task_info)
|
|
41
26
|
end
|
|
42
|
-
|
|
27
|
+
|
|
28
|
+
IndiferentHash.setup(@task_info[task])
|
|
43
29
|
end
|
|
44
30
|
|
|
45
31
|
def tasks
|
|
@@ -72,7 +58,4 @@ module WorkflowSSHClient
|
|
|
72
58
|
@exec_exports = @stream_exports = @synchronous_exports = []
|
|
73
59
|
@asynchronous_exports = @task_info.keys
|
|
74
60
|
end
|
|
75
|
-
|
|
76
|
-
def self.execute_job(base_url, task, task_params, cache_type)
|
|
77
|
-
end
|
|
78
61
|
end
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
module SSHDriver
|
|
2
|
+
def self.run(server, script)
|
|
3
|
+
Log.debug "Run ssh script in #{server}:\n#{script}"
|
|
4
|
+
CMD.cmd("ssh '#{server}' 'shopt -s expand_aliases; bash -ic \"ruby\"' ", :in => script, :log => true).read
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
#def self.run_log(server, script)
|
|
8
|
+
# Log.debug "Run and monitor ssh script in #{server}:\n#{script}"
|
|
9
|
+
# CMD.cmd("ssh '#{server}' 'shopt -s expand_aliases; bash -ic \"ruby\"' ", :in => script, :log => true)
|
|
10
|
+
#end
|
|
11
|
+
|
|
12
|
+
def self.parse_url(url)
|
|
13
|
+
m = url.match(/ssh:\/\/([^:]+):(.*)/)
|
|
14
|
+
server = m.captures[0]
|
|
15
|
+
path = m.captures[1]
|
|
16
|
+
[server, path]
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def self.path_script(path)
|
|
20
|
+
|
|
21
|
+
workflow, task, job, *rest = path.split("/")
|
|
22
|
+
|
|
23
|
+
script =<<-EOF
|
|
24
|
+
require 'rbbt/workflow'
|
|
25
|
+
wf = Workflow.require_workflow "#{workflow}"
|
|
26
|
+
EOF
|
|
27
|
+
|
|
28
|
+
case task
|
|
29
|
+
when nil
|
|
30
|
+
script +=<<-EOF
|
|
31
|
+
task_info = {}
|
|
32
|
+
wf.tasks.keys.each do |task|
|
|
33
|
+
task_info[task] = wf.task_info(task)
|
|
34
|
+
end
|
|
35
|
+
res = task_info
|
|
36
|
+
EOF
|
|
37
|
+
when 'documentation'
|
|
38
|
+
script +=<<-EOF
|
|
39
|
+
res = documentation = wf.documentation
|
|
40
|
+
EOF
|
|
41
|
+
else
|
|
42
|
+
if job.nil?
|
|
43
|
+
script +=<<-EOF
|
|
44
|
+
task = '#{task}'
|
|
45
|
+
res = task_info = wf.task_info(task)
|
|
46
|
+
EOF
|
|
47
|
+
else
|
|
48
|
+
case rest.first
|
|
49
|
+
when nil
|
|
50
|
+
script +=<<-EOF
|
|
51
|
+
task = '#{task}'
|
|
52
|
+
jobname = '#{job}'
|
|
53
|
+
res = job = wf.fast_load_id(File.join(task, jobname))
|
|
54
|
+
EOF
|
|
55
|
+
when "info"
|
|
56
|
+
script +=<<-EOF
|
|
57
|
+
task = '#{task}'
|
|
58
|
+
jobname = '#{job}'
|
|
59
|
+
job = wf.fast_load_id(File.join(task, jobname))
|
|
60
|
+
res = job_info = job.info
|
|
61
|
+
EOF
|
|
62
|
+
else
|
|
63
|
+
raise "Unkown path: #{[path, rest].inspect}"
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def self.job_script(inputs_id, jobname = nil)
|
|
70
|
+
script =<<-EOF
|
|
71
|
+
jobname = #{jobname.nil? ? 'nil' : "'#{jobname}'"}
|
|
72
|
+
path = File.join(ENV["HOME"], '.rbbt/tmp/tmp-ssh_job_inputs/#{inputs_id}')
|
|
73
|
+
job_inputs = Workflow.load_inputs(path, task_info[:inputs], task_info[:input_types])
|
|
74
|
+
job = wf.job(task, jobname, job_inputs)
|
|
75
|
+
EOF
|
|
76
|
+
script
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def self.get_json(url, params)
|
|
80
|
+
server, path = parse_url(url)
|
|
81
|
+
script = path_script(path)
|
|
82
|
+
|
|
83
|
+
script +=<<-EOF
|
|
84
|
+
STDOUT.write res.to_json
|
|
85
|
+
EOF
|
|
86
|
+
|
|
87
|
+
JSON.parse(self.run(server, script))
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def self.get_raw(url, params)
|
|
91
|
+
server, path = parse_url(url)
|
|
92
|
+
script = path_script(path)
|
|
93
|
+
|
|
94
|
+
script +=<<-EOF
|
|
95
|
+
STDOUT.write res
|
|
96
|
+
EOF
|
|
97
|
+
|
|
98
|
+
self.run(server, script)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def self.post_job(url, inputs_id, jobname = nil)
|
|
102
|
+
server, path = parse_url(url)
|
|
103
|
+
|
|
104
|
+
script = path_script(path)
|
|
105
|
+
script += job_script(inputs_id, jobname)
|
|
106
|
+
script +=<<-EOF
|
|
107
|
+
job.init_info
|
|
108
|
+
STDOUT.write job.name
|
|
109
|
+
EOF
|
|
110
|
+
@name = self.run(server, script)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def self.run_job(url, input_id, jobname = nil)
|
|
114
|
+
server, path = parse_url(url)
|
|
115
|
+
|
|
116
|
+
script = path_script(path)
|
|
117
|
+
script += job_script(input_id, jobname)
|
|
118
|
+
script +=<<-EOF
|
|
119
|
+
job.produce
|
|
120
|
+
STDOUT.write job.path
|
|
121
|
+
EOF
|
|
122
|
+
self.run(server, script)
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def self.run_slurm_job(url, input_id, jobname = nil)
|
|
126
|
+
server, path = parse_url(url)
|
|
127
|
+
|
|
128
|
+
script = path_script(path)
|
|
129
|
+
script += job_script(input_id, jobname)
|
|
130
|
+
script +=<<-EOF
|
|
131
|
+
job.produce
|
|
132
|
+
STDOUT.write job.path
|
|
133
|
+
EOF
|
|
134
|
+
self.run(server, script)
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def self.clean(url, input_id, jobname = nil)
|
|
138
|
+
server, path = parse_url(url)
|
|
139
|
+
|
|
140
|
+
script = path_script(path)
|
|
141
|
+
script +=<<-EOF
|
|
142
|
+
job.clean
|
|
143
|
+
EOF
|
|
144
|
+
self.run(server, script)
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
end
|
|
@@ -1,150 +1,3 @@
|
|
|
1
|
-
module SSHClient
|
|
2
|
-
def self.run(server, script)
|
|
3
|
-
Log.debug "Run ssh script in #{server}:\n#{script}"
|
|
4
|
-
CMD.cmd("ssh '#{server}' ruby ", :in => script).read.strip
|
|
5
|
-
end
|
|
6
|
-
|
|
7
|
-
def self.run_log(server, script)
|
|
8
|
-
Log.debug "Run and monitor ssh script in #{server}:\n#{script}"
|
|
9
|
-
CMD.cmd_log("ssh '#{server}' ruby ", :in => script)
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
def self.parse_url(url)
|
|
13
|
-
m = url.match(/ssh:\/\/([^:]+):(.*)/)
|
|
14
|
-
server = m.captures[0]
|
|
15
|
-
path = m.captures[1]
|
|
16
|
-
[server, path]
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def self.path_script(path)
|
|
20
|
-
|
|
21
|
-
workflow, task, job, *rest = path.split("/")
|
|
22
|
-
|
|
23
|
-
script =<<-EOF
|
|
24
|
-
require 'rbbt/workflow'
|
|
25
|
-
wf = Workflow.require_workflow "#{workflow}"
|
|
26
|
-
EOF
|
|
27
|
-
case task
|
|
28
|
-
when nil
|
|
29
|
-
script +=<<-EOF
|
|
30
|
-
task_info = {}
|
|
31
|
-
wf.tasks.keys.each do |task|
|
|
32
|
-
task_info[task] = wf.task_info(task)
|
|
33
|
-
end
|
|
34
|
-
res = task_info
|
|
35
|
-
EOF
|
|
36
|
-
when 'documentation'
|
|
37
|
-
script +=<<-EOF
|
|
38
|
-
res = documentation = wf.documentation
|
|
39
|
-
EOF
|
|
40
|
-
else
|
|
41
|
-
if job.nil?
|
|
42
|
-
script +=<<-EOF
|
|
43
|
-
task = '#{task}'
|
|
44
|
-
res = task_info = wf.task_info(task)
|
|
45
|
-
EOF
|
|
46
|
-
else
|
|
47
|
-
case rest.first
|
|
48
|
-
when nil
|
|
49
|
-
script +=<<-EOF
|
|
50
|
-
task = '#{task}'
|
|
51
|
-
jobname = '#{job}'
|
|
52
|
-
res = job = wf.fast_load_id(File.join(task, jobname))
|
|
53
|
-
EOF
|
|
54
|
-
when "info"
|
|
55
|
-
script +=<<-EOF
|
|
56
|
-
task = '#{task}'
|
|
57
|
-
jobname = '#{job}'
|
|
58
|
-
job = wf.fast_load_id(File.join(task, jobname))
|
|
59
|
-
res = job_info = job.info
|
|
60
|
-
EOF
|
|
61
|
-
else
|
|
62
|
-
raise "Unkown path: #{[path, rest].inspect}"
|
|
63
|
-
end
|
|
64
|
-
end
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
def self.get_json(url, params)
|
|
69
|
-
server, path = parse_url(url)
|
|
70
|
-
script = path_script(path)
|
|
71
|
-
|
|
72
|
-
script +=<<-EOF
|
|
73
|
-
puts res.to_json
|
|
74
|
-
EOF
|
|
75
|
-
|
|
76
|
-
JSON.parse(self.run(server, script))
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
def self.get_raw(url, params)
|
|
80
|
-
server, path = parse_url(url)
|
|
81
|
-
script = path_script(path)
|
|
82
|
-
|
|
83
|
-
script +=<<-EOF
|
|
84
|
-
puts res
|
|
85
|
-
EOF
|
|
86
|
-
|
|
87
|
-
self.run(server, script)
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
def self.post_job(url, inputs, input_types, jobname = nil)
|
|
91
|
-
server, path = parse_url(url)
|
|
92
|
-
script = path_script(path)
|
|
93
|
-
|
|
94
|
-
id = "inputs-" << rand(100000).to_s
|
|
95
|
-
CMD.cmd("ssh '#{server}' mkdir -p .rbbt/tmp/tmp-ssh_job_inputs/ ", :in => script).read
|
|
96
|
-
TmpFile.with_file do |dir|
|
|
97
|
-
if Step.save_inputs(inputs, input_types, dir)
|
|
98
|
-
CMD.cmd("scp -r '#{dir}' .rbbt/tmp/tmp-ssh_job_inputs/#{id}")
|
|
99
|
-
end
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
script +=<<-EOF
|
|
103
|
-
jobname = #{jobname.nil? ? 'nil' : "'#{jobname}'"}
|
|
104
|
-
path = '.rbbt/tmp/tmp-ssh_job_inputs/#{id}'
|
|
105
|
-
job_inputs = Workflow.load_inputs(path, task_info[:inputs], task_info[:input_types])
|
|
106
|
-
job = wf.job(task, jobname, job_inputs)
|
|
107
|
-
Log.severity = 10
|
|
108
|
-
job.fork
|
|
109
|
-
puts job.name
|
|
110
|
-
EOF
|
|
111
|
-
self.run(server, script)
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
def self.run_job(url, inputs, input_types, jobname = nil)
|
|
115
|
-
server, path = parse_url(url)
|
|
116
|
-
script = path_script(path)
|
|
117
|
-
|
|
118
|
-
id = "inputs-" << rand(100000).to_s
|
|
119
|
-
CMD.cmd("ssh '#{server}' mkdir -p .rbbt/tmp/tmp-ssh_job_inputs/ ", :in => script).read
|
|
120
|
-
TmpFile.with_file do |dir|
|
|
121
|
-
if Step.save_inputs(inputs, input_types, dir)
|
|
122
|
-
CMD.cmd("scp -r '#{dir}' .rbbt/tmp/tmp-ssh_job_inputs/#{id}")
|
|
123
|
-
end
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
script +=<<-EOF
|
|
127
|
-
jobname = #{jobname.nil? ? 'nil' : "'#{jobname}'"}
|
|
128
|
-
path = '.rbbt/tmp/tmp-ssh_job_inputs/#{id}'
|
|
129
|
-
job_inputs = Workflow.load_inputs(path, task_info[:inputs], task_info[:input_types])
|
|
130
|
-
job = wf.job(task, jobname, job_inputs)
|
|
131
|
-
job.run
|
|
132
|
-
EOF
|
|
133
|
-
self.run_log(server, script)
|
|
134
|
-
end
|
|
135
|
-
|
|
136
|
-
def self.clean(url)
|
|
137
|
-
server, path = parse_url(url)
|
|
138
|
-
script = path_script(path)
|
|
139
|
-
|
|
140
|
-
script +=<<-EOF
|
|
141
|
-
job.clean
|
|
142
|
-
EOF
|
|
143
|
-
self.run(server, script)
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
end
|
|
147
|
-
|
|
148
1
|
module WorkflowSSHClient
|
|
149
2
|
def self.fix_hash(hash, fix_values = false)
|
|
150
3
|
fixed = {}
|
|
@@ -223,7 +76,7 @@ module WorkflowSSHClient
|
|
|
223
76
|
|
|
224
77
|
res = capture_exception do
|
|
225
78
|
Misc.insist(2, 0.5) do
|
|
226
|
-
|
|
79
|
+
SSHDriver.get_json(url, :params => params)
|
|
227
80
|
end
|
|
228
81
|
end
|
|
229
82
|
|
|
@@ -234,22 +87,32 @@ module WorkflowSSHClient
|
|
|
234
87
|
end
|
|
235
88
|
end
|
|
236
89
|
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
90
|
+
def self.upload_inputs(server, inputs, input_types, input_id)
|
|
91
|
+
TmpFile.with_file do |dir|
|
|
92
|
+
if Step.save_inputs(inputs, input_types, dir)
|
|
93
|
+
CMD.cmd("ssh '#{server}' mkdir -p .rbbt/tmp/tmp-ssh_job_inputs/; scp -r '#{dir}' #{server}:.rbbt/tmp/tmp-ssh_job_inputs/#{input_id}")
|
|
94
|
+
end
|
|
95
|
+
end
|
|
240
96
|
end
|
|
241
97
|
|
|
98
|
+
#{{{ RUN
|
|
99
|
+
|
|
100
|
+
|
|
242
101
|
def init_job(cache_type = nil, other_params = {})
|
|
243
102
|
cache_type = :asynchronous if cache_type.nil? and not @is_exec
|
|
244
103
|
cache_type = :exec if cache_type.nil?
|
|
245
104
|
@last_info_time = nil
|
|
246
105
|
@done = false
|
|
247
|
-
|
|
106
|
+
@server, @server_path = SSHDriver.parse_url base_url
|
|
107
|
+
@input_id ||= "inputs-" << rand(100000).to_s
|
|
108
|
+
@input_types = task_info(task)[:input_types]
|
|
109
|
+
|
|
110
|
+
WorkflowSSHClient.upload_inputs(@server, inputs, @input_types, @input_id)
|
|
111
|
+
|
|
248
112
|
@name ||= Persist.memory("RemoteSteps", :workflow => self, :task => task, :jobname => @name, :inputs => inputs, :cache_type => cache_type) do
|
|
249
113
|
Misc.insist do
|
|
250
|
-
#@adaptor.post_jobname(File.join(base_url, task.to_s), inputs.merge(other_params).merge(:jobname => @name||@base_name, :_cache_type => cache_type))
|
|
251
114
|
input_types = {}
|
|
252
|
-
|
|
115
|
+
SSHDriver.post_job(File.join(base_url, task.to_s), @input_id, @base_name)
|
|
253
116
|
end
|
|
254
117
|
end
|
|
255
118
|
if Open.remote? @name
|
|
@@ -262,19 +125,26 @@ module WorkflowSSHClient
|
|
|
262
125
|
end
|
|
263
126
|
|
|
264
127
|
def path
|
|
265
|
-
server,
|
|
266
|
-
"ssh://" + server + ":" +
|
|
128
|
+
@server, @server_path = SSHDriver.parse_url @base_url
|
|
129
|
+
"ssh://" + @server + ":" + @remote_path
|
|
267
130
|
end
|
|
268
131
|
|
|
269
|
-
def
|
|
132
|
+
def produce(*args)
|
|
270
133
|
input_types = {}
|
|
271
|
-
|
|
134
|
+
init_job
|
|
135
|
+
@remote_path = SSHDriver.run_job(File.join(base_url, task.to_s), @input_id, @base_name)
|
|
136
|
+
while ! done?
|
|
137
|
+
sleep 1
|
|
138
|
+
end
|
|
272
139
|
end
|
|
273
140
|
|
|
141
|
+
def run(*args)
|
|
142
|
+
produce(*args)
|
|
143
|
+
end
|
|
274
144
|
|
|
275
145
|
def clean
|
|
276
146
|
init_job
|
|
277
|
-
|
|
147
|
+
SSHDriver.clean(@url, @input_id, @base_name) if done?
|
|
278
148
|
_restart
|
|
279
149
|
end
|
|
280
150
|
|
data/lib/rbbt/workflow/step.rb
CHANGED
|
@@ -108,6 +108,11 @@ class Step
|
|
|
108
108
|
@inputs || []
|
|
109
109
|
end
|
|
110
110
|
|
|
111
|
+
def archive
|
|
112
|
+
self.set_info :archived_info, archived_info
|
|
113
|
+
self.set_info :archived_dependencies, info[:dependencies]
|
|
114
|
+
end
|
|
115
|
+
|
|
111
116
|
def archived_info
|
|
112
117
|
return info[:archived_info] if info[:archived_info]
|
|
113
118
|
|
|
@@ -223,7 +228,7 @@ class Step
|
|
|
223
228
|
|
|
224
229
|
def result_type
|
|
225
230
|
@result_type ||= if @task.nil?
|
|
226
|
-
info[:result_type]
|
|
231
|
+
info[:result_type] || :binary
|
|
227
232
|
else
|
|
228
233
|
@task.result_type || info[:result_type] || :string
|
|
229
234
|
end
|
data/share/rbbt_commands/migrate
CHANGED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
require File.join(File.expand_path(File.dirname(__FILE__)), '..', 'test_helper.rb')
|
|
2
|
+
require 'rbbt/hpc'
|
|
3
|
+
require 'rbbt/workflow'
|
|
4
|
+
|
|
5
|
+
class TestHPC < Test::Unit::TestSuite
|
|
6
|
+
def test_relay
|
|
7
|
+
Log.severity = 0
|
|
8
|
+
Workflow.require_workflow "Translation"
|
|
9
|
+
job = Translation.job(:translate, nil, :genes => %w(TP53 KRAS))
|
|
10
|
+
Marenostrum.relay job
|
|
11
|
+
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
data/test/rbbt/test_workflow.rb
CHANGED
|
@@ -205,21 +205,23 @@ class TestWorkflow < Test::Unit::TestCase
|
|
|
205
205
|
def test_update_on_input_dependency_update
|
|
206
206
|
Open.repository_dirs << File.join(ENV["HOME"],".rbbt/tmp/test/workflow")
|
|
207
207
|
Log.severity = 0
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
208
|
+
Misc.with_env "RBBT_UPDATE", "true" do
|
|
209
|
+
send_input_dep_to_reverse_job = TestWF.job(:send_input_dep_to_reverse, nil, :name => "Miguel")
|
|
210
|
+
send_input_dep_to_reverse_job.clean
|
|
211
|
+
send_input_dep_to_reverse_job.run
|
|
212
|
+
|
|
213
|
+
input_dep_job = send_input_dep_to_reverse_job.step(:input_dep)
|
|
214
|
+
mtime_orig = Open.mtime send_input_dep_to_reverse_job.step(:reverse_input_text).path
|
|
215
|
+
|
|
216
|
+
sleep 2
|
|
217
|
+
input_dep_job.clean
|
|
218
|
+
input_dep_job.run
|
|
219
|
+
send_input_dep_to_reverse_job = TestWF.job(:send_input_dep_to_reverse, nil, :name => "Miguel")
|
|
220
|
+
|
|
221
|
+
send_input_dep_to_reverse_job.run
|
|
222
|
+
mtime_new = Open.mtime send_input_dep_to_reverse_job.step(:reverse_input_text).path
|
|
223
|
+
assert mtime_orig < mtime_new
|
|
224
|
+
end
|
|
223
225
|
end
|
|
224
226
|
|
|
225
227
|
def test_helper
|
|
@@ -252,9 +254,12 @@ class TestWorkflow < Test::Unit::TestCase
|
|
|
252
254
|
|
|
253
255
|
def test_search
|
|
254
256
|
str = "TEST"
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
257
|
+
TestWF.jobs(:repeat2).each do |name|
|
|
258
|
+
TestWF.load_name(:repeat2, name).clean
|
|
259
|
+
end
|
|
260
|
+
job1 = TestWF.job(:repeat2, "subdir/Default", :number => 3).clean.fork
|
|
261
|
+
job2 = TestWF.job(:repeat2, "subdir/Other", :number => 3).clean.fork
|
|
262
|
+
job3 = TestWF.job(:repeat2, "Default", :number => 3).clean.fork
|
|
258
263
|
|
|
259
264
|
while not job1.done? and not job2.done? and not job3.done?
|
|
260
265
|
sleep 1
|
|
@@ -379,10 +384,13 @@ class TestWorkflow < Test::Unit::TestCase
|
|
|
379
384
|
job.run
|
|
380
385
|
assert job.checks.select{|d| d.task_name.to_s == "t1" }.any?
|
|
381
386
|
job = TestWF.job(:t3)
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
assert job.
|
|
387
|
+
sleep 1
|
|
388
|
+
Open.touch job.step(:t1).path
|
|
389
|
+
Misc.with_env "RBBT_UPDATE", "false" do
|
|
390
|
+
assert job.updated?
|
|
391
|
+
end
|
|
392
|
+
Misc.with_env "RBBT_UPDATE", "true" do
|
|
393
|
+
assert ! job.updated?
|
|
386
394
|
end
|
|
387
395
|
end
|
|
388
396
|
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
require File.join(File.expand_path(File.dirname(__FILE__)), '../../..', 'test_helper.rb')
|
|
2
|
+
require 'rbbt/workflow/remote/client'
|
|
3
|
+
|
|
4
|
+
class TestRemote < Test::Unit::TestCase
|
|
5
|
+
def test_ssh
|
|
6
|
+
Log.severity = 0
|
|
7
|
+
client = WorkflowRemoteClient.new "ssh://localhost:Translation", "Translation"
|
|
8
|
+
job = client.job("translate", "SSH-TEST", :genes => ["TP53","KRAS"])
|
|
9
|
+
iii job.url
|
|
10
|
+
puts job.run
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
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.26.
|
|
4
|
+
version: 5.26.88
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Miguel Vazquez
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2019-11-
|
|
11
|
+
date: 2019-11-25 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rake
|
|
@@ -328,6 +328,7 @@ files:
|
|
|
328
328
|
- lib/rbbt/workflow/remote/rest/adaptor.rb
|
|
329
329
|
- lib/rbbt/workflow/remote/rest/get.rb
|
|
330
330
|
- lib/rbbt/workflow/remote/ssh/adaptor.rb
|
|
331
|
+
- lib/rbbt/workflow/remote/ssh/driver.rb
|
|
331
332
|
- lib/rbbt/workflow/remote/ssh/get.rb
|
|
332
333
|
- lib/rbbt/workflow/schedule.rb
|
|
333
334
|
- lib/rbbt/workflow/soap.rb
|
|
@@ -454,6 +455,7 @@ files:
|
|
|
454
455
|
- test/rbbt/test_association.rb
|
|
455
456
|
- test/rbbt/test_entity.rb
|
|
456
457
|
- test/rbbt/test_fix_width_table.rb
|
|
458
|
+
- test/rbbt/test_hpc.rb
|
|
457
459
|
- test/rbbt/test_knowledge_base.rb
|
|
458
460
|
- test/rbbt/test_monitor.rb
|
|
459
461
|
- test/rbbt/test_packed_index.rb
|
|
@@ -507,6 +509,7 @@ files:
|
|
|
507
509
|
- test/rbbt/util/test_simpleDSL.rb
|
|
508
510
|
- test/rbbt/util/test_simpleopt.rb
|
|
509
511
|
- test/rbbt/util/test_tmpfile.rb
|
|
512
|
+
- test/rbbt/workflow/remote/test_client.rb
|
|
510
513
|
- test/rbbt/workflow/step/test_dependencies.rb
|
|
511
514
|
- test/rbbt/workflow/test_doc.rb
|
|
512
515
|
- test/rbbt/workflow/test_step.rb
|
|
@@ -531,91 +534,93 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
531
534
|
- !ruby/object:Gem::Version
|
|
532
535
|
version: '0'
|
|
533
536
|
requirements: []
|
|
534
|
-
rubygems_version: 3.0.
|
|
537
|
+
rubygems_version: 3.0.6
|
|
535
538
|
signing_key:
|
|
536
539
|
specification_version: 4
|
|
537
540
|
summary: Utilities for the Ruby Bioinformatics Toolkit (rbbt)
|
|
538
541
|
test_files:
|
|
539
|
-
- test/
|
|
540
|
-
- test/rbbt/
|
|
541
|
-
- test/rbbt/
|
|
542
|
-
- test/rbbt/
|
|
543
|
-
- test/rbbt/
|
|
544
|
-
- test/rbbt/
|
|
545
|
-
- test/rbbt/
|
|
546
|
-
- test/rbbt/
|
|
547
|
-
- test/rbbt/
|
|
548
|
-
- test/rbbt/
|
|
549
|
-
- test/rbbt/
|
|
550
|
-
- test/rbbt/
|
|
551
|
-
- test/rbbt/
|
|
552
|
-
- test/rbbt/
|
|
542
|
+
- test/rbbt/test_entity.rb
|
|
543
|
+
- test/rbbt/workflow/test_doc.rb
|
|
544
|
+
- test/rbbt/workflow/test_step.rb
|
|
545
|
+
- test/rbbt/workflow/remote/test_client.rb
|
|
546
|
+
- test/rbbt/workflow/step/test_dependencies.rb
|
|
547
|
+
- test/rbbt/workflow/test_task.rb
|
|
548
|
+
- test/rbbt/resource/test_path.rb
|
|
549
|
+
- test/rbbt/util/test_colorize.rb
|
|
550
|
+
- test/rbbt/util/misc/test_omics.rb
|
|
551
|
+
- test/rbbt/util/misc/test_pipes.rb
|
|
552
|
+
- test/rbbt/util/misc/test_lock.rb
|
|
553
|
+
- test/rbbt/util/misc/test_multipart_payload.rb
|
|
554
|
+
- test/rbbt/util/misc/test_bgzf.rb
|
|
555
|
+
- test/rbbt/util/test_concurrency.rb
|
|
556
|
+
- test/rbbt/util/test_cmd.rb
|
|
557
|
+
- test/rbbt/util/R/test_plot.rb
|
|
558
|
+
- test/rbbt/util/R/test_eval.rb
|
|
559
|
+
- test/rbbt/util/R/test_model.rb
|
|
553
560
|
- test/rbbt/util/test_config.rb
|
|
554
|
-
- test/rbbt/util/
|
|
561
|
+
- test/rbbt/util/test_log.rb
|
|
562
|
+
- test/rbbt/util/test_simpleDSL.rb
|
|
563
|
+
- test/rbbt/util/log/test_progress.rb
|
|
555
564
|
- test/rbbt/util/test_tmpfile.rb
|
|
556
|
-
- test/rbbt/util/
|
|
557
|
-
- test/rbbt/util/test_misc.rb
|
|
565
|
+
- test/rbbt/util/test_R.rb
|
|
558
566
|
- test/rbbt/util/test_excel2tsv.rb
|
|
559
|
-
- test/rbbt/util/
|
|
560
|
-
- test/rbbt/util/
|
|
561
|
-
- test/rbbt/util/
|
|
562
|
-
- test/rbbt/util/misc/test_bgzf.rb
|
|
563
|
-
- test/rbbt/util/misc/test_lock.rb
|
|
564
|
-
- test/rbbt/util/misc/test_omics.rb
|
|
565
|
-
- test/rbbt/util/test_semaphore.rb
|
|
566
|
-
- test/rbbt/util/simpleopt/test_get.rb
|
|
567
|
+
- test/rbbt/util/test_misc.rb
|
|
568
|
+
- test/rbbt/util/test_open.rb
|
|
569
|
+
- test/rbbt/util/test_simpleopt.rb
|
|
567
570
|
- test/rbbt/util/simpleopt/test_parse.rb
|
|
568
571
|
- test/rbbt/util/simpleopt/test_setup.rb
|
|
569
|
-
- test/rbbt/util/
|
|
572
|
+
- test/rbbt/util/simpleopt/test_get.rb
|
|
573
|
+
- test/rbbt/util/test_python.rb
|
|
574
|
+
- test/rbbt/util/test_filecache.rb
|
|
570
575
|
- test/rbbt/util/concurrency/test_processes.rb
|
|
571
576
|
- test/rbbt/util/concurrency/test_threads.rb
|
|
572
577
|
- test/rbbt/util/concurrency/processes/test_socket.rb
|
|
573
|
-
- test/rbbt/util/
|
|
574
|
-
- test/rbbt/util/test_colorize.rb
|
|
575
|
-
- test/rbbt/util/test_cmd.rb
|
|
576
|
-
- test/rbbt/util/test_concurrency.rb
|
|
577
|
-
- test/rbbt/util/R/test_eval.rb
|
|
578
|
-
- test/rbbt/util/R/test_plot.rb
|
|
579
|
-
- test/rbbt/util/R/test_model.rb
|
|
580
|
-
- test/rbbt/util/test_simpleopt.rb
|
|
578
|
+
- test/rbbt/util/test_semaphore.rb
|
|
581
579
|
- test/rbbt/util/test_chain_methods.rb
|
|
582
|
-
- test/rbbt/
|
|
583
|
-
- test/rbbt/
|
|
584
|
-
- test/rbbt/tsv/test_index.rb
|
|
585
|
-
- test/rbbt/tsv/test_parser.rb
|
|
586
|
-
- test/rbbt/tsv/test_field_index.rb
|
|
587
|
-
- test/rbbt/tsv/test_stream.rb
|
|
588
|
-
- test/rbbt/tsv/test_accessor.rb
|
|
580
|
+
- test/rbbt/test_resource.rb
|
|
581
|
+
- test/rbbt/test_packed_index.rb
|
|
589
582
|
- test/rbbt/tsv/test_change_id.rb
|
|
590
|
-
- test/rbbt/tsv/
|
|
591
|
-
- test/rbbt/tsv/parallel/test_through.rb
|
|
592
|
-
- test/rbbt/tsv/parallel/test_traverse.rb
|
|
593
|
-
- test/rbbt/tsv/test_manipulate.rb
|
|
583
|
+
- test/rbbt/tsv/test_attach.rb
|
|
594
584
|
- test/rbbt/tsv/test_filter.rb
|
|
585
|
+
- test/rbbt/tsv/test_parser.rb
|
|
586
|
+
- test/rbbt/tsv/test_accessor.rb
|
|
595
587
|
- test/rbbt/tsv/test_matrix.rb
|
|
588
|
+
- test/rbbt/tsv/test_field_index.rb
|
|
596
589
|
- test/rbbt/tsv/test_util.rb
|
|
597
|
-
- test/rbbt/tsv/
|
|
590
|
+
- test/rbbt/tsv/test_index.rb
|
|
591
|
+
- test/rbbt/tsv/test_parallel.rb
|
|
592
|
+
- test/rbbt/tsv/test_manipulate.rb
|
|
598
593
|
- test/rbbt/tsv/test_excel.rb
|
|
599
|
-
- test/rbbt/
|
|
600
|
-
- test/rbbt/
|
|
601
|
-
- test/rbbt/
|
|
602
|
-
- test/rbbt/
|
|
603
|
-
- test/rbbt/
|
|
604
|
-
- test/rbbt/
|
|
605
|
-
- test/rbbt/
|
|
606
|
-
- test/rbbt/
|
|
607
|
-
- test/rbbt/
|
|
608
|
-
- test/rbbt/
|
|
609
|
-
- test/rbbt/test_resource.rb
|
|
610
|
-
- test/rbbt/test_persist.rb
|
|
611
|
-
- test/rbbt/persist/tsv/test_tokyocabinet.rb
|
|
612
|
-
- test/rbbt/persist/tsv/test_cdb.rb
|
|
613
|
-
- test/rbbt/persist/tsv/test_leveldb.rb
|
|
594
|
+
- test/rbbt/tsv/parallel/test_through.rb
|
|
595
|
+
- test/rbbt/tsv/parallel/test_traverse.rb
|
|
596
|
+
- test/rbbt/tsv/test_stream.rb
|
|
597
|
+
- test/rbbt/test_association.rb
|
|
598
|
+
- test/rbbt/association/test_database.rb
|
|
599
|
+
- test/rbbt/association/test_item.rb
|
|
600
|
+
- test/rbbt/association/test_open.rb
|
|
601
|
+
- test/rbbt/association/test_util.rb
|
|
602
|
+
- test/rbbt/association/test_index.rb
|
|
603
|
+
- test/rbbt/test_knowledge_base.rb
|
|
614
604
|
- test/rbbt/persist/tsv/test_kyotocabinet.rb
|
|
615
|
-
- test/rbbt/persist/tsv/
|
|
605
|
+
- test/rbbt/persist/tsv/test_cdb.rb
|
|
616
606
|
- test/rbbt/persist/tsv/test_lmdb.rb
|
|
607
|
+
- test/rbbt/persist/tsv/test_sharder.rb
|
|
608
|
+
- test/rbbt/persist/tsv/test_leveldb.rb
|
|
609
|
+
- test/rbbt/persist/tsv/test_tokyocabinet.rb
|
|
617
610
|
- test/rbbt/persist/test_tsv.rb
|
|
618
611
|
- test/rbbt/test_tsv.rb
|
|
612
|
+
- test/rbbt/test_annotations.rb
|
|
619
613
|
- test/rbbt/test_fix_width_table.rb
|
|
620
|
-
- test/rbbt/
|
|
621
|
-
- test/rbbt/
|
|
614
|
+
- test/rbbt/test_workflow.rb
|
|
615
|
+
- test/rbbt/entity/test_identifiers.rb
|
|
616
|
+
- test/rbbt/annotations/test_util.rb
|
|
617
|
+
- test/rbbt/test_hpc.rb
|
|
618
|
+
- test/rbbt/test_monitor.rb
|
|
619
|
+
- test/rbbt/test_persist.rb
|
|
620
|
+
- test/rbbt/knowledge_base/test_entity.rb
|
|
621
|
+
- test/rbbt/knowledge_base/test_registry.rb
|
|
622
|
+
- test/rbbt/knowledge_base/test_syndicate.rb
|
|
623
|
+
- test/rbbt/knowledge_base/test_query.rb
|
|
624
|
+
- test/rbbt/knowledge_base/test_enrichment.rb
|
|
625
|
+
- test/rbbt/knowledge_base/test_traverse.rb
|
|
626
|
+
- test/test_helper.rb
|