Class: ForemanDatacenter::Device

Inherits:
ActiveRecord::Base
  • Object
show all
Includes:
ScopedSearchExtensions
Defined in:
app/models/foreman_datacenter/device.rb

Instance Method Summary collapse

Instance Method Details

#child?Boolean

Returns:

  • (Boolean)


76
77
78
# File 'app/models/foreman_datacenter/device.rb', line 76

def child?
  device_type.try(:subdevice_role) == 'Child'
end

#correct_positionObject



147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
# File 'app/models/foreman_datacenter/device.rb', line 147

def correct_position
  if position > 0
    grid_template = JSON.parse(self.rack.grid_template_areas)
    correct_pos = true
    pos = []
    sz = (size == 0 || size == 1) ? [position] : [*position..(position + (size - 1))]
    sd = (side.nil?) ? "full" : side
    sz.each do |i|
      if grid_template["#{i}"].is_a?(Hash)
        if grid_template["#{i}"].key?("full") &&  grid_template["#{i}"]["full"] != "device-#{self.id}"
          correct_pos = false
          pos << "#{i}(full)"
        end
        if sd == "full"
          ["left", "right"].each do |s|
            if grid_template["#{i}"].key?("#{s}") && grid_template["#{i}"]["#{s}"] != "device-#{self.id}"
              correct_pos = false
              pos << "#{i}(#{s})"
            end
          end
        else
          if grid_template["#{i}"].key?("#{sd}") && grid_template["#{i}"]["#{sd}"] != "device-#{self.id}"
            correct_pos = false
            pos << "#{i}(#{sd})"
          end
        end
      end
    end
    pos.uniq!
    errors.add(:position, "Positions: #{pos.join(', ')} already taken") if correct_pos == false
  end
end

#free_console_portsObject



84
85
86
# File 'app/models/foreman_datacenter/device.rb', line 84

def free_console_ports
  console_ports.where(console_server_port_id: nil)
end

#free_console_server_portsObject



92
93
94
95
# File 'app/models/foreman_datacenter/device.rb', line 92

def free_console_server_ports
  console_server_ports.joins('LEFT JOIN console_ports ON console_server_ports.id = console_ports.console_server_port_id').
    where(console_ports: { console_server_port_id: nil })
end

#free_interfacesObject



80
81
82
# File 'app/models/foreman_datacenter/device.rb', line 80

def free_interfaces
  interfaces.where(mgmt_only: false).reject(&:connected?)
end

#free_power_outletsObject



97
98
99
100
# File 'app/models/foreman_datacenter/device.rb', line 97

def free_power_outlets
  power_outlets.joins('LEFT JOIN power_ports ON power_outlets.id = power_ports.power_outlet_id').
    where(power_ports: { power_outlet_id: nil })
end

#free_power_portsObject



88
89
90
# File 'app/models/foreman_datacenter/device.rb', line 88

def free_power_ports
  power_ports.where(power_outlet_id: nil)
end

#ip_addressObject



67
68
69
70
# File 'app/models/foreman_datacenter/device.rb', line 67

def ip_address
  ipmi_interface.try(:ip_address) || mgmt_interface.try(:ip_address) ||
    primary_ip4
end

#mac_addressObject



63
64
65
# File 'app/models/foreman_datacenter/device.rb', line 63

def mac_address
  ipmi_interface.try(:mac_address) || mgmt_interface.try(:mac_address)
end

#name_without_fqdnObject



115
116
117
118
# File 'app/models/foreman_datacenter/device.rb', line 115

def name_without_fqdn
  match = name.match(/^([^.]*)/)
  match[1] if match
end

#parent?Boolean

Returns:

  • (Boolean)


72
73
74
# File 'app/models/foreman_datacenter/device.rb', line 72

def parent?
  device_type.try(:subdevice_role) == 'Parent'
end

#populate_from_host(host) ⇒ Object



102
103
104
105
106
107
108
109
110
111
112
113
# File 'app/models/foreman_datacenter/device.rb', line 102

def populate_from_host(host)
  self.host = host
  self.name = host.name

  device_type = DeviceType.for_host(host)
  self.device_type = device_type if device_type

  self.device_role = DeviceRole.for_host unless self.device_role

  serial = host.fact_value_by_name('serialnumber')
  self.serial = serial.value if serial
end

#positionsObject



120
121
122
123
124
125
126
127
128
# File 'app/models/foreman_datacenter/device.rb', line 120

def positions
  result = []
  if size.nil?
    result << position
  else
    size.times{ |p| result << (position + p) } unless position.nil?
  end
  return result
end

#sync_interfaces_with_hostObject



130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# File 'app/models/foreman_datacenter/device.rb', line 130

def sync_interfaces_with_host
  if host
    existed_names = interfaces.map(&:name)
    host.interfaces.each do |interface|
      unless existed_names.include?(interface.identifier)
        interfaces.create(
          name: interface.identifier,
          form_factor: ForemanDatacenter::DeviceInterface::DEFAULT_FORM_FACTOR,
          mac_address: interface.mac,
          ip_address: interface.ip,
          mgmt_only: interface.identifier == 'ipmi'
        )
      end
    end
  end
end