diff --git a/vitrage/persistor/service.py b/vitrage/persistor/service.py index 5223f1002..90e21cb39 100644 --- a/vitrage/persistor/service.py +++ b/vitrage/persistor/service.py @@ -18,7 +18,6 @@ import dateutil.parser import oslo_messaging as oslo_m from oslo_log import log -from oslo_serialization import jsonutils from oslo_service import service as os_service from vitrage.common.constants import DatasourceProperties as DSProps from vitrage.common.constants import GraphAction @@ -73,6 +72,6 @@ class VitragePersistorEndpoint(object): return collector_timestamp = \ dateutil.parser.parse(data.get(DSProps.SAMPLE_DATE)) - event_row = models.Event(payload=jsonutils.dumps(data), + event_row = models.Event(payload=data, collector_timestamp=collector_timestamp) self.db_connection.events.create(event_row) diff --git a/vitrage/storage/impl_sqlalchemy.py b/vitrage/storage/impl_sqlalchemy.py index a7261c6a1..35b4b3500 100644 --- a/vitrage/storage/impl_sqlalchemy.py +++ b/vitrage/storage/impl_sqlalchemy.py @@ -61,6 +61,7 @@ class Connection(base.Connection): def upgrade(self, nocreate=False): engine = self._engine_facade.get_engine() engine.connect() + models.Base.metadata.drop_all(engine, tables=[models.Event.__table__]) models.Base.metadata.create_all(engine) # TODO(idan_hefetz) upgrade logic is missing diff --git a/vitrage/storage/sqlalchemy/models.py b/vitrage/storage/sqlalchemy/models.py index c93b17fc9..da51095f7 100644 --- a/vitrage/storage/sqlalchemy/models.py +++ b/vitrage/storage/sqlalchemy/models.py @@ -14,8 +14,11 @@ from oslo_db.sqlalchemy import models from sqlalchemy import Column, DateTime, INTEGER, String, \ - SmallInteger, BigInteger, Index, Text + SmallInteger, BigInteger, Index from sqlalchemy.ext.declarative import declarative_base +import sqlalchemy.types as types + +import json class VitrageBase(models.ModelBase): @@ -39,6 +42,28 @@ class VitrageBase(models.ModelBase): Base = declarative_base(cls=VitrageBase) +class StringyJSON(types.TypeDecorator): + """Stores and retrieves JSON as TEXT. + + Adjust JSON type to sqlite for unit test + """ + + impl = types.TEXT + + def process_bind_param(self, value, dialect): + if value is not None: + value = json.dumps(value) + return value + + def process_result_value(self, value, dialect): + if value is not None: + value = json.loads(value) + return value + + +MagicJSON = types.JSON().with_variant(StringyJSON, 'sqlite') + + class Event(Base): __tablename__ = 'events' @@ -46,14 +71,14 @@ class Event(Base): event_id = Column("id", INTEGER, primary_key=True, nullable=False, autoincrement=True) collector_timestamp = Column(DateTime, index=True, nullable=False) - payload = Column(Text, nullable=False) + payload = Column(MagicJSON, nullable=False) def __repr__(self): return \ "" %\ + "payload='%s')>" % \ ( self.event_id, self.collector_timestamp, @@ -88,7 +113,7 @@ class ActiveAction(Base, models.TimestampMixin): "target_vertex_id='%s', " \ "action_id='%s', " \ "score='%s', " \ - "trigger='%s')>" %\ + "trigger='%s')>" % \ ( self.created_at, self.action_type, diff --git a/vitrage_tempest_tests/tests/database/test_persistor.py b/vitrage_tempest_tests/tests/database/test_persistor.py index 08e1fed2c..a5e2434c2 100644 --- a/vitrage_tempest_tests/tests/database/test_persistor.py +++ b/vitrage_tempest_tests/tests/database/test_persistor.py @@ -16,7 +16,6 @@ import datetime import six from oslo_log import log as logging -from oslo_serialization import jsonutils from vitrage.common.constants import DatasourceProperties as DSProps from vitrage.datasources import NEUTRON_PORT_DATASOURCE from vitrage.datasources import NOVA_INSTANCE_DATASOURCE @@ -129,6 +128,4 @@ class TestEvents(BaseVitrageTempest): writen_events = self.db_connection.events.query( gt_collector_timestamp=time_before_action) - for event in writen_events: - event.payload = jsonutils.loads(event.payload) return writen_events