Class: XP5K::Role

Inherits:
Object
  • Object
show all
Defined in:
lib/xp5k/role.rb

Constant Summary collapse

@@roles =
[]

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Role

Returns a new instance of Role.



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 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

Instance Attribute Details

#descObject

Returns the value of attribute desc.



3
4
5
# File 'lib/xp5k/role.rb', line 3

def desc
  @desc
end

#innerObject

Returns the value of attribute inner.



3
4
5
# File 'lib/xp5k/role.rb', line 3

def inner
  @inner
end

#jobidObject

Returns the value of attribute jobid.



3
4
5
# File 'lib/xp5k/role.rb', line 3

def jobid
  @jobid
end

#nameObject

Returns the value of attribute name.



3
4
5
# File 'lib/xp5k/role.rb', line 3

def name
  @name
end

#patternObject

Returns the value of attribute pattern.



3
4
5
# File 'lib/xp5k/role.rb', line 3

def pattern
  @pattern
end

#procObject

Returns the value of attribute proc.



3
4
5
# File 'lib/xp5k/role.rb', line 3

def proc
  @proc
end

#serversObject

Returns the value of attribute servers.



3
4
5
# File 'lib/xp5k/role.rb', line 3

def servers
  @servers
end

#sizeObject

Returns the value of attribute size.



3
4
5
# File 'lib/xp5k/role.rb', line 3

def size
  @size
end

#vlanObject

Returns the value of attribute vlan.



3
4
5
# File 'lib/xp5k/role.rb', line 3

def vlan
  @vlan
end

Class Method Details

.create_roles(job, job_definition) ⇒ Object



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# 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) ⇒ Boolean

Returns:

  • (Boolean)


126
127
128
# File 'lib/xp5k/role.rb', line 126

def self.exists?(name)
  @@roles.select { |x| x.name == name }.empty? ? false : true
end

.findByName(name) ⇒ Object



121
122
123
124
# File 'lib/xp5k/role.rb', line 121

def self.findByName(name)
  roles = @@roles.select { |x| x.name == name }
  roles.empty? ? nil : roles.first
end

.listObject



113
114
115
# File 'lib/xp5k/role.rb', line 113

def self.list()
  @@roles
end

.listnamesObject



117
118
119
# File 'lib/xp5k/role.rb', line 117

def self.listnames()
  @@roles.map { |role| role.name }
end

Instance Method Details

#addObject



30
31
32
# File 'lib/xp5k/role.rb', line 30

def add
  @@roles << self
end

#callprocObject



47
48
49
50
51
52
53
54
55
56
57
58
# 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