Log look up attributes at INFO level
Without this it's hard to debug look up issues. This change required NodeInfo to expose attributes. Change-Id: Ieba14ab14dd356cc2c099656201c24fa46cbff6d
This commit is contained in:
parent
b383c87dfc
commit
7d32c57936
|
@ -131,6 +131,10 @@ def _background_introspect(ironic, node_info):
|
|||
{'macs': macs, 'node': node_info.uuid})
|
||||
firewall.update_filters(ironic)
|
||||
|
||||
LOG.info(_LI('The following attributes will be used for looking up '
|
||||
'node %(uuid)s: %(attrs)s'),
|
||||
{'attrs': node_info.attributes, 'uuid': node_info.uuid})
|
||||
|
||||
if not node_info.options.get('new_ipmi_credentials'):
|
||||
try:
|
||||
ironic.node.set_boot_device(node_info.uuid, 'pxe',
|
||||
|
|
|
@ -49,6 +49,7 @@ class NodeInfo(object):
|
|||
if ports is not None and not isinstance(ports, dict):
|
||||
ports = {p.address: p for p in ports}
|
||||
self._ports = ports
|
||||
self._attributes = None
|
||||
|
||||
@property
|
||||
def options(self):
|
||||
|
@ -60,6 +61,17 @@ class NodeInfo(object):
|
|||
for row in rows}
|
||||
return self._options
|
||||
|
||||
@property
|
||||
def attributes(self):
|
||||
"""Node look up attributes as a dict."""
|
||||
if self._attributes is None:
|
||||
self._attributes = {}
|
||||
rows = db.model_query(db.Attribute).filter_by(
|
||||
uuid=self.uuid)
|
||||
for row in rows:
|
||||
self._attributes.setdefault(row.name, []).append(row.value)
|
||||
return self._attributes
|
||||
|
||||
def set_option(self, name, value):
|
||||
"""Set an option for a node."""
|
||||
encoded = json.dumps(value)
|
||||
|
@ -111,6 +123,8 @@ class NodeInfo(object):
|
|||
raise utils.Error(_(
|
||||
'Some or all of %(name)s\'s %(value)s are already '
|
||||
'on introspection') % {'name': name, 'value': value})
|
||||
# Invalidate attributes so they're loaded on next usage
|
||||
self._attributes = None
|
||||
|
||||
@classmethod
|
||||
def from_row(cls, row):
|
||||
|
@ -124,6 +138,7 @@ class NodeInfo(object):
|
|||
self._options = None
|
||||
self._node = None
|
||||
self._ports = None
|
||||
self._attributes = None
|
||||
|
||||
def node(self, ironic=None):
|
||||
"""Get Ironic node object associated with the cached node record."""
|
||||
|
|
|
@ -93,6 +93,28 @@ class TestNodeCache(test_base.NodeTest):
|
|||
[tuple(row) for row in res])
|
||||
self.assertRaises(utils.Error, node_info.add_attribute,
|
||||
'key', 'value')
|
||||
# check that .attributes got invalidated and reloaded
|
||||
self.assertEqual({'key': ['value']}, node_info.attributes)
|
||||
|
||||
def test_attributes(self):
|
||||
node_info = node_cache.add_node(self.uuid,
|
||||
bmc_address='1.2.3.4',
|
||||
mac=self.macs)
|
||||
self.assertEqual({'bmc_address': ['1.2.3.4'],
|
||||
'mac': self.macs},
|
||||
node_info.attributes)
|
||||
# check invalidation
|
||||
session = db.get_session()
|
||||
with session.begin():
|
||||
db.Attribute(name='foo', value='bar', uuid=self.uuid).save(session)
|
||||
# still cached
|
||||
self.assertEqual({'bmc_address': ['1.2.3.4'],
|
||||
'mac': self.macs},
|
||||
node_info.attributes)
|
||||
node_info.invalidate_cache()
|
||||
self.assertEqual({'bmc_address': ['1.2.3.4'],
|
||||
'mac': self.macs, 'foo': ['bar']},
|
||||
node_info.attributes)
|
||||
|
||||
|
||||
class TestNodeCacheFind(test_base.NodeTest):
|
||||
|
|
Loading…
Reference in New Issue