diff --git a/src/context/service/__main__.py b/src/context/service/__main__.py index 154c8ff004640a67d283dbb779e74ce00f62ef93..937059202f65709840723544cdd383d2da213f4e 100644 --- a/src/context/service/__main__.py +++ b/src/context/service/__main__.py @@ -52,7 +52,7 @@ def main(): start_http_server(metrics_port) # Get database instance - db_uri = 'cockroachdb://root@10.152.183.121:26257/defaultdb?sslmode=disable' + db_uri = 'cockroachdb://root@10.152.183.66:26257/defaultdb?sslmode=disable' LOGGER.debug('Connecting to DB: {}'.format(db_uri)) # engine = create_engine(db_uri, echo=False) diff --git a/src/context/service/database/TopologyModel.py b/src/context/service/database/TopologyModel.py index 9f117c73c74dae9af7b127c792f0697e8ea397a0..ec8427b07f8ad3fab775f8a5fb1711b62b36d0ce 100644 --- a/src/context/service/database/TopologyModel.py +++ b/src/context/service/database/TopologyModel.py @@ -27,11 +27,11 @@ LOGGER = logging.getLogger(__name__) class TopologyModel(Base): __tablename__ = 'Topology' - context_fk = Column(UUID(as_uuid=False), ForeignKey("Context.context_uuid"), nullable=False) - topology_uuid = Column(UUID(as_uuid=False), primary_key=True, nullable=False) + context_uuid = Column(UUID(as_uuid=False), ForeignKey("Context.context_uuid"), primary_key=True) + topology_uuid = Column(UUID(as_uuid=False), primary_key=True) # Relationships - context = relationship("ContextModel", back_populates="topology", lazy="joined") + context = relationship("ContextModel", back_populates="topology", lazy="subquery") def dump_id(self) -> Dict: context_id = self.context.dump_id() diff --git a/src/context/service/grpc_server/ContextServiceServicerImpl.py b/src/context/service/grpc_server/ContextServiceServicerImpl.py index 9952444b7ac004a0c18748ad2921431ac012de6d..5439b6c068cb9ad624913bbfcea822185613d220 100644 --- a/src/context/service/grpc_server/ContextServiceServicerImpl.py +++ b/src/context/service/grpc_server/ContextServiceServicerImpl.py @@ -170,11 +170,10 @@ class ContextServiceServicerImpl(ContextServiceServicer): @safe_and_metered_rpc_method(METRICS, LOGGER) def ListTopologyIds(self, request: ContextId, context : grpc.ServicerContext) -> TopologyIdList: - with self.lock: - context_uuid = request.context_uuid.uuid + context_uuid = request.context_uuid.uuid - with self.session() as session: - result = session.query(ContextModel).options(selectinload(ContextModel.topology)).filter_by(context_uuid=context_uuid).one_or_none() + with self.session() as session: + result = session.query(ContextModel).options(selectinload(ContextModel.topology)).filter_by(context_uuid=context_uuid).one_or_none() if not result: raise NotFoundException(ContextModel.__name__.replace('Model', ''), context_uuid) @@ -188,11 +187,11 @@ class ContextServiceServicerImpl(ContextServiceServicer): with self.session() as session: result = session.query(ContextModel).options(selectinload(ContextModel.topology)).filter_by( context_uuid=context_uuid).one_or_none() - if not result: - raise NotFoundException(ContextModel.__name__.replace('Model', ''), context_uuid) + if not result: + raise NotFoundException(ContextModel.__name__.replace('Model', ''), context_uuid) - db_topologies = result.topology - return TopologyList(topologies=[db_topology.dump() for db_topology in db_topologies]) + db_topologies = result.topology + return TopologyList(topologies=[db_topology.dump() for db_topology in db_topologies]) @safe_and_metered_rpc_method(METRICS, LOGGER) def GetTopology(self, request: TopologyId, context : grpc.ServicerContext) -> Topology: @@ -213,22 +212,19 @@ class ContextServiceServicerImpl(ContextServiceServicer): context_uuid = request.topology_id.context_id.context_uuid.uuid topology_uuid = request.topology_id.topology_uuid.uuid with self.session() as session: - db_context: ContextModel = session.query(ContextModel).filter_by(context_uuid=context_uuid).one() - - topology_add = TopologyModel(topology_uuid=topology_uuid, context_fk=context_uuid) - topology_add.context = db_context + topology_add = TopologyModel(topology_uuid=topology_uuid, context_uuid=context_uuid) updated = True - result = session.query(TopologyModel).join(TopologyModel.context).filter(TopologyModel.topology_uuid==topology_uuid).options(contains_eager(TopologyModel.context)).one_or_none() - + result = session.query(TopologyModel).join(TopologyModel.context).filter(TopologyModel.topology_uuid==topology_uuid).one_or_none() if not result: updated = False session.merge(topology_add) session.commit() + result = session.query(TopologyModel).join(TopologyModel.context).filter(TopologyModel.topology_uuid==topology_uuid).one_or_none() - event_type = EventTypeEnum.EVENTTYPE_UPDATE if updated else EventTypeEnum.EVENTTYPE_CREATE - dict_topology_id = topology_add.dump_id() - notify_event(self.messagebroker, TOPIC_TOPOLOGY, event_type, {'topology_id': dict_topology_id}) - return TopologyId(**dict_topology_id) + event_type = EventTypeEnum.EVENTTYPE_UPDATE if updated else EventTypeEnum.EVENTTYPE_CREATE + dict_topology_id = result.dump_id() + notify_event(self.messagebroker, TOPIC_TOPOLOGY, event_type, {'topology_id': dict_topology_id}) + return TopologyId(**dict_topology_id) @safe_and_metered_rpc_method(METRICS, LOGGER) def RemoveTopology(self, request: TopologyId, context : grpc.ServicerContext) -> Empty: @@ -236,12 +232,12 @@ class ContextServiceServicerImpl(ContextServiceServicer): topology_uuid = request.topology_uuid.uuid with self.session() as session: - result = session.query(TopologyModel).filter_by(topology_uuid=topology_uuid, context_fk=context_uuid).one_or_none() + result = session.query(TopologyModel).filter_by(topology_uuid=topology_uuid, context_uuid=context_uuid).one_or_none() if not result: return Empty() dict_topology_id = result.dump_id() - session.query(TopologyModel).filter_by(topology_uuid=topology_uuid, context_fk=context_uuid).delete() + session.query(TopologyModel).filter_by(topology_uuid=topology_uuid, context_uuid=context_uuid).delete() session.commit() event_type = EventTypeEnum.EVENTTYPE_REMOVE notify_event(self.messagebroker, TOPIC_TOPOLOGY, event_type, {'topology_id': dict_topology_id}) diff --git a/src/context/tests/test_unitary.py b/src/context/tests/test_unitary.py index b7a9cee926600e0371088b188e83ffc8fcbb86e5..e202de498253432676bb5acee304874c2161787c 100644 --- a/src/context/tests/test_unitary.py +++ b/src/context/tests/test_unitary.py @@ -84,7 +84,7 @@ def context_s_mb(request) -> Tuple[Session, MessageBroker]: msg = 'Running scenario {:s} db_session={:s}, mb_backend={:s}, mb_settings={:s}...' LOGGER.info(msg.format(str(name), str(db_session), str(mb_backend.value), str(mb_settings))) - db_uri = 'cockroachdb://root@10.152.183.121:26257/defaultdb?sslmode=disable' + db_uri = 'cockroachdb://root@10.152.183.66:26257/defaultdb?sslmode=disable' LOGGER.debug('Connecting to DB: {}'.format(db_uri)) try: