cloudfoundry/cloud_controller_ng

View on GitHub
lib/cloud_controller/app_services/process_log_rate_limit_calculator.rb

Summary

Maintainability
A
40 mins
Test Coverage
module VCAP::CloudController
  class ProcessLogRateLimitCalculator
    attr_reader :process

    def initialize(process)
      @process = process
    end

    def additional_log_rate_limit_requested
      return 0 if process.stopped?
      return QuotaDefinition::UNLIMITED if is_process_log_rate_unlimited?

      total_requested_log_rate_limit - currently_used_log_rate_limit
    end

    def total_requested_log_rate_limit
      return 0 if process.log_rate_limit == QuotaDefinition::UNLIMITED

      process.log_rate_limit * process.instances
    end

    def currently_used_log_rate_limit
      return 0 if process.new?

      db_process = process_from_db
      return 0 if db_process.stopped? || db_process[:log_rate_limit] == QuotaDefinition::UNLIMITED

      db_process[:log_rate_limit] * db_process[:instances]
    end

    private

    def is_process_log_rate_unlimited?
      process.log_rate_limit == QuotaDefinition::UNLIMITED
    end

    def process_from_db
      error_message = 'Expected process record not found in database with guid %<guid>s'
      process_fetched_from_db = ProcessModel.find(guid: process.guid)
      if process_fetched_from_db.nil?
        logger.fatal('process.find.missing', guid: process.guid, self: process.inspect)
        raise CloudController::Errors::ApplicationMissing.new(sprintf(error_message, guid: process.guid))
      end
      process_fetched_from_db
    end

    def logger
      @logger ||= Steno.logger('cc.process_log_rate_limit_calculator')
    end
  end
end