t2-server 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +1 -0
- data/.ruby-env +1 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +7 -1
- data/CHANGES.rdoc +49 -0
- data/README.rdoc +10 -8
- data/bin/t2-delete-runs +0 -3
- data/lib/t2-server-cli.rb +16 -9
- data/lib/t2-server/exceptions.rb +7 -19
- data/lib/t2-server/net/connection.rb +14 -6
- data/lib/t2-server/net/credentials.rb +12 -1
- data/lib/t2-server/net/parameters.rb +3 -3
- data/lib/t2-server/port.rb +12 -29
- data/lib/t2-server/run.rb +54 -35
- data/lib/t2-server/server.rb +3 -4
- data/lib/t2-server/xml.rb +0 -1
- data/lib/t2-server/xml/methods.rb +97 -4
- data/t2-server.gemspec +4 -1
- data/test/helpers/fake-run.rb +47 -0
- data/test/helpers/test-cache.rb +49 -0
- data/test/helpers/test-xml.rb +36 -0
- data/test/helpers/timezone.rb +39 -0
- data/test/mocked-server-responses/.gitattributes +1 -0
- data/test/mocked-server-responses/get-admin.raw +6 -0
- data/test/mocked-server-responses/get-rest-policy-runlimit.raw +6 -0
- data/test/mocked-server-responses/get-rest-policy.raw +6 -0
- data/test/mocked-server-responses/get-rest-run-input-expected.raw +6 -0
- data/test/mocked-server-responses/get-rest-run-input.raw +6 -0
- data/test/mocked-server-responses/get-rest-run-interaction-feed-0.raw +11 -0
- data/test/mocked-server-responses/get-rest-run-interaction-feed-1.raw +92 -0
- data/test/mocked-server-responses/get-rest-run-interaction-feed-2.raw +80 -0
- data/test/mocked-server-responses/get-rest-run-name.raw +6 -0
- data/test/mocked-server-responses/get-rest-run-output-list-errors.raw +6 -0
- data/test/mocked-server-responses/get-rest-run-output.raw +6 -0
- data/test/mocked-server-responses/get-rest-run-security-permissions.raw +6 -0
- data/test/mocked-server-responses/get-rest-run-security.raw +6 -0
- data/test/mocked-server-responses/get-rest-run.raw +6 -0
- data/test/mocked-server-responses/get-rest-runs.raw +6 -0
- data/test/mocked-server-responses/get-rest.raw +6 -0
- data/test/mocked-server-responses/log.txt +1 -0
- data/test/mocked-server-responses/mocks.rb +107 -0
- data/test/mocked-server-responses/options-admin-allownew.raw +7 -0
- data/test/tc_admin.rb +52 -24
- data/test/tc_admin_live.rb +66 -0
- data/test/tc_connection.rb +87 -0
- data/test/tc_connection_exceptions.rb +86 -0
- data/test/tc_credentials.rb +73 -0
- data/test/tc_interaction.rb +182 -0
- data/test/{tc_misc.rb → tc_misc_live.rb} +3 -1
- data/test/tc_params.rb +82 -4
- data/test/tc_perms.rb +54 -101
- data/test/tc_perms_live.rb +150 -0
- data/test/tc_ports.rb +192 -0
- data/test/tc_run.rb +333 -350
- data/test/tc_run_live.rb +453 -0
- data/test/{tc_secure.rb → tc_secure_live.rb} +30 -29
- data/test/tc_server.rb +115 -42
- data/test/tc_server_live.rb +92 -0
- data/test/tc_server_version.rb +19 -0
- data/test/tc_xml_messages.rb +201 -0
- data/test/ts_t2server.rb +37 -43
- data/test/workflows/secure/heater-pk.pem +24 -18
- data/test/workflows/secure/user-cert.p12 +0 -0
- data/version.yml +1 -1
- metadata +136 -29
- data/lib/t2-server/xml/fragments.rb +0 -78
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
MDViZjcxNjNjYzgwNjJkNThmYzEwMjcyOWRjZTYzM2ZlNGNmNzRmYg==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
MjMyMWEzOGM2N2Q1YWQ1YTYwYmRjMGIyZGY1OGViY2IxMzAzM2NkYQ==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
Yzk5ZmFiYWE5NThmYzYyNDdjYzhkMjQ3ODAwNThkOTEwMDBkZjI4ZmY4ZjU4
|
10
|
+
YWQ2N2Q2N2EzN2VhNWU1OGNmYTFkMmVmMzFlOWQ3ZWQ3MTI2ZGY1NGZiMWZi
|
11
|
+
MGQ4MDcyMjRkYTkyNjU2NWFkZjM3YTVjOWU4ZmYwMWMzNDg3ZGM=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
Mzk5NTU3MWE5ZjczMzM0YWViNTYyYTE5OWFiMzc5MzA4ZWEzODkzMWYwZThm
|
14
|
+
MGU5OGI4NjdjNmFlMzgzZjlkYzFlZjFjNjNhNDdmYjk3MWYyZDdjMDMzY2Y1
|
15
|
+
Yzk2MmE0YjVjZDAzMjc3ZGQyNjNkNzViNDNhODMxZTI1ODcxNDM=
|
data/.gitignore
CHANGED
data/.ruby-env
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
RUBYLIB=./lib:../lib
|
data/.ruby-gemset
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
t2-server
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
ruby-1.9.3-p484
|
data/.travis.yml
CHANGED
data/CHANGES.rdoc
CHANGED
@@ -1,5 +1,54 @@
|
|
1
1
|
= Changes log for the T2 Ruby Gem
|
2
2
|
|
3
|
+
== Version 1.2.0
|
4
|
+
|
5
|
+
* Test provenance collection on version 2.5.4 and up only.
|
6
|
+
* Only run tests against a live server if an address is supplied.
|
7
|
+
* Add a test case to test the connection factory.
|
8
|
+
* Set up mocking of Net::HTTP and mock creation of a run.
|
9
|
+
* Mock testing server run limits and deleting all runs.
|
10
|
+
* Add Coveralls integration to the tests.
|
11
|
+
* Add tests for the credentials classes.
|
12
|
+
* Add a simple check for parsing the server version.
|
13
|
+
* Test a full run of a workflow.
|
14
|
+
* Fix the parameters classes with initial parameters.
|
15
|
+
* Test custom CA connection parameters.
|
16
|
+
* Test a network timeout.
|
17
|
+
* Catch Net::HTTP::Persistent::Error internally.
|
18
|
+
* Net::HTTP::Persistent::Error is now wrapped internally.
|
19
|
+
* Remove the unused RunNotFoundError.
|
20
|
+
* Fix documentation for Run#upload_data.
|
21
|
+
* Set minimum ruby version to be 1.9.3 in the spec.
|
22
|
+
* Modernize the installation instructions.
|
23
|
+
* Remove the unused workflow upload XML fragment.
|
24
|
+
* Add XML generation methods for server messages.
|
25
|
+
* Programmatic generation of mkdir server message.
|
26
|
+
* Programmatic generation of the upload server message.
|
27
|
+
* Streamline XML node generation methods.
|
28
|
+
* Programmatically generate input server messages.
|
29
|
+
* Generate permissions server message fragment.
|
30
|
+
* Generate trusts server message fragment.
|
31
|
+
* Generate credentials server messages.
|
32
|
+
* Streamline the generation of hierarchical XML nodes.
|
33
|
+
* Setup tests for the XML messages sent to server.
|
34
|
+
* Factor out the common help and version CLI options.
|
35
|
+
* Factor out the different SSL config options for HTTPS connections.
|
36
|
+
* Neaten up the code to get a run's resource links.
|
37
|
+
* Fix typo in Run#grant_permission.
|
38
|
+
* Add a parse method to the credentials objects.
|
39
|
+
* Found a way to better test the credentials objects.
|
40
|
+
* Fix up the test suite driver code.
|
41
|
+
* Update the public key of the secure remote services.
|
42
|
+
* Update the client certificate for secure remote services.
|
43
|
+
* Stop using a pre-cooked server reply for Run#status.
|
44
|
+
* Only download a range of bytes if requested for outputs.
|
45
|
+
* Streamline the OutputPort methods for getting data.
|
46
|
+
* Remove unused private method (path) from OutputPort.
|
47
|
+
* Factor out I/O Port processing.
|
48
|
+
* Cache a run's finished state when it has finished.
|
49
|
+
* Fix the client authentication connection settings.
|
50
|
+
* Test InputPort and OutputPort.
|
51
|
+
|
3
52
|
== Version 1.1.0
|
4
53
|
|
5
54
|
* Remove hirb as a runtime dependency.
|
data/README.rdoc
CHANGED
@@ -6,9 +6,10 @@ URL:: http://www.taverna.org.uk/
|
|
6
6
|
Licence:: BSD (See LICENCE or http://www.opensource.org/licenses/bsd-license.php)
|
7
7
|
Copyright:: (c) 2010-2014 The University of Manchester, UK
|
8
8
|
|
9
|
-
{<img src="https://badge.fury.io/rb/t2-server.
|
10
|
-
{<img src="https://codeclimate.com/github/myGrid/t2-server-gem.
|
9
|
+
{<img src="https://badge.fury.io/rb/t2-server.svg" alt="Gem Version" />}[http://badge.fury.io/rb/t2-server]
|
10
|
+
{<img src="https://codeclimate.com/github/myGrid/t2-server-gem/badges/gpa.svg" />}[https://codeclimate.com/github/myGrid/t2-server-gem]
|
11
11
|
{<img src="https://travis-ci.org/myGrid/t2-server-gem.svg?branch=master" alt="Build Status" />}[https://travis-ci.org/myGrid/t2-server-gem]
|
12
|
+
{<img src="https://coveralls.io/repos/myGrid/t2-server-gem/badge.png?branch=master" alt="Coverage Status" />}[https://coveralls.io/r/myGrid/t2-server-gem?branch=master]
|
12
13
|
|
13
14
|
== Synopsis
|
14
15
|
|
@@ -16,12 +17,13 @@ This is a Ruby library to interface with the Taverna 2 Server REST API.
|
|
16
17
|
|
17
18
|
== Installation
|
18
19
|
|
19
|
-
|
20
|
-
[sudo] gem update --system
|
21
|
-
|
22
|
-
Then simply install as you would any other gem:
|
20
|
+
Simply install as you would any other gem:
|
23
21
|
[sudo] gem install t2-server
|
24
22
|
|
23
|
+
Or use {Bundler}[http://bundler.io/], with
|
24
|
+
gem 't2-server', '~> 1.0'
|
25
|
+
in your +Gemfile+, for example.
|
26
|
+
|
25
27
|
In case of problems with the above the gem is available for download here:
|
26
28
|
https://rubygems.org/gems/t2-server
|
27
29
|
|
@@ -57,10 +59,10 @@ version pairings:
|
|
57
59
|
=== Ruby
|
58
60
|
|
59
61
|
This library is known to work with the following versions of Ruby:
|
60
|
-
* 1.9.2
|
61
62
|
* 1.9.3 +*
|
62
63
|
* 2.0.0 +*
|
63
|
-
* 2.1.
|
64
|
+
* 2.1.2 +*
|
65
|
+
* rbx 2.2 +
|
64
66
|
|
65
67
|
Those marked with an asterisk (*) are fully supported and bugs found against
|
66
68
|
them will be fixed. Other versions may work but are not tested or supported.
|
data/bin/t2-delete-runs
CHANGED
@@ -88,9 +88,6 @@ for run in server_runs
|
|
88
88
|
run.delete
|
89
89
|
end
|
90
90
|
end
|
91
|
-
rescue T2Server::RunNotFoundError => rnf
|
92
|
-
puts "Run '#{run.id}' not found - skipping."
|
93
|
-
next
|
94
91
|
rescue T2Server::AuthorizationError => ae
|
95
92
|
puts "You are not authorized to delete run '#{run.id}' - skipping."
|
96
93
|
next
|
data/lib/t2-server-cli.rb
CHANGED
@@ -53,7 +53,7 @@ module T2Server
|
|
53
53
|
ssl_auth_opts(opt, conn_params)
|
54
54
|
ssl_transport_opts(opt, conn_params)
|
55
55
|
|
56
|
-
#
|
56
|
+
# Simple credential options
|
57
57
|
opt.on_tail("-u", "--username=USERNAME", "The username to use for " +
|
58
58
|
"server operations.") do |val|
|
59
59
|
user = val.chomp
|
@@ -62,14 +62,9 @@ module T2Server
|
|
62
62
|
"the supplied username.") do |val|
|
63
63
|
pass = val.chomp
|
64
64
|
end
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
end
|
69
|
-
opt.on_tail("-v", "--version", "Show the version.") do
|
70
|
-
puts "Taverna 2 Server Ruby Gem version: #{T2Server::Version::STRING}"
|
71
|
-
exit
|
72
|
-
end
|
65
|
+
|
66
|
+
# Common options
|
67
|
+
common_opts(opt)
|
73
68
|
end
|
74
69
|
|
75
70
|
# parse options
|
@@ -96,6 +91,18 @@ module T2Server
|
|
96
91
|
|
97
92
|
private
|
98
93
|
|
94
|
+
# The help and version options.
|
95
|
+
def common_opts(opt)
|
96
|
+
opt.on_tail("-h", "-?", "--help", "Show this help message.") do
|
97
|
+
puts opt
|
98
|
+
exit
|
99
|
+
end
|
100
|
+
opt.on_tail("-v", "--version", "Show the version.") do
|
101
|
+
puts "Taverna 2 Server Ruby Gem version: #{T2Server::Version::STRING}"
|
102
|
+
exit
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
99
106
|
# The SSL authentication and peer verification options.
|
100
107
|
def ssl_auth_opts(opt, conn_params)
|
101
108
|
opt.on("-E CERT_FILE:PASSWORD", "--cert=CERT_FILE:PASSWORD", "Use " +
|
data/lib/t2-server/exceptions.rb
CHANGED
@@ -30,7 +30,7 @@
|
|
30
30
|
#
|
31
31
|
# Author: Robert Haines
|
32
32
|
|
33
|
-
require 'net/http'
|
33
|
+
require 'net/http/persistent'
|
34
34
|
|
35
35
|
module T2Server
|
36
36
|
# :stopdoc:
|
@@ -41,8 +41,10 @@ module T2Server
|
|
41
41
|
module InternalHTTPError
|
42
42
|
end
|
43
43
|
|
44
|
-
# These are the HTTP errors we want to catch.
|
45
|
-
#
|
44
|
+
# These are the HTTP errors we want to catch. Add the above exception as an
|
45
|
+
# ancestor to them all. Some are caught by Net::HTTP::Persistent and
|
46
|
+
# re-raised as a Net::HTTP::Persistent::Error but keep them listed here just
|
47
|
+
# in case.
|
46
48
|
[
|
47
49
|
EOFError,
|
48
50
|
SocketError,
|
@@ -53,7 +55,8 @@ module T2Server
|
|
53
55
|
Errno::ECONNREFUSED,
|
54
56
|
Net::HTTPBadResponse,
|
55
57
|
Net::HTTPHeaderSyntaxError,
|
56
|
-
Net::ProtocolError
|
58
|
+
Net::ProtocolError,
|
59
|
+
Net::HTTP::Persistent::Error
|
57
60
|
].each {|err| err.send(:include, InternalHTTPError)}
|
58
61
|
|
59
62
|
# :startdoc:
|
@@ -112,21 +115,6 @@ module T2Server
|
|
112
115
|
end
|
113
116
|
end
|
114
117
|
|
115
|
-
# Raised when the run that is being operated on cannot be found. If the
|
116
|
-
# expectation is that the run exists then it could have been destroyed by
|
117
|
-
# a timeout or another user.
|
118
|
-
class RunNotFoundError < T2ServerError
|
119
|
-
|
120
|
-
# The identifier of the run that was not found on the server.
|
121
|
-
attr_reader :identifier
|
122
|
-
|
123
|
-
# Create a new RunNotFoundError with the specified identifier.
|
124
|
-
def initialize(id)
|
125
|
-
@identifier = id
|
126
|
-
super "Could not find run #{@identifier}"
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
118
|
# Indicates that the attribute that the user is trying to read/change does
|
131
119
|
# not exist. The attribute could be a server or run attribute.
|
132
120
|
class AttributeNotFoundError < T2ServerError
|
@@ -306,7 +306,13 @@ module T2Server
|
|
306
306
|
@http.ssl_version = @params[:ssl_version]
|
307
307
|
end
|
308
308
|
|
309
|
-
|
309
|
+
set_peer_verification
|
310
|
+
set_client_authentication
|
311
|
+
end
|
312
|
+
|
313
|
+
private
|
314
|
+
|
315
|
+
def set_peer_verification
|
310
316
|
if @params[:verify_peer]
|
311
317
|
if @params[:ca_file]
|
312
318
|
@http.ca_file = @params[:ca_file]
|
@@ -328,14 +334,16 @@ module T2Server
|
|
328
334
|
else
|
329
335
|
@http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
330
336
|
end
|
337
|
+
end
|
331
338
|
|
332
|
-
|
339
|
+
def set_client_authentication
|
333
340
|
if @params[:client_certificate]
|
334
|
-
|
335
|
-
|
336
|
-
@http.
|
337
|
-
|
341
|
+
cert = File.read(@params[:client_certificate])
|
342
|
+
pkcs12 = OpenSSL::PKCS12.new(cert, @params[:client_password])
|
343
|
+
@http.certificate = pkcs12.certificate
|
344
|
+
@http.private_key = pkcs12.key
|
338
345
|
end
|
339
346
|
end
|
347
|
+
|
340
348
|
end
|
341
349
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2010-
|
1
|
+
# Copyright (c) 2010-2014 The University of Manchester, UK.
|
2
2
|
#
|
3
3
|
# All rights reserved.
|
4
4
|
#
|
@@ -52,6 +52,17 @@ module T2Server
|
|
52
52
|
end
|
53
53
|
# :startdoc:
|
54
54
|
|
55
|
+
# :call-seq:
|
56
|
+
# parse(userinfo) -> Credentials
|
57
|
+
#
|
58
|
+
# Parse a typical userinfo style string, such as "username:password", into
|
59
|
+
# a credentials object. In this case the credentials would have a username
|
60
|
+
# of "username" and a password of "password".
|
61
|
+
def self.parse(userinfo)
|
62
|
+
user, pass = userinfo.split(':', 2)
|
63
|
+
new(user, pass)
|
64
|
+
end
|
65
|
+
|
55
66
|
# :call-seq:
|
56
67
|
# to_s -> string
|
57
68
|
#
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2010-
|
1
|
+
# Copyright (c) 2010-2014 The University of Manchester, UK.
|
2
2
|
#
|
3
3
|
# All rights reserved.
|
4
4
|
#
|
@@ -122,7 +122,7 @@ module T2Server
|
|
122
122
|
# _path_ can either be a directory where the required certificate is stored
|
123
123
|
# or the path to the certificate file itself.
|
124
124
|
def initialize(path)
|
125
|
-
super
|
125
|
+
super()
|
126
126
|
|
127
127
|
case path
|
128
128
|
when String
|
@@ -147,7 +147,7 @@ module T2Server
|
|
147
147
|
# encrypted. If _password_ is not specified, but needed, then the
|
148
148
|
# underlying SSL implementation may ask for it if it can.
|
149
149
|
def initialize(cert, password = nil)
|
150
|
-
super
|
150
|
+
super()
|
151
151
|
|
152
152
|
case cert
|
153
153
|
when String
|
data/lib/t2-server/port.rb
CHANGED
@@ -231,14 +231,9 @@ module T2Server
|
|
231
231
|
# run.output_port("port_name")[0].value(0..100)
|
232
232
|
def value(range = nil, &block)
|
233
233
|
if depth == 0
|
234
|
-
|
235
|
-
@structure.value(&block)
|
236
|
-
else
|
237
|
-
@structure.value(range, &block)
|
238
|
-
end
|
234
|
+
@structure.value(range, &block)
|
239
235
|
else
|
240
|
-
@values
|
241
|
-
@values
|
236
|
+
@values ||= strip(:value)
|
242
237
|
end
|
243
238
|
end
|
244
239
|
|
@@ -261,11 +256,7 @@ module T2Server
|
|
261
256
|
"Stream passed in must provide a write method" unless
|
262
257
|
stream.respond_to? :write
|
263
258
|
|
264
|
-
|
265
|
-
@structure.stream_value(stream)
|
266
|
-
else
|
267
|
-
@structure.stream_value(stream, range)
|
268
|
-
end
|
259
|
+
@structure.stream_value(stream, range)
|
269
260
|
end
|
270
261
|
|
271
262
|
# :call-seq:
|
@@ -282,11 +273,7 @@ module T2Server
|
|
282
273
|
def write_value_to_file(filename, range = nil)
|
283
274
|
return 0 unless depth == 0
|
284
275
|
|
285
|
-
|
286
|
-
@structure.write_value_to_file(filename)
|
287
|
-
else
|
288
|
-
@structure.write_value_to_file(filename, range)
|
289
|
-
end
|
276
|
+
@structure.write_value_to_file(filename, range)
|
290
277
|
end
|
291
278
|
|
292
279
|
# :call-seq:
|
@@ -407,12 +394,6 @@ module T2Server
|
|
407
394
|
end
|
408
395
|
end
|
409
396
|
|
410
|
-
# Generate the path to the actual data for a data value.
|
411
|
-
def path(ref)
|
412
|
-
parts = ref.split('/')
|
413
|
-
@depth == 0 ? parts[-1] : "/" + parts[-(@depth + 1)..-1].join('/')
|
414
|
-
end
|
415
|
-
|
416
397
|
# Strip the requested attribute from the raw values structure.
|
417
398
|
def strip(attribute, struct = @structure)
|
418
399
|
if struct.instance_of? Array
|
@@ -477,22 +458,24 @@ module T2Server
|
|
477
458
|
# This method does not cache any data.
|
478
459
|
#
|
479
460
|
# If this port is an error then this value will be the error message.
|
480
|
-
def value(range =
|
461
|
+
def value(range = nil, &block)
|
481
462
|
# The following block is a workaround for Taverna Server versions prior
|
482
463
|
# to 2.4.1 and can be removed when support for those versions is no
|
483
464
|
# longer required.
|
484
465
|
if error? && @size == 0
|
485
466
|
value = @port.download(@reference)
|
486
467
|
@size = value.size
|
487
|
-
range = 0...@size if range.min.nil?
|
468
|
+
range = 0...@size if range.nil? || range.min.nil?
|
488
469
|
return value[range]
|
489
470
|
end
|
490
471
|
|
491
472
|
return "" if @type == EMPTY_TYPE
|
492
473
|
|
493
474
|
# Check that the range provided is sensible
|
494
|
-
|
495
|
-
|
475
|
+
unless range.nil?
|
476
|
+
range = 0..range.max if range.min < 0
|
477
|
+
range = range.min...@size if range.max >= @size
|
478
|
+
end
|
496
479
|
|
497
480
|
@port.download(@reference, range, &block)
|
498
481
|
end
|
@@ -506,7 +489,7 @@ module T2Server
|
|
506
489
|
# File, for example. No data is cached by this method.
|
507
490
|
#
|
508
491
|
# The number of bytes written to the stream is returned.
|
509
|
-
def stream_value(stream, range =
|
492
|
+
def stream_value(stream, range = nil)
|
510
493
|
raise ArgumentError,
|
511
494
|
"Stream passed in must provide a write method" unless
|
512
495
|
stream.respond_to? :write
|
@@ -527,7 +510,7 @@ module T2Server
|
|
527
510
|
# Stream this port value directly to a file. If a range is supplied then
|
528
511
|
# just that range of data is downloaded from the server. No data is cached
|
529
512
|
# by this method.
|
530
|
-
def write_value_to_file(filename, range =
|
513
|
+
def write_value_to_file(filename, range = nil)
|
531
514
|
File.open(filename, "wb") do |file|
|
532
515
|
stream_value(file, range)
|
533
516
|
end
|
data/lib/t2-server/run.rb
CHANGED
@@ -115,6 +115,9 @@ module T2Server
|
|
115
115
|
|
116
116
|
@credentials = credentials
|
117
117
|
|
118
|
+
# Has this Run finished executing on the server?
|
119
|
+
@finished = false
|
120
|
+
|
118
121
|
# Has this Run object been deleted from the server?
|
119
122
|
@deleted = false
|
120
123
|
|
@@ -320,7 +323,13 @@ module T2Server
|
|
320
323
|
# :running or :finished.
|
321
324
|
def status
|
322
325
|
return :deleted if @deleted
|
323
|
-
|
326
|
+
return :finished if @finished
|
327
|
+
|
328
|
+
state = Status.to_sym(@server.read(links[:status], "text/plain",
|
329
|
+
@credentials))
|
330
|
+
|
331
|
+
@finished = (state == :finished)
|
332
|
+
state
|
324
333
|
end
|
325
334
|
|
326
335
|
# :call-seq:
|
@@ -441,11 +450,14 @@ module T2Server
|
|
441
450
|
end
|
442
451
|
|
443
452
|
# :call-seq:
|
444
|
-
# upload_data(data, remote_name, remote_directory = "") ->
|
453
|
+
# upload_data(data, remote_name, remote_directory = "") -> URI
|
445
454
|
#
|
446
455
|
# Upload data to the server and store it in <tt>remote_file</tt>. The
|
447
456
|
# remote directory to put this file in can also be specified, but if it is
|
448
457
|
# it must first have been created by a call to Run#mkdir.
|
458
|
+
#
|
459
|
+
# Returns the URI of the file on the server in which the data has been
|
460
|
+
# stored.
|
449
461
|
def upload_data(data, remote_name, remote_directory = "")
|
450
462
|
location_uri = Util.append_to_uri_path(links[:wdir], remote_directory)
|
451
463
|
@server.upload_data(data, remote_name, location_uri, @credentials)
|
@@ -730,7 +742,7 @@ module T2Server
|
|
730
742
|
def grant_permission(username, permission)
|
731
743
|
return unless owner?
|
732
744
|
|
733
|
-
value =
|
745
|
+
value = xml_permissions_fragment(username, permission.to_s)
|
734
746
|
@server.create(links[:sec_perms], value, "application/xml", @credentials)
|
735
747
|
end
|
736
748
|
|
@@ -797,8 +809,7 @@ module T2Server
|
|
797
809
|
# basic uri checks
|
798
810
|
uri = _check_cred_uri(uri)
|
799
811
|
|
800
|
-
|
801
|
-
value = XML::Fragments::CREDENTIAL % cred
|
812
|
+
value = xml_password_cred_fragment(uri, username, password)
|
802
813
|
|
803
814
|
if cred_uri.nil?
|
804
815
|
@server.create(links[:sec_creds], value, "application/xml",
|
@@ -829,9 +840,7 @@ module T2Server
|
|
829
840
|
# basic uri checks
|
830
841
|
uri = _check_cred_uri(uri)
|
831
842
|
|
832
|
-
|
833
|
-
type, password]
|
834
|
-
value = XML::Fragments::CREDENTIAL % cred
|
843
|
+
value = xml_keypair_cred_fragment(uri, name, contents, type, password)
|
835
844
|
|
836
845
|
@server.create(links[:sec_creds], value, "application/xml", @credentials)
|
837
846
|
end
|
@@ -908,7 +917,7 @@ module T2Server
|
|
908
917
|
|
909
918
|
contents = Base64.encode64(IO.read(filename))
|
910
919
|
|
911
|
-
value =
|
920
|
+
value = xml_trust_fragment(contents, type)
|
912
921
|
@server.create(links[:sec_trusts], value, "application/xml", @credentials)
|
913
922
|
end
|
914
923
|
|
@@ -1060,9 +1069,9 @@ module T2Server
|
|
1060
1069
|
# use a remote file.
|
1061
1070
|
port.remote_file = upload_file(port.file) unless port.remote_file?
|
1062
1071
|
|
1063
|
-
xml_value =
|
1072
|
+
xml_value = xml_input_fragment(port.file, :file)
|
1064
1073
|
else
|
1065
|
-
xml_value =
|
1074
|
+
xml_value = xml_input_fragment(port.value)
|
1066
1075
|
end
|
1067
1076
|
|
1068
1077
|
@server.update(uri, xml_value, "application/xml", @credentials)
|
@@ -1112,33 +1121,35 @@ module T2Server
|
|
1112
1121
|
end
|
1113
1122
|
|
1114
1123
|
def _get_input_port_info
|
1115
|
-
ports = {}
|
1116
1124
|
port_desc = @server.read(links[:inputexp], "application/xml",
|
1117
1125
|
@credentials)
|
1118
1126
|
|
1119
1127
|
doc = xml_document(port_desc)
|
1120
1128
|
|
1121
|
-
|
1122
|
-
port = InputPort.new(self, inp)
|
1123
|
-
ports[port.name] = port
|
1124
|
-
end
|
1125
|
-
|
1126
|
-
ports
|
1129
|
+
_get_port_info(doc, :port_in)
|
1127
1130
|
end
|
1128
1131
|
|
1129
1132
|
def _get_output_port_info
|
1130
|
-
ports = {}
|
1131
|
-
|
1132
1133
|
begin
|
1133
1134
|
port_desc = @server.read(links[:output], "application/xml", @credentials)
|
1134
1135
|
rescue AttributeNotFoundError => anfe
|
1135
|
-
return
|
1136
|
+
return {}
|
1136
1137
|
end
|
1137
1138
|
|
1138
1139
|
doc = xml_document(port_desc)
|
1139
1140
|
|
1140
|
-
|
1141
|
-
|
1141
|
+
_get_port_info(doc, :port_out)
|
1142
|
+
end
|
1143
|
+
|
1144
|
+
def _get_port_info(doc, type)
|
1145
|
+
ports = {}
|
1146
|
+
|
1147
|
+
xpath_find(doc, @@xpaths[type]).each do |desc|
|
1148
|
+
port = if type == :port_out
|
1149
|
+
OutputPort.new(self, desc)
|
1150
|
+
else
|
1151
|
+
InputPort.new(self, desc)
|
1152
|
+
end
|
1142
1153
|
ports[port.name] = port
|
1143
1154
|
end
|
1144
1155
|
|
@@ -1177,20 +1188,12 @@ module T2Server
|
|
1177
1188
|
|
1178
1189
|
links.merge! get_uris_from_doc(doc, [:baclava, :inputexp])
|
1179
1190
|
|
1180
|
-
#
|
1181
|
-
|
1182
|
-
[:stdout, :stderr, :exitcode].each do |res|
|
1183
|
-
links[res] = Util.append_to_uri_path(links[:io], "properties/#{res}")
|
1184
|
-
end
|
1191
|
+
# IO properties links
|
1192
|
+
_get_io_properties_links(links)
|
1185
1193
|
|
1186
|
-
#
|
1194
|
+
# Security properties links - only available to the owner of a run
|
1187
1195
|
if owner?
|
1188
|
-
|
1189
|
-
@credentials)
|
1190
|
-
doc = xml_document(securectx)
|
1191
|
-
|
1192
|
-
links.merge! get_uris_from_doc(doc,
|
1193
|
-
[:sec_creds, :sec_perms, :sec_trusts])
|
1196
|
+
_get_security_links(links)
|
1194
1197
|
end
|
1195
1198
|
|
1196
1199
|
links
|
@@ -1209,6 +1212,22 @@ module T2Server
|
|
1209
1212
|
end
|
1210
1213
|
end
|
1211
1214
|
|
1215
|
+
def _get_io_properties_links(links)
|
1216
|
+
links[:io] = Util.append_to_uri_path(links[:listeners], "io")
|
1217
|
+
[:stdout, :stderr, :exitcode].each do |res|
|
1218
|
+
links[res] = Util.append_to_uri_path(links[:io], "properties/#{res}")
|
1219
|
+
end
|
1220
|
+
end
|
1221
|
+
|
1222
|
+
def _get_security_links(links)
|
1223
|
+
securectx = @server.read(links[:securectx], "application/xml",
|
1224
|
+
@credentials)
|
1225
|
+
doc = xml_document(securectx)
|
1226
|
+
|
1227
|
+
links.merge! get_uris_from_doc(doc,
|
1228
|
+
[:sec_creds, :sec_perms, :sec_trusts])
|
1229
|
+
end
|
1230
|
+
|
1212
1231
|
def download_or_stream(param, uri, type, &block)
|
1213
1232
|
if param.respond_to? :write
|
1214
1233
|
@server.read_to_stream(param, uri, type, @credentials)
|