Sha256: e1a6268c13bade2342191f0d41fbed0b879f93dd5562404f53109949241b681f

Contents?: true

Size: 1.3 KB

Versions: 1

Compression:

Stored size: 1.3 KB

Contents

module Autoscale
  class Heroku
    
    class << self

      def workers
        client.get_app(app).body.fetch("workers", 0).to_i
      end

      def workers=(qty)
        client.post_ps_scale(app, "worker", qty)
      end

      def job_count
        QC::Queries.count.to_i
      end

      # scale workers based on scale
      def up
        unless calculate_required_workers <= workers
          QC.log(action: :scale, workers: calculate_required_workers)
          self.workers = calculate_required_workers
        end
      end

      # shutdown if no jobs exist
      def down
        if job_count < 1
          QC.log(action: :scale, workers: min_workers)
          self.workers = min_workers
        end
      end

      def calculate_required_workers
        scale.rindex{|x| x <= job_count} + 1
      end

      def params
        {
          api_key: Autoscale.api_key  || ENV['HEROKU_API_KEY'],
          mock:    Autoscale.mock     || false
        }
      end
      
      # the app to scale
      def app
        Autoscale.app
      end

      # the scale
      def scale
        Autoscale.scale || [1, 15, 30, 40, 50]
      end

      def min_workers
        Autoscale.min || 0
      end

      # heroku api client
      def client
        @@client ||= ::Heroku::API.new( params )
      end
    end

  end
  
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
heroku-qc-autoscale-0.0.5 lib/autoscale/heroku.rb