class Bricolage::JobNetRunner

Constants

EXIT_ERROR
EXIT_FAILURE
EXIT_SUCCESS

Public Class Methods

main() click to toggle source
# File lib/bricolage/jobnetrunner.rb, line 22
def JobNetRunner.main
  Application.install_signal_handlers
  new.main
end
new() click to toggle source
# File lib/bricolage/jobnetrunner.rb, line 27
def initialize
  @hooks = ::Bricolage
  @jobnet_id = nil
  @jobnet_start_time = Time.now
end

Public Instance Methods

app_name() click to toggle source
# File lib/bricolage/jobnetrunner.rb, line 119
def app_name
  path = @ctx.home_path.realpath
  while /\A(?:\d+|current|releases)\z/ =~ path.basename.to_s   # is Capistrano dirs
    path = path.dirname
  end
  path.basename.to_s
end
check_jobs(queue) click to toggle source
# File lib/bricolage/jobnetrunner.rb, line 142
def check_jobs(queue)
  queue.each do |task|
    Job.load_ref(task.job, @ctx).compile
  end
end
clear_queue(opts) click to toggle source
# File lib/bricolage/jobnetrunner.rb, line 94
def clear_queue(opts)
  if path = get_queue_file_path(opts)
    FileUtils.rm_f path
  end
end
enqueue_jobs(jobnet, queue) click to toggle source
# File lib/bricolage/jobnetrunner.rb, line 127
def enqueue_jobs(jobnet, queue)
  seq = 1
  jobnet.sequential_jobs.each do |ref|
    queue.enq JobTask.new(ref)
    seq += 1
  end
  queue.save
end
error_exit(msg) click to toggle source
# File lib/bricolage/jobnetrunner.rb, line 197
def error_exit(msg)
  print_error msg
  exit 1
end
execute_job(ref, queue) click to toggle source
# File lib/bricolage/jobnetrunner.rb, line 164
def execute_job(ref, queue)
  logger.debug "job #{ref}"
  job_start_time = Time.now
  job = Job.load_ref(ref, @ctx)
  job.compile
  @hooks.run_before_job_hooks(BeforeJobEvent.new(ref))
  result = job.execute_in_process(log_locator: make_log_locator(ref, job_start_time))
  @hooks.run_after_job_hooks(AfterJobEvent.new(result))
  result
rescue Exception => ex
  logger.exception ex
  logger.error "unexpected error: #{ref} (#{ex.class}: #{ex.message})"
  JobResult.error(ex)
end
get_queue(opts) click to toggle source
# File lib/bricolage/jobnetrunner.rb, line 100
def get_queue(opts)
  if path = get_queue_file_path(opts)
    logger.info "queue path: #{path}"
    FileTaskQueue.restore_if_exist(path)
  else
    TaskQueue.new
  end
end
get_queue_file_path(opts) click to toggle source
# File lib/bricolage/jobnetrunner.rb, line 109
def get_queue_file_path(opts)
  if opts.queue_path
    opts.queue_path
  elsif opts.enable_queue?
    opts.local_state_dir + 'queue' + "#{app_name}.#{@jobnet_id.tr('/', '.')}"
  else
    nil
  end
end
list_jobs(queue) click to toggle source
# File lib/bricolage/jobnetrunner.rb, line 136
def list_jobs(queue)
  queue.each do |task|
    puts task.job
  end
end
logger() click to toggle source
# File lib/bricolage/jobnetrunner.rb, line 90
def logger
  @ctx.logger
end
main() click to toggle source
# File lib/bricolage/jobnetrunner.rb, line 37
def main
  opts = Options.new(self)
  @hooks.run_before_option_parsing_hooks(opts)
  opts.parse!(ARGV)

  @ctx = Context.for_application(job_path: opts.jobnet_files.first, environment: opts.environment, global_variables: opts.global_variables)
  opts.merge_saved_options(@ctx.load_system_options)

  jobnet = RootJobNet.load_auto(@ctx, opts.jobnet_files)
  @jobnet_id = jobnet.id

  if opts.dump_options?
    puts "jobnet-id=#{@jobnet_id}"
    puts "jobnet-file=#{opts.jobnet_files.first}"
    opts.option_pairs.each do |key, value|
      puts "#{key}=#{value.inspect}"
    end
    exit EXIT_SUCCESS
  end

  if opts.clear_queue?
    clear_queue(opts)
    exit EXIT_SUCCESS
  end
  queue = get_queue(opts)
  if queue.locked?
    raise ParameterError, "Job queue is still locked. If you are sure to restart jobnet, #{queue.unlock_help}"
  end
  unless queue.queued?
    enqueue_jobs jobnet, queue
  end

  if opts.list_jobs?
    list_jobs queue
    exit EXIT_SUCCESS
  end
  check_jobs queue
  if opts.check_only?
    puts "OK"
    exit EXIT_SUCCESS
  end

  @log_locator_builder = LogLocatorBuilder.for_options(@ctx, opts.log_path_format, opts.log_s3_ds, opts.log_s3_key_format)
  run_queue queue
  exit EXIT_SUCCESS
rescue OptionError => ex
  raise if $DEBUG
  usage_exit ex.message, opts.help
rescue ApplicationError => ex
  raise if $DEBUG
  error_exit ex.message
end
make_log_locator(ref, job_start_time) click to toggle source
# File lib/bricolage/jobnetrunner.rb, line 179
def make_log_locator(ref, job_start_time)
  @log_locator_builder.build(
    job_ref: ref,
    jobnet_id: @jobnet_id,
    job_start_time: job_start_time,
    jobnet_start_time: @jobnet_start_time
  )
end
print_error(msg) click to toggle source
program_name() click to toggle source
# File lib/bricolage/jobnetrunner.rb, line 206
def program_name
  File.basename($PROGRAM_NAME, '.*')
end
run_queue(queue) click to toggle source
# File lib/bricolage/jobnetrunner.rb, line 148
def run_queue(queue)
  @hooks.run_before_all_jobs_hooks(BeforeAllJobsEvent.new(@jobnet_id, queue))
  queue.consume_each do |task|
    result = execute_job(task.job, queue)
    unless result.success?
      logger.elapsed_time 'jobnet total: ', (Time.now - @jobnet_start_time)
      logger.error "[job #{task.job}] #{result.message}"
      @hooks.run_after_all_jobs_hooks(AfterAllJobsEvent.new(false, queue))
      exit result.status
    end
  end
  @hooks.run_after_all_jobs_hooks(AfterAllJobsEvent.new(true, queue))
  logger.elapsed_time 'jobnet total: ', (Time.now - @jobnet_start_time)
  logger.info "status all green"
end
usage_exit(msg, usage) click to toggle source
# File lib/bricolage/jobnetrunner.rb, line 191
def usage_exit(msg, usage)
  print_error msg
  $stderr.puts usage
  exit 1
end