diff --git a/src/context/service/ContextServiceServicerImpl.py b/src/context/service/ContextServiceServicerImpl.py index f51e725cd7763253c86851561fb69724cf77f847..6db5b99e7b1c6148cfe72c6d3e393e8841944802 100644 --- a/src/context/service/ContextServiceServicerImpl.py +++ b/src/context/service/ContextServiceServicerImpl.py @@ -58,7 +58,7 @@ from context.service.database.ContextModel import ContextModel #from context.service.database.ServiceModel import ( # ServiceModel, grpc_to_enum__service_status, grpc_to_enum__service_type) #from context.service.database.SliceModel import SliceModel, grpc_to_enum__slice_status -#from context.service.database.TopologyModel import TopologyModel +from context.service.database.TopologyModel import TopologyModel #from .Constants import ( # CONSUME_TIMEOUT, TOPIC_CONNECTION, TOPIC_CONTEXT, TOPIC_DEVICE, TOPIC_LINK, TOPIC_SERVICE, TOPIC_SLICE, # TOPIC_TOPOLOGY) @@ -111,8 +111,10 @@ class ContextServiceServicerImpl(ContextServiceServicer, ContextPolicyServiceSer def GetContext(self, request: ContextId, context : grpc.ServicerContext) -> Context: context_uuid = request.context_uuid.uuid def callback(session : Session) -> Optional[Dict]: - obj : Optional[ContextModel] = \ - session.query(ContextModel).filter_by(context_uuid=context_uuid).one_or_none() + obj : Optional[ContextModel] = session\ + .query(ContextModel)\ + .filter_by(context_uuid=context_uuid)\ + .one_or_none() return None if obj is None else obj.dump() obj = run_transaction(sessionmaker(bind=self.db_engine), callback) if obj is None: raise NotFoundException(ContextModel.__name__.replace('Model', ''), context_uuid) @@ -202,47 +204,50 @@ class ContextServiceServicerImpl(ContextServiceServicer, ContextPolicyServiceSer def ListTopologyIds(self, request: ContextId, context : grpc.ServicerContext) -> TopologyIdList: 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() - if not result: - raise NotFoundException(ContextModel.__name__.replace('Model', ''), context_uuid) - - db_topologies = result.topology - return TopologyIdList(topology_ids=[db_topology.dump_id() for db_topology in db_topologies]) - return ContextIdList(context_ids=run_transaction(sessionmaker(bind=self.db_engine), callback)) - - def callback(session : Session) -> List[Dict]: - obj_list : List[ContextModel] = session.query(ContextModel).all() + obj_list : List[TopologyModel] = session.query(TopologyModel).filter_by(context_uuid=context_uuid).all() + #.options(selectinload(ContextModel.topology)).filter_by(context_uuid=context_uuid).one_or_none() return [obj.dump_id() for obj in obj_list] - + + #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) + # db_topologies = result.topology + return TopologyIdList(topology_ids=run_transaction(sessionmaker(bind=self.db_engine), callback)) @safe_and_metered_rpc_method(METRICS, LOGGER) - def ListContexts(self, request: Empty, context : grpc.ServicerContext) -> ContextList: + def ListTopologies(self, request: ContextId, context : grpc.ServicerContext) -> TopologyList: + context_uuid = request.context_uuid.uuid + def callback(session : Session) -> List[Dict]: - obj_list : List[ContextModel] = session.query(ContextModel).all() + obj_list : List[TopologyModel] = session.query(TopologyModel).filter_by(context_uuid=context_uuid).all() + #.options(selectinload(ContextModel.topology)).filter_by(context_uuid=context_uuid).one_or_none() return [obj.dump() for obj in obj_list] - return ContextList(contexts=run_transaction(sessionmaker(bind=self.db_engine), callback)) + #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) + # db_topologies = result.topology + return TopologyList(topologies=run_transaction(sessionmaker(bind=self.db_engine), callback)) + @safe_and_metered_rpc_method(METRICS, LOGGER) + def GetTopology(self, request: TopologyId, context : grpc.ServicerContext) -> Topology: + context_uuid = request.context_id.context_uuid.uuid + topology_uuid = request.topology_uuid.uuid + + def callback(session : Session) -> Optional[Dict]: + obj : Optional[TopologyModel] = session\ + .query(TopologyModel)\ + .filter_by(context_uuid=context_uuid, topology_uuid=topology_uuid)\ + .one_or_none() + return None if obj is None else obj.dump() + obj = run_transaction(sessionmaker(bind=self.db_engine), callback) + if obj is None: raise NotFoundException(TopologyModel.__name__.replace('Model', ''), context_uuid) + return Topology(**obj) -# @safe_and_metered_rpc_method(METRICS, LOGGER) -# def ListTopologies(self, request: ContextId, context : grpc.ServicerContext) -> TopologyList: -# 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() -# 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]) -# -# @safe_and_metered_rpc_method(METRICS, LOGGER) -# def GetTopology(self, request: TopologyId, context : grpc.ServicerContext) -> Topology: -# topology_uuid = request.topology_uuid.uuid -# # result, dump = self.database.get_object(TopologyModel, topology_uuid, True) # with self.session() as session: # devs = None @@ -265,8 +270,7 @@ class ContextServiceServicerImpl(ContextServiceServicer, ContextPolicyServiceSer # links.append(session.query(LinkModel).filter_by(**filt).one()) # # return Topology(**result.dump(devs, links)) -# -# + # @safe_and_metered_rpc_method(METRICS, LOGGER) # def SetTopology(self, request: Topology, context : grpc.ServicerContext) -> TopologyId: # context_uuid = request.topology_id.context_id.context_uuid.uuid @@ -300,7 +304,7 @@ class ContextServiceServicerImpl(ContextServiceServicer, ContextPolicyServiceSer # dict_topology_id = db_topology.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: # context_uuid = request.context_id.context_uuid.uuid @@ -317,13 +321,12 @@ class ContextServiceServicerImpl(ContextServiceServicer, ContextPolicyServiceSer # event_type = EventTypeEnum.EVENTTYPE_REMOVE # notify_event(self.messagebroker, TOPIC_TOPOLOGY, event_type, {'topology_id': dict_topology_id}) # return Empty() -# -## @safe_and_metered_rpc_method(METRICS, LOGGER) -## def GetTopologyEvents(self, request: Empty, context : grpc.ServicerContext) -> Iterator[TopologyEvent]: -## for message in self.messagebroker.consume({TOPIC_TOPOLOGY}, consume_timeout=CONSUME_TIMEOUT): -## yield TopologyEvent(**json.loads(message.content)) -# -# + +# @safe_and_metered_rpc_method(METRICS, LOGGER) +# def GetTopologyEvents(self, request: Empty, context : grpc.ServicerContext) -> Iterator[TopologyEvent]: +# for message in self.messagebroker.consume({TOPIC_TOPOLOGY}, consume_timeout=CONSUME_TIMEOUT): +# yield TopologyEvent(**json.loads(message.content)) + # # ----- Device ----------------------------------------------------------------------------------------------------- # # @safe_and_metered_rpc_method(METRICS, LOGGER) diff --git a/src/context/service/database/ContextModel.py b/src/context/service/database/ContextModel.py index 9ad5e0bcb25a227005affb902eb5517666381a87..241198d3f798830ff2206911c71933307c6976aa 100644 --- a/src/context/service/database/ContextModel.py +++ b/src/context/service/database/ContextModel.py @@ -16,8 +16,8 @@ import logging from typing import Dict from sqlalchemy import Column, Float, String from sqlalchemy.dialects.postgresql import UUID +from sqlalchemy.orm import relationship from ._Base import _Base -#from sqlalchemy.orm import relationship LOGGER = logging.getLogger(__name__) @@ -27,7 +27,7 @@ class ContextModel(_Base): context_name = Column(String(), nullable=False) created_at = Column(Float) - #topology = relationship('TopologyModel', back_populates='context') + topology = relationship('TopologyModel', back_populates='context') def dump_id(self) -> Dict: return {'context_uuid': {'uuid': self.context_uuid}} @@ -48,8 +48,13 @@ class ContextModel(_Base): return [TopologyModel(self.database, pk).dump_id() for pk,_ in db_topology_pks] """ - def dump(self, include_services=True, include_topologies=True) -> Dict: # pylint: disable=arguments-differ + def dump(self, + include_services : bool = True, # pylint: disable=arguments-differ + include_slices : bool = True, # pylint: disable=arguments-differ + include_topologies : bool = True # pylint: disable=arguments-differ + ) -> Dict: result = {'context_id': self.dump_id(), 'name': self.context_name} # if include_services: result['service_ids'] = self.dump_service_ids() + # if include_slices: result['slice_ids'] = self.dump_slice_ids() # if include_topologies: result['topology_ids'] = self.dump_topology_ids() return result diff --git a/src/context/service/database/TopologyModel.py b/src/context/service/database/TopologyModel.py index 0a56981638d51b6a4fced1620abd63618bf0e716..102e3ae3f11ceace9e9b08a431a8ba32c15bc045 100644 --- a/src/context/service/database/TopologyModel.py +++ b/src/context/service/database/TopologyModel.py @@ -12,21 +12,22 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging, operator -from typing import Dict, List -from sqlalchemy.orm import relationship +import logging #, operator +from typing import Dict #, List from sqlalchemy import Column, ForeignKey from sqlalchemy.dialects.postgresql import UUID -from context.service.database._Base import Base +from sqlalchemy.orm import relationship +from ._Base import _Base + LOGGER = logging.getLogger(__name__) -class TopologyModel(Base): +class TopologyModel(_Base): __tablename__ = 'Topology' - context_uuid = Column(UUID(as_uuid=False), ForeignKey("Context.context_uuid"), primary_key=True) + context_uuid = Column(UUID(as_uuid=False), ForeignKey('context.context_uuid'), primary_key=True) topology_uuid = Column(UUID(as_uuid=False), primary_key=True, unique=True) # Relationships - context = relationship("ContextModel", back_populates="topology") + context = relationship('ContextModel', back_populates='topology') def dump_id(self) -> Dict: context_id = self.context.dump_id() @@ -35,16 +36,16 @@ class TopologyModel(Base): 'topology_uuid': {'uuid': self.topology_uuid}, } - @staticmethod - def main_pk_name() -> str: - return 'topology_uuid' + #@staticmethod + #def main_pk_name() -> str: + # return 'topology_uuid' - def dump( # pylint: disable=arguments-differ - self, devices=None, links=None - ) -> Dict: + def dump(self) -> Dict: + # pylint: disable=arguments-differ result = {'topology_id': self.dump_id()} - if devices: - result['device_ids'] = [device.dump_id() for device in devices] - if links: - result['link_ids'] = [link.dump_id() for link in links] + # params: , devices=None, links=None + #if devices: + # result['device_ids'] = [device.dump_id() for device in devices] + #if links: + # result['link_ids'] = [link.dump_id() for link in links] return result diff --git a/src/context/service/database/__init__.py b/src/context/service/database/__init__.py index 9802657861aa8d2cf99a1e5c64daefbacf587b92..c4940470a23d6b672e1389b32419894d0563ab70 100644 --- a/src/context/service/database/__init__.py +++ b/src/context/service/database/__init__.py @@ -14,3 +14,4 @@ from ._Base import _Base, rebuild_database from .ContextModel import ContextModel +from .TopologyModel import TopologyModel