1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
LOGGER.progname = File.expand_path(__FILE__)
module OpenTox
class Task
attr_accessor :uri
def initialize(uri)
@uri = uri.chomp
end
def self.create
resource = RestClient::Resource.new(@@config[:services]["opentox-task"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0])
uri = resource.post({}).chomp
Task.new(uri.chomp)
end
def self.find(uri)
Task.new(uri)
end
def self.base_uri
@@config[:services]["opentox-task"]
end
def self.all
task_uris = RestClient.get(@@config[:services]["opentox-task"]).chomp.split(/\n/)
task_uris.collect{|uri| Task.new(uri)}
end
def created_at
RestClient.get File.join(@uri, 'created_at')
end
def finished_at
RestClient.get File.join(@uri, 'finished_at')
end
def description
RestClient.get File.join(@uri, 'description')
end
def status
RestClient.get File.join(@uri, 'status')
end
def resource
RestClient.get File.join(@uri, 'resource')
end
def started
LOGGER.info File.join(@uri,'started')
resource = RestClient::Resource.new(File.join(@uri,'started'), :user => @@users[:users].keys[0], :password => @@users[:users].values[0])
resource.put({})
end
def cancel
resource = RestClient::Resource.new(File.join(@uri,'cancelled'), :user => @@users[:users].keys[0], :password => @@users[:users].values[0])
resource.put({})
end
def completed(uri)
resource = RestClient::Resource.new(File.join(@uri,'completed'), :user => @@users[:users].keys[0], :password => @@users[:users].values[0])
resource.put :resource => uri
end
def failed(description)
resource = RestClient::Resource.new(File.join(@uri,'failed'), :user => @@users[:users].keys[0], :password => @@users[:users].values[0])
resource.put :description => description
#resource.put({})
end
def parent=(task)
#RestClient.put File.join(@uri,'parent'), {:uri => task.uri}
resource = RestClient::Resource.new(File.join(@uri,'parent'), :user => @@users[:users].keys[0], :password => @@users[:users].values[0])
LOGGER.debug "task.rb: #{resource}"
resource.put :uri => task.uri
end
def pid=(pid)
resource = RestClient::Resource.new(File.join(@uri,'pid'), :user => @@users[:users].keys[0], :password => @@users[:users].values[0])
resource.put :pid => pid
end
def completed?
self.status.to_s == 'completed'
end
def failed?
self.status.to_s == 'failed'
end
def wait_for_completion(dur=0.1)
until self.completed? or self.failed?
sleep dur
end
end
def self.as_task(parent_task=nil)
#return yield nil
task = OpenTox::Task.create
task.parent = parent_task if parent_task
LOGGER.debug "Starting task"
pid = Spork.spork(:logger => LOGGER) do
task.started
LOGGER.debug "Task #{task.uri} started #{Time.now}"
begin
result = catch(:halt) do
yield task
end
if result && result.is_a?(Array) && result.size==2 && result[0]>202
# halted while executing task
LOGGER.error "task was halted: "+result.inspect
task.failed(result[1])
throw :halt,result
end
task.completed(result)
rescue => ex
#raise ex
LOGGER.error "task failed: "+ex.message
task.failed(ex.message)
end
raise "Invalid task state" unless task.completed? || task.failed?
end
LOGGER.debug "task PID: " + pid.to_s
task.pid = pid
task.uri
end
end
end
|