sp-job 0.1.17 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/README.md +40 -17
- data/VERSION +1 -1
- data/bin/console +1 -1
- data/bin/unique-file +55 -0
- data/lib/sp-job.rb +9 -8
- data/lib/sp/job/back_burner.rb +301 -42
- data/lib/sp/job/broker.rb +59 -21
- data/lib/sp/job/common.rb +288 -156
- data/lib/sp/job/job_db_adapter.rb +63 -0
- data/lib/sp/job/{engine.rb → jwt.rb} +14 -12
- data/lib/sp/job/mail_queue.rb +60 -0
- data/lib/sp/job/pg_connection.rb +68 -76
- data/lib/sp/job/unique_file.rb +73 -0
- data/lib/sp/job/uploaded_image_converter.rb +35 -16
- data/lib/sp/job/worker.rb +1 -8
- data/lib/sp/job/worker_thread.rb +57 -0
- data/lib/tasks/configure.rake +66 -16
- data/sp-job.gemspec +10 -8
- metadata +23 -17
data/lib/sp/job/worker.rb
CHANGED
@@ -18,29 +18,22 @@
|
|
18
18
|
#
|
19
19
|
# encoding: utf-8
|
20
20
|
#
|
21
|
-
|
22
21
|
module SP
|
23
22
|
module Job
|
24
23
|
|
25
24
|
class Worker < Backburner::Workers::Simple
|
26
25
|
|
27
|
-
def initialize (tube_names=nil)
|
28
|
-
super(tube_names)
|
29
|
-
end
|
30
|
-
|
31
26
|
def start
|
32
27
|
prepare
|
33
28
|
loop do
|
34
29
|
work_one_job
|
35
30
|
unless connection.connected?
|
36
31
|
log_error "Connection to beanstalk closed, exiting now"
|
37
|
-
exit
|
32
|
+
Kernel.exit
|
38
33
|
end
|
39
34
|
end
|
40
35
|
end
|
41
36
|
|
42
|
-
private
|
43
|
-
|
44
37
|
end # Worker
|
45
38
|
end # Module Job
|
46
39
|
end # Module SP
|
@@ -0,0 +1,57 @@
|
|
1
|
+
#
|
2
|
+
#
|
3
|
+
# Copyright (c) 2011-2017 Cloudware S.A. All rights reserved.
|
4
|
+
#
|
5
|
+
# This file is part of sp-job.
|
6
|
+
#
|
7
|
+
# sp-job is free software: you can redistribute it and/or modify
|
8
|
+
# it under the terms of the GNU Affero General Public License as published by
|
9
|
+
# the Free Software Foundation, either version 3 of the License, or
|
10
|
+
# (at your option) any later version.
|
11
|
+
#
|
12
|
+
# sp-job is distributed in the hope that it will be useful,
|
13
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
15
|
+
# GNU General Public License for more details.
|
16
|
+
#
|
17
|
+
# You should have received a copy of the GNU Affero General Public License
|
18
|
+
# along with sp-job. If not, see <http://www.gnu.org/licenses/>.
|
19
|
+
#
|
20
|
+
# encoding: utf-8
|
21
|
+
#
|
22
|
+
module SP
|
23
|
+
module Job
|
24
|
+
|
25
|
+
class WorkerThread < Backburner::Workers::Simple
|
26
|
+
|
27
|
+
# Used to prepare job queues before processing jobs.
|
28
|
+
# Setup beanstalk tube_names and watch all specified tubes for jobs.
|
29
|
+
#
|
30
|
+
# @raise [Beaneater::NotConnected] If beanstalk fails to connect.
|
31
|
+
# @example
|
32
|
+
# @worker.prepare
|
33
|
+
#
|
34
|
+
def prepare
|
35
|
+
log_info "Working #{tube_names.size} queues: [ #{tube_names.join(', ')} ]"
|
36
|
+
$config[:options][:threads].times do
|
37
|
+
connection = new_connection.tap{ |conn| conn.tubes.watch!(*tube_names) }
|
38
|
+
connection.on_reconnect = lambda { |conn| conn.tubes.watch!(*tube_names) }
|
39
|
+
|
40
|
+
$threads << Thread.new {
|
41
|
+
$thread_data[Thread.current] = ::SP::Job::ThreadData.new
|
42
|
+
logger.debug "Thread for #{tube_names.join(',')} #{Thread.current}"
|
43
|
+
loop do
|
44
|
+
work_one_job(connection)
|
45
|
+
unless connection.connected?
|
46
|
+
log_error "Connection to beanstalk closed, exiting now"
|
47
|
+
Kernel.exit
|
48
|
+
end
|
49
|
+
end
|
50
|
+
}
|
51
|
+
end
|
52
|
+
#end
|
53
|
+
end
|
54
|
+
|
55
|
+
end # Worker
|
56
|
+
end # Module Job
|
57
|
+
end # Module SP
|
data/lib/tasks/configure.rake
CHANGED
@@ -5,8 +5,38 @@ require 'ostruct'
|
|
5
5
|
require 'awesome_print'
|
6
6
|
require 'os'
|
7
7
|
require 'fileutils'
|
8
|
+
require 'tempfile'
|
8
9
|
require 'etc'
|
9
10
|
|
11
|
+
class SpDataStruct < OpenStruct
|
12
|
+
|
13
|
+
def self.to_hash_sp (object)
|
14
|
+
hash = {}
|
15
|
+
object.each_pair do |key, value|
|
16
|
+
if value.is_a?(SpDataStruct)
|
17
|
+
hash[key] = SpDataStruct::to_hash_sp(value)
|
18
|
+
elsif value.is_a?(Array)
|
19
|
+
hash[key] = []
|
20
|
+
value.each do |member|
|
21
|
+
if member.is_a?(SpDataStruct)
|
22
|
+
hash[key] << SpDataStruct::to_hash_sp(member)
|
23
|
+
else
|
24
|
+
hash[key] << member
|
25
|
+
end
|
26
|
+
end
|
27
|
+
else
|
28
|
+
hash[key] = value
|
29
|
+
end
|
30
|
+
end
|
31
|
+
hash
|
32
|
+
end
|
33
|
+
|
34
|
+
def to_json
|
35
|
+
SpDataStruct::to_hash_sp(self).to_json
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
10
40
|
def safesudo(cmd)
|
11
41
|
unless true == system(cmd)
|
12
42
|
system("sudo #{cmd}")
|
@@ -15,7 +45,7 @@ end
|
|
15
45
|
|
16
46
|
def create_directory (path)
|
17
47
|
|
18
|
-
if ! Dir.
|
48
|
+
if ! Dir.exist?(path)
|
19
49
|
if OS.mac?
|
20
50
|
if path.match("^/usr/local/")
|
21
51
|
info = Etc.getpwnam(Etc.getlogin)
|
@@ -113,8 +143,26 @@ def diff_and_write (contents:, path:, diff: true, dry_run: false)
|
|
113
143
|
FileUtils.rm(tmp_file)
|
114
144
|
end
|
115
145
|
|
116
|
-
def
|
146
|
+
def pg_conn_string (db)
|
147
|
+
"host=#{db.host} port=#{db.port} dbname=#{db.dbname} user=#{db.user}#{db.password.size != 0 ? ' password='+ db.password : '' }"
|
148
|
+
end
|
117
149
|
|
150
|
+
def expand_template (template, pretty_json: false)
|
151
|
+
begin
|
152
|
+
contents = ERB.new(File.read(template), nil, '-').result()
|
153
|
+
if pretty_json
|
154
|
+
JSON.pretty_generate(JSON.parse(contents))
|
155
|
+
else
|
156
|
+
contents
|
157
|
+
end
|
158
|
+
rescue Exception => e
|
159
|
+
puts "Expansion of #{template} failed".yellow
|
160
|
+
puts e.message.red
|
161
|
+
exit
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
def get_config
|
118
166
|
hostname = %x[hostname -s].strip
|
119
167
|
@project = Dir.pwd
|
120
168
|
@user_home = File.expand_path('~')
|
@@ -165,13 +213,16 @@ def get_config
|
|
165
213
|
end
|
166
214
|
|
167
215
|
#
|
168
|
-
# Pre-cook the connection string
|
216
|
+
# Pre-cook the connection string # TODO remove this after Hydra goes live
|
169
217
|
#
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
218
|
+
if conf['db']
|
219
|
+
dbname = conf['db']['dbname']
|
220
|
+
dbuser = conf['db']['user']
|
221
|
+
dbhost = conf['db']['host']
|
222
|
+
dbport = conf['db']['port'] || 5432
|
223
|
+
dbpass = conf['db']['password'] || ''
|
224
|
+
conf['db']['connection_string'] = "host=#{dbhost} port=#{dbport} dbname=#{dbname} user=#{dbuser}#{dbpass.size != 0 ? ' password='+ dbpass : '' }"
|
225
|
+
end
|
175
226
|
|
176
227
|
#
|
177
228
|
# Resolve project and user relative paths
|
@@ -187,7 +238,7 @@ def get_config
|
|
187
238
|
conf.clean_keys!
|
188
239
|
|
189
240
|
ap conf
|
190
|
-
return JSON.parse(conf.to_json, object_class:
|
241
|
+
return JSON.parse(conf.to_json, object_class: SpDataStruct), conf
|
191
242
|
end
|
192
243
|
|
193
244
|
desc 'Update project configuration: action=overwrite => update system,user,project; action => hotfix update project only; other no change (dryrun)'
|
@@ -338,7 +389,7 @@ task :configure, [ :action ] do |task, args|
|
|
338
389
|
if m && m.size == 3
|
339
390
|
key_l1 = m[1].gsub('-', '_')
|
340
391
|
if conf[key_l1].nil? or conf[key_l1][m[2]].nil?
|
341
|
-
puts "Filtered #{m[1]} - #{m[2]} - #{dst_file}"
|
392
|
+
puts "Filtered #{m[1]} - #{m[2]} - #{dst_file}"
|
342
393
|
next
|
343
394
|
end
|
344
395
|
end
|
@@ -347,7 +398,7 @@ task :configure, [ :action ] do |task, args|
|
|
347
398
|
if m && m.size == 3
|
348
399
|
key_l1 = m[1].gsub('-', '_')
|
349
400
|
if conf[key_l1].nil?
|
350
|
-
puts "Filtered #{m[1]} - #{m[2]} - #{dst_file}"
|
401
|
+
puts "Filtered #{m[1]} - #{m[2]} - #{dst_file}"
|
351
402
|
next
|
352
403
|
end
|
353
404
|
end
|
@@ -361,9 +412,8 @@ task :configure, [ :action ] do |task, args|
|
|
361
412
|
end
|
362
413
|
end
|
363
414
|
|
364
|
-
# puts "Expanding #{template}".red
|
365
415
|
# Now expand the template
|
366
|
-
file_contents =
|
416
|
+
file_contents = expand_template(template)
|
367
417
|
|
368
418
|
if /.*(nginx-broker|nginx-epaper)\/conf\.d\/(.*)\.conf$/.match(dst_file)
|
369
419
|
includes = file_contents.scan(/^\s*include\s+conf\.d\/(.*)\.location\;/)
|
@@ -393,7 +443,7 @@ task :configure, [ :action ] do |task, args|
|
|
393
443
|
if used_locations.include? m[1]
|
394
444
|
# Write text expanded configuration file
|
395
445
|
create_directory(File.dirname dst_file)
|
396
|
-
diff_and_write(contents:
|
446
|
+
diff_and_write(contents: expand_template(template),
|
397
447
|
path: dst_file,
|
398
448
|
diff: diff_before_copy,
|
399
449
|
dry_run: dry_run
|
@@ -427,7 +477,7 @@ task :configure, [ :action ] do |task, args|
|
|
427
477
|
end
|
428
478
|
create_directory "#{@config.prefix}/etc/#{@job_name}"
|
429
479
|
create_directory "#{@config.prefix}/var/log/#{@job_name}"
|
430
|
-
diff_and_write(contents:
|
480
|
+
diff_and_write(contents: expand_template(template, pretty_json: true),
|
431
481
|
path: "#{@config.prefix}/etc/#{@job_name}/conf.json",
|
432
482
|
diff: diff_before_copy,
|
433
483
|
dry_run: dry_run
|
@@ -442,7 +492,7 @@ task :configure, [ :action ] do |task, args|
|
|
442
492
|
throw "Missing service file for #{@job_name}"
|
443
493
|
end
|
444
494
|
|
445
|
-
diff_and_write(contents:
|
495
|
+
diff_and_write(contents: expand_template(template),
|
446
496
|
path: "#{@config.prefix}/lib/systemd/system/#{@job_name}@.service",
|
447
497
|
diff: diff_before_copy,
|
448
498
|
dry_run: dry_run
|
data/sp-job.gemspec
CHANGED
@@ -26,24 +26,26 @@ Gem::Specification.new do |spec|
|
|
26
26
|
f.match(%r{^(test|spec|features)/})
|
27
27
|
end
|
28
28
|
spec.bindir = 'bin'
|
29
|
-
spec.executables = 'queue-job'
|
29
|
+
spec.executables = ['queue-job', 'unique-file']
|
30
30
|
spec.require_paths = ['lib']
|
31
|
-
spec.add_dependency 'concurrent-ruby'
|
32
31
|
spec.add_dependency 'os'
|
33
|
-
spec.add_dependency '
|
32
|
+
spec.add_dependency 'ffi'
|
34
33
|
spec.add_dependency 'redis'
|
35
34
|
spec.add_dependency 'backburner'
|
36
|
-
spec.add_dependency 'pg'
|
37
|
-
spec.add_dependency '
|
38
|
-
spec.add_dependency '
|
39
|
-
spec.add_dependency '
|
35
|
+
spec.add_dependency 'pg' unless RUBY_ENGINE == 'jruby'
|
36
|
+
spec.add_dependency 'pg_jruby' if RUBY_ENGINE == 'jruby'
|
37
|
+
spec.add_dependency 'curb' unless RUBY_ENGINE == 'jruby'
|
38
|
+
spec.add_dependency 'oauth2' unless RUBY_ENGINE == 'jruby'
|
39
|
+
spec.add_dependency 'oauth2-client' unless RUBY_ENGINE == 'jruby'
|
40
40
|
spec.add_dependency 'mail'
|
41
|
-
spec.add_dependency 'rails'
|
42
41
|
spec.add_dependency 'json'
|
42
|
+
spec.add_dependency 'jwt'
|
43
43
|
spec.add_dependency 'awesome_print'
|
44
44
|
spec.add_dependency 'rollbar'
|
45
45
|
spec.add_dependency 'roadie'
|
46
46
|
|
47
|
+
spec.add_development_dependency 'ruby-debug' if RUBY_ENGINE == 'jruby'
|
48
|
+
spec.add_development_dependency 'byebug' unless RUBY_ENGINE == 'jruby'
|
47
49
|
spec.add_development_dependency 'bundler', '~> 1.14'
|
48
50
|
spec.add_development_dependency 'rake', '~> 10.0'
|
49
51
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
metadata
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sp-job
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eurico Inocencio, Vitor Pinho
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-03-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: os
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
@@ -25,7 +25,7 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: ffi
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
@@ -39,7 +39,7 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: redis
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
@@ -53,7 +53,7 @@ dependencies:
|
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: backburner
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - ">="
|
@@ -67,7 +67,7 @@ dependencies:
|
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: pg
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - ">="
|
@@ -81,7 +81,7 @@ dependencies:
|
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
84
|
+
name: curb
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - ">="
|
@@ -123,7 +123,7 @@ dependencies:
|
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '0'
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
|
-
name:
|
126
|
+
name: mail
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
128
128
|
requirements:
|
129
129
|
- - ">="
|
@@ -137,7 +137,7 @@ dependencies:
|
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '0'
|
139
139
|
- !ruby/object:Gem::Dependency
|
140
|
-
name:
|
140
|
+
name: json
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
142
142
|
requirements:
|
143
143
|
- - ">="
|
@@ -151,7 +151,7 @@ dependencies:
|
|
151
151
|
- !ruby/object:Gem::Version
|
152
152
|
version: '0'
|
153
153
|
- !ruby/object:Gem::Dependency
|
154
|
-
name:
|
154
|
+
name: jwt
|
155
155
|
requirement: !ruby/object:Gem::Requirement
|
156
156
|
requirements:
|
157
157
|
- - ">="
|
@@ -165,7 +165,7 @@ dependencies:
|
|
165
165
|
- !ruby/object:Gem::Version
|
166
166
|
version: '0'
|
167
167
|
- !ruby/object:Gem::Dependency
|
168
|
-
name:
|
168
|
+
name: awesome_print
|
169
169
|
requirement: !ruby/object:Gem::Requirement
|
170
170
|
requirements:
|
171
171
|
- - ">="
|
@@ -179,7 +179,7 @@ dependencies:
|
|
179
179
|
- !ruby/object:Gem::Version
|
180
180
|
version: '0'
|
181
181
|
- !ruby/object:Gem::Dependency
|
182
|
-
name:
|
182
|
+
name: rollbar
|
183
183
|
requirement: !ruby/object:Gem::Requirement
|
184
184
|
requirements:
|
185
185
|
- - ">="
|
@@ -193,7 +193,7 @@ dependencies:
|
|
193
193
|
- !ruby/object:Gem::Version
|
194
194
|
version: '0'
|
195
195
|
- !ruby/object:Gem::Dependency
|
196
|
-
name:
|
196
|
+
name: roadie
|
197
197
|
requirement: !ruby/object:Gem::Requirement
|
198
198
|
requirements:
|
199
199
|
- - ">="
|
@@ -207,13 +207,13 @@ dependencies:
|
|
207
207
|
- !ruby/object:Gem::Version
|
208
208
|
version: '0'
|
209
209
|
- !ruby/object:Gem::Dependency
|
210
|
-
name:
|
210
|
+
name: byebug
|
211
211
|
requirement: !ruby/object:Gem::Requirement
|
212
212
|
requirements:
|
213
213
|
- - ">="
|
214
214
|
- !ruby/object:Gem::Version
|
215
215
|
version: '0'
|
216
|
-
type: :
|
216
|
+
type: :development
|
217
217
|
prerelease: false
|
218
218
|
version_requirements: !ruby/object:Gem::Requirement
|
219
219
|
requirements:
|
@@ -267,6 +267,7 @@ email:
|
|
267
267
|
- eurico.inocencio@gmail.com, vitor.pinho@servicepartner.pt
|
268
268
|
executables:
|
269
269
|
- queue-job
|
270
|
+
- unique-file
|
270
271
|
extensions: []
|
271
272
|
extra_rdoc_files: []
|
272
273
|
files:
|
@@ -281,6 +282,7 @@ files:
|
|
281
282
|
- bin/console
|
282
283
|
- bin/queue-job
|
283
284
|
- bin/setup
|
285
|
+
- bin/unique-file
|
284
286
|
- lib/sp-job.rb
|
285
287
|
- lib/sp/job.rb
|
286
288
|
- lib/sp/job/back_burner.rb
|
@@ -288,12 +290,16 @@ files:
|
|
288
290
|
- lib/sp/job/broker_http_client.rb
|
289
291
|
- lib/sp/job/broker_oauth2_client.rb
|
290
292
|
- lib/sp/job/common.rb
|
291
|
-
- lib/sp/job/
|
293
|
+
- lib/sp/job/job_db_adapter.rb
|
292
294
|
- lib/sp/job/jsonapi_error.rb
|
295
|
+
- lib/sp/job/jwt.rb
|
296
|
+
- lib/sp/job/mail_queue.rb
|
293
297
|
- lib/sp/job/pg_connection.rb
|
298
|
+
- lib/sp/job/unique_file.rb
|
294
299
|
- lib/sp/job/uploaded_image_converter.rb
|
295
300
|
- lib/sp/job/version.rb
|
296
301
|
- lib/sp/job/worker.rb
|
302
|
+
- lib/sp/job/worker_thread.rb
|
297
303
|
- lib/tasks/configure.rake
|
298
304
|
- sp-job.gemspec
|
299
305
|
homepage: https://github.com/vpfpinho/sp-job
|