zerobearing2/heroku-qc-autoscale

View on GitHub
lib/autoscale/heroku.rb

Summary

Maintainability
A
0 mins
Test Coverage
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

      # shutdown all workers
      def shutdown
        self.workers = 0
      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}.to_i + 1)
      end

      def params
        {
          api_key:          Autoscale.api_key           || ENV['HEROKU_API_KEY'],
          connect_timeout:  Autoscale.connect_timeout,
          read_timeout:     Autoscale.read_timeout,
          write_timeout:    Autoscale.write_timeout,
          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