opentox-client 0.0.1pre → 0.0.2pre
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.
- data/README.markdown +5 -0
- data/lib/authorization.rb +55 -79
- data/lib/dataset.rb +17 -306
- data/lib/error.rb +23 -12
- data/lib/opentox-client.rb +5 -2
- data/lib/opentox.rb +27 -15
- data/lib/overwrite.rb +10 -22
- data/lib/policy.rb +204 -127
- data/lib/rest-client-wrapper.rb +14 -7
- data/lib/task.rb +22 -31
- data/opentox-client.gemspec +5 -1
- data/test/authorization.rb +107 -0
- data/test/dataset.rb +60 -14
- data/test/feature.rb +2 -2
- data/test/policy.rb +120 -0
- data/test/task.rb +5 -5
- metadata +19 -15
data/lib/policy.rb
CHANGED
@@ -1,28 +1,29 @@
|
|
1
1
|
module OpenTox
|
2
2
|
require "rexml/document"
|
3
3
|
|
4
|
-
#Module for policy-processing
|
4
|
+
#Module for policy-processing
|
5
5
|
# @see also http://www.opentox.org/dev/apis/api-1.2/AA for opentox API specs
|
6
6
|
# Class Policies corresponds to <policies> container of an xml-policy-fle
|
7
|
-
class Policies
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
class Policies
|
8
|
+
|
9
|
+
#Hash for policy objects see {Policy Policy}
|
10
|
+
attr_accessor :policies, :name
|
11
|
+
|
11
12
|
def initialize()
|
12
13
|
@policies = {}
|
13
14
|
end
|
14
|
-
|
15
|
+
|
15
16
|
#create new policy instance with name
|
16
17
|
# @param [String]name of the policy
|
17
18
|
def new_policy(name)
|
18
19
|
@policies[name] = Policy.new(name)
|
19
20
|
end
|
20
|
-
|
21
|
+
|
21
22
|
#drop a specific policy in a policies instance
|
22
23
|
# @param [String]name of the policy
|
23
24
|
# @return [Boolean]
|
24
25
|
def drop_policy(name)
|
25
|
-
return true if @policies.delete(name)
|
26
|
+
return true if @policies.delete(name)
|
26
27
|
end
|
27
28
|
|
28
29
|
#drop all policies in a policies instance
|
@@ -32,58 +33,63 @@ module OpenTox
|
|
32
33
|
end
|
33
34
|
return true
|
34
35
|
end
|
35
|
-
|
36
|
+
|
36
37
|
# @return [Array] set of arrays affected by policies
|
37
38
|
def uris
|
38
|
-
@policies.collect{ |k,v| v.
|
39
|
+
@policies.collect{ |k,v| v.uri }.flatten.uniq
|
39
40
|
end
|
40
41
|
|
41
|
-
|
42
|
+
#list all policy names in a policies instance
|
43
|
+
# @return [Array]
|
42
44
|
def names
|
43
45
|
out = []
|
44
46
|
@policies.each do |name, policy|
|
45
|
-
out << name
|
47
|
+
out << name
|
46
48
|
end
|
47
49
|
return out
|
48
50
|
end
|
49
51
|
|
50
|
-
#
|
51
|
-
|
52
|
+
# Loads a default policy template in a policies instance
|
53
|
+
# @param [String]user username in LDAP string of user policy: 'uid=<user>,ou=people,dc=opentox,dc=org'
|
54
|
+
# @param [String]uri URI
|
55
|
+
# @param [String]group groupname in LDAP string of group policy: 'cn=<group>,ou=groups,dc=opentox,dc=org'
|
56
|
+
def load_default_policy(user, uri, group="member")
|
52
57
|
template = case user
|
53
58
|
when "guest", "anonymous" then "default_guest_policy"
|
54
|
-
else "default_policy"
|
59
|
+
else "default_policy"
|
55
60
|
end
|
56
61
|
xml = File.read(File.join(File.dirname(__FILE__), "templates/#{template}.xml"))
|
57
62
|
self.load_xml(xml)
|
58
63
|
datestring = Time.now.strftime("%Y-%m-%d-%H-%M-%S-x") + rand(1000).to_s
|
59
|
-
|
64
|
+
|
60
65
|
@policies["policy_user"].name = "policy_user_#{user}_#{datestring}"
|
61
|
-
@policies["policy_user"].
|
62
|
-
@policies["policy_user"].
|
63
|
-
@policies["policy_user"].
|
64
|
-
@policies["policy_user"].
|
66
|
+
@policies["policy_user"].rule.uri = uri
|
67
|
+
@policies["policy_user"].rule.name = "rule_user_#{user}_#{datestring}"
|
68
|
+
@policies["policy_user"].subject.name = "subject_user_#{user}_#{datestring}"
|
69
|
+
@policies["policy_user"].subject.value = "uid=#{user},ou=people,dc=opentox,dc=org"
|
65
70
|
@policies["policy_user"].subject_group = "subjects_user_#{user}_#{datestring}"
|
66
|
-
|
67
|
-
@policies["policy_group"].name = "policy_group_#{group}_#{datestring}"
|
68
|
-
@policies["policy_group"].
|
69
|
-
@policies["policy_group"].
|
70
|
-
@policies["policy_group"].
|
71
|
-
@policies["policy_group"].
|
72
|
-
@policies["policy_group"].subject_group = "subjects_#{group}_#{datestring}"
|
71
|
+
|
72
|
+
@policies["policy_group"].name = "policy_group_#{group}_#{datestring}"
|
73
|
+
@policies["policy_group"].rule.uri = uri
|
74
|
+
@policies["policy_group"].rule.name = "rule_group_#{group}_#{datestring}"
|
75
|
+
@policies["policy_group"].subject.name = "subject_group_#{group}_#{datestring}"
|
76
|
+
@policies["policy_group"].subject.value = "cn=#{group},ou=groups,dc=opentox,dc=org"
|
77
|
+
@policies["policy_group"].subject_group = "subjects_#{group}_#{datestring}"
|
73
78
|
return true
|
74
|
-
end
|
79
|
+
end
|
75
80
|
|
76
|
-
#loads a xml template
|
81
|
+
#loads a xml template
|
77
82
|
def load_xml(xml)
|
78
83
|
rexml = REXML::Document.new(xml)
|
79
84
|
rexml.elements.each("Policies/Policy") do |pol| #Policies
|
80
85
|
policy_name = pol.attributes["name"]
|
81
86
|
new_policy(policy_name)
|
82
|
-
#@policies[policy_name] = Policy.new(policy_name)
|
87
|
+
#@policies[policy_name] = Policy.new(policy_name)
|
83
88
|
rexml.elements.each("Policies/Policy[@name='#{policy_name}']/Rule") do |r| #Rules
|
84
|
-
rule_name = r.attributes["name"]
|
89
|
+
rule_name = r.attributes["name"]
|
85
90
|
uri = rexml.elements["Policies/Policy[@name='#{policy_name}']/Rule[@name='#{rule_name}']/ResourceName"].attributes["name"]
|
86
|
-
@policies[policy_name].
|
91
|
+
@policies[policy_name].rule.name = rule_name
|
92
|
+
@policies[policy_name].uri = uri
|
87
93
|
rexml.elements.each("Policies/Policy[@name='#{policy_name}']/Rule[@name='#{rule_name}']/AttributeValuePair") do |attribute_pairs|
|
88
94
|
action=nil; value=nil;
|
89
95
|
attribute_pairs.each_element do |elem|
|
@@ -93,163 +99,234 @@ module OpenTox
|
|
93
99
|
if action and value
|
94
100
|
case action
|
95
101
|
when "GET"
|
96
|
-
@policies[policy_name].
|
102
|
+
@policies[policy_name].rule.get = value
|
97
103
|
when "POST"
|
98
|
-
@policies[policy_name].
|
104
|
+
@policies[policy_name].rule.post = value
|
99
105
|
when "PUT"
|
100
|
-
@policies[policy_name].
|
101
|
-
when "DELETE"
|
102
|
-
@policies[policy_name].
|
106
|
+
@policies[policy_name].rule.put = value
|
107
|
+
when "DELETE"
|
108
|
+
@policies[policy_name].rule.delete = value
|
103
109
|
end
|
104
110
|
end
|
105
|
-
end
|
111
|
+
end
|
106
112
|
end
|
107
113
|
rexml.elements.each("Policies/Policy[@name='#{policy_name}']/Subjects") do |subjects| #Subjects
|
108
|
-
@policies[policy_name].subject_group = subjects.attributes["name"]
|
114
|
+
@policies[policy_name].subject_group = subjects.attributes["name"]
|
109
115
|
rexml.elements.each("Policies/Policy[@name='#{policy_name}']/Subjects[@name='#{@policies[policy_name].subject_group}']/Subject") do |s| #Subject
|
110
116
|
subject_name = s.attributes["name"]
|
111
117
|
subject_type = s.attributes["type"]
|
112
118
|
subject_value = rexml.elements["Policies/Policy[@name='#{policy_name}']/Subjects[@name='#{@policies[policy_name].subject_group}']/Subject[@name='#{subject_name}']/AttributeValuePair/Value"].text
|
113
|
-
|
119
|
+
if subject_name and subject_type and subject_value
|
120
|
+
@policies[policy_name].subject.name = subject_name
|
121
|
+
@policies[policy_name].type = subject_type
|
122
|
+
@policies[policy_name].value = subject_value
|
123
|
+
end
|
114
124
|
end
|
115
|
-
end
|
116
|
-
end
|
125
|
+
end
|
126
|
+
end
|
117
127
|
end
|
118
|
-
|
128
|
+
|
119
129
|
#generates xml from policies instance
|
120
130
|
def to_xml
|
121
131
|
doc = REXML::Document.new()
|
122
132
|
doc << REXML::DocType.new("Policies", "PUBLIC \"-//Sun Java System Access Manager7.1 2006Q3\n Admin CLI DTD//EN\" \"jar://com/sun/identity/policy/policyAdmin.dtd\"")
|
123
133
|
doc.add_element(REXML::Element.new("Policies"))
|
124
|
-
|
134
|
+
|
125
135
|
@policies.each do |name, pol|
|
126
136
|
policy = REXML::Element.new("Policy")
|
127
137
|
policy.attributes["name"] = pol.name
|
128
138
|
policy.attributes["referralPolicy"] = false
|
129
139
|
policy.attributes["active"] = true
|
130
|
-
@policies[name].
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
out_rule.add_element(attributevaluepair)
|
151
|
-
|
152
|
-
end
|
140
|
+
rule = @policies[name].rule
|
141
|
+
out_rule = REXML::Element.new("Rule")
|
142
|
+
out_rule.attributes["name"] = rule.name
|
143
|
+
servicename = REXML::Element.new("ServiceName")
|
144
|
+
servicename.attributes["name"]="iPlanetAMWebAgentService"
|
145
|
+
out_rule.add_element(servicename)
|
146
|
+
rescourcename = REXML::Element.new("ResourceName")
|
147
|
+
rescourcename.attributes["name"] = rule.uri
|
148
|
+
out_rule.add_element(rescourcename)
|
149
|
+
|
150
|
+
["get","post","delete","put"].each do |act|
|
151
|
+
if rule.method(act).call
|
152
|
+
attribute = REXML::Element.new("Attribute")
|
153
|
+
attribute.attributes["name"] = act.upcase
|
154
|
+
attributevaluepair = REXML::Element.new("AttributeValuePair")
|
155
|
+
attributevaluepair.add_element(attribute)
|
156
|
+
attributevalue = REXML::Element.new("Value")
|
157
|
+
attributevaluepair.add_element(attributevalue)
|
158
|
+
attributevalue.add_text REXML::Text.new(rule.method(act).call)
|
159
|
+
out_rule.add_element(attributevaluepair)
|
153
160
|
end
|
154
|
-
|
155
|
-
|
161
|
+
end
|
162
|
+
policy.add_element(out_rule)
|
156
163
|
|
157
164
|
subjects = REXML::Element.new("Subjects")
|
158
165
|
subjects.attributes["name"] = pol.subject_group
|
159
166
|
subjects.attributes["description"] = ""
|
160
|
-
@policies[name].
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
end
|
167
|
+
subj = @policies[name].subject.name
|
168
|
+
subject = REXML::Element.new("Subject")
|
169
|
+
subject.attributes["name"] = pol.subject.name
|
170
|
+
subject.attributes["type"] = pol.subject.type
|
171
|
+
subject.attributes["includeType"] = "inclusive"
|
172
|
+
attributevaluepair = REXML::Element.new("AttributeValuePair")
|
173
|
+
attribute = REXML::Element.new("Attribute")
|
174
|
+
attribute.attributes["name"] = "Values"
|
175
|
+
attributevaluepair.add_element(attribute)
|
176
|
+
attributevalue = REXML::Element.new("Value")
|
177
|
+
attributevalue.add_text REXML::Text.new(pol.subject.value)
|
178
|
+
attributevaluepair.add_element(attributevalue)
|
179
|
+
subject.add_element(attributevaluepair)
|
180
|
+
subjects.add_element(subject)
|
175
181
|
policy.add_element(subjects)
|
176
182
|
doc.root.add_element(policy)
|
177
|
-
end
|
183
|
+
end
|
178
184
|
out = ""
|
179
185
|
doc.write(out, 2)
|
180
186
|
return out
|
181
|
-
end
|
182
|
-
|
187
|
+
end
|
188
|
+
|
183
189
|
end
|
184
|
-
|
185
|
-
#single policy in a
|
186
|
-
class Policy
|
187
|
-
|
188
|
-
attr_accessor :name, :
|
189
|
-
|
190
|
+
|
191
|
+
#single policy in a {Policies Policies} instance
|
192
|
+
class Policy
|
193
|
+
|
194
|
+
attr_accessor :name, :rule, :subject_group, :subject, :value, :type, :uri, :group, :user
|
195
|
+
|
190
196
|
def initialize(name)
|
191
197
|
@name = name
|
192
|
-
@
|
193
|
-
@subject_group = ""
|
194
|
-
@
|
198
|
+
@rule = Rule.new("#{name}_rule", nil)
|
199
|
+
@subject_group = "#{name}_subjects"
|
200
|
+
@subject = Subject.new("#{name}_subject", nil, nil)
|
195
201
|
end
|
196
|
-
|
197
|
-
#
|
198
|
-
def
|
199
|
-
@
|
202
|
+
|
203
|
+
# Subject type LDAPUsers or LDAPGroups
|
204
|
+
def type
|
205
|
+
@subject.type
|
200
206
|
end
|
201
|
-
|
202
|
-
#
|
203
|
-
|
204
|
-
|
207
|
+
|
208
|
+
# Set subject type <LDAPUsers, LDAPGroups>
|
209
|
+
# @param [String],type
|
210
|
+
def type=(type)
|
211
|
+
@subject.type = type
|
205
212
|
end
|
206
|
-
|
207
|
-
#
|
208
|
-
def
|
209
|
-
@
|
213
|
+
|
214
|
+
# returns LDAP Distinguished Name (DN) e.g. uid=username,ou=people,dc=opentox,dc=org or cn=membergroup,ou=groups,dc=opentox,dc=org
|
215
|
+
def value
|
216
|
+
@subject.value
|
217
|
+
end
|
218
|
+
|
219
|
+
# sets LDAP Distinguished Name (DN) for policy e.g.
|
220
|
+
# @param [String],LDAPString
|
221
|
+
def value=(value)
|
222
|
+
@subject.value = value
|
223
|
+
end
|
224
|
+
|
225
|
+
# uri affected by policy
|
226
|
+
# @return uri affected by policy
|
227
|
+
def uri
|
228
|
+
@rule.uri
|
229
|
+
end
|
230
|
+
|
231
|
+
# sets uri affected by policy
|
232
|
+
# @param [String] set URI
|
233
|
+
def uri=(uri)
|
234
|
+
@rule.uri = uri
|
235
|
+
end
|
236
|
+
|
237
|
+
# Get the groupname from within the LDAP Distinguished Name (DN)
|
238
|
+
def group
|
239
|
+
return false if !value && type != "LDAPGroups"
|
240
|
+
value.split(",").each{|part| return part.gsub("cn=","") if part.match("cn=")}
|
241
|
+
end
|
242
|
+
|
243
|
+
# Get the username from within the LDAP Distinguished Name (DN)
|
244
|
+
def user
|
245
|
+
return false if !value && type != "LDAPUsers"
|
246
|
+
value.split(",").each{|part| return part.gsub("uid=","") if part.match("uid=")}
|
247
|
+
end
|
248
|
+
|
249
|
+
# helper method sets value and type to opentox LDAP Distinguished Name (DN) of a user
|
250
|
+
def set_ot_user(username)
|
251
|
+
self.value = "uid=#{username},ou=people,dc=opentox,dc=org"
|
252
|
+
self.type = "LDAPUsers"
|
253
|
+
true
|
254
|
+
end
|
255
|
+
|
256
|
+
def set_ot_group(groupname)
|
257
|
+
self.value = "cn=#{groupname},ou=groups,dc=opentox,dc=org"
|
258
|
+
self.type = "LDAPGroups"
|
259
|
+
true
|
210
260
|
end
|
211
|
-
|
261
|
+
|
212
262
|
#rule inside a policy
|
213
263
|
class Rule
|
214
|
-
|
215
|
-
attr_accessor :name, :uri, :get, :post, :put, :delete
|
216
|
-
|
264
|
+
|
265
|
+
attr_accessor :name, :uri, :get, :post, :put, :delete, :read, :readwrite
|
266
|
+
|
217
267
|
def initialize(name, uri)
|
218
268
|
@name = name
|
219
269
|
@uri = uri
|
220
270
|
end
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
self[new].name = new
|
225
|
-
end
|
226
|
-
|
271
|
+
|
272
|
+
#Set Rule attribute for request-method GET
|
273
|
+
# @param [String]value (allow,deny,nil)
|
227
274
|
def get=(value)
|
228
275
|
@get = check_value(value, @get)
|
229
276
|
end
|
230
|
-
|
277
|
+
|
278
|
+
#Set Rule attribute for request-method POST
|
279
|
+
# @param [String]value (allow,deny,nil)
|
231
280
|
def post=(value)
|
232
281
|
@post = check_value(value, @post)
|
233
282
|
end
|
234
|
-
|
283
|
+
|
284
|
+
#Set Rule attribute for request-method DELETE
|
285
|
+
# @param [String]value (allow,deny,nil)
|
235
286
|
def delete=(value)
|
236
287
|
@delete = check_value(value, @delete)
|
237
288
|
end
|
238
|
-
|
289
|
+
|
290
|
+
#Set Rule attribute for request-method PUT
|
291
|
+
# @param [String]value (allow,deny,nil)
|
239
292
|
def put=(value)
|
240
293
|
@put = check_value(value, @put)
|
241
294
|
end
|
242
|
-
|
295
|
+
|
296
|
+
def read
|
297
|
+
return true if @get == "allow" && (@put == "deny" || !@put) && (@post == "deny" || !@post)
|
298
|
+
end
|
299
|
+
|
300
|
+
def readwrite
|
301
|
+
return true if @get == "allow" && @put == "allow" && @post == "allow"
|
302
|
+
end
|
303
|
+
|
304
|
+
def read=(value)
|
305
|
+
if value
|
306
|
+
@get = "allow"; @put = nil; @post = nil
|
307
|
+
else
|
308
|
+
@get = nil; @put = nil; @post = nil
|
309
|
+
end
|
310
|
+
end
|
311
|
+
|
312
|
+
def readwrite=(value)
|
313
|
+
if value
|
314
|
+
@get = "allow"; @put = "allow"; @post = "allow"
|
315
|
+
else
|
316
|
+
@get = nil; @put = nil; @post = nil
|
317
|
+
end
|
318
|
+
end
|
319
|
+
|
243
320
|
private
|
244
|
-
#checks if value is allow or
|
321
|
+
#checks if value is allow, deny or nil. returns old value if not valid.
|
245
322
|
def check_value(new_value, old_value)
|
246
|
-
return (new_value=="allow" || new_value=="deny" || new_value==nil) ? new_value : old_value
|
323
|
+
return (new_value=="allow" || new_value=="deny" || new_value==nil) ? new_value : old_value
|
247
324
|
end
|
248
325
|
end
|
249
|
-
|
326
|
+
|
250
327
|
class Subject
|
251
328
|
|
252
|
-
attr_accessor :name, :type, :value
|
329
|
+
attr_accessor :name, :type, :value
|
253
330
|
|
254
331
|
def initialize(name, type, value)
|
255
332
|
@name = name
|
@@ -258,4 +335,4 @@ module OpenTox
|
|
258
335
|
end
|
259
336
|
end
|
260
337
|
end
|
261
|
-
end
|
338
|
+
end
|
data/lib/rest-client-wrapper.rb
CHANGED
@@ -16,12 +16,16 @@ module OpenTox
|
|
16
16
|
define_singleton_method method do |uri,payload={},headers={}|
|
17
17
|
|
18
18
|
# check input
|
19
|
+
@subjectid = headers[:subjectid] ? headers[:subjectid] : nil
|
19
20
|
bad_request_error "Invalid URI: '#{uri}'" unless URI.valid? uri
|
20
|
-
not_found_error "URI '#{uri}' not found." unless URI.accessible? uri
|
21
|
+
not_found_error "URI '#{uri}' not found." unless URI.accessible?(uri, @subjectid) unless URI.ssl?(uri)
|
21
22
|
bad_request_error "Headers are not a hash: #{headers.inspect}" unless headers==nil or headers.is_a?(Hash)
|
22
23
|
# make sure that no header parameters are set in the payload
|
23
24
|
[:accept,:content_type,:subjectid].each do |header|
|
24
|
-
|
25
|
+
if defined? $aa || URI(uri).host == URI($aa[:uri]).host
|
26
|
+
else
|
27
|
+
bad_request_error "#{header} should be submitted in the headers" if payload and payload.is_a?(Hash) and payload[header]
|
28
|
+
end
|
25
29
|
end
|
26
30
|
|
27
31
|
# create request
|
@@ -33,13 +37,16 @@ module OpenTox
|
|
33
37
|
headers.each{ |k,v| headers.delete(k) if v==nil } if headers #remove keys with empty values, as this can cause problems
|
34
38
|
args[:headers] = headers
|
35
39
|
|
36
|
-
# perform request
|
37
40
|
@request = RestClient::Request.new(args)
|
38
|
-
# do not throw RestClient exceptions in order to create a @response object (needed for error reports) in every case
|
39
|
-
@response = @request.execute { |response, request, result| return response }
|
40
41
|
# ignore error codes from Task services (may return error codes >= 400 according to API, which causes exceptions in RestClient and RDF::Reader)
|
41
|
-
|
42
|
-
|
42
|
+
@response = @request.execute do |response, request, result|
|
43
|
+
if [301, 302, 307].include? response.code and request.method == :get
|
44
|
+
response.follow_redirection(request, result)
|
45
|
+
else
|
46
|
+
raise OpenTox::RestCallError.new response.to_s, request, uri unless response.code < 400 or URI.task? uri
|
47
|
+
response
|
48
|
+
end
|
49
|
+
end
|
43
50
|
end
|
44
51
|
end
|
45
52
|
|
data/lib/task.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__),'error')
|
2
1
|
DEFAULT_TASK_MAX_DURATION = 36000
|
3
2
|
module OpenTox
|
4
3
|
|
@@ -9,17 +8,14 @@ module OpenTox
|
|
9
8
|
|
10
9
|
def self.create service_uri, params={}
|
11
10
|
|
12
|
-
# TODO set/enforce request uri
|
13
|
-
# TODO: run observer in same process?
|
14
11
|
task = Task.new RestClientWrapper.post(service_uri,params).chomp
|
15
12
|
pid = fork do
|
16
13
|
begin
|
17
14
|
result_uri = yield
|
18
15
|
task.completed result_uri
|
19
16
|
rescue
|
20
|
-
RestClientWrapper.put(File.join(task.uri,'Error'),{:errorReport => $!.report.to_yaml})
|
17
|
+
RestClientWrapper.put(File.join(task.uri,'Error'),{:errorReport => $!.report.to_yaml}) if $!.respond_to? :report
|
21
18
|
task.kill
|
22
|
-
#raise $!
|
23
19
|
end
|
24
20
|
end
|
25
21
|
Process.detach(pid)
|
@@ -43,7 +39,7 @@ module OpenTox
|
|
43
39
|
def kill
|
44
40
|
Process.kill(9,@pid)
|
45
41
|
Process.kill(9,@observer_pid)
|
46
|
-
|
42
|
+
rescue # no need to raise an exeption if processes are not running
|
47
43
|
end
|
48
44
|
|
49
45
|
def description
|
@@ -62,23 +58,27 @@ module OpenTox
|
|
62
58
|
end
|
63
59
|
|
64
60
|
def completed(uri)
|
65
|
-
not_found_error "Result URI \"#{uri}\" does not exist." unless URI.accessible? uri
|
61
|
+
#not_found_error "Result URI \"#{uri}\" does not exist." unless URI.accessible? uri
|
66
62
|
RestClientWrapper.put(File.join(@uri,'Completed'),{:resultURI => uri})
|
67
63
|
end
|
68
64
|
|
69
65
|
# waits for a task, unless time exceeds or state is no longer running
|
70
66
|
# @param [optional,Numeric] dur seconds pausing before checking again for completion
|
71
|
-
|
72
|
-
|
73
|
-
|
67
|
+
# TODO: add waiting task
|
68
|
+
def wait
|
69
|
+
start_time = Time.new
|
70
|
+
due_to_time = start_time + DEFAULT_TASK_MAX_DURATION
|
71
|
+
dur = 0
|
72
|
+
while running?
|
74
73
|
sleep dur
|
74
|
+
dur = [[(Time.new - start_time)/20.0,0.3].max,300.0].min
|
75
75
|
time_out_error "max wait time exceeded ("+DEFAULT_TASK_MAX_DURATION.to_s+"sec), task: '"+@uri.to_s+"'" if (Time.new > due_to_time)
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
79
79
|
end
|
80
80
|
|
81
|
-
# get only header for
|
81
|
+
# get only header for status requests
|
82
82
|
def running?
|
83
83
|
RestClientWrapper.head(@uri).code == 202
|
84
84
|
end
|
@@ -96,28 +96,19 @@ module OpenTox
|
|
96
96
|
code >= 400 and code != 503
|
97
97
|
end
|
98
98
|
|
99
|
-
def
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
response = self.[](RDF::OT1[method]) if response.empty? # API 1.1 compatibility
|
110
|
-
internal_server_error "No #{method} metadata for #{@uri} " if response.empty?
|
111
|
-
return response.uniq.first.to_s
|
112
|
-
end
|
113
|
-
rescue OpenTox::Error
|
114
|
-
raise $!
|
115
|
-
rescue
|
116
|
-
$logger.error "Unknown #{self.class} method #{method}"
|
117
|
-
super
|
99
|
+
def errorReport
|
100
|
+
# TODO: fix rdf output at task service
|
101
|
+
not_implemented_error "RDF output of errorReports has to be fixed at task service"
|
102
|
+
end
|
103
|
+
|
104
|
+
[:hasStatus, :resultURI].each do |method|
|
105
|
+
define_method method do
|
106
|
+
response = self.[](RDF::OT[method])
|
107
|
+
response = self.[](RDF::OT1[method]) unless response # API 1.1 compatibility
|
108
|
+
response
|
118
109
|
end
|
119
110
|
end
|
120
111
|
|
121
|
-
#TODO: subtasks
|
112
|
+
#TODO: subtasks (only for progress)
|
122
113
|
|
123
114
|
end
|
data/opentox-client.gemspec
CHANGED
@@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__)
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "opentox-client"
|
6
|
-
s.version = "0.0.
|
6
|
+
s.version = "0.0.2pre"
|
7
7
|
s.authors = ["Christoph Helma, Martin Guetlein, Andreas Maunz, Micha Rautenberg, David Vorgrimmler"]
|
8
8
|
s.email = ["helma@in-silico.ch"]
|
9
9
|
s.homepage = "http://github.com/opentox/opentox-client"
|
@@ -24,4 +24,8 @@ Gem::Specification.new do |s|
|
|
24
24
|
s.add_runtime_dependency "rdf"
|
25
25
|
s.add_runtime_dependency "rdf-raptor"
|
26
26
|
s.add_runtime_dependency "open4"
|
27
|
+
|
28
|
+
# external requirements
|
29
|
+
["libraptor-dev"].each{|r| s.requirements << r}
|
30
|
+
s.post_install_message = "Please check the version of your libraptor library, if installation of rdf.rb fails"
|
27
31
|
end
|