Commit c47c372f authored by Carlos Manso's avatar Carlos Manso
Browse files

Update scalability

parent cf2a36a2
Loading
Loading
Loading
Loading
+34 −16
Original line number Diff line number Diff line
@@ -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:
@@ -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):
@@ -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

@@ -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:
@@ -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
+2 −8
Original line number Diff line number Diff line
@@ -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 = []
@@ -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 = {
+1 −24
Original line number Diff line number Diff line
@@ -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}}

@@ -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
+1 −1
Original line number Diff line number Diff line
@@ -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__)
+27 −27
Original line number Diff line number Diff line
@@ -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