diff --git a/ironic_discoverd/node_cache.py b/ironic_discoverd/node_cache.py index 31f9a3263..78df1dcb4 100644 --- a/ironic_discoverd/node_cache.py +++ b/ironic_discoverd/node_cache.py @@ -58,7 +58,7 @@ class NodeInfo(object): self.started_at = started_at self.finished_at = finished_at self.error = error - self._options = None + self.invalidate_cache() @property def options(self): @@ -126,6 +126,10 @@ class NodeInfo(object): for key in ('uuid', 'started_at', 'finished_at', 'error')} return cls(**fields) + def invalidate_cache(self): + """Clear all cached info, so that it's reloaded next time.""" + self._options = None + def init(): """Initialize the database.""" diff --git a/ironic_discoverd/process.py b/ironic_discoverd/process.py index 3ad3e345f..453f66fb5 100644 --- a/ironic_discoverd/process.py +++ b/ironic_discoverd/process.py @@ -99,6 +99,9 @@ def _process_node(ironic, node, node_info, cached_node): {'mac': mac, 'node': node.uuid}) node_patches, port_patches = _run_post_hooks(node, ports, node_info) + # Invalidate cache in case of hooks modifying options + cached_node.invalidate_cache() + node = utils.retry_on_conflict(ironic.node.update, node.uuid, node_patches) for mac, patches in port_patches.items(): utils.retry_on_conflict(ironic.port.update, ports[mac].uuid, patches) diff --git a/ironic_discoverd/test/test_node_cache.py b/ironic_discoverd/test/test_node_cache.py index 068b40313..f5ab47ef1 100644 --- a/ironic_discoverd/test/test_node_cache.py +++ b/ironic_discoverd/test/test_node_cache.py @@ -309,6 +309,11 @@ class TestNodeInfoOptions(test_base.NodeTest): self.assertEqual({'foo': 'bar'}, self.node_info.options) # should be cached self.assertIs(self.node_info.options, self.node_info.options) + # invalidate cache + old_options = self.node_info.options + self.node_info.invalidate_cache() + self.assertIsNot(old_options, self.node_info.options) + self.assertEqual(old_options, self.node_info.options) def test_set(self): data = {'s': 'value', 'b': True, 'i': 42}