caerus 0.0.1
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.
- checksums.yaml +7 -0
- data/bin/caerus_master +10 -0
- data/lib/caerus.rb +9 -0
- data/lib/caerus/application/base.rb +15 -0
- data/lib/caerus/application/master.rb +23 -0
- data/lib/caerus/common_methods.rb +19 -0
- data/lib/caerus/job_control.rb +123 -0
- data/lib/caerus/redis/base.rb +7 -0
- data/lib/caerus/redis/redis_gateway.rb +16 -0
- metadata +192 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 038ef3da882624c61a6e3b705cf5fcd4ef60eab9
|
4
|
+
data.tar.gz: b5235ce5dc6ff380712c9108b2fdd5aa1e3366f4
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 815521019867e490cde76698e3590dace814fc22233b230a8cf2772c9c634cc3233a1411155598b0e06565050f4d68529f2ee371cc198e81261b9241147e6508
|
7
|
+
data.tar.gz: 5efa179bbcebe93f012fab6dea782a01f424355f19f0df1fda40222b40bd016f90fe82529bd3f286c3c1c91bc528a20cf7a9242fad6430a14a5ad7b4ba42504a
|
data/bin/caerus_master
ADDED
data/lib/caerus.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'caerus/job_control'
|
2
|
+
|
3
|
+
module Caerus
|
4
|
+
module Application
|
5
|
+
class Master < Base
|
6
|
+
include Caerus::JobControl
|
7
|
+
|
8
|
+
def run
|
9
|
+
connect_to_redis
|
10
|
+
enter_infinite_loop
|
11
|
+
end
|
12
|
+
|
13
|
+
def enter_infinite_loop
|
14
|
+
@r = redis.redis_server
|
15
|
+
loop do
|
16
|
+
load_job
|
17
|
+
puts 'nothing to do'
|
18
|
+
sleep 0.2
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module Caerus
|
4
|
+
def self.connect_to_redis
|
5
|
+
Caerus::Redis::RedisGateway.new
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.enqueue(klass, could_be_anything = '' )
|
9
|
+
puts "#{klass} and #{could_be_anything} to be enqueued"
|
10
|
+
|
11
|
+
hash_to_json = {}
|
12
|
+
|
13
|
+
hash_to_json[klass] = could_be_anything
|
14
|
+
redis = connect_to_redis.redis_server
|
15
|
+
|
16
|
+
hash_to_json["status"] = 'new'
|
17
|
+
redis.lpush 'Caerus:jobs', hash_to_json.to_json
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
module Caerus
|
2
|
+
module JobControl
|
3
|
+
#Methods to do the job control
|
4
|
+
#get the jobs from redis and make a hash out of it, create a class and run perfom
|
5
|
+
|
6
|
+
CAERUS_JOBS_LIST = 'Caerus:jobs'
|
7
|
+
CAERUS_JOBS_PROCESSING_LIST = 'Caerus:processing'
|
8
|
+
CAERUS_JOBS_FAILED_LIST = 'Caerus:failed'
|
9
|
+
|
10
|
+
def load_job
|
11
|
+
klass, params = read_job_from_queue
|
12
|
+
process_job(klass,params) if (params && klass)
|
13
|
+
end
|
14
|
+
|
15
|
+
def read_job_from_queue
|
16
|
+
return if (job_list_length < 1)
|
17
|
+
return unless (object_hash = get_job)
|
18
|
+
|
19
|
+
object_to_bring = object_hash.first.first
|
20
|
+
param_to_use_with_it = object_hash.first.last || ''
|
21
|
+
@json_string = object_hash.to_json
|
22
|
+
|
23
|
+
return object_to_bring, param_to_use_with_it
|
24
|
+
end
|
25
|
+
|
26
|
+
def process_job(object_to_bring,param_to_use_with_it)
|
27
|
+
begin
|
28
|
+
klass = Kernel.const_get(object_to_bring)
|
29
|
+
rescue Exception => e
|
30
|
+
puts "Nothing to do Class do not exit #{object_to_bring}"
|
31
|
+
deal_with_faulty_job(e)
|
32
|
+
return
|
33
|
+
end
|
34
|
+
|
35
|
+
#If the job blow up in your face catch the error!
|
36
|
+
#the fork engine is going to be this point on
|
37
|
+
begin
|
38
|
+
klass.perform(param_to_use_with_it)
|
39
|
+
rescue Exception => e
|
40
|
+
deal_with_faulty_job(e)
|
41
|
+
return
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def get_job
|
46
|
+
search_candidate
|
47
|
+
end
|
48
|
+
|
49
|
+
def job_list_length
|
50
|
+
(@r.llen CAERUS_JOBS_LIST)
|
51
|
+
end
|
52
|
+
|
53
|
+
def processing_list_length
|
54
|
+
(@r.llen CAERUS_JOBS_PROCESSING_LIST)
|
55
|
+
end
|
56
|
+
|
57
|
+
def search_candidate
|
58
|
+
#TODO FIX linear search, replace it later for a better algorithm
|
59
|
+
0.upto((job_list_length) -1) do
|
60
|
+
job = @r.rpop CAERUS_JOBS_LIST
|
61
|
+
next unless validate_object(job)
|
62
|
+
|
63
|
+
#binding.pry
|
64
|
+
hash_job = JSON.parse(job)
|
65
|
+
status = hash_job['status']
|
66
|
+
|
67
|
+
case status
|
68
|
+
when /new/
|
69
|
+
puts 'New job'
|
70
|
+
job_with_pid = print_child_pid(hash_job)
|
71
|
+
put_it_in_the_processing_queue(job_with_pid, :left)
|
72
|
+
|
73
|
+
return hash_job
|
74
|
+
else
|
75
|
+
puts "unknow state removing from the queue #{job}"
|
76
|
+
return nil
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def validate_object(job)
|
82
|
+
tmp_hash = JSON.parse(job)
|
83
|
+
(tmp_hash.size == 2) && (tmp_hash["status"]) && (tmp_hash.kind_of? Hash)
|
84
|
+
end
|
85
|
+
|
86
|
+
def put_it_in_the_processing_queue(job, direction)
|
87
|
+
case direction
|
88
|
+
when :left
|
89
|
+
@r.lpush CAERUS_JOBS_PROCESSING_LIST, job
|
90
|
+
when :right
|
91
|
+
@r.rpush CAERUS_JOBS_PROCESSING_LIST, job
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def print_child_pid(job)
|
96
|
+
job['status'] = $$
|
97
|
+
job.to_json
|
98
|
+
end
|
99
|
+
|
100
|
+
def remove_job_from_being_processed
|
101
|
+
#Todo remove the linear search
|
102
|
+
list = @r.lrange CAERUS_JOBS_PROCESSING_LIST, 0, -1
|
103
|
+
if list.size > 0
|
104
|
+
list.each do |job,index|
|
105
|
+
if JSON.parse(job)['status'] == $$
|
106
|
+
@r.lrem CAERUS_JOBS_PROCESSING_LIST, -1, job
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def enque_job_in_failed_to_be_processed(error)
|
113
|
+
puts "FAILED JOB! #{@json_string} #{error.backtrace}"
|
114
|
+
failed_job_json = @json_string.dup
|
115
|
+
@r.lpush CAERUS_JOBS_FAILED_LIST, (failed_job_json << " " << error.backtrace.to_s || '')
|
116
|
+
end
|
117
|
+
|
118
|
+
def deal_with_faulty_job(e)
|
119
|
+
remove_job_from_being_processed
|
120
|
+
enque_job_in_failed_to_be_processed e
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
metadata
ADDED
@@ -0,0 +1,192 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: caerus
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Manuel Gutierrez
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-08-19 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: ipaddress
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: typhoeus
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: colorize
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: redis
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: pry
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rake
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rspec-core
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rspec-expectations
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - '>='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rspec-mocks
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - '>='
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - '>='
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: rspec_junit_formatter
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - '>='
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - '>='
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
description: Another Background gem
|
154
|
+
email: m.gutierrez@modcloth.com
|
155
|
+
executables:
|
156
|
+
- caerus_master
|
157
|
+
extensions: []
|
158
|
+
extra_rdoc_files: []
|
159
|
+
files:
|
160
|
+
- bin/caerus_master
|
161
|
+
- lib/caerus.rb
|
162
|
+
- lib/caerus/application/base.rb
|
163
|
+
- lib/caerus/application/master.rb
|
164
|
+
- lib/caerus/common_methods.rb
|
165
|
+
- lib/caerus/job_control.rb
|
166
|
+
- lib/caerus/redis/base.rb
|
167
|
+
- lib/caerus/redis/redis_gateway.rb
|
168
|
+
homepage: https://github.com/atilamx/caerus
|
169
|
+
licenses: []
|
170
|
+
metadata: {}
|
171
|
+
post_install_message:
|
172
|
+
rdoc_options: []
|
173
|
+
require_paths:
|
174
|
+
- lib
|
175
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
176
|
+
requirements:
|
177
|
+
- - '>='
|
178
|
+
- !ruby/object:Gem::Version
|
179
|
+
version: '0'
|
180
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
181
|
+
requirements:
|
182
|
+
- - '>='
|
183
|
+
- !ruby/object:Gem::Version
|
184
|
+
version: '0'
|
185
|
+
requirements: []
|
186
|
+
rubyforge_project:
|
187
|
+
rubygems_version: 2.2.2
|
188
|
+
signing_key:
|
189
|
+
specification_version: 4
|
190
|
+
summary: Another Backgrund gem
|
191
|
+
test_files: []
|
192
|
+
has_rdoc:
|