class Pwrake::Option

Constants

DEFAULT_CONFFILES

Attributes

counter[R]
host_map[R]
queue_class[R]
total_cores[RW]
worker_option[R]
worker_progs[R]

Public Class Methods

new() click to toggle source
# File lib/pwrake/option/option.rb, line 17
def initialize
  load_pwrake_conf
  init_filesystem
  init_options
  init_pass_env
  if self['SHOW_CONF']
    require "yaml"
    YAML.dump(self,$stdout)
    exit
  elsif self['REPORT_DIR']
    require 'pwrake/report'
    Report.new(self,[]).report_html
    exit
  end
  setup_hosts
  set_filesystem_option
end

Public Instance Methods

cwd_relative_if_under_home() click to toggle source
# File lib/pwrake/option/option.rb, line 309
def cwd_relative_if_under_home
  home = Pathname.new(ENV['HOME']).realpath
  path = pwd = Pathname.pwd.realpath
  while path != home
    if path.root?
      return pwd.to_s
    end
    path = path.parent
  end
  return pwd.relative_path_from(home).to_s
end
cwd_relative_to_home() click to toggle source
# File lib/pwrake/option/option.rb, line 305
def cwd_relative_to_home
  Pathname.pwd.relative_path_from(Pathname.new(ENV['HOME'])).to_s
end
feedback_options() click to toggle source
# File lib/pwrake/option/option.rb, line 243
def feedback_options
  opts = Rake.application.options
  ['DRYRUN',
   'IGNORE_SYSTEM',
   'IGNORE_DEPRECATE',
   'LOAD_SYSTEM',
   'NOSEARCH',
   'RAKELIB',
   'SHOW_PREREQS',
   'SILENT',
   'TRACE',
   'BACKTRACE',
   'TRACE_OUTPUT',
   'TRACE_RULES'
  ].each do |k|
    if v=self[k]
      m = (k.downcase+"=").to_sym
      opts.send(m,v)
    end
  end
  case opts.trace_output
  when 'stdout'
    opts.trace_output = $stdout
  when 'stderr', nil
    opts.trace_output = $stderr
  end
end
format_time_pid(v) click to toggle source
# File lib/pwrake/option/option.rb, line 239
def format_time_pid(v)
  START_TIME.strftime(v).sub("%$","%05d"%Process.pid)
end
init_filesystem() click to toggle source

# File lib/pwrake/option/option.rb, line 63
def init_filesystem
  @filesystem = Rake.application.options.filesystem || mount_type
  case @filesystem
  when 'gfarm2fs'
    require "pwrake/option/option_gfarm2fs"
  else
    require "pwrake/option/option_default_filesystem"
  end
end
init_options() click to toggle source

# File lib/pwrake/option/option.rb, line 102
def init_options
  option_data.each do |a|
    prc = nil
    keys = []
    case a
    when String
      keys << a
    when Array
      a.each do |x|
        case x
        when String
          keys << x
        when Proc
          prc = x
        end
      end
    end
    key = keys[0]
    val = search_opts(keys)
    val = prc.call(val) if prc
    self[key] = val if !val.nil?
    instance_variable_set("@"+key.downcase, val)
  end

  feedback_options

  Rake.verbose(false) if Rake.application.options.silent
end
init_pass_env() click to toggle source

# File lib/pwrake/option/option.rb, line 323
def init_pass_env
  if envs = self['PASS_ENV']
    pass_env = {}

    case envs
    when Array
      envs.each do |k|
        k = k.to_s
        if v = ENV[k]
          pass_env[k] = v
        end
      end
    when Hash
      envs.each do |k,v|
        k = k.to_s
        if v = ENV[k] || v
          pass_env[k] = v
        end
      end
    else
      raise "invalid option for PASS_ENV in pwrake_conf.yaml"
    end

    if pass_env.empty?
      self.delete('PASS_ENV')
    else
      self['PASS_ENV'] = pass_env
    end
  end
end
load_pwrake_conf() click to toggle source

—– init —–

# File lib/pwrake/option/option.rb, line 42
def load_pwrake_conf
  # Read pwrake_conf
  pwrake_conf = Rake.application.options.pwrake_conf
  if pwrake_conf
    if !File.exist?(pwrake_conf)
      raise "Configuration file not found: #{pwrake_conf}"
    end
  else
    pwrake_conf = DEFAULT_CONFFILES.find{|fn| File.exist?(fn)}
  end
  self['PWRAKE_CONF'] = pwrake_conf
  if pwrake_conf.nil?
    @yaml = {}
  else
    require "yaml"
    @yaml = open(pwrake_conf){|f| YAML.load(f) }
  end
end
mount_type(dir=nil) click to toggle source
# File lib/pwrake/option/option.rb, line 76
def mount_type(dir=nil)
  mtab = '/etc/mtab'
  if File.exist?(mtab)
    dir ||= mountpoint_of_cwd
    open(mtab,'r') do |f|
      f.each_line do |l|
        a = l.split
        if a[1] == dir
          return a[2].sub(/^fuse\./,'')
        end
      end
    end
  end
  nil
end
mountpoint_of_cwd() click to toggle source
# File lib/pwrake/option/option.rb, line 92
def mountpoint_of_cwd
  d = Pathname.pwd
  while !d.mountpoint?
    d = d.parent
  end
  d.to_s
end
option_data() click to toggle source
# File lib/pwrake/option/option.rb, line 131
def option_data
  [
    'DRYRUN',
    'IGNORE_SYSTEM',
    'IGNORE_DEPRECATE',
    'LOAD_SYSTEM',
    'NOSEARCH',
    'RAKELIB',
    'SHOW_PREREQS',
    'SILENT',
    'TRACE',
    'BACKTRACE',
    'TRACE_OUTPUT',
    'TRACE_RULES',

    'SSH_OPTION',
    'PASS_ENV',
    'GNU_TIME',
    'DEBUG',
    'PLOT_PARALLELISM',
    'SHOW_CONF',
    ['SUBDIR','SUBDIRS',
      proc{|v|
        if Array===v
          v.each do |d|
            if !File.directory?(d)
              raise "directory #{d.inspect} does not exist"
            end
          end
        elsif !v.nil?
          raise "invalid argument for SUBDIR: #{v.inspect}"
        end
      }
    ],
    ['REPORT_DIR','REPORT'],
    'REPORT_IMAGE',
    'FAILED_TARGET', # rename(default), delete, leave
    'FAILURE_TERMINATION', # wait, kill, continue
    'QUEUE_PRIORITY', # LIHR(default), FIFO, LIFO, RANK
    'NOACTION_QUEUE_PRIORITY', # FIFO(default), LIFO, RAND
    'DISABLE_RANK_PRIORITY',
    ['RESERVE_NODE','RESERVE_HOST'],
    'GRAPH_PARTITION',
    'PLOT_PARTITION',

    ['HOSTFILE','HOSTS'],
    ['LOG_DIR',
      proc{|v|
        if v
          if v == "" || !v.kind_of?(String)
            v = "Pwrake%Y%m%d-%H%M%S"
          end
          d = v = format_time_pid(v)
          i = 1
          while File.exist?(d)
            d = "#{v}.#{i}"
            i += 1
          end
          d
        end
      }],
    ['LOG_FILE',
      proc{|v|
        if v.kind_of?(String) && v != ""
          v
        else
          "pwrake.log"
        end
      }],
    ['TASK_CSV_FILE',
      proc{|v|
        if v.kind_of?(String) && v != ""
          v
        else
          "task.csv"
        end
      }],
    ['COMMAND_CSV_FILE',
      proc{|v|
        if v.kind_of?(String) && v != ""
          v
        else
          "command.csv"
        end
      }],
    ['GC_LOG_FILE',
     proc{|v|
       if v
         if v.kind_of?(String) && v != ""
           v
         else
           "gc.log"
         end
       end
     }],
    ['NUM_THREADS', proc{|v| v && v.to_i}],
    ['SHELL_START_INTERVAL', proc{|v| (v || 0.012).to_f}],
    ['HEARTBEAT', proc{|v| v && v.to_i}],
    ['RETRY', proc{|v| (v || 1).to_i}],
    ['HOST_FAILURE', 'HOST_FAIL', proc{|v| (v || 2).to_i}],
    ['MASTER_HOSTNAME', proc{|v| (v || Socket.gethostname).chomp}],
    ['WORK_DIR', proc{|v|
       v ||= '%CWD_RELATIVE_TO_HOME'
       v.sub('%CWD_RELATIVE_TO_HOME',cwd_relative_if_under_home)
     }],
  ].concat(option_data_filesystem)
end
parse_opt(s) click to toggle source
# File lib/pwrake/option/option.rb, line 290
def parse_opt(s)
  case s
  when /^(false|nil|off|n|no)$/i
    false
  when /^(true|on|y|yes)$/i
    true
  when $stdout
    "stdout"
  when $stderr
    "stderr"
  else
    s
  end
end
put_log() click to toggle source

# File lib/pwrake/option/option.rb, line 374
def put_log
  Log.info "Pwrake::VERSION=#{Pwrake::VERSION}"
  Log.info "Options:"
  self.each do |k,v|
    Log.info " #{k} = #{v.inspect}"
  end
  Log.debug "@queue_class=#{@queue_class}"
  Log.debug "@filesystem=#{@filesystem}"
end
search_opts(keys) click to toggle source

Priority of Option:

command_option > ENV > pwrake_conf > DEFAULT_OPTIONS
# File lib/pwrake/option/option.rb, line 273
def search_opts(keys)
  val = Rake.application.options.send(keys[0].downcase.to_sym)
  return parse_opt(val) if !val.nil?
  #
  keys.each do |k|
    val = ENV[k.upcase]
    return parse_opt(val) if !val.nil?
  end
  #
  return nil if !@yaml
  keys.each do |k|
    val = @yaml[k.upcase]
    return val if !val.nil?
  end
  nil
end
setup_hosts() click to toggle source

# File lib/pwrake/option/option.rb, line 356
def setup_hosts
  if f = ENV['PBS_NODEFILE']
    if @hostfile
      Log.info "HOSTFILE=#{@hostfile} overrides PBS_NODEFILE=#{f}"
    else
      Log.info "use PBS_NODEFILE=#{f}"
      @hostfile = f
    end
  end
  if @hostfile && @num_threads
    raise "Cannot set `hostfile' and `num_threads' simultaneously"
  end
  @host_map = HostMap.new(@hostfile || @num_threads)
end