t2-server 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +38 -9
- data/bin/run_workflow +3 -9
- data/bin/server_info +75 -0
- data/lib/t2server.rb +2 -2
- data/lib/t2server/server.rb +32 -64
- metadata +5 -4
data/README.rdoc
CHANGED
@@ -1,21 +1,50 @@
|
|
1
1
|
= Taverna[http://www.taverna.org.uk/] 2 Server Interaction Gem
|
2
2
|
|
3
|
-
Authors::
|
4
|
-
Version::
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
3
|
+
Authors:: Robert Haines
|
4
|
+
Gem Version:: 0.0.4
|
5
|
+
API Version:: 2.2a1
|
6
|
+
Contact:: mailto:rhaines@manchester.ac.uk
|
7
|
+
URL:: http://taverna.sourceforge.net/
|
8
|
+
Licence:: BSD (See LICENCE or http://www.opensource.org/licenses/bsd-license.php)
|
9
|
+
Copyright:: (c) 2010 The University of Manchester, UK
|
9
10
|
|
10
11
|
|
11
12
|
== Synopsis
|
12
13
|
|
13
|
-
This is a Ruby library to interface with the Taverna 2 Server REST
|
14
|
+
This is a Ruby library to interface with the Taverna 2 Server REST API.
|
14
15
|
|
15
16
|
== Installation
|
16
17
|
|
17
|
-
|
18
|
+
Ensure that gem itself is up to date:
|
19
|
+
[sudo] gem update --system
|
20
|
+
|
21
|
+
Then simply install as you would any other gem:
|
22
|
+
[sudo] gem install t2-server
|
23
|
+
|
24
|
+
In case of problems with the above the gem is available for download here:
|
25
|
+
http://rubygems.org/gems/t2-server
|
26
|
+
|
27
|
+
You can also download the source code from here:
|
28
|
+
http://github.com/myGrid/t2-server-gem
|
18
29
|
|
19
30
|
== Usage
|
20
31
|
|
21
|
-
|
32
|
+
As well as the library there are also a couple of example scripts which
|
33
|
+
demonstrate good use of the T2Server API. These are available in the
|
34
|
+
<tt>bin</tt> directory:
|
35
|
+
* run_workflow
|
36
|
+
* server_info
|
37
|
+
* delete_all_runs
|
38
|
+
Running any of these scripts with a <tt>-h</tt> or <tt>--help</tt>
|
39
|
+
switch will show how to use them, e.g.:
|
40
|
+
run_workflow --help
|
41
|
+
|
42
|
+
== Support
|
43
|
+
|
44
|
+
Please email mailto:support@mygrid.org.uk for any questions relating to
|
45
|
+
this Ruby gem.
|
46
|
+
|
47
|
+
== References
|
48
|
+
|
49
|
+
Taverna 2 Server:: http://www.taverna.org.uk/documentation/taverna-2-x/server/
|
50
|
+
REST API Documentation:: http://www.taverna.org.uk/documentation/taverna-2-x/server/rest-api/
|
data/bin/run_workflow
CHANGED
@@ -38,23 +38,17 @@ require 'optparse'
|
|
38
38
|
# out or save them to a file.
|
39
39
|
# if the output is a list, it appears as a directory so
|
40
40
|
# all the individual entries must be grabbed from there.
|
41
|
-
# server seems to be rather sensitive to slashes, hence
|
42
|
-
# all the [...] mucking about.
|
43
41
|
def get_outputs(run, pout, dir="")
|
44
42
|
dirs, files = run.ls("out#{dir}")
|
45
43
|
dirs.each {|d| get_outputs(run, pout, "#{dir}/#{d}")}
|
46
44
|
files.each do |out|
|
47
45
|
print " #{dir}/#{out} -> "
|
48
|
-
|
49
|
-
output_name = out
|
50
|
-
else
|
51
|
-
output_name = "#{dir[1..-1]}/#{out}"
|
52
|
-
end
|
53
|
-
data = run.get_output(output_name)
|
46
|
+
data = run.get_output("#{dir}/#{out}")
|
54
47
|
if pout
|
55
48
|
p data
|
56
49
|
else
|
57
|
-
|
50
|
+
# remove leading slash
|
51
|
+
filename = "#{dir[1..-1]}/#{out}".gsub('/', '-')
|
58
52
|
File.open(filename, "w") do |file|
|
59
53
|
file.syswrite(data)
|
60
54
|
end
|
data/bin/server_info
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Copyright (c) 2010, The University of Manchester, UK.
|
3
|
+
#
|
4
|
+
# All rights reserved.
|
5
|
+
#
|
6
|
+
# Redistribution and use in source and binary forms, with or without
|
7
|
+
# modification, are permitted provided that the following conditions are met:
|
8
|
+
#
|
9
|
+
# * Redistributions of source code must retain the above copyright notice,
|
10
|
+
# this list of conditions and the following disclaimer.
|
11
|
+
#
|
12
|
+
# * Redistributions in binary form must reproduce the above copyright notice,
|
13
|
+
# this list of conditions and the following disclaimer in the documentation
|
14
|
+
# and/or other materials provided with the distribution.
|
15
|
+
#
|
16
|
+
# * Neither the names of The University of Manchester nor the names of its
|
17
|
+
# contributors may be used to endorse or promote products derived from this
|
18
|
+
# software without specific prior written permission.
|
19
|
+
#
|
20
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
21
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
22
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
23
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
24
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
25
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
26
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
27
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
28
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
29
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
30
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
31
|
+
#
|
32
|
+
# Author: Robert Haines
|
33
|
+
|
34
|
+
require 't2server'
|
35
|
+
require 'optparse'
|
36
|
+
|
37
|
+
opts = OptionParser.new do |opt|
|
38
|
+
opt.banner = "Usage: server_info [options] server-address"
|
39
|
+
opt.separator ""
|
40
|
+
opt.separator " Where server-address is the full URI of the server to"
|
41
|
+
opt.separator " connect to, e.g.: http://example.com:8080/taverna"
|
42
|
+
opt.separator " and [options] can be:"
|
43
|
+
opt.on_tail("-h", "-?", "--help", "Show this message") do
|
44
|
+
puts opt
|
45
|
+
exit
|
46
|
+
end
|
47
|
+
opt.on_tail("-v", "--version", "Show the version") do
|
48
|
+
puts "Taverna 2 Server Ruby Gem version: #{T2Server::GEM_VERSION}"
|
49
|
+
puts "Taverna 2 Server REST API version: #{T2Server::API_VERSION}"
|
50
|
+
exit
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# parse options
|
55
|
+
opts.parse!
|
56
|
+
|
57
|
+
# read and check server address
|
58
|
+
uri = ARGV.shift
|
59
|
+
if uri == nil
|
60
|
+
puts opts
|
61
|
+
exit 1
|
62
|
+
end
|
63
|
+
|
64
|
+
# connect to server and output information
|
65
|
+
server = T2Server::Server.connect(uri)
|
66
|
+
print " Server: #{uri}\n"
|
67
|
+
print " Run limit: #{server.run_limit}\n"
|
68
|
+
runs = server.runs
|
69
|
+
print "No. of runs: #{runs.length}\n"
|
70
|
+
if runs.length > 0
|
71
|
+
print " Run list: #{runs[0].uuid} - #{runs[0].expiry}\n"
|
72
|
+
runs[1..-1].each do |run|
|
73
|
+
print " #{run.uuid} - #{run.expiry}\n"
|
74
|
+
end
|
75
|
+
end
|
data/lib/t2server.rb
CHANGED
data/lib/t2server/server.rb
CHANGED
@@ -51,7 +51,7 @@ module T2Server
|
|
51
51
|
@port = uri.port
|
52
52
|
@base_path = uri.path
|
53
53
|
@rest_path = uri.path + "/rest"
|
54
|
-
@links =
|
54
|
+
@links = parse_description(get_attribute(@rest_path))
|
55
55
|
#@links.each {|key, val| puts "#{key}: #{val}"}
|
56
56
|
|
57
57
|
# get max runs
|
@@ -81,7 +81,7 @@ module T2Server
|
|
81
81
|
end
|
82
82
|
|
83
83
|
def initialize_run(workflow)
|
84
|
-
request = Net::HTTP::Post.new("#{@links[:runs]}")
|
84
|
+
request = Net::HTTP::Post.new("#{@links[:runs]}".gsub("//", "/"))
|
85
85
|
request.content_type = "application/xml"
|
86
86
|
response = Net::HTTP.new(@host, @port).start do |http|
|
87
87
|
http.request(request, Fragments::WORKFLOW % workflow)
|
@@ -111,7 +111,7 @@ module T2Server
|
|
111
111
|
end
|
112
112
|
|
113
113
|
def delete_run(uuid)
|
114
|
-
request = Net::HTTP::Delete.new("#{@links[:runs]}/#{uuid}")
|
114
|
+
request = Net::HTTP::Delete.new("#{@links[:runs]}/#{uuid}".gsub("//", "/"))
|
115
115
|
response = Net::HTTP.new(@host, @port).start {|http| http.request(request)}
|
116
116
|
|
117
117
|
case response
|
@@ -133,7 +133,7 @@ module T2Server
|
|
133
133
|
end
|
134
134
|
|
135
135
|
def set_run_input(run, input, value)
|
136
|
-
request = Net::HTTP::Put.new("#{@links[:runs]}/#{run.uuid}/#{run.inputs}/input/#{input}")
|
136
|
+
request = Net::HTTP::Put.new("#{@links[:runs]}/#{run.uuid}/#{run.inputs}/input/#{input}".gsub("//", "/"))
|
137
137
|
request.content_type = "application/xml"
|
138
138
|
response = Net::HTTP.new(@host, @port).start do |http|
|
139
139
|
http.request(request, Fragments::RUNINPUTVALUE % value)
|
@@ -149,7 +149,7 @@ module T2Server
|
|
149
149
|
end
|
150
150
|
|
151
151
|
def set_run_input_file(run, input, filename)
|
152
|
-
request = Net::HTTP::Put.new("#{@links[:runs]}/#{run.uuid}/#{run.inputs}/input/#{input}")
|
152
|
+
request = Net::HTTP::Put.new("#{@links[:runs]}/#{run.uuid}/#{run.inputs}/input/#{input}".gsub("//", "/"))
|
153
153
|
request.content_type = "application/xml"
|
154
154
|
response = Net::HTTP.new(@host, @port).start do |http|
|
155
155
|
http.request(request, Fragments::RUNINPUTFILE % filename)
|
@@ -165,7 +165,7 @@ module T2Server
|
|
165
165
|
end
|
166
166
|
|
167
167
|
def make_run_dir(uuid, root, dir)
|
168
|
-
request = Net::HTTP::Post.new("#{@links[:runs]}/#{uuid}/#{root}")
|
168
|
+
request = Net::HTTP::Post.new("#{@links[:runs]}/#{uuid}/#{root}".gsub("//", "/"))
|
169
169
|
request.content_type = "application/xml"
|
170
170
|
response = Net::HTTP.new(@host, @port).start do |http|
|
171
171
|
http.request(request, Fragments::MKDIR % dir)
|
@@ -189,7 +189,7 @@ module T2Server
|
|
189
189
|
def upload_run_file(uuid, filename, location, rename)
|
190
190
|
contents = Base64.encode64(IO.read(filename))
|
191
191
|
rename = filename.split('/')[-1] if rename == ""
|
192
|
-
request = Net::HTTP::Post.new("#{@links[:runs]}/#{uuid}/#{location}")
|
192
|
+
request = Net::HTTP::Post.new("#{@links[:runs]}/#{uuid}/#{location}".gsub("//", "/"))
|
193
193
|
request.content_type = "application/xml"
|
194
194
|
response = Net::HTTP.new(@host, @port).start do |http|
|
195
195
|
http.request(request, Fragments::UPLOAD % [rename, contents])
|
@@ -211,7 +211,7 @@ module T2Server
|
|
211
211
|
end
|
212
212
|
|
213
213
|
def set_run_attribute(uuid, path, value)
|
214
|
-
request = Net::HTTP::Put.new("#{@links[:runs]}/#{uuid}/#{path}")
|
214
|
+
request = Net::HTTP::Put.new("#{@links[:runs]}/#{uuid}/#{path}".gsub("//", "/"))
|
215
215
|
request.content_type = "text/plain"
|
216
216
|
response = Net::HTTP.new(@host, @port).start {|http| http.request(request, value)}
|
217
217
|
|
@@ -231,9 +231,9 @@ module T2Server
|
|
231
231
|
end
|
232
232
|
end
|
233
233
|
|
234
|
-
|
234
|
+
private
|
235
235
|
def get_attribute(path)
|
236
|
-
request = Net::HTTP::Get.new(path)
|
236
|
+
request = Net::HTTP::Get.new(path.gsub("//", "/"))
|
237
237
|
response = Net::HTTP.new(@host, @port).start {|http| http.request(request)}
|
238
238
|
|
239
239
|
case response
|
@@ -241,19 +241,8 @@ module T2Server
|
|
241
241
|
return response.body
|
242
242
|
when Net::HTTPNotFound
|
243
243
|
puts "Cannot find attribute #{path}."
|
244
|
-
|
245
|
-
|
246
|
-
end
|
247
|
-
end
|
248
|
-
|
249
|
-
private
|
250
|
-
def get_server_description
|
251
|
-
request = Net::HTTP::Get.new(@rest_path)
|
252
|
-
response = Net::HTTP.new(@host, @port).start {|http| http.request(request)}
|
253
|
-
|
254
|
-
case response
|
255
|
-
when Net::HTTPOK
|
256
|
-
parse_description(response.body)
|
244
|
+
when Net::HTTPForbidden
|
245
|
+
puts "Verboten!"
|
257
246
|
else
|
258
247
|
response_error(response)
|
259
248
|
end
|
@@ -269,20 +258,6 @@ module T2Server
|
|
269
258
|
:permlisteners => URI.parse(XPath.first(doc, "//nsr:permittedListeners", nsmap).attributes["href"]).path
|
270
259
|
}
|
271
260
|
end
|
272
|
-
|
273
|
-
def get_run_description(uuid)
|
274
|
-
request = Net::HTTP::Get.new("#{@links[:runs]}/#{uuid}")
|
275
|
-
response = Net::HTTP.new(@host, @port).start {|http| http.request(request)}
|
276
|
-
|
277
|
-
case response
|
278
|
-
when Net::HTTPOK
|
279
|
-
return response.body
|
280
|
-
when Net::HTTPNotFound
|
281
|
-
puts "Cannot find run #{uuid}."
|
282
|
-
else
|
283
|
-
response_error(response)
|
284
|
-
end
|
285
|
-
end
|
286
261
|
|
287
262
|
def response_error(response)
|
288
263
|
puts "Unnexpected response from Taverna Server!"
|
@@ -296,36 +271,29 @@ module T2Server
|
|
296
271
|
end
|
297
272
|
|
298
273
|
def get_runs
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
uuids.each do |uuid|
|
314
|
-
if !@runs.has_key? uuid
|
315
|
-
description = get_run_description(uuid)
|
316
|
-
@runs[uuid] = Run.create(self, "", uuid)
|
317
|
-
end
|
318
|
-
end
|
319
|
-
|
320
|
-
# clear out the expired runs
|
321
|
-
if @runs.length > @run_limit
|
322
|
-
@runs.delete_if {|key, val| !uuids.member? key}
|
274
|
+
run_list = get_attribute("#{@links[:runs]}")
|
275
|
+
|
276
|
+
doc = Document.new(run_list)
|
277
|
+
|
278
|
+
# get list of run uuids
|
279
|
+
uuids = []
|
280
|
+
XPath.each(doc, "//nsr:run", Namespaces::MAP) do |run|
|
281
|
+
uuids << run.attributes["href"].split('/')[-1]
|
282
|
+
end
|
283
|
+
|
284
|
+
# add new runs
|
285
|
+
uuids.each do |uuid|
|
286
|
+
if !@runs.has_key? uuid
|
287
|
+
@runs[uuid] = Run.create(self, "", uuid)
|
323
288
|
end
|
289
|
+
end
|
324
290
|
|
325
|
-
|
326
|
-
|
327
|
-
|
291
|
+
# clear out the expired runs
|
292
|
+
if @runs.length > @run_limit
|
293
|
+
@runs.delete_if {|key, val| !uuids.member? key}
|
328
294
|
end
|
295
|
+
|
296
|
+
@runs
|
329
297
|
end
|
330
298
|
end
|
331
299
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: t2-server
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 4
|
10
|
+
version: 0.0.4
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Robert Haines
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-07-
|
18
|
+
date: 2010-07-30 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|
@@ -29,6 +29,7 @@ extra_rdoc_files:
|
|
29
29
|
- README.rdoc
|
30
30
|
- LICENCE
|
31
31
|
files:
|
32
|
+
- bin/server_info
|
32
33
|
- bin/run_workflow
|
33
34
|
- bin/delete_all_runs
|
34
35
|
- lib/t2server.rb
|