report power consumption with dell

This commit is contained in:
Solvik Blum 2019-09-04 17:51:04 +02:00
commit 6e012c49ab
No known key found for this signature in database
GPG key ID: CC12B3DC262B6C47
3 changed files with 69 additions and 3 deletions

View file

@ -8,11 +8,11 @@ PSU_DMI_TYPE = 39
class PowerSupply(): class PowerSupply():
def __init__(self, server=None): def __init__(self, server=None):
self.server = server self.server = server
netbox_server = self.server.get_netbox_server() self.netbox_server = self.server.get_netbox_server()
if self.server.is_blade(): if self.server.is_blade():
self.device_id = netbox_server.parent_device.id if netbox_server else None self.device_id = self.netbox_server.parent_device.id if self.netbox_server else None
else: else:
self.device_id = netbox_server.id if netbox_server else None self.device_id = self.netbox_server.id if self.netbox_server else None
def get_power_supply(self): def get_power_supply(self):
power_supply = [] power_supply = []
@ -81,3 +81,31 @@ class PowerSupply():
) )
return True return True
def report_power_consumption(self):
psu_cons = self.server.get_power_consumption()
nb_psus = self.get_netbox_power_supply()
if not len(nb_psus) or not len(psu_cons):
return False
# find power feeds for rack or dc
voltage = None
pwr_feeds = None
if self.netbox_server.rack:
pwr_feeds = nb.dcim.power_feeds.filter(
rack=self.netbox_server.rack.id
)
if pwr_feeds is None or not len(pwr_feeds):
logging.info('Could not find power feeds for Rack, defaulting value to 230')
voltage = 230
for i, nb_psu in enumerate(nb_psus):
nb_psu.allocated_draw = float(psu_cons[i]) * voltage
nb_psu.save()
logging.info('Updated power consumption for PSU {}: {}W'.format(
nb_psu.name,
nb_psu.allocated_draw,
))
return True

View file

@ -108,6 +108,9 @@ class ServerBase():
def get_bios_release_date(self): def get_bios_release_date(self):
raise NotImplementedError raise NotImplementedError
def get_power_consumption(self):
raise NotImplementedError
def _netbox_create_blade_chassis(self, datacenter, rack): def _netbox_create_blade_chassis(self, datacenter, rack):
device_type = nb.dcim.device_types.get( device_type = nb.dcim.device_types.get(
model=self.get_chassis(), model=self.get_chassis(),
@ -322,6 +325,7 @@ class ServerBase():
if config.update_all or config.update_psu: if config.update_all or config.update_psu:
self.power = PowerSupply(server=self) self.power = PowerSupply(server=self)
self.power.create_or_update_power_supply() self.power.create_or_update_power_supply()
self.power.report_power_consumption()
if update: if update:
server.save() server.save()
logging.debug('Finished updating Server!') logging.debug('Finished updating Server!')

View file

@ -1,4 +1,8 @@
import logging
import subprocess
from netbox_agent.server import ServerBase from netbox_agent.server import ServerBase
from netbox_agent.misc import is_tool
class DellHost(ServerBase): class DellHost(ServerBase):
@ -33,3 +37,33 @@ class DellHost(ServerBase):
if self.is_blade(): if self.is_blade():
return self.dmi.get_by_type('Chassis')[0]['Serial Number'] return self.dmi.get_by_type('Chassis')[0]['Serial Number']
return self.get_service_tag() return self.get_service_tag()
def get_power_consumption(self):
'''
Parse omreport output like this
Amperage
PS1 Current 1 : 1.8 A
PS2 Current 2 : 1.4 A
'''
value = []
if not is_tool('omreport'):
logging.error('omreport does not seem to be installed, please debug')
return value
data = subprocess.getoutput('omreport chassis pwrmonitoring')
amperage = False
for line in data.splitlines():
if line.startswith('Amperage'):
amperage = True
continue
if amperage:
if line.startswith('PS'):
amp_value = line.split(':')[1].split()[0]
value.append(amp_value)
else:
break
return value