sidekiq 2.15.1 → 4.2.10
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of sidekiq might be problematic. Click here for more details.
- checksums.yaml +7 -0
- data/.github/contributing.md +32 -0
- data/.github/issue_template.md +9 -0
- data/.gitignore +1 -0
- data/.travis.yml +16 -17
- data/3.0-Upgrade.md +70 -0
- data/4.0-Upgrade.md +53 -0
- data/COMM-LICENSE +56 -44
- data/Changes.md +644 -1
- data/Ent-Changes.md +173 -0
- data/Gemfile +27 -0
- data/LICENSE +1 -1
- data/Pro-2.0-Upgrade.md +138 -0
- data/Pro-3.0-Upgrade.md +44 -0
- data/Pro-Changes.md +457 -3
- data/README.md +46 -29
- data/Rakefile +6 -3
- data/bin/sidekiq +4 -0
- data/bin/sidekiqctl +41 -20
- data/bin/sidekiqload +154 -0
- data/code_of_conduct.md +50 -0
- data/lib/generators/sidekiq/templates/worker.rb.erb +9 -0
- data/lib/generators/sidekiq/templates/worker_spec.rb.erb +6 -0
- data/lib/generators/sidekiq/templates/worker_test.rb.erb +8 -0
- data/lib/generators/sidekiq/worker_generator.rb +49 -0
- data/lib/sidekiq.rb +141 -29
- data/lib/sidekiq/api.rb +540 -106
- data/lib/sidekiq/cli.rb +131 -71
- data/lib/sidekiq/client.rb +168 -96
- data/lib/sidekiq/core_ext.rb +36 -8
- data/lib/sidekiq/exception_handler.rb +20 -28
- data/lib/sidekiq/extensions/action_mailer.rb +25 -5
- data/lib/sidekiq/extensions/active_record.rb +8 -4
- data/lib/sidekiq/extensions/class_methods.rb +9 -5
- data/lib/sidekiq/extensions/generic_proxy.rb +1 -0
- data/lib/sidekiq/fetch.rb +45 -101
- data/lib/sidekiq/launcher.rb +144 -30
- data/lib/sidekiq/logging.rb +69 -12
- data/lib/sidekiq/manager.rb +90 -140
- data/lib/sidekiq/middleware/chain.rb +18 -5
- data/lib/sidekiq/middleware/i18n.rb +9 -2
- data/lib/sidekiq/middleware/server/active_record.rb +1 -1
- data/lib/sidekiq/middleware/server/logging.rb +11 -11
- data/lib/sidekiq/middleware/server/retry_jobs.rb +98 -44
- data/lib/sidekiq/paginator.rb +20 -8
- data/lib/sidekiq/processor.rb +157 -96
- data/lib/sidekiq/rails.rb +109 -5
- data/lib/sidekiq/redis_connection.rb +70 -24
- data/lib/sidekiq/scheduled.rb +122 -50
- data/lib/sidekiq/testing.rb +171 -31
- data/lib/sidekiq/testing/inline.rb +1 -0
- data/lib/sidekiq/util.rb +31 -5
- data/lib/sidekiq/version.rb +2 -1
- data/lib/sidekiq/web.rb +136 -263
- data/lib/sidekiq/web/action.rb +93 -0
- data/lib/sidekiq/web/application.rb +336 -0
- data/lib/sidekiq/web/helpers.rb +278 -0
- data/lib/sidekiq/web/router.rb +100 -0
- data/lib/sidekiq/worker.rb +40 -7
- data/sidekiq.gemspec +18 -14
- data/web/assets/images/favicon.ico +0 -0
- data/web/assets/images/{status-sd8051fd480.png → status.png} +0 -0
- data/web/assets/javascripts/application.js +67 -19
- data/web/assets/javascripts/dashboard.js +138 -29
- data/web/assets/stylesheets/application.css +267 -406
- data/web/assets/stylesheets/bootstrap.css +4 -8
- data/web/locales/cs.yml +78 -0
- data/web/locales/da.yml +9 -1
- data/web/locales/de.yml +18 -9
- data/web/locales/el.yml +68 -0
- data/web/locales/en.yml +19 -4
- data/web/locales/es.yml +10 -1
- data/web/locales/fa.yml +79 -0
- data/web/locales/fr.yml +50 -32
- data/web/locales/hi.yml +75 -0
- data/web/locales/it.yml +27 -18
- data/web/locales/ja.yml +27 -12
- data/web/locales/ko.yml +8 -3
- data/web/locales/{no.yml → nb.yml} +19 -5
- data/web/locales/nl.yml +8 -3
- data/web/locales/pl.yml +0 -1
- data/web/locales/pt-br.yml +11 -4
- data/web/locales/pt.yml +8 -1
- data/web/locales/ru.yml +39 -21
- data/web/locales/sv.yml +68 -0
- data/web/locales/ta.yml +75 -0
- data/web/locales/uk.yml +76 -0
- data/web/locales/zh-cn.yml +68 -0
- data/web/locales/zh-tw.yml +68 -0
- data/web/views/_footer.erb +17 -0
- data/web/views/_job_info.erb +72 -60
- data/web/views/_nav.erb +58 -25
- data/web/views/_paging.erb +5 -5
- data/web/views/_poll_link.erb +7 -0
- data/web/views/_summary.erb +20 -14
- data/web/views/busy.erb +94 -0
- data/web/views/dashboard.erb +34 -21
- data/web/views/dead.erb +34 -0
- data/web/views/layout.erb +8 -30
- data/web/views/morgue.erb +75 -0
- data/web/views/queue.erb +37 -30
- data/web/views/queues.erb +26 -20
- data/web/views/retries.erb +60 -47
- data/web/views/retry.erb +23 -19
- data/web/views/scheduled.erb +39 -35
- data/web/views/scheduled_job_info.erb +2 -1
- metadata +152 -195
- data/Contributing.md +0 -29
- data/config.ru +0 -18
- data/lib/sidekiq/actor.rb +0 -7
- data/lib/sidekiq/capistrano.rb +0 -54
- data/lib/sidekiq/yaml_patch.rb +0 -21
- data/test/config.yml +0 -11
- data/test/env_based_config.yml +0 -11
- data/test/fake_env.rb +0 -0
- data/test/helper.rb +0 -42
- data/test/test_api.rb +0 -341
- data/test/test_cli.rb +0 -326
- data/test/test_client.rb +0 -211
- data/test/test_exception_handler.rb +0 -124
- data/test/test_extensions.rb +0 -105
- data/test/test_fetch.rb +0 -44
- data/test/test_manager.rb +0 -83
- data/test/test_middleware.rb +0 -135
- data/test/test_processor.rb +0 -160
- data/test/test_redis_connection.rb +0 -97
- data/test/test_retry.rb +0 -306
- data/test/test_scheduled.rb +0 -86
- data/test/test_scheduling.rb +0 -47
- data/test/test_sidekiq.rb +0 -37
- data/test/test_testing.rb +0 -82
- data/test/test_testing_fake.rb +0 -265
- data/test/test_testing_inline.rb +0 -92
- data/test/test_util.rb +0 -18
- data/test/test_web.rb +0 -372
- data/web/assets/images/bootstrap/glyphicons-halflings-white.png +0 -0
- data/web/assets/images/bootstrap/glyphicons-halflings.png +0 -0
- data/web/assets/images/status/active.png +0 -0
- data/web/assets/images/status/idle.png +0 -0
- data/web/assets/javascripts/locales/README.md +0 -27
- data/web/assets/javascripts/locales/jquery.timeago.ar.js +0 -96
- data/web/assets/javascripts/locales/jquery.timeago.bg.js +0 -18
- data/web/assets/javascripts/locales/jquery.timeago.bs.js +0 -49
- data/web/assets/javascripts/locales/jquery.timeago.ca.js +0 -18
- data/web/assets/javascripts/locales/jquery.timeago.cy.js +0 -20
- data/web/assets/javascripts/locales/jquery.timeago.cz.js +0 -18
- data/web/assets/javascripts/locales/jquery.timeago.da.js +0 -18
- data/web/assets/javascripts/locales/jquery.timeago.de.js +0 -18
- data/web/assets/javascripts/locales/jquery.timeago.el.js +0 -18
- data/web/assets/javascripts/locales/jquery.timeago.en-short.js +0 -20
- data/web/assets/javascripts/locales/jquery.timeago.en.js +0 -20
- data/web/assets/javascripts/locales/jquery.timeago.es.js +0 -18
- data/web/assets/javascripts/locales/jquery.timeago.et.js +0 -18
- data/web/assets/javascripts/locales/jquery.timeago.fa.js +0 -22
- data/web/assets/javascripts/locales/jquery.timeago.fi.js +0 -28
- data/web/assets/javascripts/locales/jquery.timeago.fr-short.js +0 -16
- data/web/assets/javascripts/locales/jquery.timeago.fr.js +0 -17
- data/web/assets/javascripts/locales/jquery.timeago.he.js +0 -18
- data/web/assets/javascripts/locales/jquery.timeago.hr.js +0 -49
- data/web/assets/javascripts/locales/jquery.timeago.hu.js +0 -18
- data/web/assets/javascripts/locales/jquery.timeago.hy.js +0 -18
- data/web/assets/javascripts/locales/jquery.timeago.id.js +0 -18
- data/web/assets/javascripts/locales/jquery.timeago.it.js +0 -16
- data/web/assets/javascripts/locales/jquery.timeago.ja.js +0 -19
- data/web/assets/javascripts/locales/jquery.timeago.ko.js +0 -17
- data/web/assets/javascripts/locales/jquery.timeago.lt.js +0 -20
- data/web/assets/javascripts/locales/jquery.timeago.mk.js +0 -20
- data/web/assets/javascripts/locales/jquery.timeago.nl.js +0 -20
- data/web/assets/javascripts/locales/jquery.timeago.no.js +0 -18
- data/web/assets/javascripts/locales/jquery.timeago.pl.js +0 -31
- data/web/assets/javascripts/locales/jquery.timeago.pt-br.js +0 -16
- data/web/assets/javascripts/locales/jquery.timeago.pt.js +0 -16
- data/web/assets/javascripts/locales/jquery.timeago.ro.js +0 -18
- data/web/assets/javascripts/locales/jquery.timeago.rs.js +0 -49
- data/web/assets/javascripts/locales/jquery.timeago.ru.js +0 -34
- data/web/assets/javascripts/locales/jquery.timeago.sk.js +0 -18
- data/web/assets/javascripts/locales/jquery.timeago.sl.js +0 -44
- data/web/assets/javascripts/locales/jquery.timeago.sv.js +0 -18
- data/web/assets/javascripts/locales/jquery.timeago.th.js +0 -20
- data/web/assets/javascripts/locales/jquery.timeago.tr.js +0 -16
- data/web/assets/javascripts/locales/jquery.timeago.uk.js +0 -34
- data/web/assets/javascripts/locales/jquery.timeago.uz.js +0 -19
- data/web/assets/javascripts/locales/jquery.timeago.zh-CN.js +0 -20
- data/web/assets/javascripts/locales/jquery.timeago.zh-TW.js +0 -20
- data/web/views/_poll.erb +0 -14
- data/web/views/_workers.erb +0 -29
- data/web/views/index.erb +0 -16
data/test/test_testing_inline.rb
DELETED
@@ -1,92 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
require 'sidekiq'
|
3
|
-
require 'sidekiq/worker'
|
4
|
-
require 'active_record'
|
5
|
-
require 'action_mailer'
|
6
|
-
require 'sidekiq/rails'
|
7
|
-
require 'sidekiq/extensions/action_mailer'
|
8
|
-
require 'sidekiq/extensions/active_record'
|
9
|
-
|
10
|
-
Sidekiq.hook_rails!
|
11
|
-
|
12
|
-
class TestInline < Sidekiq::Test
|
13
|
-
describe 'sidekiq inline testing' do
|
14
|
-
class InlineError < RuntimeError; end
|
15
|
-
class ParameterIsNotString < RuntimeError; end
|
16
|
-
|
17
|
-
class InlineWorker
|
18
|
-
include Sidekiq::Worker
|
19
|
-
def perform(pass)
|
20
|
-
raise InlineError unless pass
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
class InlineWorkerWithTimeParam
|
25
|
-
include Sidekiq::Worker
|
26
|
-
def perform(time)
|
27
|
-
raise ParameterIsNotString unless time.is_a?(String) || time.is_a?(Numeric)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
class InlineFooMailer < ActionMailer::Base
|
32
|
-
def bar(str)
|
33
|
-
raise InlineError
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
class InlineFooModel < ActiveRecord::Base
|
38
|
-
def self.bar(str)
|
39
|
-
raise InlineError
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
before do
|
44
|
-
require 'sidekiq/testing/inline.rb'
|
45
|
-
Sidekiq::Testing.inline!
|
46
|
-
end
|
47
|
-
|
48
|
-
after do
|
49
|
-
Sidekiq::Testing.disable!
|
50
|
-
end
|
51
|
-
|
52
|
-
it 'stubs the async call when in testing mode' do
|
53
|
-
assert InlineWorker.perform_async(true)
|
54
|
-
|
55
|
-
assert_raises InlineError do
|
56
|
-
InlineWorker.perform_async(false)
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
it 'stubs the delay call on mailers' do
|
61
|
-
assert_raises InlineError do
|
62
|
-
InlineFooMailer.delay.bar('three')
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
it 'stubs the delay call on models' do
|
67
|
-
assert_raises InlineError do
|
68
|
-
InlineFooModel.delay.bar('three')
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
it 'stubs the enqueue call when in testing mode' do
|
73
|
-
assert Sidekiq::Client.enqueue(InlineWorker, true)
|
74
|
-
|
75
|
-
assert_raises InlineError do
|
76
|
-
Sidekiq::Client.enqueue(InlineWorker, false)
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
it 'stubs the push_bulk call when in testing mode' do
|
81
|
-
assert Sidekiq::Client.push_bulk({'class' => InlineWorker, 'args' => [[true], [true]]})
|
82
|
-
|
83
|
-
assert_raises InlineError do
|
84
|
-
Sidekiq::Client.push_bulk({'class' => InlineWorker, 'args' => [[true], [false]]})
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
it 'should relay parameters through json' do
|
89
|
-
assert Sidekiq::Client.enqueue(InlineWorkerWithTimeParam, Time.now)
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
data/test/test_util.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
require 'sidekiq/util'
|
3
|
-
|
4
|
-
class TestUtil < Sidekiq::Test
|
5
|
-
describe 'util' do
|
6
|
-
it 'generates the same process id when included in two or more classes' do
|
7
|
-
class One
|
8
|
-
include Sidekiq::Util
|
9
|
-
end
|
10
|
-
|
11
|
-
class Two
|
12
|
-
include Sidekiq::Util
|
13
|
-
end
|
14
|
-
|
15
|
-
assert_equal One.new.process_id, Two.new.process_id
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
data/test/test_web.rb
DELETED
@@ -1,372 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
require 'sidekiq'
|
3
|
-
require 'sidekiq/web'
|
4
|
-
require 'rack/test'
|
5
|
-
|
6
|
-
class TestWeb < Sidekiq::Test
|
7
|
-
describe 'sidekiq web' do
|
8
|
-
include Rack::Test::Methods
|
9
|
-
|
10
|
-
def app
|
11
|
-
Sidekiq::Web
|
12
|
-
end
|
13
|
-
|
14
|
-
def job_params(job, score)
|
15
|
-
"#{score}-#{job['jid']}"
|
16
|
-
end
|
17
|
-
|
18
|
-
before do
|
19
|
-
Sidekiq.redis = REDIS
|
20
|
-
Sidekiq.redis {|c| c.flushdb }
|
21
|
-
end
|
22
|
-
|
23
|
-
class WebWorker
|
24
|
-
include Sidekiq::Worker
|
25
|
-
|
26
|
-
def perform(a, b)
|
27
|
-
a + b
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
it 'can display workers' do
|
32
|
-
Sidekiq.redis do |conn|
|
33
|
-
identity = 'foo:1234-123abc:default'
|
34
|
-
conn.sadd('workers', identity)
|
35
|
-
conn.setex("worker:#{identity}:started", 10, Time.now.to_s)
|
36
|
-
hash = {:queue => 'critical', :payload => { 'class' => WebWorker.name, 'args' => [1,'abc'] }, :run_at => Time.now.to_i }
|
37
|
-
conn.setex("worker:#{identity}", 10, Sidekiq.dump_json(hash))
|
38
|
-
end
|
39
|
-
|
40
|
-
get '/workers'
|
41
|
-
assert_equal 200, last_response.status
|
42
|
-
assert_match /status-active/, last_response.body
|
43
|
-
assert_match /critical/, last_response.body
|
44
|
-
assert_match /WebWorker/, last_response.body
|
45
|
-
end
|
46
|
-
|
47
|
-
it 'can display queues' do
|
48
|
-
assert Sidekiq::Client.push('queue' => :foo, 'class' => WebWorker, 'args' => [1, 3])
|
49
|
-
|
50
|
-
get '/queues'
|
51
|
-
assert_equal 200, last_response.status
|
52
|
-
assert_match /foo/, last_response.body
|
53
|
-
refute_match /HardWorker/, last_response.body
|
54
|
-
end
|
55
|
-
|
56
|
-
it 'handles queue view' do
|
57
|
-
get '/queues/default'
|
58
|
-
assert_equal 200, last_response.status
|
59
|
-
end
|
60
|
-
|
61
|
-
it 'can delete a queue' do
|
62
|
-
Sidekiq.redis do |conn|
|
63
|
-
conn.rpush('queue:foo', '{}')
|
64
|
-
conn.sadd('queues', 'foo')
|
65
|
-
end
|
66
|
-
|
67
|
-
get '/queues/foo'
|
68
|
-
assert_equal 200, last_response.status
|
69
|
-
|
70
|
-
post '/queues/foo'
|
71
|
-
assert_equal 302, last_response.status
|
72
|
-
|
73
|
-
Sidekiq.redis do |conn|
|
74
|
-
refute conn.smembers('queues').include?('foo')
|
75
|
-
refute conn.exists('queues:foo')
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
it 'can clear an empty worker list' do
|
80
|
-
post '/reset'
|
81
|
-
assert_equal 302, last_response.status
|
82
|
-
end
|
83
|
-
|
84
|
-
it 'can clear a non-empty worker list' do
|
85
|
-
Sidekiq.redis do |conn|
|
86
|
-
identity = 'foo'
|
87
|
-
conn.sadd('workers', identity)
|
88
|
-
end
|
89
|
-
|
90
|
-
post '/reset'
|
91
|
-
|
92
|
-
assert_equal 302, last_response.status
|
93
|
-
|
94
|
-
Sidekiq.redis do |conn|
|
95
|
-
refute conn.smembers('workers').any?
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
it 'can delete a job' do
|
100
|
-
Sidekiq.redis do |conn|
|
101
|
-
conn.rpush('queue:foo', "{}")
|
102
|
-
conn.rpush('queue:foo', "{\"foo\":\"bar\"}")
|
103
|
-
conn.rpush('queue:foo', "{\"foo2\":\"bar2\"}")
|
104
|
-
end
|
105
|
-
|
106
|
-
get '/queues/foo'
|
107
|
-
assert_equal 200, last_response.status
|
108
|
-
|
109
|
-
post '/queues/foo/delete', key_val: "{\"foo\":\"bar\"}"
|
110
|
-
assert_equal 302, last_response.status
|
111
|
-
|
112
|
-
Sidekiq.redis do |conn|
|
113
|
-
refute conn.lrange('queue:foo', 0, -1).include?("{\"foo\":\"bar\"}")
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
it 'can display retries' do
|
118
|
-
get '/retries'
|
119
|
-
assert_equal 200, last_response.status
|
120
|
-
assert_match /found/, last_response.body
|
121
|
-
refute_match /HardWorker/, last_response.body
|
122
|
-
|
123
|
-
add_retry
|
124
|
-
|
125
|
-
get '/retries'
|
126
|
-
assert_equal 200, last_response.status
|
127
|
-
refute_match /found/, last_response.body
|
128
|
-
assert_match /HardWorker/, last_response.body
|
129
|
-
end
|
130
|
-
|
131
|
-
it 'can display a single retry' do
|
132
|
-
params = add_retry
|
133
|
-
get '/retries/0-shouldntexist'
|
134
|
-
assert_equal 302, last_response.status
|
135
|
-
get "/retries/#{job_params(*params)}"
|
136
|
-
assert_equal 200, last_response.status
|
137
|
-
assert_match /HardWorker/, last_response.body
|
138
|
-
end
|
139
|
-
|
140
|
-
it 'handles missing retry' do
|
141
|
-
get "/retries/0-shouldntexist"
|
142
|
-
assert_equal 302, last_response.status
|
143
|
-
end
|
144
|
-
|
145
|
-
it 'can delete a single retry' do
|
146
|
-
params = add_retry
|
147
|
-
post "/retries/#{job_params(*params)}", 'delete' => 'Delete'
|
148
|
-
assert_equal 302, last_response.status
|
149
|
-
assert_equal 'http://example.org/retries', last_response.header['Location']
|
150
|
-
|
151
|
-
get "/retries"
|
152
|
-
assert_equal 200, last_response.status
|
153
|
-
refute_match /#{params.first['args'][2]}/, last_response.body
|
154
|
-
end
|
155
|
-
|
156
|
-
it 'can delete all retries' do
|
157
|
-
3.times { add_retry }
|
158
|
-
|
159
|
-
post "/retries/all/delete", 'delete' => 'Delete'
|
160
|
-
assert_equal 0, Sidekiq::RetrySet.new.size
|
161
|
-
assert_equal 302, last_response.status
|
162
|
-
assert_equal 'http://example.org/retries', last_response.header['Location']
|
163
|
-
end
|
164
|
-
|
165
|
-
it 'can retry a single retry now' do
|
166
|
-
params = add_retry
|
167
|
-
post "/retries/#{job_params(*params)}", 'retry' => 'Retry'
|
168
|
-
assert_equal 302, last_response.status
|
169
|
-
assert_equal 'http://example.org/retries', last_response.header['Location']
|
170
|
-
|
171
|
-
get '/queues/default'
|
172
|
-
assert_equal 200, last_response.status
|
173
|
-
assert_match /#{params.first['args'][2]}/, last_response.body
|
174
|
-
end
|
175
|
-
|
176
|
-
it 'can display scheduled' do
|
177
|
-
get '/scheduled'
|
178
|
-
assert_equal 200, last_response.status
|
179
|
-
assert_match /found/, last_response.body
|
180
|
-
refute_match /HardWorker/, last_response.body
|
181
|
-
|
182
|
-
add_scheduled
|
183
|
-
|
184
|
-
get '/scheduled'
|
185
|
-
assert_equal 200, last_response.status
|
186
|
-
refute_match /found/, last_response.body
|
187
|
-
assert_match /HardWorker/, last_response.body
|
188
|
-
end
|
189
|
-
|
190
|
-
it 'can display a single scheduled job' do
|
191
|
-
params = add_scheduled
|
192
|
-
get '/scheduled/0-shouldntexist'
|
193
|
-
assert_equal 302, last_response.status
|
194
|
-
get "/scheduled/#{job_params(*params)}"
|
195
|
-
assert_equal 200, last_response.status
|
196
|
-
assert_match /HardWorker/, last_response.body
|
197
|
-
end
|
198
|
-
|
199
|
-
it 'handles missing scheduled job' do
|
200
|
-
get "/scheduled/0-shouldntexist"
|
201
|
-
assert_equal 302, last_response.status
|
202
|
-
end
|
203
|
-
|
204
|
-
it 'can add to queue a single scheduled job' do
|
205
|
-
params = add_scheduled
|
206
|
-
post "/scheduled/#{job_params(*params)}", 'add_to_queue' => true
|
207
|
-
assert_equal 302, last_response.status
|
208
|
-
assert_equal 'http://example.org/scheduled', last_response.header['Location']
|
209
|
-
|
210
|
-
get '/queues/default'
|
211
|
-
assert_equal 200, last_response.status
|
212
|
-
assert_match /#{params.first['args'][2]}/, last_response.body
|
213
|
-
end
|
214
|
-
|
215
|
-
it 'can delete a single scheduled job' do
|
216
|
-
params = add_scheduled
|
217
|
-
post "/scheduled/#{job_params(*params)}", 'delete' => 'Delete'
|
218
|
-
assert_equal 302, last_response.status
|
219
|
-
assert_equal 'http://example.org/scheduled', last_response.header['Location']
|
220
|
-
|
221
|
-
get "/scheduled"
|
222
|
-
assert_equal 200, last_response.status
|
223
|
-
refute_match /#{params.first['args'][2]}/, last_response.body
|
224
|
-
end
|
225
|
-
|
226
|
-
it 'can delete scheduled' do
|
227
|
-
params = add_scheduled
|
228
|
-
Sidekiq.redis do |conn|
|
229
|
-
assert_equal 1, conn.zcard('schedule')
|
230
|
-
post '/scheduled', 'key' => [job_params(*params)], 'delete' => 'Delete'
|
231
|
-
assert_equal 302, last_response.status
|
232
|
-
assert_equal 'http://example.org/scheduled', last_response.header['Location']
|
233
|
-
assert_equal 0, conn.zcard('schedule')
|
234
|
-
end
|
235
|
-
end
|
236
|
-
|
237
|
-
it "can move scheduled to default queue" do
|
238
|
-
q = Sidekiq::Queue.new
|
239
|
-
params = add_scheduled
|
240
|
-
Sidekiq.redis do |conn|
|
241
|
-
assert_equal 1, conn.zcard('schedule')
|
242
|
-
assert_equal 0, q.size
|
243
|
-
post '/scheduled', 'key' => [job_params(*params)], 'add_to_queue' => 'AddToQueue'
|
244
|
-
assert_equal 302, last_response.status
|
245
|
-
assert_equal 'http://example.org/scheduled', last_response.header['Location']
|
246
|
-
assert_equal 0, conn.zcard('schedule')
|
247
|
-
assert_equal 1, q.size
|
248
|
-
get '/queues/default'
|
249
|
-
assert_equal 200, last_response.status
|
250
|
-
assert_match /#{params[0]['args'][2]}/, last_response.body
|
251
|
-
end
|
252
|
-
end
|
253
|
-
|
254
|
-
it 'can retry all retries' do
|
255
|
-
msg, score = add_retry
|
256
|
-
add_retry
|
257
|
-
|
258
|
-
post "/retries/all/retry", 'retry' => 'Retry'
|
259
|
-
assert_equal 302, last_response.status
|
260
|
-
assert_equal 'http://example.org/retries', last_response.header['Location']
|
261
|
-
assert_equal 2, Sidekiq::Queue.new("default").size
|
262
|
-
|
263
|
-
get '/queues/default'
|
264
|
-
assert_equal 200, last_response.status
|
265
|
-
assert_match /#{msg['args'][2]}/, last_response.body
|
266
|
-
end
|
267
|
-
|
268
|
-
it 'can show user defined tab' do
|
269
|
-
begin
|
270
|
-
Sidekiq::Web.tabs['Custom Tab'] = '/custom'
|
271
|
-
|
272
|
-
get '/'
|
273
|
-
assert_match 'Custom Tab', last_response.body
|
274
|
-
|
275
|
-
ensure
|
276
|
-
Sidekiq::Web.tabs.delete 'Custom Tab'
|
277
|
-
end
|
278
|
-
end
|
279
|
-
|
280
|
-
it 'can display home' do
|
281
|
-
get '/'
|
282
|
-
assert_equal 200, last_response.status
|
283
|
-
end
|
284
|
-
|
285
|
-
describe 'stats' do
|
286
|
-
before do
|
287
|
-
Sidekiq.redis do |conn|
|
288
|
-
conn.set("stat:processed", 5)
|
289
|
-
conn.set("stat:failed", 2)
|
290
|
-
end
|
291
|
-
2.times { add_retry }
|
292
|
-
3.times { add_scheduled }
|
293
|
-
4.times { add_worker }
|
294
|
-
|
295
|
-
get '/dashboard/stats'
|
296
|
-
@response = Sidekiq.load_json(last_response.body)
|
297
|
-
end
|
298
|
-
|
299
|
-
it 'can refresh dashboard stats' do
|
300
|
-
assert_equal 200, last_response.status
|
301
|
-
end
|
302
|
-
|
303
|
-
describe "for sidekiq" do
|
304
|
-
it 'are namespaced' do
|
305
|
-
assert_includes @response.keys, "sidekiq"
|
306
|
-
end
|
307
|
-
|
308
|
-
it 'reports processed' do
|
309
|
-
assert_equal 5, @response["sidekiq"]["processed"]
|
310
|
-
end
|
311
|
-
|
312
|
-
it 'reports failed' do
|
313
|
-
assert_equal 2, @response["sidekiq"]["failed"]
|
314
|
-
end
|
315
|
-
|
316
|
-
it 'reports busy' do
|
317
|
-
assert_equal 4, @response["sidekiq"]["busy"]
|
318
|
-
end
|
319
|
-
|
320
|
-
it 'reports retries' do
|
321
|
-
assert_equal 2, @response["sidekiq"]["retries"]
|
322
|
-
end
|
323
|
-
|
324
|
-
it 'reports scheduled' do
|
325
|
-
assert_equal 3, @response["sidekiq"]["scheduled"]
|
326
|
-
end
|
327
|
-
end
|
328
|
-
|
329
|
-
describe "for redis" do
|
330
|
-
it 'are namespaced' do
|
331
|
-
assert_includes @response.keys, "redis"
|
332
|
-
end
|
333
|
-
end
|
334
|
-
end
|
335
|
-
|
336
|
-
def add_scheduled
|
337
|
-
score = Time.now.to_f
|
338
|
-
msg = { 'class' => 'HardWorker',
|
339
|
-
'args' => ['bob', 1, Time.now.to_f],
|
340
|
-
'jid' => 'f39af2a05e8f4b24dbc0f1e4' }
|
341
|
-
Sidekiq.redis do |conn|
|
342
|
-
conn.zadd('schedule', score, Sidekiq.dump_json(msg))
|
343
|
-
end
|
344
|
-
[msg, score]
|
345
|
-
end
|
346
|
-
|
347
|
-
def add_retry
|
348
|
-
msg = { 'class' => 'HardWorker',
|
349
|
-
'args' => ['bob', 1, Time.now.to_f],
|
350
|
-
'queue' => 'default',
|
351
|
-
'error_message' => 'Some fake message',
|
352
|
-
'error_class' => 'RuntimeError',
|
353
|
-
'retry_count' => 0,
|
354
|
-
'failed_at' => Time.now.utc,
|
355
|
-
'jid' => 'f39af2a05e8f4b24dbc0f1e4'}
|
356
|
-
score = Time.now.to_f
|
357
|
-
Sidekiq.redis do |conn|
|
358
|
-
conn.zadd('retry', score, Sidekiq.dump_json(msg))
|
359
|
-
end
|
360
|
-
[msg, score]
|
361
|
-
end
|
362
|
-
|
363
|
-
def add_worker
|
364
|
-
process_id = rand(1000)
|
365
|
-
msg = "{\"queue\":\"default\",\"payload\":{\"retry\":true,\"queue\":\"default\",\"timeout\":20,\"backtrace\":5,\"class\":\"HardWorker\",\"args\":[\"bob\",10,5],\"jid\":\"2b5ad2b016f5e063a1c62872\"},\"run_at\":1361208995}"
|
366
|
-
Sidekiq.redis do |conn|
|
367
|
-
conn.sadd("workers", "mercury.home:#{process_id}-70215157189060:started")
|
368
|
-
conn.set("worker:mercury.home:#{process_id}-70215157189060:started", msg)
|
369
|
-
end
|
370
|
-
end
|
371
|
-
end
|
372
|
-
end
|