From b76f84d4c15b46cdd4781d91c372e56452dc460f Mon Sep 17 00:00:00 2001 From: Bob Fournier Date: Wed, 13 Feb 2019 12:33:42 -0500 Subject: [PATCH] Use processed bool as key in introspection_data DB table When using store_data=database with sqlalchemy, running introspection results in a DBDuplicateEntry error. This happens because the query when adding an entry uses both the primary key (uuid) and the processed flag, but the processed flag is not a key. This change makes it a key so that both unprocessed and processed data can be stored in the table. Note - since the previous migration hasn't been released yet this fixes it without creating a new one. Change-Id: I052594d529ae363fce50b1726169d86583bb1439 Story: #2004992 Task: #29463 --- ironic_inspector/db.py | 2 +- ...8dec16023c_add_introspection_data_table.py | 2 +- ironic_inspector/test/unit/test_node_cache.py | 19 +++++++++++++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/ironic_inspector/db.py b/ironic_inspector/db.py index 7d7a11111..73e67e76e 100644 --- a/ironic_inspector/db.py +++ b/ironic_inspector/db.py @@ -137,7 +137,7 @@ class RuleAction(Base): class IntrospectionData(Base): __tablename__ = 'introspection_data' uuid = Column(String(36), ForeignKey('nodes.uuid'), primary_key=True) - processed = Column(Boolean, default=False) + processed = Column(Boolean, default=False, primary_key=True) data = Column(db_types.JsonEncodedDict(mysql_as_long=True), nullable=True) diff --git a/ironic_inspector/migrations/versions/bf8dec16023c_add_introspection_data_table.py b/ironic_inspector/migrations/versions/bf8dec16023c_add_introspection_data_table.py index bceefac29..a43763670 100644 --- a/ironic_inspector/migrations/versions/bf8dec16023c_add_introspection_data_table.py +++ b/ironic_inspector/migrations/versions/bf8dec16023c_add_introspection_data_table.py @@ -34,7 +34,7 @@ def upgrade(): 'introspection_data', sa.Column('uuid', sa.String(36), sa.ForeignKey('nodes.uuid'), primary_key=True), - sa.Column('processed', sa.Boolean, default=False), + sa.Column('processed', sa.Boolean, default=False, primary_key=True), sa.Column('data', db_types.JsonEncodedDict(mysql_as_long=True).impl, nullable=True), mysql_ENGINE='InnoDB', diff --git a/ironic_inspector/test/unit/test_node_cache.py b/ironic_inspector/test/unit/test_node_cache.py index 4e6bed5a1..477bf5145 100644 --- a/ironic_inspector/test/unit/test_node_cache.py +++ b/ironic_inspector/test/unit/test_node_cache.py @@ -1285,3 +1285,22 @@ class TestIntrospectionDataDbStore(test_base.NodeTest): def test_get_no_data_available(self): self.assertRaises(utils.IntrospectionDataNotFound, node_cache.get_introspection_data, self.node.uuid) + + def test_store_proc_and_unproc(self): + unproc_data = {'s': 'value', 'b': True, 'i': 42} + node_cache.store_introspection_data(self.node.uuid, + unproc_data, + processed=False) + + proc_data = {'foo': 'bar'} + node_cache.store_introspection_data(self.node.uuid, + proc_data, + processed=True) + + stored_data = node_cache.get_introspection_data(self.node.uuid, + True) + self.assertEqual(stored_data, proc_data) + + stored_data = node_cache.get_introspection_data(self.node.uuid, + False) + self.assertEqual(stored_data, unproc_data)