diff --git a/lib/autoscaler/heroku_scaler.rb b/lib/autoscaler/heroku_scaler.rb index 3680957..c55c802 100644 --- a/lib/autoscaler/heroku_scaler.rb +++ b/lib/autoscaler/heroku_scaler.rb @@ -26,7 +26,7 @@ def workers if known? @workers else - know client.get_ps(app).body.count {|ps| ps['process'].match /#{type}\.\d?/ } + know heroku_get_workers end end @@ -35,11 +35,23 @@ def workers def workers=(n) if n != @workers || !known? p "Scaling #{type} to #{n}" - client.post_ps_scale(app, type, n) + heroku_set_workers(n) know n end end + # Callable object which responds to exceptions during api calls + # + # @example + # heroku.exception_handler = lambda {|exception| MyApp.logger.error(exception)} + # heroku.exception_handler = lambda {|exception| raise} + # # default + # lambda {|exception| + # p exception + # puts exception.backtrace + # } + attr_writer :exception_handler + private attr_reader :client @@ -51,5 +63,25 @@ def know(n) def known? Time.now < @known end + + def heroku_get_workers + client.get_ps(app).body.count {|ps| ps['process'].match /#{type}\.\d?/ } + rescue Excon::Errors::Error => e + exception_handler.call(e) + @workers + end + + def heroku_set_workers(n) + client.post_ps_scale(app, type, n) + rescue Excon::Errors::Error => e + exception_handler.call(e) + end + + def exception_handler + @exception_handler ||= lambda {|exception| + p exception + puts exception.backtrace + } + end end end diff --git a/spec/autoscaler/heroku_scaler_spec.rb b/spec/autoscaler/heroku_scaler_spec.rb index f222490..e9a87e7 100644 --- a/spec/autoscaler/heroku_scaler_spec.rb +++ b/spec/autoscaler/heroku_scaler_spec.rb @@ -17,4 +17,27 @@ its(:workers) {should == 1} end + + describe 'exception handling', :focus => true do + before do + def client.client + raise Excon::Errors::SocketError.new(Exception.new('oops')) + end + end + + describe "default handler" do + it {expect{client.workers}.to_not raise_error} + it {client.workers.should == 0} + it {expect{client.workers = 1}.to_not raise_error} + end + + describe "custom handler" do + before do + @caught = false + client.exception_handler = lambda {|exception| @caught = true} + end + + it {client.workers; @caught.should be_true} + end + end end