Loading src/context/service/Database.py +34 −16 Original line number Diff line number Diff line Loading @@ -16,6 +16,9 @@ class Database(Session): super().__init__() self.session = session def get_session(self): return self.session def get_all(self, model): result = [] with self.session() as session: Loading @@ -27,21 +30,20 @@ class Database(Session): def create_or_update(self, model): with self.session() as session: att = getattr(model, model.main_pk_name()) obj = self.get_object(type(model), att) filt = {model.main_pk_name(): att} t_model = type(model) found = session.query(t_model).filter_by(**filt).one_or_none() if found: obj = session.query(t_model).filter_by(**filt).one_or_none() if obj: for key in obj.__table__.columns.keys(): setattr(obj, key, getattr(model, key)) found = True session.commit() return obj, found else: found = False session.merge(model) session.add(model) session.commit() obj = self.get_object(t_model, att) return model, found def create(self, model): Loading Loading @@ -85,7 +87,6 @@ class Database(Session): for table in meta.sorted_tables: for row in engine.execute(table.select()): result.append((table.name, dict(row))) LOGGER.info(result) return result Loading @@ -98,10 +99,27 @@ class Database(Session): if raise_if_not_found: raise NotFoundException(model_class.__name__.replace('Model', ''), main_key) return get dump = None if hasattr(get, 'dump'): dump = get.dump() return get, dump def get_object_filter(self, model_class: Base, filt, raise_if_not_found=False): with self.session() as session: get = session.query(model_class).filter_by(**filt).all() if not get: if raise_if_not_found: raise NotFoundException(model_class.__name__.replace('Model', '')) else: return None, None if isinstance(get, list): return get, [obj.dump() for obj in get] return get, get.dump() def get_or_create(self, model_class: Base, key_parts: List[str], filt=None) -> Tuple[Base, bool]: str_key = key_to_str(key_parts) def get_or_create(self, model_class: Base, key_parts: str, filt=None) -> Tuple[Base, bool]: if not filt: filt = {model_class.main_pk_name(): key_parts} with self.session() as session: Loading @@ -110,7 +128,7 @@ class Database(Session): return get, False else: obj = model_class() setattr(obj, model_class.main_pk_name(), str_key) setattr(obj, model_class.main_pk_name(), key_parts) session.add(obj) session.commit() return obj, True src/context/service/database/ConfigModel.py +2 −8 Original line number Diff line number Diff line Loading @@ -40,13 +40,7 @@ class ConfigModel(Base): # pylint: disable=abstract-method config_uuid = Column(UUID(as_uuid=False), primary_key=True) # Relationships config_rule = relationship("ConfigRuleModel", back_populates="config", lazy='joined') def delete(self) -> None: db_config_rule_pks = self.references(ConfigRuleModel) for pk,_ in db_config_rule_pks: ConfigRuleModel(self.database, pk).delete() super().delete() config_rule = relationship("ConfigRuleModel", cascade="all,delete", back_populates="config", lazy='joined') def dump(self) -> List[Dict]: config_rules = [] Loading Loading @@ -75,7 +69,7 @@ class ConfigRuleModel(Base): # pylint: disable=abstract-method ) # Relationships config = relationship("ConfigModel", back_populates="config_rule") config = relationship("ConfigModel", passive_deletes=True, back_populates="config_rule") def dump(self, include_position=True) -> Dict: # pylint: disable=arguments-differ result = { Loading src/context/service/database/DeviceModel.py +1 −24 Original line number Diff line number Diff line Loading @@ -54,30 +54,10 @@ class DeviceModel(Base): native_enum=False)) # Relationships device_config = relationship("ConfigModel", passive_deletes="all, delete", lazy="joined") device_config = relationship("ConfigModel", passive_deletes=True, lazy="joined") driver = relationship("DriverModel", passive_deletes=True, back_populates="device") endpoints = relationship("EndPointModel", passive_deletes=True, back_populates="device") # topology = relationship("TopologyModel", lazy="joined") # def delete(self) -> None: # # pylint: disable=import-outside-toplevel # from .EndPointModel import EndPointModel # from .RelationModels import TopologyDeviceModel # # for db_endpoint_pk,_ in self.references(EndPointModel): # EndPointModel(self.database, db_endpoint_pk).delete() # # for db_topology_device_pk,_ in self.references(TopologyDeviceModel): # TopologyDeviceModel(self.database, db_topology_device_pk).delete() # # for db_driver_pk,_ in self.references(DriverModel): # DriverModel(self.database, db_driver_pk).delete() # # super().delete() # # ConfigModel(self.database, self.device_config_fk).delete() def dump_id(self) -> Dict: return {'device_uuid': {'uuid': self.device_uuid}} Loading @@ -86,10 +66,7 @@ class DeviceModel(Base): def dump_drivers(self) -> List[int]: response = [] for a in self.driver: LOGGER.info('DUMPPPPPPPPPPPPPPPPPPPPPIIIIIIIIIIIIIIIIIIIIIIINNNNNNNNNNNNNNNGGGGGGGGGGGGGGGGGGg') LOGGER.info('aasdfadsf: {}'.format(a.dump())) response.append(a.dump()) return response Loading src/context/service/database/EndPointModel.py +1 −1 Original line number Diff line number Diff line Loading @@ -20,7 +20,7 @@ from common.orm.backend.Tools import key_to_str from common.proto.context_pb2 import EndPointId from .KpiSampleType import ORM_KpiSampleTypeEnum, grpc_to_enum__kpi_sample_type from sqlalchemy import Column, ForeignKey, String, Enum, ForeignKeyConstraint from sqlalchemy.dialects.postgresql import UUID, ARRAY from sqlalchemy.dialects.postgresql import UUID from context.service.database.Base import Base from sqlalchemy.orm import relationship LOGGER = logging.getLogger(__name__) Loading src/context/service/database/LinkModel.py +27 −27 Original line number Diff line number Diff line Loading @@ -14,39 +14,39 @@ import logging, operator from typing import Dict, List from common.orm.fields.PrimaryKeyField import PrimaryKeyField from common.orm.fields.StringField import StringField from common.orm.model.Model import Model from common.orm.HighLevel import get_related_objects from sqlalchemy import Column, ForeignKey from sqlalchemy.dialects.postgresql import UUID from context.service.database.Base import Base from sqlalchemy.orm import relationship LOGGER = logging.getLogger(__name__) class LinkModel(Model): pk = PrimaryKeyField() link_uuid = StringField(required=True, allow_empty=False) class LinkModel(Base): __tablename__ = 'Link' link_uuid = Column(UUID(as_uuid=False), primary_key=True, unique=True) def delete(self) -> None: #pylint: disable=import-outside-toplevel from .RelationModels import LinkEndPointModel, TopologyLinkModel for db_link_endpoint_pk,_ in self.references(LinkEndPointModel): LinkEndPointModel(self.database, db_link_endpoint_pk).delete() for db_topology_link_pk,_ in self.references(TopologyLinkModel): TopologyLinkModel(self.database, db_topology_link_pk).delete() super().delete() @staticmethod def main_pk_name(): return 'link_uuid' def dump_id(self) -> Dict: return {'link_uuid': {'uuid': self.link_uuid}} def dump_endpoint_ids(self) -> List[Dict]: from .RelationModels import LinkEndPointModel # pylint: disable=import-outside-toplevel db_endpoints = get_related_objects(self, LinkEndPointModel, 'endpoint_fk') return [db_endpoint.dump_id() for db_endpoint in sorted(db_endpoints, key=operator.attrgetter('pk'))] def dump(self) -> Dict: return { 'link_id': self.dump_id(), 'link_endpoint_ids': self.dump_endpoint_ids(), return [endpoint.dump_id() for endpoint in self.endpoints] def dump(self, endpoints=None) -> Dict: result = { 'link_id': self.dump_id() } if endpoints: result['link_endpoint_ids'] = [] for endpoint in endpoints: dump = endpoint.dump_id() LOGGER.info(dump) result['link_endpoint_ids'].append(dump) LOGGER.info(result['link_endpoint_ids']) LOGGER.info(result) return result Loading
src/context/service/Database.py +34 −16 Original line number Diff line number Diff line Loading @@ -16,6 +16,9 @@ class Database(Session): super().__init__() self.session = session def get_session(self): return self.session def get_all(self, model): result = [] with self.session() as session: Loading @@ -27,21 +30,20 @@ class Database(Session): def create_or_update(self, model): with self.session() as session: att = getattr(model, model.main_pk_name()) obj = self.get_object(type(model), att) filt = {model.main_pk_name(): att} t_model = type(model) found = session.query(t_model).filter_by(**filt).one_or_none() if found: obj = session.query(t_model).filter_by(**filt).one_or_none() if obj: for key in obj.__table__.columns.keys(): setattr(obj, key, getattr(model, key)) found = True session.commit() return obj, found else: found = False session.merge(model) session.add(model) session.commit() obj = self.get_object(t_model, att) return model, found def create(self, model): Loading Loading @@ -85,7 +87,6 @@ class Database(Session): for table in meta.sorted_tables: for row in engine.execute(table.select()): result.append((table.name, dict(row))) LOGGER.info(result) return result Loading @@ -98,10 +99,27 @@ class Database(Session): if raise_if_not_found: raise NotFoundException(model_class.__name__.replace('Model', ''), main_key) return get dump = None if hasattr(get, 'dump'): dump = get.dump() return get, dump def get_object_filter(self, model_class: Base, filt, raise_if_not_found=False): with self.session() as session: get = session.query(model_class).filter_by(**filt).all() if not get: if raise_if_not_found: raise NotFoundException(model_class.__name__.replace('Model', '')) else: return None, None if isinstance(get, list): return get, [obj.dump() for obj in get] return get, get.dump() def get_or_create(self, model_class: Base, key_parts: List[str], filt=None) -> Tuple[Base, bool]: str_key = key_to_str(key_parts) def get_or_create(self, model_class: Base, key_parts: str, filt=None) -> Tuple[Base, bool]: if not filt: filt = {model_class.main_pk_name(): key_parts} with self.session() as session: Loading @@ -110,7 +128,7 @@ class Database(Session): return get, False else: obj = model_class() setattr(obj, model_class.main_pk_name(), str_key) setattr(obj, model_class.main_pk_name(), key_parts) session.add(obj) session.commit() return obj, True
src/context/service/database/ConfigModel.py +2 −8 Original line number Diff line number Diff line Loading @@ -40,13 +40,7 @@ class ConfigModel(Base): # pylint: disable=abstract-method config_uuid = Column(UUID(as_uuid=False), primary_key=True) # Relationships config_rule = relationship("ConfigRuleModel", back_populates="config", lazy='joined') def delete(self) -> None: db_config_rule_pks = self.references(ConfigRuleModel) for pk,_ in db_config_rule_pks: ConfigRuleModel(self.database, pk).delete() super().delete() config_rule = relationship("ConfigRuleModel", cascade="all,delete", back_populates="config", lazy='joined') def dump(self) -> List[Dict]: config_rules = [] Loading Loading @@ -75,7 +69,7 @@ class ConfigRuleModel(Base): # pylint: disable=abstract-method ) # Relationships config = relationship("ConfigModel", back_populates="config_rule") config = relationship("ConfigModel", passive_deletes=True, back_populates="config_rule") def dump(self, include_position=True) -> Dict: # pylint: disable=arguments-differ result = { Loading
src/context/service/database/DeviceModel.py +1 −24 Original line number Diff line number Diff line Loading @@ -54,30 +54,10 @@ class DeviceModel(Base): native_enum=False)) # Relationships device_config = relationship("ConfigModel", passive_deletes="all, delete", lazy="joined") device_config = relationship("ConfigModel", passive_deletes=True, lazy="joined") driver = relationship("DriverModel", passive_deletes=True, back_populates="device") endpoints = relationship("EndPointModel", passive_deletes=True, back_populates="device") # topology = relationship("TopologyModel", lazy="joined") # def delete(self) -> None: # # pylint: disable=import-outside-toplevel # from .EndPointModel import EndPointModel # from .RelationModels import TopologyDeviceModel # # for db_endpoint_pk,_ in self.references(EndPointModel): # EndPointModel(self.database, db_endpoint_pk).delete() # # for db_topology_device_pk,_ in self.references(TopologyDeviceModel): # TopologyDeviceModel(self.database, db_topology_device_pk).delete() # # for db_driver_pk,_ in self.references(DriverModel): # DriverModel(self.database, db_driver_pk).delete() # # super().delete() # # ConfigModel(self.database, self.device_config_fk).delete() def dump_id(self) -> Dict: return {'device_uuid': {'uuid': self.device_uuid}} Loading @@ -86,10 +66,7 @@ class DeviceModel(Base): def dump_drivers(self) -> List[int]: response = [] for a in self.driver: LOGGER.info('DUMPPPPPPPPPPPPPPPPPPPPPIIIIIIIIIIIIIIIIIIIIIIINNNNNNNNNNNNNNNGGGGGGGGGGGGGGGGGGg') LOGGER.info('aasdfadsf: {}'.format(a.dump())) response.append(a.dump()) return response Loading
src/context/service/database/EndPointModel.py +1 −1 Original line number Diff line number Diff line Loading @@ -20,7 +20,7 @@ from common.orm.backend.Tools import key_to_str from common.proto.context_pb2 import EndPointId from .KpiSampleType import ORM_KpiSampleTypeEnum, grpc_to_enum__kpi_sample_type from sqlalchemy import Column, ForeignKey, String, Enum, ForeignKeyConstraint from sqlalchemy.dialects.postgresql import UUID, ARRAY from sqlalchemy.dialects.postgresql import UUID from context.service.database.Base import Base from sqlalchemy.orm import relationship LOGGER = logging.getLogger(__name__) Loading
src/context/service/database/LinkModel.py +27 −27 Original line number Diff line number Diff line Loading @@ -14,39 +14,39 @@ import logging, operator from typing import Dict, List from common.orm.fields.PrimaryKeyField import PrimaryKeyField from common.orm.fields.StringField import StringField from common.orm.model.Model import Model from common.orm.HighLevel import get_related_objects from sqlalchemy import Column, ForeignKey from sqlalchemy.dialects.postgresql import UUID from context.service.database.Base import Base from sqlalchemy.orm import relationship LOGGER = logging.getLogger(__name__) class LinkModel(Model): pk = PrimaryKeyField() link_uuid = StringField(required=True, allow_empty=False) class LinkModel(Base): __tablename__ = 'Link' link_uuid = Column(UUID(as_uuid=False), primary_key=True, unique=True) def delete(self) -> None: #pylint: disable=import-outside-toplevel from .RelationModels import LinkEndPointModel, TopologyLinkModel for db_link_endpoint_pk,_ in self.references(LinkEndPointModel): LinkEndPointModel(self.database, db_link_endpoint_pk).delete() for db_topology_link_pk,_ in self.references(TopologyLinkModel): TopologyLinkModel(self.database, db_topology_link_pk).delete() super().delete() @staticmethod def main_pk_name(): return 'link_uuid' def dump_id(self) -> Dict: return {'link_uuid': {'uuid': self.link_uuid}} def dump_endpoint_ids(self) -> List[Dict]: from .RelationModels import LinkEndPointModel # pylint: disable=import-outside-toplevel db_endpoints = get_related_objects(self, LinkEndPointModel, 'endpoint_fk') return [db_endpoint.dump_id() for db_endpoint in sorted(db_endpoints, key=operator.attrgetter('pk'))] def dump(self) -> Dict: return { 'link_id': self.dump_id(), 'link_endpoint_ids': self.dump_endpoint_ids(), return [endpoint.dump_id() for endpoint in self.endpoints] def dump(self, endpoints=None) -> Dict: result = { 'link_id': self.dump_id() } if endpoints: result['link_endpoint_ids'] = [] for endpoint in endpoints: dump = endpoint.dump_id() LOGGER.info(dump) result['link_endpoint_ids'].append(dump) LOGGER.info(result['link_endpoint_ids']) LOGGER.info(result) return result