summaryrefslogtreecommitdiff
path: root/lib/task.rb
blob: 29fb4fec89b954d06e15728a722a1c04d753bef7 (plain)
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