heroku-scalr 0.2.3 → 0.2.4
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.
- data/Gemfile.lock +1 -1
- data/heroku-scalr.gemspec +1 -1
- data/lib/heroku/scalr/app.rb +7 -6
- data/lib/heroku/scalr/core_ext.rb +11 -0
- data/lib/heroku/scalr/runner.rb +1 -0
- data/lib/heroku/scalr.rb +1 -1
- data/spec/heroku/scalr/app_spec.rb +15 -10
- data/spec/heroku/scalr/config_spec.rb +1 -1
- data/spec/heroku/scalr/core_ext_spec.rb +29 -0
- metadata +4 -2
data/Gemfile.lock
CHANGED
data/heroku-scalr.gemspec
CHANGED
@@ -7,7 +7,7 @@ Gem::Specification.new do |s|
|
|
7
7
|
s.name = File.basename(__FILE__, '.gemspec')
|
8
8
|
s.summary = "Watch and scale your dynos!"
|
9
9
|
s.description = "Issues recurring 'pings' to your Heroku apps and scales dynos up or down depending on pre-defined rules"
|
10
|
-
s.version = "0.2.
|
10
|
+
s.version = "0.2.4"
|
11
11
|
|
12
12
|
s.authors = ["Black Square Media"]
|
13
13
|
s.email = "info@blacksquaremedia.com"
|
data/lib/heroku/scalr/app.rb
CHANGED
@@ -12,7 +12,7 @@ class Heroku::Scalr::App
|
|
12
12
|
min_frequency: 60
|
13
13
|
}.freeze
|
14
14
|
|
15
|
-
attr_reader :name, :url, :
|
15
|
+
attr_reader :name, :url, :api_key, :interval, :min_dynos, :max_dynos,
|
16
16
|
:metric, :wait_low, :wait_high, :ping_low, :ping_high,
|
17
17
|
:min_frequency, :last_scaled_at
|
18
18
|
|
@@ -41,9 +41,8 @@ class Heroku::Scalr::App
|
|
41
41
|
fail("max_dynos must be at least 1") unless opts[:max_dynos] >= 1
|
42
42
|
fail("interval must be at least 10") unless opts[:interval] >= 10
|
43
43
|
|
44
|
-
@url
|
45
|
-
@
|
46
|
-
|
44
|
+
@url = opts[:url] || "http://#{@name}.herokuapp.com/robots.txt"
|
45
|
+
@api_key = opts[:api_key]
|
47
46
|
@interval = opts[:interval].to_i
|
48
47
|
@min_dynos = opts[:min_dynos].to_i
|
49
48
|
@max_dynos = opts[:max_dynos].to_i
|
@@ -59,8 +58,9 @@ class Heroku::Scalr::App
|
|
59
58
|
# Scales the app
|
60
59
|
def scale!
|
61
60
|
scale_at = next_scale_attempt
|
62
|
-
|
63
|
-
|
61
|
+
now = Time.now
|
62
|
+
if now < scale_at
|
63
|
+
log :debug, "skip check, next attempt in #{(scale_at - now).to_i}s"
|
64
64
|
return
|
65
65
|
end
|
66
66
|
|
@@ -89,6 +89,7 @@ class Heroku::Scalr::App
|
|
89
89
|
def do_scale(by)
|
90
90
|
return if by.zero?
|
91
91
|
|
92
|
+
api = Heroku::API.new(api_key: api_key)
|
92
93
|
info = api.get_app(name)
|
93
94
|
unless info.status == 200
|
94
95
|
log :warn, "error fetching app info, responded with #{info.status}"
|
data/lib/heroku/scalr/runner.rb
CHANGED
data/lib/heroku/scalr.rb
CHANGED
@@ -10,7 +10,7 @@ describe Heroku::Scalr::App do
|
|
10
10
|
|
11
11
|
its(:name) { should == 'name' }
|
12
12
|
its(:url) { should == 'http://name.herokuapp.com/robots.txt' }
|
13
|
-
its(:
|
13
|
+
its(:api_key) { should == 'key' }
|
14
14
|
its(:metric) { should be_instance_of(Heroku::Scalr::Metric::Ping) }
|
15
15
|
|
16
16
|
its(:interval) { should be(30) }
|
@@ -43,8 +43,13 @@ describe Heroku::Scalr::App do
|
|
43
43
|
end
|
44
44
|
|
45
45
|
describe "scaling" do
|
46
|
+
|
47
|
+
let :mock_api do
|
48
|
+
mock "Heroku::API", get_app: mock_response(200, { "dynos" => 2 }), post_ps_scale: mock_response(200, "")
|
49
|
+
end
|
50
|
+
|
46
51
|
before do
|
47
|
-
|
52
|
+
Heroku::API.stub new: mock_api
|
48
53
|
subject.metric.stub by: -1
|
49
54
|
end
|
50
55
|
|
@@ -54,7 +59,7 @@ describe Heroku::Scalr::App do
|
|
54
59
|
end
|
55
60
|
|
56
61
|
it "should log errors" do
|
57
|
-
|
62
|
+
mock_api.should_receive(:get_app).and_raise(RuntimeError, "API Error")
|
58
63
|
Heroku::Scalr.logger.should_receive(:error)
|
59
64
|
subject.scale!.should be_nil
|
60
65
|
end
|
@@ -70,20 +75,20 @@ describe Heroku::Scalr::App do
|
|
70
75
|
end
|
71
76
|
|
72
77
|
it "should check current number of dynos" do
|
73
|
-
|
78
|
+
mock_api.should_receive(:get_app).with("name").and_return mock_response(200, { "dynos" => 2 })
|
74
79
|
subject.scale!.should == 1
|
75
80
|
end
|
76
81
|
|
77
82
|
context "down" do
|
78
83
|
|
79
84
|
it "should return the new number of dynos" do
|
80
|
-
|
85
|
+
mock_api.should_receive(:post_ps_scale).with("name", "web", 1).and_return mock_response(200, "")
|
81
86
|
subject.scale!.should == 1
|
82
87
|
end
|
83
88
|
|
84
89
|
it "should skip if min number of dynos reached" do
|
85
|
-
|
86
|
-
|
90
|
+
mock_api.should_receive(:get_app).with("name").and_return mock_response(200, { "dynos" => 1 })
|
91
|
+
mock_api.should_not_receive(:post_ps_scale)
|
87
92
|
subject.scale!.should be_nil
|
88
93
|
end
|
89
94
|
|
@@ -94,13 +99,13 @@ describe Heroku::Scalr::App do
|
|
94
99
|
before { subject.metric.stub by: 1 }
|
95
100
|
|
96
101
|
it "should return the new number of dynos" do
|
97
|
-
|
102
|
+
mock_api.should_receive(:post_ps_scale).with("name", "web", 3).and_return mock_response(200, "")
|
98
103
|
subject.scale!.should == 3
|
99
104
|
end
|
100
105
|
|
101
106
|
it "should skip if max number of dynos reached" do
|
102
|
-
|
103
|
-
|
107
|
+
mock_api.should_receive(:get_app).with("name").and_return mock_response(200, { "dynos" => 3 })
|
108
|
+
mock_api.should_not_receive(:post_ps_scale)
|
104
109
|
subject.scale!.should be_nil
|
105
110
|
end
|
106
111
|
|
@@ -11,7 +11,7 @@ describe Heroku::Scalr::Config do
|
|
11
11
|
it 'should merge defaults into app configurations' do
|
12
12
|
app = subject.apps.first
|
13
13
|
app.should be_instance_of(Heroku::Scalr::App)
|
14
|
-
app.
|
14
|
+
app.api_key.should == "API_KEY"
|
15
15
|
end
|
16
16
|
|
17
17
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'tempfile'
|
3
|
+
|
4
|
+
describe Logger do
|
5
|
+
|
6
|
+
describe "#reopen" do
|
7
|
+
|
8
|
+
let(:path) { Tempfile.new(["heroku-scalr", "logger"]).path }
|
9
|
+
subject { Logger.new(path) }
|
10
|
+
|
11
|
+
it "should reopen files" do
|
12
|
+
subject.info "Line 1"
|
13
|
+
FileUtils.mv(path, "#{path}.1")
|
14
|
+
subject.info "Line 2"
|
15
|
+
subject.reopen.should be(subject)
|
16
|
+
subject.info "Line 3"
|
17
|
+
|
18
|
+
File.read("#{path}.1").should have(2).lines
|
19
|
+
File.read(path).should have(1).lines
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should skip streams" do
|
23
|
+
logger = Logger.new(STDERR)
|
24
|
+
logger.reopen.should be_nil
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: heroku-scalr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-05-
|
12
|
+
date: 2013-05-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: timers
|
@@ -142,11 +142,13 @@ files:
|
|
142
142
|
- lib/heroku/scalr/app.rb
|
143
143
|
- lib/heroku/scalr/cli.rb
|
144
144
|
- lib/heroku/scalr/config.rb
|
145
|
+
- lib/heroku/scalr/core_ext.rb
|
145
146
|
- lib/heroku/scalr/metric.rb
|
146
147
|
- lib/heroku/scalr/runner.rb
|
147
148
|
- spec/fixtures/config_a.rb
|
148
149
|
- spec/heroku/scalr/app_spec.rb
|
149
150
|
- spec/heroku/scalr/config_spec.rb
|
151
|
+
- spec/heroku/scalr/core_ext_spec.rb
|
150
152
|
- spec/heroku/scalr/metric_spec.rb
|
151
153
|
- spec/heroku/scalr/runner_spec.rb
|
152
154
|
- spec/heroku/scalr_spec.rb
|