simple_worker 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/simple_worker.rb +32 -60
- data/test/scheduled_worker.rb +2 -1
- data/test/{simple_worker_tests.rb → test_simple_worker.rb} +11 -10
- metadata +26 -11
- data/lib/api_auth.rb +0 -15
- data/lib/http_enabled.rb +0 -119
- data/lib/simple_worker_error.rb +0 -22
data/lib/simple_worker.rb
CHANGED
@@ -1,18 +1,14 @@
|
|
1
|
-
require
|
2
|
-
require File.join(File.dirname(__FILE__), 'api_auth')
|
1
|
+
require 'appoxy_api'
|
3
2
|
require File.join(File.dirname(__FILE__), 'worker')
|
4
|
-
require File.join(File.dirname(__FILE__), 'simple_worker_error')
|
5
3
|
|
6
4
|
|
7
5
|
module SimpleWorker
|
8
6
|
|
9
|
-
class Service <
|
10
|
-
|
11
|
-
include SimpleWorker::HttpEnabled
|
7
|
+
class Service < Appoxy::Api::Client
|
12
8
|
|
13
9
|
def initialize(access_key, secret_key, options={})
|
14
10
|
puts 'Starting SimpleWorker::Service...'
|
15
|
-
super(access_key, secret_key, options)
|
11
|
+
super("http://api.simpleworkr.com/api/", access_key, secret_key, options)
|
16
12
|
end
|
17
13
|
|
18
14
|
# Options:
|
@@ -23,26 +19,22 @@ module SimpleWorker
|
|
23
19
|
mystring = f.read
|
24
20
|
end
|
25
21
|
options = {"code"=>mystring, "class_name"=>class_name}
|
26
|
-
|
27
|
-
|
28
|
-
parse_response response
|
22
|
+
ret = post("code/put", options)
|
23
|
+
ret
|
29
24
|
end
|
30
25
|
|
31
26
|
#
|
32
27
|
# data:
|
33
28
|
def queue(class_name, data={})
|
34
|
-
|
35
|
-
params = nil
|
36
29
|
if !data.is_a?(Array)
|
37
30
|
data = [data]
|
38
31
|
end
|
39
32
|
hash_to_send = {}
|
40
|
-
hash_to_send["
|
33
|
+
hash_to_send["payload"] = data
|
41
34
|
hash_to_send["class_name"] = class_name
|
42
35
|
if defined?(RAILS_ENV)
|
43
36
|
hash_to_send["rails_env"] = RAILS_ENV
|
44
37
|
end
|
45
|
-
# puts 'hash_to_send=' + hash_to_send.inspect
|
46
38
|
return queue_raw(class_name, hash_to_send)
|
47
39
|
|
48
40
|
end
|
@@ -50,21 +42,10 @@ module SimpleWorker
|
|
50
42
|
def queue_raw(class_name, data={})
|
51
43
|
params = nil
|
52
44
|
hash_to_send = data
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
parse_response response
|
58
|
-
|
59
|
-
end
|
45
|
+
hash_to_send["class_name"] = class_name
|
46
|
+
ret = post("queue/add", hash_to_send)
|
47
|
+
ret
|
60
48
|
|
61
|
-
def parse_response(response)
|
62
|
-
begin
|
63
|
-
return ActiveSupport::JSON.decode(response)
|
64
|
-
rescue => ex
|
65
|
-
puts 'response that caused error = ' + response.to_s
|
66
|
-
raise ex
|
67
|
-
end
|
68
49
|
end
|
69
50
|
|
70
51
|
|
@@ -80,52 +61,43 @@ module SimpleWorker
|
|
80
61
|
#
|
81
62
|
def schedule(class_name, data, schedule)
|
82
63
|
raise "Schedule must be a hash." if !schedule.is_a? Hash
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
end
|
64
|
+
# if !data.is_a?(Array)
|
65
|
+
# data = [data]
|
66
|
+
# end
|
87
67
|
hash_to_send = {}
|
88
|
-
hash_to_send["
|
68
|
+
hash_to_send["payload"] = data
|
89
69
|
hash_to_send["class_name"] = class_name
|
90
70
|
hash_to_send["schedule"] = schedule
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
parse_response response
|
71
|
+
puts 'about to send ' + hash_to_send.inspect
|
72
|
+
ret = post("scheduler/schedule", hash_to_send)
|
73
|
+
ret
|
95
74
|
end
|
96
75
|
|
97
|
-
|
98
|
-
|
99
|
-
#
|
100
|
-
def get_scheduled_tasks(schedule_id)
|
101
|
-
params = nil
|
102
|
-
if !data.is_a?(Array)
|
103
|
-
data = [data]
|
104
|
-
end
|
76
|
+
def cancel_schedule(scheduled_task_id)
|
77
|
+
raise "Must include a schedule id." if scheduled_task_id.blank?
|
105
78
|
hash_to_send = {}
|
106
|
-
hash_to_send["
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
79
|
+
hash_to_send["scheduled_task_id"] = scheduled_task_id
|
80
|
+
ret = post("scheduler/cancel", hash_to_send)
|
81
|
+
ret
|
82
|
+
end
|
83
|
+
|
84
|
+
def get_schedules()
|
85
|
+
hash_to_send = {}
|
86
|
+
ret = get("scheduler/list", hash_to_send)
|
87
|
+
ret
|
112
88
|
end
|
113
89
|
|
114
90
|
def status(task_id)
|
115
91
|
data = {"task_id"=>task_id}
|
116
|
-
|
117
|
-
|
118
|
-
# puts "response=" + response
|
119
|
-
parse_response response
|
92
|
+
ret = get("task/status", data)
|
93
|
+
ret
|
120
94
|
end
|
121
95
|
|
122
96
|
def log(task_id)
|
123
97
|
data = {"task_id"=>task_id}
|
124
|
-
|
125
|
-
|
126
|
-
#
|
127
|
-
ret = parse_response response
|
128
|
-
ret["log"] = Base64.decode64(ret["log"])
|
98
|
+
ret = get("task/log", data)
|
99
|
+
puts 'ret=' + ret.inspect
|
100
|
+
# ret["log"] = Base64.decode64(ret["log"])
|
129
101
|
ret
|
130
102
|
end
|
131
103
|
|
data/test/scheduled_worker.rb
CHANGED
@@ -22,16 +22,16 @@ class SimpleWorkerTests < Test::Unit::TestCase
|
|
22
22
|
|
23
23
|
|
24
24
|
# Upload latest runner code
|
25
|
-
@worker.upload(File.join(File.dirname(__FILE__), "./
|
25
|
+
@worker.upload(File.join(File.dirname(__FILE__), "./test_worker.rb"), "TestWorker")
|
26
26
|
|
27
27
|
# Add something to queue, get task ID back
|
28
28
|
# Single task
|
29
|
-
response_hash_single = @worker.queue("
|
29
|
+
response_hash_single = @worker.queue("TestWorker", {"s3_key"=>"single runner", "times"=>10})
|
30
30
|
|
31
31
|
# task set
|
32
|
-
response_hash = @worker.queue("
|
33
|
-
|
34
|
-
# Check status
|
32
|
+
response_hash = @worker.queue("TestWorker", [{"id"=>"local_id", "s3_key"=>"some key", "times"=>4}, {"s3_key"=>"some key2", "times"=>3}, {"s3_key"=>"some key", "times"=>2}])
|
33
|
+
|
34
|
+
# # Check status
|
35
35
|
tasks = response_hash["tasks"]
|
36
36
|
while tasks.size > 0
|
37
37
|
tasks.each do |t|
|
@@ -46,28 +46,29 @@ class SimpleWorkerTests < Test::Unit::TestCase
|
|
46
46
|
# lets try to get the log now too
|
47
47
|
task_id = response_hash_single["tasks"][0]["task_id"]
|
48
48
|
puts 'task_id=' + task_id
|
49
|
-
|
49
|
+
status_with_log = @worker.log(task_id)
|
50
|
+
puts 'log=' + status_with_log.inspect
|
50
51
|
|
51
52
|
end
|
52
53
|
|
53
54
|
def test_scheduled
|
54
55
|
|
55
56
|
# Upload latest runner code
|
56
|
-
@worker.upload(File.join(File.dirname(__FILE__), "./
|
57
|
+
@worker.upload(File.join(File.dirname(__FILE__), "./scheduled_worker.rb"), "ScheduledWorker")
|
57
58
|
|
58
59
|
start_at = 10.seconds.since
|
59
60
|
#start_at = start_at.gmtime # testing different timezone
|
60
61
|
puts 'start_at =' + start_at.inspect
|
61
|
-
response_hash = @worker.schedule("
|
62
|
+
response_hash = @worker.schedule("ScheduledWorker", {"msg"=>"One time test."}, {:start_at=>start_at})
|
62
63
|
puts 'response_hash=' + response_hash.inspect
|
63
64
|
|
64
65
|
start_at = 10.seconds.since
|
65
|
-
response_hash = @worker.schedule("
|
66
|
+
response_hash = @worker.schedule("ScheduledWorker", {"msg"=>"Run times test"}, {:start_at=>start_at, :run_every=>30, :run_times=>3})
|
66
67
|
puts 'response_hash=' + response_hash.inspect
|
67
68
|
|
68
69
|
start_at = 10.seconds.since
|
69
70
|
end_at = 2.minutes.since
|
70
|
-
response_hash = @worker.schedule("
|
71
|
+
response_hash = @worker.schedule("ScheduledWorker", {"msg"=>"End at test"}, {:start_at=>start_at, :run_every=>30, :end_at=>end_at, :run_times=>20})
|
71
72
|
puts 'response_hash=' + response_hash.inspect
|
72
73
|
|
73
74
|
end
|
metadata
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple_worker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 1
|
8
|
+
- 1
|
9
|
+
version: 0.1.1
|
5
10
|
platform: ruby
|
6
11
|
authors:
|
7
12
|
- Travis Reeder
|
@@ -9,10 +14,21 @@ autorequire:
|
|
9
14
|
bindir: bin
|
10
15
|
cert_chain: []
|
11
16
|
|
12
|
-
date:
|
17
|
+
date: 2010-04-16 00:00:00 -07:00
|
13
18
|
default_executable:
|
14
|
-
dependencies:
|
15
|
-
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: appoxy_api
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
version: "0"
|
30
|
+
type: :runtime
|
31
|
+
version_requirements: *id001
|
16
32
|
description: I could tell you, but then I'd have to...
|
17
33
|
email: travis@appoxy.com
|
18
34
|
executables: []
|
@@ -22,10 +38,7 @@ extensions: []
|
|
22
38
|
extra_rdoc_files:
|
23
39
|
- README.markdown
|
24
40
|
files:
|
25
|
-
- lib/api_auth.rb
|
26
|
-
- lib/http_enabled.rb
|
27
41
|
- lib/simple_worker.rb
|
28
|
-
- lib/simple_worker_error.rb
|
29
42
|
- lib/worker.rb
|
30
43
|
- README.markdown
|
31
44
|
has_rdoc: true
|
@@ -41,22 +54,24 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
41
54
|
requirements:
|
42
55
|
- - ">="
|
43
56
|
- !ruby/object:Gem::Version
|
57
|
+
segments:
|
58
|
+
- 0
|
44
59
|
version: "0"
|
45
|
-
version:
|
46
60
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
47
61
|
requirements:
|
48
62
|
- - ">="
|
49
63
|
- !ruby/object:Gem::Version
|
64
|
+
segments:
|
65
|
+
- 0
|
50
66
|
version: "0"
|
51
|
-
version:
|
52
67
|
requirements: []
|
53
68
|
|
54
69
|
rubyforge_project:
|
55
|
-
rubygems_version: 1.3.
|
70
|
+
rubygems_version: 1.3.6
|
56
71
|
signing_key:
|
57
72
|
specification_version: 3
|
58
73
|
summary: Classified
|
59
74
|
test_files:
|
60
75
|
- test/scheduled_worker.rb
|
61
|
-
- test/
|
76
|
+
- test/test_simple_worker.rb
|
62
77
|
- test/test_worker.rb
|
data/lib/api_auth.rb
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
module SimpleWorker
|
2
|
-
|
3
|
-
class ApiAuth
|
4
|
-
|
5
|
-
attr_accessor :host
|
6
|
-
|
7
|
-
def initialize(access_key, secret_key, options={})
|
8
|
-
@access_key = access_key
|
9
|
-
@secret_key = secret_key
|
10
|
-
@host = options[:host] || "http://simpleworker.appoxy.com/api/"
|
11
|
-
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
end
|
data/lib/http_enabled.rb
DELETED
@@ -1,119 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'active_support'
|
3
|
-
require 'net/http'
|
4
|
-
require 'base64'
|
5
|
-
|
6
|
-
require File.join(File.dirname(__FILE__), 'simple_worker_error')
|
7
|
-
|
8
|
-
begin
|
9
|
-
require 'digest/hmac'
|
10
|
-
USE_EMBEDDED_HMAC = false
|
11
|
-
rescue
|
12
|
-
puts "HMAC, not found in standard lib." + $!.message
|
13
|
-
require 'hmac-sha1'
|
14
|
-
USE_EMBEDDED_HMAC = true
|
15
|
-
end
|
16
|
-
|
17
|
-
module SimpleWorker
|
18
|
-
|
19
|
-
|
20
|
-
module HttpEnabled
|
21
|
-
|
22
|
-
# body is a hash
|
23
|
-
def run_http(host, access_key, secret_key, http_method, command_path, body=nil, parameters={}, extra_headers=nil)
|
24
|
-
ts = generate_timestamp(Time.now.gmtime)
|
25
|
-
# puts 'timestamp = ' + ts
|
26
|
-
sig = generate_signature_v0(command_path, ts, secret_key)
|
27
|
-
# puts "My signature = " + sig
|
28
|
-
url = host + command_path
|
29
|
-
# puts url
|
30
|
-
|
31
|
-
user_agent = "Ruby Client"
|
32
|
-
headers = {'User-Agent' => user_agent}
|
33
|
-
|
34
|
-
if !extra_headers.nil?
|
35
|
-
extra_headers.each_pair do |k, v|
|
36
|
-
headers[k] = v
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
extra_params = {'sigv'=>"0.1", 'sig' => sig, 'timestamp' => ts, 'access_key' => access_key}
|
41
|
-
if http_method == :put
|
42
|
-
body.update(extra_params)
|
43
|
-
else
|
44
|
-
parameters = {} if parameters.nil?
|
45
|
-
parameters.update(extra_params)
|
46
|
-
# puts 'params=' + parameters.inspect
|
47
|
-
|
48
|
-
end
|
49
|
-
|
50
|
-
|
51
|
-
uri = URI.parse(url)
|
52
|
-
#puts 'body=' + body.to_s
|
53
|
-
if (http_method == :put)
|
54
|
-
req = Net::HTTP::Put.new(uri.path)
|
55
|
-
body = ActiveSupport::JSON.encode(body)
|
56
|
-
req.body = body unless body.nil?
|
57
|
-
elsif (http_method == :post)
|
58
|
-
req = Net::HTTP::Post.new(uri.path)
|
59
|
-
if !parameters.nil?
|
60
|
-
req.set_form_data(parameters)
|
61
|
-
else
|
62
|
-
req.body = body unless body.nil?
|
63
|
-
end
|
64
|
-
elsif (http_method == :delete)
|
65
|
-
req = Net::HTTP::Delete.new(uri.path)
|
66
|
-
if !parameters.nil?
|
67
|
-
req.set_form_data(parameters)
|
68
|
-
end
|
69
|
-
else
|
70
|
-
req = Net::HTTP::Get.new(uri.path)
|
71
|
-
if !parameters.nil?
|
72
|
-
req.set_form_data(parameters)
|
73
|
-
end
|
74
|
-
end
|
75
|
-
headers.each_pair do |k, v|
|
76
|
-
req[k] = v
|
77
|
-
end
|
78
|
-
# req.each_header do |k, v|
|
79
|
-
# puts 'header ' + k + '=' + v
|
80
|
-
#end
|
81
|
-
res = Net::HTTP.start(uri.host, uri.port) do |http|
|
82
|
-
http.request(req)
|
83
|
-
end
|
84
|
-
|
85
|
-
ret = ''
|
86
|
-
case res
|
87
|
-
when Net::HTTPSuccess
|
88
|
-
# puts 'response body=' + res.body
|
89
|
-
ret = res.body
|
90
|
-
when Net::HTTPClientError
|
91
|
-
raise SimpleWorker::ClientError.new(res.class.name, ActiveSupport::JSON.decode(res.body))
|
92
|
-
else
|
93
|
-
#res.error
|
94
|
-
raise SimpleWorker::ServiceError.new(res.class.name, res.body)
|
95
|
-
end
|
96
|
-
return ret
|
97
|
-
end
|
98
|
-
|
99
|
-
def generate_timestamp(gmtime)
|
100
|
-
return gmtime.strftime("%Y-%m-%dT%H:%M:%SZ")
|
101
|
-
end
|
102
|
-
|
103
|
-
def generate_signature_v0(operation, timestamp, secret_key)
|
104
|
-
HttpEnabled.generate_signature_v0(operation, timestamp, secret_key)
|
105
|
-
end
|
106
|
-
|
107
|
-
def self.generate_signature_v0(operation, timestamp, secret_key)
|
108
|
-
if USE_EMBEDDED_HMAC
|
109
|
-
my_sha_hmac = HMAC::SHA1.digest(secret_key, operation + timestamp)
|
110
|
-
else
|
111
|
-
my_sha_hmac = Digest::HMAC.digest(operation + timestamp, secret_key, Digest::SHA1)
|
112
|
-
end
|
113
|
-
my_b64_hmac_digest = Base64.encode64(my_sha_hmac).strip
|
114
|
-
return my_b64_hmac_digest
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
end
|
119
|
-
|
data/lib/simple_worker_error.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
module SimpleWorker
|
2
|
-
class ClientError < StandardError
|
3
|
-
|
4
|
-
attr_reader :response_hash
|
5
|
-
|
6
|
-
def initialize(class_name, response_hash)
|
7
|
-
puts 'response-hash=' + response_hash.inspect
|
8
|
-
super("#{class_name} - #{response_hash["msg"]}")
|
9
|
-
@response_hash = response_hash
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
class ServiceError < StandardError
|
14
|
-
attr_reader :body
|
15
|
-
|
16
|
-
def initialize(class_name, body)
|
17
|
-
super("#{class_name}")
|
18
|
-
@body = body
|
19
|
-
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|