bio-miga/miga

View on GitHub
lib/miga/daemon/base.rb

Summary

Maintainability
A
1 hr
Test Coverage
A
100%
require 'shellwords'

class MiGA::Daemon < MiGA::MiGA
end

module MiGA::Daemon::Base
  ##
  # Set/get #options, where +k+ is the Symbol of the option and +v+ is the value
  # (or nil to use as getter). Skips consistency tests if +force+. Returns new
  # value.
  def runopts(k, v = nil, force = false)
    k = k.to_sym
    unless v.nil?
      case k
      when :latency, :maxjobs, :ppn, :ppn_project, :format_version, :verbosity,
           :skip_maintenance
        v = v.to_i
        if !force && v == 0 && !%i[verbosity skip_maintenance].include?(k)
          raise "Daemon's #{k} cannot be set to zero"
        end
      when :shutdown_when_done, :show_log, :bypass_maintenance
        v = !!v
      when :nodelist
        if v =~ /^\$/
          vv = ENV[v.sub('$', '')] or raise "Unset environment variable: #{v}"
          v = vv
        end
        say "Reading node list: #{v}"
        v = File.readlines(v).map(&:chomp)
      end
      @runopts[k] = v
    end
    @runopts[k]
  end

  ##
  # Returns Integer indicating the number of seconds to sleep between checks
  def latency
    runopts(:latency)
  end

  ##
  # Returns Integer indicating the maximum number of concurrent jobs to run
  def maxjobs
    runopts(:maxjobs)
  end

  ##
  # Returns the path to the list of execution hostnames
  def nodelist
    runopts(:nodelist)
  end

  ##
  # Returns the number of times maintenance should be skipped before running
  def skip_maintenance
    runopts(:skip_maintenance) || 0
  end

  ##
  # Returns the running option +opt+ in jobs for +what+. +what+ can be
  # +:dataset+ or +:projects+
  def runopts_for(opt, what)
    runopts(:"#{opt}_#{what}") || runopts(opt)
  end

  ##
  # Returns Integer indicating the number of CPUs per job, in jobs for +what+.
  # See also #runopts_for
  def ppn(what = :dataset)
    runopts_for(:ppn, what)
  end

  ##
  # Returns Boolean indicating if the daemon should shutdown when processing is
  # complete
  def shutdown_when_done?
    !!runopts(:shutdown_when_done)
  end

  ##
  # Should the daemon ignore regular maintenance steps?
  def bypass_maintenance?
    !!runopts(:bypass_maintenance)
  end

  ##
  # Returns the level of verbosity for the daemon as an Integer, or 1 if unset.
  # Verbosity levels are:
  # 0: No output
  # 1: General daemon and job information
  # 2: Same, and indicate when each task is performed (even if nothing happens)
  # 3: Same, and indicate when each loop begins and ends
  def verbosity
    runopts(:verbosity) || 1
  end

  ##
  # Writing file handler (IO) to the log file
  def logfh
    @logfh ||= nil
    return $stderr if show_log?
    return @logfh if @logfh && !@logfh.closed?

    @logfh = File.open(output_file, 'w')
  end

  ##
  # Display log instead of the progress summary
  def show_log!
    @runopts[:show_log] = true
  end

  ##
  # Display progress summary instead of the log
  def show_summary!
    @runopts[:show_log] = false
  end

  ##
  # Display log instead of the progress summary?
  def show_log?
    @runopts[:show_log] ||= false
  end
end