Class: XP5K::Role
- Inherits:
-
Object
- Object
- XP5K::Role
- Defined in:
- lib/xp5k/role.rb
Constant Summary collapse
- @@roles =
[]
Instance Attribute Summary collapse
-
#desc ⇒ Object
Returns the value of attribute desc.
-
#inner ⇒ Object
Returns the value of attribute inner.
-
#jobid ⇒ Object
Returns the value of attribute jobid.
-
#name ⇒ Object
Returns the value of attribute name.
-
#pattern ⇒ Object
Returns the value of attribute pattern.
-
#proc ⇒ Object
Returns the value of attribute proc.
-
#servers ⇒ Object
Returns the value of attribute servers.
-
#size ⇒ Object
Returns the value of attribute size.
-
#vlan ⇒ Object
Returns the value of attribute vlan.
Class Method Summary collapse
- .create_roles(job, job_definition) ⇒ Object
- .exists?(name) ⇒ Boolean
- .findByName(name) ⇒ Object
- .list ⇒ Object
- .listnames ⇒ Object
Instance Method Summary collapse
- #add ⇒ Object
- #callproc ⇒ Object
-
#initialize(options = {}) ⇒ Role
constructor
A new instance of Role.
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( = {}) # Defaults @inner = false @servers = [] @desc = "" @proc = nil @vlan = nil # Required parameters %w{ name size }.each do |param| if [param.to_sym].nil? raise XP5K::Exceptions::Role, "#{self.to_s}: #{param.to_sym} needed at initialization" else instance_variable_set("@#{param}", [param.to_sym]) end end # Optional parameters %w{ desc servers inner pattern proc vlan }.each do |param| instance_variable_set("@#{param}", [param.to_sym]) if [param.to_sym] end end |
Instance Attribute Details
#desc ⇒ Object
Returns the value of attribute desc.
3 4 5 |
# File 'lib/xp5k/role.rb', line 3 def desc @desc end |
#inner ⇒ Object
Returns the value of attribute inner.
3 4 5 |
# File 'lib/xp5k/role.rb', line 3 def inner @inner end |
#jobid ⇒ Object
Returns the value of attribute jobid.
3 4 5 |
# File 'lib/xp5k/role.rb', line 3 def jobid @jobid end |
#name ⇒ Object
Returns the value of attribute name.
3 4 5 |
# File 'lib/xp5k/role.rb', line 3 def name @name end |
#pattern ⇒ Object
Returns the value of attribute pattern.
3 4 5 |
# File 'lib/xp5k/role.rb', line 3 def pattern @pattern end |
#proc ⇒ Object
Returns the value of attribute proc.
3 4 5 |
# File 'lib/xp5k/role.rb', line 3 def proc @proc end |
#servers ⇒ Object
Returns the value of attribute servers.
3 4 5 |
# File 'lib/xp5k/role.rb', line 3 def servers @servers end |
#size ⇒ Object
Returns the value of attribute size.
3 4 5 |
# File 'lib/xp5k/role.rb', line 3 def size @size end |
#vlan ⇒ Object
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
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 |
.list ⇒ Object
113 114 115 |
# File 'lib/xp5k/role.rb', line 113 def self.list() @@roles end |
.listnames ⇒ Object
117 118 119 |
# File 'lib/xp5k/role.rb', line 117 def self.listnames() @@roles.map { |role| role.name } end |
Instance Method Details
#add ⇒ Object
30 31 32 |
# File 'lib/xp5k/role.rb', line 30 def add @@roles << self end |
#callproc ⇒ Object
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 |