autoscale 0.9.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.
Files changed (42) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +81 -0
  3. data/Guardfile +12 -0
  4. data/README.md +81 -0
  5. data/examples/complex.rb +39 -0
  6. data/examples/simple.rb +28 -0
  7. data/lib/autoscaler.rb +5 -0
  8. data/lib/autoscaler/binary_scaling_strategy.rb +26 -0
  9. data/lib/autoscaler/counter_cache_memory.rb +35 -0
  10. data/lib/autoscaler/counter_cache_redis.rb +50 -0
  11. data/lib/autoscaler/delayed_shutdown.rb +44 -0
  12. data/lib/autoscaler/heroku_scaler.rb +81 -0
  13. data/lib/autoscaler/ignore_scheduled_and_retrying.rb +13 -0
  14. data/lib/autoscaler/linear_scaling_strategy.rb +39 -0
  15. data/lib/autoscaler/sidekiq.rb +11 -0
  16. data/lib/autoscaler/sidekiq/activity.rb +62 -0
  17. data/lib/autoscaler/sidekiq/celluloid_monitor.rb +67 -0
  18. data/lib/autoscaler/sidekiq/client.rb +50 -0
  19. data/lib/autoscaler/sidekiq/entire_queue_system.rb +41 -0
  20. data/lib/autoscaler/sidekiq/monitor_middleware_adapter.rb +46 -0
  21. data/lib/autoscaler/sidekiq/queue_system.rb +20 -0
  22. data/lib/autoscaler/sidekiq/sleep_wait_server.rb +51 -0
  23. data/lib/autoscaler/sidekiq/specified_queue_system.rb +48 -0
  24. data/lib/autoscaler/stub_scaler.rb +25 -0
  25. data/lib/autoscaler/version.rb +4 -0
  26. data/spec/autoscaler/binary_scaling_strategy_spec.rb +19 -0
  27. data/spec/autoscaler/counter_cache_memory_spec.rb +21 -0
  28. data/spec/autoscaler/counter_cache_redis_spec.rb +49 -0
  29. data/spec/autoscaler/delayed_shutdown_spec.rb +23 -0
  30. data/spec/autoscaler/heroku_scaler_spec.rb +49 -0
  31. data/spec/autoscaler/ignore_scheduled_and_retrying_spec.rb +33 -0
  32. data/spec/autoscaler/linear_scaling_strategy_spec.rb +85 -0
  33. data/spec/autoscaler/sidekiq/activity_spec.rb +34 -0
  34. data/spec/autoscaler/sidekiq/celluloid_monitor_spec.rb +39 -0
  35. data/spec/autoscaler/sidekiq/client_spec.rb +35 -0
  36. data/spec/autoscaler/sidekiq/entire_queue_system_spec.rb +65 -0
  37. data/spec/autoscaler/sidekiq/monitor_middleware_adapter_spec.rb +16 -0
  38. data/spec/autoscaler/sidekiq/sleep_wait_server_spec.rb +45 -0
  39. data/spec/autoscaler/sidekiq/specified_queue_system_spec.rb +63 -0
  40. data/spec/spec_helper.rb +16 -0
  41. data/spec/test_system.rb +11 -0
  42. metadata +187 -0
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+ require 'autoscaler/sidekiq/monitor_middleware_adapter'
3
+
4
+ describe Autoscaler::Sidekiq::MonitorMiddlewareAdapter do
5
+ before do
6
+ @redis = Sidekiq.redis = REDIS
7
+ Sidekiq.redis {|c| c.flushdb }
8
+ end
9
+
10
+ let(:cut) {Autoscaler::Sidekiq::MonitorMiddlewareAdapter}
11
+ let(:scaler) {TestScaler.new(1)}
12
+ let(:server) {cut.new(scaler, 0, ['queue'])}
13
+
14
+ it('yields') {server.call(Object.new, {}, 'queue') {:foo}.should == :foo}
15
+ it('yields with a redis pool') {server.call(Object.new, {}, 'queue', Sidekiq.method(:redis)) {:foo}.should == :foo}
16
+ end
@@ -0,0 +1,45 @@
1
+ require 'spec_helper'
2
+ require 'autoscaler/sidekiq/sleep_wait_server'
3
+
4
+ describe Autoscaler::Sidekiq::SleepWaitServer do
5
+ before do
6
+ @redis = Sidekiq.redis = REDIS
7
+ Sidekiq.redis {|c| c.flushdb }
8
+ end
9
+
10
+ let(:cut) {Autoscaler::Sidekiq::SleepWaitServer}
11
+ let(:scaler) {TestScaler.new(1)}
12
+ let(:server) {cut.new(scaler, 0, ['queue'])}
13
+
14
+ shared_examples "a sleepwait server" do
15
+ it "scales with no work" do
16
+ server.stub(:pending_work?).and_return(false)
17
+ when_run
18
+ scaler.workers.should == 0
19
+ end
20
+
21
+ it "does not scale with pending work" do
22
+ server.stub(:pending_work?).and_return(true)
23
+ when_run
24
+ scaler.workers.should == 1
25
+ end
26
+ end
27
+
28
+ describe "a middleware with no redis specified" do
29
+ it_behaves_like "a sleepwait server" do
30
+ def when_run
31
+ server.call(Object.new, {}, 'queue') {}
32
+ end
33
+ end
34
+ end
35
+
36
+ describe "a middleware with redis specified" do
37
+ it_behaves_like "a sleepwait server" do
38
+ def when_run
39
+ server.call(Object.new, {}, 'queue', Sidekiq.method(:redis)) {}
40
+ end
41
+ end
42
+ end
43
+
44
+ it('yields') {server.call(Object.new, {}, 'queue') {:foo}.should == :foo}
45
+ end
@@ -0,0 +1,63 @@
1
+ require 'spec_helper'
2
+ require 'autoscaler/sidekiq/specified_queue_system'
3
+
4
+ describe Autoscaler::Sidekiq::SpecifiedQueueSystem do
5
+ let(:cut) {Autoscaler::Sidekiq::SpecifiedQueueSystem}
6
+
7
+ before do
8
+ @redis = Sidekiq.redis = REDIS
9
+ Sidekiq.redis {|c| c.flushdb }
10
+ end
11
+
12
+ def with_work_in_set(queue, set)
13
+ payload = Sidekiq.dump_json('queue' => queue)
14
+ Sidekiq.redis { |c| c.zadd(set, (Time.now.to_f + 30.to_f).to_s, payload)}
15
+ end
16
+
17
+ def with_scheduled_work_in(queue)
18
+ with_work_in_set(queue, 'schedule')
19
+ end
20
+
21
+ def with_retry_work_in(queue)
22
+ with_work_in_set(queue, 'retry')
23
+ end
24
+
25
+ subject {cut.new(['queue'])}
26
+
27
+ it {subject.queue_names.should == ['queue']}
28
+ it {subject.workers.should == 0}
29
+
30
+ describe 'no queued work' do
31
+ it "with no work" do
32
+ subject.stub(:sidekiq_queues).and_return({'queue' => 0, 'another_queue' => 1})
33
+ subject.queued.should == 0
34
+ end
35
+
36
+ it "with scheduled work in another queue" do
37
+ with_scheduled_work_in('another_queue')
38
+ subject.scheduled.should == 0
39
+ end
40
+
41
+ it "with retry work in another queue" do
42
+ with_retry_work_in('another_queue')
43
+ subject.retrying.should == 0
44
+ end
45
+ end
46
+
47
+ describe 'with queued work' do
48
+ it "with enqueued work" do
49
+ subject.stub(:sidekiq_queues).and_return({'queue' => 1})
50
+ subject.queued.should == 1
51
+ end
52
+
53
+ it "with schedule work" do
54
+ with_scheduled_work_in('queue')
55
+ subject.scheduled.should == 1
56
+ end
57
+
58
+ it "with retry work" do
59
+ with_retry_work_in('queue')
60
+ subject.retrying.should == 1
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,16 @@
1
+ require 'sidekiq'
2
+ REDIS = Sidekiq::RedisConnection.create(:url => 'http://localhost:9736', :namespace => 'autoscaler')
3
+
4
+ RSpec.configure do |config|
5
+ config.mock_with :rspec
6
+
7
+ config.filter_run_excluding :online => true unless ENV['HEROKU_APP']
8
+ end
9
+
10
+ class TestScaler
11
+ attr_accessor :workers
12
+
13
+ def initialize(n = 0)
14
+ self.workers = n
15
+ end
16
+ end
@@ -0,0 +1,11 @@
1
+ class TestSystem
2
+ def initialize(pending, current = 0)
3
+ @pending = pending
4
+ @current = current
5
+ end
6
+
7
+ def workers; @current; end
8
+ def queued; @pending; end
9
+ def scheduled; 0; end
10
+ def retrying; 0; end
11
+ end
metadata ADDED
@@ -0,0 +1,187 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: autoscale
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.1
5
+ platform: ruby
6
+ authors:
7
+ - Justin Love
8
+ - Fix Peña
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2015-10-06 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: sidekiq
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '3'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '3'
28
+ - !ruby/object:Gem::Dependency
29
+ name: heroku-api
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: bundler
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: rspec
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "<"
61
+ - !ruby/object:Gem::Version
62
+ version: '3'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "<"
68
+ - !ruby/object:Gem::Version
69
+ version: '3'
70
+ - !ruby/object:Gem::Dependency
71
+ name: guard-rspec
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: guard-process
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ description: Currently provides a Sidekiq middleware that does 0/1 scaling of Heroku
99
+ processes
100
+ email:
101
+ - git@JustinLove.name
102
+ executables: []
103
+ extensions: []
104
+ extra_rdoc_files: []
105
+ files:
106
+ - CHANGELOG.md
107
+ - Guardfile
108
+ - README.md
109
+ - examples/complex.rb
110
+ - examples/simple.rb
111
+ - lib/autoscaler.rb
112
+ - lib/autoscaler/binary_scaling_strategy.rb
113
+ - lib/autoscaler/counter_cache_memory.rb
114
+ - lib/autoscaler/counter_cache_redis.rb
115
+ - lib/autoscaler/delayed_shutdown.rb
116
+ - lib/autoscaler/heroku_scaler.rb
117
+ - lib/autoscaler/ignore_scheduled_and_retrying.rb
118
+ - lib/autoscaler/linear_scaling_strategy.rb
119
+ - lib/autoscaler/sidekiq.rb
120
+ - lib/autoscaler/sidekiq/activity.rb
121
+ - lib/autoscaler/sidekiq/celluloid_monitor.rb
122
+ - lib/autoscaler/sidekiq/client.rb
123
+ - lib/autoscaler/sidekiq/entire_queue_system.rb
124
+ - lib/autoscaler/sidekiq/monitor_middleware_adapter.rb
125
+ - lib/autoscaler/sidekiq/queue_system.rb
126
+ - lib/autoscaler/sidekiq/sleep_wait_server.rb
127
+ - lib/autoscaler/sidekiq/specified_queue_system.rb
128
+ - lib/autoscaler/stub_scaler.rb
129
+ - lib/autoscaler/version.rb
130
+ - spec/autoscaler/binary_scaling_strategy_spec.rb
131
+ - spec/autoscaler/counter_cache_memory_spec.rb
132
+ - spec/autoscaler/counter_cache_redis_spec.rb
133
+ - spec/autoscaler/delayed_shutdown_spec.rb
134
+ - spec/autoscaler/heroku_scaler_spec.rb
135
+ - spec/autoscaler/ignore_scheduled_and_retrying_spec.rb
136
+ - spec/autoscaler/linear_scaling_strategy_spec.rb
137
+ - spec/autoscaler/sidekiq/activity_spec.rb
138
+ - spec/autoscaler/sidekiq/celluloid_monitor_spec.rb
139
+ - spec/autoscaler/sidekiq/client_spec.rb
140
+ - spec/autoscaler/sidekiq/entire_queue_system_spec.rb
141
+ - spec/autoscaler/sidekiq/monitor_middleware_adapter_spec.rb
142
+ - spec/autoscaler/sidekiq/sleep_wait_server_spec.rb
143
+ - spec/autoscaler/sidekiq/specified_queue_system_spec.rb
144
+ - spec/spec_helper.rb
145
+ - spec/test_system.rb
146
+ homepage: ''
147
+ licenses: []
148
+ metadata: {}
149
+ post_install_message:
150
+ rdoc_options: []
151
+ require_paths:
152
+ - lib
153
+ required_ruby_version: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - ">="
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ required_rubygems_version: !ruby/object:Gem::Requirement
159
+ requirements:
160
+ - - ">="
161
+ - !ruby/object:Gem::Version
162
+ version: '0'
163
+ requirements: []
164
+ rubyforge_project: autoscaler
165
+ rubygems_version: 2.4.5.1
166
+ signing_key:
167
+ specification_version: 4
168
+ summary: Start/stop Sidekiq workers on Heroku
169
+ test_files:
170
+ - Guardfile
171
+ - spec/autoscaler/binary_scaling_strategy_spec.rb
172
+ - spec/autoscaler/counter_cache_memory_spec.rb
173
+ - spec/autoscaler/counter_cache_redis_spec.rb
174
+ - spec/autoscaler/delayed_shutdown_spec.rb
175
+ - spec/autoscaler/heroku_scaler_spec.rb
176
+ - spec/autoscaler/ignore_scheduled_and_retrying_spec.rb
177
+ - spec/autoscaler/linear_scaling_strategy_spec.rb
178
+ - spec/autoscaler/sidekiq/activity_spec.rb
179
+ - spec/autoscaler/sidekiq/celluloid_monitor_spec.rb
180
+ - spec/autoscaler/sidekiq/client_spec.rb
181
+ - spec/autoscaler/sidekiq/entire_queue_system_spec.rb
182
+ - spec/autoscaler/sidekiq/monitor_middleware_adapter_spec.rb
183
+ - spec/autoscaler/sidekiq/sleep_wait_server_spec.rb
184
+ - spec/autoscaler/sidekiq/specified_queue_system_spec.rb
185
+ - spec/spec_helper.rb
186
+ - spec/test_system.rb
187
+ has_rdoc: