class Bosh::Director::Scheduler

Public Class Methods

new(scheduled_jobs=[], options={}) click to toggle source
# File lib/bosh/director/scheduler.rb, line 5
def initialize(scheduled_jobs=[], options={})
  if scheduled_jobs.nil? || scheduled_jobs.is_a?(Array)
    @scheduled_jobs = scheduled_jobs
    @scheduler = options.fetch(:scheduler) { Rufus::Scheduler::PlainScheduler.new }
    @queue = options.fetch(:queue) { JobQueue.new }
  else
    raise 'scheduled_jobs must be an array'
  end
end

Public Instance Methods

logger() click to toggle source
# File lib/bosh/director/scheduler.rb, line 27
def logger
  @logger ||= Config.logger
end
start!() click to toggle source
# File lib/bosh/director/scheduler.rb, line 15
def start!
  logger.info('starting scheduler')
  add_jobs unless @added_already
  @scheduler.start
  @scheduler.join
end
stop!() click to toggle source
# File lib/bosh/director/scheduler.rb, line 22
def stop!
  logger.info('stopping scheduler')
  @scheduler.stop
end

Private Instance Methods

add_jobs() click to toggle source
# File lib/bosh/director/scheduler.rb, line 33
    def add_jobs
      return if @scheduled_jobs.nil?
      @added_already = true

      @scheduled_jobs.each do |scheduled_job|
        begin
          director_job_class = Bosh::Director::Jobs.const_get(scheduled_job['command'].to_s)
        rescue NameError
          raise "unknown job 'Bosh::Director::Jobs::#{scheduled_job['command']}'"
        end

        @scheduler.cron(scheduled_job['schedule']) do |_|

          should_enqueue = true
          if director_job_class.respond_to?(:has_work)
            logger.debug("Scheduler cron - checking /
#{director_job_class}.has_work:#{director_job_class.has_work(scheduled_job['params'])} /
with params #{scheduled_job['params']}")

            should_enqueue = director_job_class.has_work(scheduled_job['params'])
          end

          if should_enqueue
            logger.info("enqueueing '#{scheduled_job['command']}'")

            schedule_message = "scheduled #{scheduled_job['command']}"
            if director_job_class.respond_to?(:schedule_message)
              schedule_message = director_job_class.schedule_message
            end

            @queue.enqueue('scheduler',
              director_job_class,
              schedule_message,
              scheduled_job['params'])
          end
        end

        logger.info("added scheduled job '#{director_job_class}' with interval '#{scheduled_job['schedule']}'")
      end
    end