Skip to content
Snippets Groups Projects
DeviceModel.py 5.21 KiB
Newer Older
  • Learn to ignore specific revisions
  • # Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #      http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    import functools, logging
    from enum import Enum
    from typing import Dict, List
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    from common.orm.Database import Database
    from common.orm.backend.Tools import key_to_str
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    from common.orm.fields.EnumeratedField import EnumeratedField
    from common.orm.fields.ForeignKeyField import ForeignKeyField
    from common.orm.fields.PrimaryKeyField import PrimaryKeyField
    from common.orm.fields.StringField import StringField
    from common.orm.model.Model import Model
    
    from common.proto.context_pb2 import DeviceDriverEnum, DeviceOperationalStatusEnum
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    from .ConfigModel import ConfigModel
    from .Tools import grpc_to_enum
    
    LOGGER = logging.getLogger(__name__)
    
    class ORM_DeviceDriverEnum(Enum):
        UNDEFINED             = DeviceDriverEnum.DEVICEDRIVER_UNDEFINED
        OPENCONFIG            = DeviceDriverEnum.DEVICEDRIVER_OPENCONFIG
        TRANSPORT_API         = DeviceDriverEnum.DEVICEDRIVER_TRANSPORT_API
        P4                    = DeviceDriverEnum.DEVICEDRIVER_P4
        IETF_NETWORK_TOPOLOGY = DeviceDriverEnum.DEVICEDRIVER_IETF_NETWORK_TOPOLOGY
        ONF_TR_352            = DeviceDriverEnum.DEVICEDRIVER_ONF_TR_352
    
        XR                    = DeviceDriverEnum.DEVICEDRIVER_XR
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    
    grpc_to_enum__device_driver = functools.partial(
        grpc_to_enum, DeviceDriverEnum, ORM_DeviceDriverEnum)
    
    class ORM_DeviceOperationalStatusEnum(Enum):
        UNDEFINED = DeviceOperationalStatusEnum.DEVICEOPERATIONALSTATUS_UNDEFINED
        DISABLED  = DeviceOperationalStatusEnum.DEVICEOPERATIONALSTATUS_DISABLED
        ENABLED   = DeviceOperationalStatusEnum.DEVICEOPERATIONALSTATUS_ENABLED
    
    grpc_to_enum__device_operational_status = functools.partial(
        grpc_to_enum, DeviceOperationalStatusEnum, ORM_DeviceOperationalStatusEnum)
    
    class DeviceModel(Model):
        pk = PrimaryKeyField()
        device_uuid = StringField(required=True, allow_empty=False)
        device_type = StringField()
        device_config_fk = ForeignKeyField(ConfigModel)
        device_operational_status = EnumeratedField(ORM_DeviceOperationalStatusEnum, required=True)
    
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        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()
    
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        def dump_id(self) -> Dict:
            return {'device_uuid': {'uuid': self.device_uuid}}
    
        def dump_config(self) -> Dict:
            return ConfigModel(self.database, self.device_config_fk).dump()
    
        def dump_drivers(self) -> List[int]:
            db_driver_pks = self.references(DriverModel)
            return [DriverModel(self.database, pk).dump() for pk,_ in db_driver_pks]
    
        def dump_endpoints(self) -> List[Dict]:
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
            from .EndPointModel import EndPointModel # pylint: disable=import-outside-toplevel
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
            db_endpoints_pks = self.references(EndPointModel)
            return [EndPointModel(self.database, pk).dump() for pk,_ in db_endpoints_pks]
    
        def dump(   # pylint: disable=arguments-differ
                self, include_config_rules=True, include_drivers=True, include_endpoints=True
            ) -> Dict:
            result = {
                'device_id': self.dump_id(),
                'device_type': self.device_type,
                'device_operational_status': self.device_operational_status.value,
            }
            if include_config_rules: result.setdefault('device_config', {})['config_rules'] = self.dump_config()
            if include_drivers: result['device_drivers'] = self.dump_drivers()
            if include_endpoints: result['device_endpoints'] = self.dump_endpoints()
            return result
    
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    class DriverModel(Model): # pylint: disable=abstract-method
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        pk = PrimaryKeyField()
        device_fk = ForeignKeyField(DeviceModel)
        driver = EnumeratedField(ORM_DeviceDriverEnum, required=True)
    
        def dump(self) -> Dict:
            return self.driver.value
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    
    def set_drivers(database : Database, db_device : DeviceModel, grpc_device_drivers):
        db_device_pk = db_device.pk
        for driver in grpc_device_drivers:
            orm_driver = grpc_to_enum__device_driver(driver)
            str_device_driver_key = key_to_str([db_device_pk, orm_driver.name])
            db_device_driver = DriverModel(database, str_device_driver_key)
            db_device_driver.device_fk = db_device
            db_device_driver.driver = orm_driver
            db_device_driver.save()