Bug 2412 - la page cluster/UserGuide ne fonctionne plus
- for the sake of debugging, improved the handling of missing data in SimpaDb.sql : now when a data is missing, the exception handler displays a message describing what's missing.
This commit is contained in:
parent
796ec2d6a5
commit
a2be664bbe
|
@ -10,6 +10,7 @@ import re
|
||||||
import pygraphviz
|
import pygraphviz
|
||||||
from inventory import Inventory
|
from inventory import Inventory
|
||||||
from SimpaDbUtil import SqlFile, SqlDatabaseReader
|
from SimpaDbUtil import SqlFile, SqlDatabaseReader
|
||||||
|
from Lib import SimpaDbUtil
|
||||||
|
|
||||||
|
|
||||||
def add_capacity_constraints(capacity1, capacity2):
|
def add_capacity_constraints(capacity1, capacity2):
|
||||||
|
@ -136,6 +137,7 @@ class Connection(object):
|
||||||
return str(self.from_plug) + ' -> ' + str(self.to_plug) + ' (' + str(self.from_plug.get_max_amperes()) + str(self.get_max_amperes()) + 'A)'
|
return str(self.from_plug) + ' -> ' + str(self.to_plug) + ' (' + str(self.from_plug.get_max_amperes()) + str(self.get_max_amperes()) + 'A)'
|
||||||
|
|
||||||
def get_max_amperes(self):
|
def get_max_amperes(self):
|
||||||
|
# gLogger.debug('%s (%s A) -> %s (%s A): ' % (str(self.from_plug), str(self.from_plug.get_max_amperes()), str(self.to_plug), str(self.to_plug.current_capacity_constraint)))
|
||||||
capacity = self.from_plug.get_max_amperes()
|
capacity = self.from_plug.get_max_amperes()
|
||||||
capacity = add_capacity_constraints(capacity, self.to_plug.current_capacity_constraint)
|
capacity = add_capacity_constraints(capacity, self.to_plug.current_capacity_constraint)
|
||||||
if self.current_capacity_constraint is not None:
|
if self.current_capacity_constraint is not None:
|
||||||
|
@ -202,7 +204,15 @@ class PowerConfig(object):
|
||||||
|
|
||||||
# print(machine_name)
|
# print(machine_name)
|
||||||
|
|
||||||
machine_spec_id = inventory.machine_name_to_machine_spec_id(machine_name)
|
machine_spec_id = None
|
||||||
|
try:
|
||||||
|
# assert machine_spec_id != '', 'non-empty value expected for machine_spec_id for machine %s' % machine_name
|
||||||
|
machine_spec_id = inventory.machine_name_to_machine_spec_id(machine_name)
|
||||||
|
if machine_spec_id == '':
|
||||||
|
machine_spec_id = None # some simple 'machines' such as powerext003 have undefined machine_spec_id
|
||||||
|
except SimpaDbUtil.TableAttrNotFound:
|
||||||
|
pass
|
||||||
|
|
||||||
if machine_spec_id is not None:
|
if machine_spec_id is not None:
|
||||||
power_consumption = inventory.machine_spec_id_to_power_consumption(machine_spec_id)
|
power_consumption = inventory.machine_spec_id_to_power_consumption(machine_spec_id)
|
||||||
if power_consumption is not None:
|
if power_consumption is not None:
|
||||||
|
@ -275,20 +285,24 @@ def power_config_to_svg(power_config, svg_file_path):
|
||||||
amperes = power_consumption / 220.0
|
amperes = power_consumption / 220.0
|
||||||
color = 'green'
|
color = 'green'
|
||||||
capacity = con.get_max_amperes()
|
capacity = con.get_max_amperes()
|
||||||
|
penwidth_scaler = 0.25
|
||||||
if capacity is None:
|
if capacity is None:
|
||||||
label = '?'
|
max_amp = '? A'
|
||||||
|
color = 'red'
|
||||||
|
penwidth = 100.0 * penwidth_scaler # make the problem clearly visible
|
||||||
else:
|
else:
|
||||||
label = str(capacity) + 'A'
|
max_amp = str(capacity) + 'A'
|
||||||
if amperes / capacity > 1.0:
|
if amperes / capacity > 1.0:
|
||||||
color = 'red'
|
color = 'red'
|
||||||
elif amperes / capacity > 0.75:
|
elif amperes / capacity > 0.75:
|
||||||
color = 'orange'
|
color = 'orange'
|
||||||
else:
|
else:
|
||||||
color = 'green'
|
color = 'green'
|
||||||
label = "%.1f/%s" % (amperes, label)
|
color = hotness_to_hsv_color(pow(amperes / capacity, 4.0))
|
||||||
|
penwidth = capacity * penwidth_scaler
|
||||||
|
label = "%.1f/%s" % (amperes, max_amp)
|
||||||
# color='//%d' % int(9.0-amperes/capacity*8)
|
# color='//%d' % int(9.0-amperes/capacity*8)
|
||||||
|
|
||||||
color = hotness_to_hsv_color(pow(amperes / capacity, 4.0))
|
graph.add_edge(con.from_plug.machine.name, con.to_plug.machine.name, color=color, label=label, penwidth=penwidth)
|
||||||
graph.add_edge(con.from_plug.machine.name, con.to_plug.machine.name, color=color, label=label, penwidth=capacity * 0.25)
|
|
||||||
graph.layout(prog='twopi')
|
graph.layout(prog='twopi')
|
||||||
graph.draw(svg_file_path)
|
graph.draw(svg_file_path)
|
||||||
|
|
|
@ -113,6 +113,16 @@ class SqlFile(ISqlDatabaseBackend):
|
||||||
return rows
|
return rows
|
||||||
|
|
||||||
|
|
||||||
|
class TableAttrNotFound(Exception):
|
||||||
|
def __init__(self, table, key_name, key_value, attr_name):
|
||||||
|
message = "failed to find in table %s a value for %s where %s is %s" % (table, attr_name, key_name, key_value)
|
||||||
|
super(TableAttrNotFound, self).__init__(message)
|
||||||
|
self.table = table
|
||||||
|
self.key_name = key_name
|
||||||
|
self.key_value = key_value
|
||||||
|
self.attr_name = attr_name
|
||||||
|
|
||||||
|
|
||||||
class SqlDatabaseReader(object):
|
class SqlDatabaseReader(object):
|
||||||
|
|
||||||
def __init__(self, inv_provider):
|
def __init__(self, inv_provider):
|
||||||
|
@ -142,6 +152,8 @@ class SqlDatabaseReader(object):
|
||||||
rows = self.query("SELECT " + attr_name + " FROM " + table + " WHERE " + key_name + "='" + key_value + "'")
|
rows = self.query("SELECT " + attr_name + " FROM " + table + " WHERE " + key_name + "='" + key_value + "'")
|
||||||
if len(rows) > 0:
|
if len(rows) > 0:
|
||||||
attr_value = rows[0][0]
|
attr_value = rows[0][0]
|
||||||
|
else:
|
||||||
|
raise TableAttrNotFound(table, key_name, key_value, attr_name)
|
||||||
return attr_value
|
return attr_value
|
||||||
|
|
||||||
|
|
||||||
|
|
72
inventory.py
72
inventory.py
|
@ -1,8 +1,25 @@
|
||||||
# encoding: utf-8
|
# encoding: utf-8
|
||||||
import datetime
|
import datetime
|
||||||
|
from Lib import SimpaDbUtil
|
||||||
|
|
||||||
|
|
||||||
|
class MachineSpecIdNotFound(Exception):
|
||||||
|
def __init__(self, machine_name):
|
||||||
|
message = "failed to find the machine_spec_id for the machine '%s'" % machine_name
|
||||||
|
super(MachineSpecIdNotFound, self).__init__(message)
|
||||||
|
self.machine_name = machine_name
|
||||||
|
|
||||||
|
|
||||||
|
class PlugTypeNotFound(Exception):
|
||||||
|
def __init__(self, machine_spec_id, plug_name):
|
||||||
|
message = "failed to find the plug_type for the machine_spec_id '%s' and plug_name '%s'" % (machine_spec_id, plug_name)
|
||||||
|
super(PlugTypeNotFound, self).__init__(message)
|
||||||
|
self.machine_spec_id = machine_spec_id
|
||||||
|
self.plug_name = plug_name
|
||||||
|
|
||||||
|
|
||||||
class Inventory(object):
|
class Inventory(object):
|
||||||
|
|
||||||
def __init__(self, sql_reader):
|
def __init__(self, sql_reader):
|
||||||
"""
|
"""
|
||||||
:param SimpaDbUtil.SqlDatabaseReader sql_reader: the inventory database
|
:param SimpaDbUtil.SqlDatabaseReader sql_reader: the inventory database
|
||||||
|
@ -28,39 +45,68 @@ class Inventory(object):
|
||||||
return machine_name
|
return machine_name
|
||||||
|
|
||||||
def machine_name_to_machine_spec_id(self, machine_name):
|
def machine_name_to_machine_spec_id(self, machine_name):
|
||||||
# machine_spec_id = None
|
|
||||||
# try:
|
|
||||||
machine_spec_id = self._sql_reader.get_table_attr('machines', 'name', machine_name, 'machine_spec_id')
|
machine_spec_id = self._sql_reader.get_table_attr('machines', 'name', machine_name, 'machine_spec_id')
|
||||||
# except:
|
|
||||||
# machine_spec_id = None
|
|
||||||
return machine_spec_id
|
return machine_spec_id
|
||||||
|
|
||||||
# electricity related methods
|
# electricity related methods
|
||||||
|
|
||||||
def machine_spec_id_to_power_consumption(self, machine_spec_id):
|
def machine_spec_id_to_power_consumption(self, machine_spec_id):
|
||||||
power_consumption = self._sql_reader.get_table_attr('machine_spec_to_power_consumption', 'machine_spec_id', machine_spec_id, 'power_consumption')
|
try:
|
||||||
|
power_consumption = self._sql_reader.get_table_attr('machine_spec_to_power_consumption', 'machine_spec_id', machine_spec_id, 'power_consumption')
|
||||||
|
except SimpaDbUtil.TableAttrNotFound as e: # @UnusedVariable
|
||||||
|
# some passive machines such as pdus are not detailed in the machine_spec_to_power_consumption because they don't consume power
|
||||||
|
power_consumption = 0.0
|
||||||
return power_consumption
|
return power_consumption
|
||||||
|
|
||||||
def get_plug_type_attr(self, plug_type, attr_name):
|
def get_plug_type_attr(self, plug_type, attr_name):
|
||||||
|
"""
|
||||||
|
:param str plug_type: eg 'c14'
|
||||||
|
"""
|
||||||
# INSERT INTO `powerplug_type_desc` (`plug_type_id`, `genre`, `max_amps`) VALUES
|
# INSERT INTO `powerplug_type_desc` (`plug_type_id`, `genre`, `max_amps`) VALUES
|
||||||
# ('iec60309_blue_pne6h_32a_m', 'm', 32.0),
|
# ('iec60309_blue_pne6h_32a_m', 'm', 32.0),
|
||||||
attr_value = self._sql_reader.get_table_attr('powerplug_type_desc', 'plug_type_id', plug_type, attr_name)
|
attr_value = self._sql_reader.get_table_attr('powerplug_type_desc', 'plug_type_id', plug_type, attr_name)
|
||||||
return attr_value
|
return attr_value
|
||||||
|
|
||||||
def read_plug_capacity(self, plug):
|
def get_plug_type(self, machine_name, plug_name):
|
||||||
plug_capacity = None
|
"""
|
||||||
machine_spec_id = self.machine_name_to_machine_spec_id(plug.machine.name)
|
:param str machine_name: eg 'pdu4'
|
||||||
|
:param str plug_name: eg 'o4'
|
||||||
|
"""
|
||||||
|
machine_spec_id = None
|
||||||
|
try:
|
||||||
|
machine_spec_id = self.machine_name_to_machine_spec_id(machine_name)
|
||||||
|
except SimpaDbUtil.TableAttrNotFound as e: # @UnusedVariable
|
||||||
|
raise MachineSpecIdNotFound(machine_name)
|
||||||
if machine_spec_id is not None:
|
if machine_spec_id is not None:
|
||||||
# INSERT INTO `powerplug_desc` (`machine_spec_id`, `powerplug_id`, `plug_type`) VALUES
|
# INSERT INTO `powerplug_desc` (`machine_spec_id`, `powerplug_id`, `plug_type`) VALUES
|
||||||
# ('atos_mpdu_2901382', 'i', 'iec60309_blue_pne6h_32a_m'),
|
# ('atos_mpdu_2901382', 'i', 'iec60309_blue_pne6h_32a_m'),
|
||||||
rows = self._sql_reader.query("SELECT plug_type FROM powerplug_desc WHERE machine_spec_id='%s' AND powerplug_id='%s'" % (machine_spec_id, plug.name))
|
rows = self._sql_reader.query("SELECT plug_type FROM powerplug_desc WHERE machine_spec_id='%s' AND powerplug_id='%s'" % (machine_spec_id, plug_name))
|
||||||
if len(rows) > 0:
|
if len(rows) > 0:
|
||||||
plug_type = rows[0][0]
|
plug_type = rows[0][0]
|
||||||
# print('plug_type : %s' % plug_type)
|
else:
|
||||||
|
raise PlugTypeNotFound(machine_spec_id, plug_name)
|
||||||
|
return plug_type
|
||||||
|
|
||||||
plug_capacity = self.get_plug_type_attr(plug_type, 'max_amps')
|
def read_plug_capacity(self, plug):
|
||||||
# if plug_capacity:
|
"""
|
||||||
# print('plug_capacity : %f A' % plug_capacity)
|
:param PowerDiagram.Plug plug: the power plug of a 'device' we're interested in (eg pdu4.o1)
|
||||||
|
"""
|
||||||
|
plug_capacity = None
|
||||||
|
plug_type = None
|
||||||
|
try:
|
||||||
|
plug_type = self.get_plug_type(plug.machine.name, plug.name)
|
||||||
|
except MachineSpecIdNotFound:
|
||||||
|
# some machines are not actual machines (eg edf, ups1pdu)
|
||||||
|
pass
|
||||||
|
except PlugTypeNotFound:
|
||||||
|
# some plugs are just plain connections, with no actual plug types
|
||||||
|
pass
|
||||||
|
if plug_type is not None:
|
||||||
|
# print('plug_type : %s' % plug_type)
|
||||||
|
|
||||||
|
plug_capacity = self.get_plug_type_attr(plug_type, 'max_amps')
|
||||||
|
# if plug_capacity:
|
||||||
|
# print('plug_capacity : %f A' % plug_capacity)
|
||||||
# print("read_plug_capacity : plug capacity for plug.machine.name="+plug.machine.name+" plug="+str(plug)+" : "+ str(plug_capacity)+ "A")
|
# print("read_plug_capacity : plug capacity for plug.machine.name="+plug.machine.name+" plug="+str(plug)+" : "+ str(plug_capacity)+ "A")
|
||||||
return plug_capacity
|
return plug_capacity
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue