class Sv::Job

Attributes

name[R]
namespace[W]
working_dir[W]

Public Class Methods

new(name) click to toggle source
# File lib/sv/job.rb, line 8
def initialize(name)
  set :name, name
end

Public Instance Methods

autorestart(*args) click to toggle source
# File lib/sv/job.rb, line 38
def autorestart(*args)
  set_or_get :autorestart, args
end
command(*args) click to toggle source
# File lib/sv/job.rb, line 20
def command(*args)
  set_or_get :command, args
end
env(*args) click to toggle source
# File lib/sv/job.rb, line 28
def env(*args)
  set_or_get :env, args
end
group() click to toggle source
# File lib/sv/job.rb, line 16
def group
  @namespace ? "#{name}.#{@namespace}" : name
end
killasgroup(*args) click to toggle source
# File lib/sv/job.rb, line 66
def killasgroup(*args)
  set_or_get :killasgroup, args
end
numprocs(*args) click to toggle source
# File lib/sv/job.rb, line 32
def numprocs(*args)
  set_or_get :numprocs, args do |v|
    v.to_i
  end
end
processes() click to toggle source
# File lib/sv/job.rb, line 93
def processes
  processes = []
  s = Struct.new(:name, :group, :stopwait_on_rr)
  numprocs.times do |i|
    process = s.new
    process.name = "#{name}_#{i.to_s.rjust(2,"0")}"
    process.group = group
    process.stopwait_on_rr = stopwait_on_rr
    processes << process
  end
  processes
end
render() click to toggle source
# File lib/sv/job.rb, line 84
def render
  return if attributes.values.any? { |v| v.nil? }
  return if attributes[:numprocs] < 1
  File.open(template) do |f|
    erb = ERB.new(f.read, nil, '<>')
    erb.result(binding)
  end
end
startretries(*args) click to toggle source
# File lib/sv/job.rb, line 46
def startretries(*args)
  set_or_get :startretries, args
end
startsecs(*args) click to toggle source
# File lib/sv/job.rb, line 42
def startsecs(*args)
  set_or_get :startsecs, args
end
stderr_logfile(*args) click to toggle source
# File lib/sv/job.rb, line 74
def stderr_logfile(*args)
  set_or_get :stderr_logfile, args
end
stdout_logfile(*args) click to toggle source
# File lib/sv/job.rb, line 70
def stdout_logfile(*args)
  set_or_get :stdout_logfile, args
end
stopasgroup(*args) click to toggle source
# File lib/sv/job.rb, line 62
def stopasgroup(*args)
  set_or_get :stopasgroup, args
end
stopsignal(*args) click to toggle source
# File lib/sv/job.rb, line 50
def stopsignal(*args)
  set_or_get :stopsignal, args
end
stopwait_on_rr(*args) click to toggle source
# File lib/sv/job.rb, line 54
def stopwait_on_rr(*args)
  set_or_get :stopwait_on_rr, args
end
stopwaitsecs(*args) click to toggle source
# File lib/sv/job.rb, line 58
def stopwaitsecs(*args)
  set_or_get :stopwaitsecs, args
end
update(attrs) click to toggle source
# File lib/sv/job.rb, line 78
def update(attrs)
  attrs.each do |key ,value|
    set key, value
  end 
end
working_dir(*args) click to toggle source
# File lib/sv/job.rb, line 24
def working_dir(*args)
  set_or_get :working_dir, args
end

Private Instance Methods

attributes() click to toggle source
# File lib/sv/job.rb, line 108
def attributes
  @attributes ||= {
    name: nil,
    command: nil,
    working_dir: nil,
    env: "",
    numprocs: 0,
    autorestart: true,
    startsecs: 1,
    startretries: 3,
    stopsignal: :TERM,
    stopwaitsecs: 10,
    stopasgroup: false,
    killasgroup: true,
    redirect_stderr: true,
    stdout_logfile: "/dev/null",
    stderr_logfile: "",
    stopwait_on_rr: true
  }
end
binding() click to toggle source
# File lib/sv/job.rb, line 155
def binding
  attrs = OpenStruct.new(attributes)
  attrs.group = group
  transform_paths attrs
  transform_command attrs
  attrs.instance_eval { binding }
end
set(key, value) click to toggle source
# File lib/sv/job.rb, line 142
def set(key, value)
  key = key.to_sym
  if attributes.key? key
    attributes.store key, value
  else
    raise "no such key #{key}"
  end
end
set_or_get(key, args) { |value| ... } click to toggle source
# File lib/sv/job.rb, line 129
def set_or_get(key, args)
  key = key.to_sym
  if args.length == 0
    return attributes.fetch key
  else
    value = args.first
    if block_given?
      value = yield value 
    end
    set key, value
  end
end
template() click to toggle source
# File lib/sv/job.rb, line 151
def template
  @template ||= Pathname.new("#{__dir__}/templates/job.erb")
end
transform_command(attrs) click to toggle source
# File lib/sv/job.rb, line 177
def transform_command(attrs)
  command = attrs.command.strip
  return if not command =~ /\A\.\//
  command.gsub! /\A\.\//, "#{attrs.working_dir}/"
  attrs.command = command
end
transform_paths(attrs) click to toggle source

transform relative paths to absolute paths for stdout_logfile and stderr_logfile only while rendering

# File lib/sv/job.rb, line 167
def transform_paths(attrs)
  [:stdout_logfile, :stderr_logfile].each do |key|
    value = attrs.send key
    path = Pathname.new(value)
    next if value.empty? || path.absolute?
    new_value = "#{attrs.working_dir}/#{path}"
    attrs.send "#{key}=".to_sym, new_value
  end
end