sp-job 0.1.17 → 0.2.2
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 +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
|