class XP5K::Role

Attributes

desc[RW]
inner[RW]
jobid[RW]
name[RW]
pattern[RW]
proc[RW]
servers[RW]
size[RW]
vlan[RW]

Public Class Methods

create_roles(job, job_definition) click to toggle source
# File lib/xp5k/role.rb, line 61
def self.create_roles(job, job_definition)
  # Definition will return list of roles
  roles = []

  # Test if job contain enough nodes for all roles
  count_needed_nodes = 0
  job_definition[:roles].each { |role| count_needed_nodes += role.size if not role.inner }
  if job['assigned_nodes'].length < count_needed_nodes
    raise "Job ##{job['uid']} require more nodes for required roles"
  end

  # Sort nodes assigned to the job
  available_nodes = { 'job' => job['assigned_nodes'].sort }


  # Sort roles to manage inner roles at the end
  defined_roles = job_definition[:roles].sort do |x,y|
    a = x.inner ? 1 : 0
    b = y.inner ? 1 : 0
    a <=> b
  end

  # Sort roles to manage roles with pattern first
  defined_roles = defined_roles.sort do |x,y|
    a = x.pattern ? 0 : 1
    b = y.pattern ? 0 : 1
    a <=> b
  end

  # Attributes nodes to roles
  defined_roles.each do |role|
    next if self.exists?(role.name)
    if role.inner
      available_nodes[role.inner] ||= self.findByName(role.inner).servers
      role.servers = available_nodes[role.inner][0..(role.size - 1)]
      available_nodes[role.inner] -= role.servers
    else
      if not role.pattern
        role.servers = available_nodes['job'][0..(role.size - 1)]
      else
        filtered_nodes = available_nodes['job'].select { |x| x.match role.pattern }
        role.servers = filtered_nodes[0..(role.size - 1)]
      end
      available_nodes['job'] -= role.servers
    end
    role.jobid = job['uid']
    roles << role
    @@roles << role
  end
  return roles
end
exists?(name) click to toggle source
# File lib/xp5k/role.rb, line 126
def self.exists?(name)
  @@roles.select { |x| x.name == name }.empty? ? false : true
end
findByName(name) click to toggle source
# File lib/xp5k/role.rb, line 121
def self.findByName(name)
  roles = @@roles.select { |x| x.name == name }
  roles.empty? ? nil : roles.first
end
list() click to toggle source
# File lib/xp5k/role.rb, line 113
def self.list()
  @@roles
end
listnames() click to toggle source
# File lib/xp5k/role.rb, line 117
def self.listnames()
  @@roles.map { |role| role.name }
end
new(options = {}) click to toggle source
# File lib/xp5k/role.rb, line 7
def initialize(options = {})
  # Defaults
  @inner   = false
  @servers = []
  @desc    = ""
  @proc    = nil
  @vlan    = nil

  # Required parameters
  %w{ name size }.each do |param|
    if options[param.to_sym].nil?
      raise XP5K::Exceptions::Role, "#{self.to_s}: #{param.to_sym} needed at initialization"
    else
      instance_variable_set("@#{param}", options[param.to_sym])
    end
  end

  # Optional parameters
  %w{ desc servers inner pattern proc vlan }.each do |param|
    instance_variable_set("@#{param}", options[param.to_sym]) if options[param.to_sym]
  end
end

Public Instance Methods

add() click to toggle source
# File lib/xp5k/role.rb, line 30
def add
  @@roles << self
end
callproc() click to toggle source
# File lib/xp5k/role.rb, line 47
def callproc
  case result = self.proc.call
  when String
    hosts = [result]
  when Array
    hosts = result
  else
    raise "Role <#{args.first}> block must return String or Array"
  end
  self.size = hosts.length
  self.servers = hosts
end