module Tengine::Job::Dsl::Loader

ジョブDSLをロードする際に使用される語彙に関するメソッドを定義するモジュール

Public Class Methods

loading_template_block_store() click to toggle source
# File lib/tengine/job/dsl/loader.rb, line 8
def loading_template_block_store
  @loading_template_block_store ||= {}
end
template_block_store() click to toggle source
# File lib/tengine/job/dsl/loader.rb, line 12
def template_block_store
  @template_block_store ||= {}
end
template_block_store_key(job, name) click to toggle source
# File lib/tengine/job/dsl/loader.rb, line 16
def template_block_store_key(job, name)
  "#{job.root.id.to_s}/#{job.id.to_s}##{name}"
end
update_loaded_blocks(loaded_root) click to toggle source
# File lib/tengine/job/dsl/loader.rb, line 20
def update_loaded_blocks(loaded_root)
  if loaded_root
    loading_template_block_store.each do |unsaved_job, (name, block)|
      loaded_job = loaded_root.vertex_by_name_path(unsaved_job.name_path)
      key = template_block_store_key(loaded_job, name)
      template_block_store[key] = block
    end
  else
    loading_template_block_store.each do |saved_job, (name, block)|
      key = template_block_store_key(saved_job, name)
      template_block_store[key] = block
    end
  end
  loading_template_block_store.clear
end

Public Instance Methods

auto_sequence() click to toggle source
# File lib/tengine/job/dsl/loader.rb, line 87
def auto_sequence
  @auto_sequence = true
end
boot_jobs(*boot_job_names) click to toggle source
# File lib/tengine/job/dsl/loader.rb, line 91
def boot_jobs(*boot_job_names)
  @auto_sequence = false
  @boot_job_names = boot_job_names
end
expansion(root_jobnet_name, options = {}) click to toggle source
# File lib/tengine/job/dsl/loader.rb, line 146
def expansion(root_jobnet_name, options = {})
  options = {
    :name => root_jobnet_name,
  }.update(options)
  result = __with_redirection__(options) do
    Tengine::Job::Template::Expansion.new(options)
  end
  @jobnet.children << result
  result
end
finally(&block) click to toggle source
# File lib/tengine/job/dsl/loader.rb, line 142
def finally(&block)
  jobnet("finally", :jobnet_type_key => :finally, &block)
end
hadoop_job(name, options = {}) click to toggle source
# File lib/tengine/job/dsl/loader.rb, line 122
def hadoop_job(name, options = {})
  result = __with_redirection__(options) do
    Tengine::Job::Template::Jobnet.new(:name => name, :jobnet_type_key => :hadoop_job)
  end
  result.children << start  = Tengine::Job::Template::Start.new
  result.children << fork   = Tengine::Job::Template::Fork.new
  result.children << map    = Tengine::Job::Template::Jobnet.new(:name => "Map"   , :jobnet_type_key => :map_phase   )
  result.children << reduce = Tengine::Job::Template::Jobnet.new(:name => "Reduce", :jobnet_type_key => :reduce_phase)
  result.children << join   = Tengine::Job::Template::Join.new
  result.children << _end   = Tengine::Job::Template::End.new
  result.edges.new(:origin_id => start.id , :destination_id => fork.id  )
  result.edges.new(:origin_id => fork.id  , :destination_id => map.id   )
  result.edges.new(:origin_id => fork.id  , :destination_id => reduce.id)
  result.edges.new(:origin_id => map.id   , :destination_id => join.id  )
  result.edges.new(:origin_id => reduce.id, :destination_id => join.id  )
  result.edges.new(:origin_id => join.id  , :destination_id => _end.id  )
  @jobnet.children << result
  result
end
hadoop_job_run(name, *args, &block) click to toggle source
# File lib/tengine/job/dsl/loader.rb, line 115
def hadoop_job_run(name, *args, &block)
  script, description, options = __parse_job_args__(name, args)
  options[:script] = script
  options[:jobnet_type_key] = :hadoop_job_run
  jobnet(name, description, options, &block)
end
job(name, *args) click to toggle source
# File lib/tengine/job/dsl/loader.rb, line 96
def job(name, *args)
  script, description, options = __parse_job_args__(name, args)
  options[:description] = options.delete(:caption) if options[:caption]
  options = {
    name: name,
    description: description,
    script: script,
  }.update(options)
  preparation = options.delete(:preparation)
  result = __with_redirection__(options) do
    Tengine::Job::Template::SshJob.new(options)
  end
  @jobnet.children << result
  if preparation
    Tengine::Job::Dsl::Loader.loading_template_block_store[result] = [:preparation, preparation]
  end
  result
end
jobnet(name, *args, &block) click to toggle source
# File lib/tengine/job/dsl/loader.rb, line 38
def jobnet(name, *args, &block)
  options = args.extract_options!
  options[:description] = options.delete(:caption) if options[:caption]
  options = {
    :name => name,
    :description => args.first || name,
  }.update(options)
  auto_sequence = options.delete(:auto_sequence)
  result = __with_redirection__(options) do
    if @jobnet.nil?
      klass = Tengine::Job::Template::RootJobnet
      options[:dsl_version] = config.dsl_version
      path, lineno = *block.source_location
      options[:dsl_filepath] = config.relative_path_from_dsl_dir(path)
      options[:dsl_lineno] = lineno.to_i
    else
      klass = Tengine::Job::Template::Jobnet
    end
    klass.new(options)
  end
  result.with_start
  @jobnet.children << result if @jobnet
  if result.parent.nil?
    if duplicated = result.find_duplication
      if (duplicated.dsl_filepath != result.dsl_filepath) ||
          (duplicated.dsl_lineno != result.dsl_lineno)
        raise Tengine::Job::Dsl::Error, "2 jobnet named #{name.inspect} found at #{duplicated.dsl_filepath}:#{duplicated.dsl_lineno} and #{result.dsl_filepath}:#{result.dsl_lineno}"
      end
    end
  end

  __stack_instance_variable__(:@auto_sequence,  auto_sequence || @auto_sequence) do
    __stack_instance_variable__(:@boot_job_names,  []) do
      __stack_instance_variable__(:@redirections,  []) do
        __stack_instance_variable__(:@jobnet, result, &block)
        result.build_edges(@auto_sequence, @boot_job_names, @redirections)
      end
    end
  end
  if result.parent.nil?
    loaded = result.find_duplication
    result.save! unless loaded
    Tengine::Job::Dsl::Loader.update_loaded_blocks(loaded)
    loaded || result
  else
    result
  end
end

Private Instance Methods

__parse_job_args__(name, args) click to toggle source
# File lib/tengine/job/dsl/loader.rb, line 158
def __parse_job_args__(name, args)
  options = args.extract_options!
  description_or_script, script = *args
  if script
    description = description_or_script
  else
    script = description_or_script
    description = name
  end
  return script, description, options
end
__with_redirection__(options) { || ... } click to toggle source
# File lib/tengine/job/dsl/loader.rb, line 170
def __with_redirection__(options)
  destination_names = Array(options.delete(:to) || options.delete(:redirect_to))
  result = yield
  destination_names.each do |dest_name|
    @redirections << [result.name, dest_name]
  end
  result
end