Skip to content
Snippets Groups Projects
Select Git revision
  • feat/320-cttc-ietf-simap-basic-support-with-kafka-yang-push
  • feat/327-tid-new-service-to-ipowdm-controller-to-manage-transceivers-configuration-on-external-agent
  • feat/325-tid-nbi-e2e-to-manage-e2e-path-computation
  • feat/326-tid-external-management-of-devices-telemetry-nbi
  • openroadm-flex-grid
  • feat/314-tid-new-service-for-ipowdm-configuration-fron-orchestrator-to-ipowdm-controller
  • feat/310-cttc-implement-nbi-connector-to-interface-with-osm-client
  • feat/292-cttc-implement-integration-test-for-ryu-openflow
  • develop protected
  • feat/324-tid-nbi-ietf_l3vpn-deploy-fail
  • feat/321-add-support-for-gnmi-configuration-via-proto
  • feat/322-add-read-support-for-ipinfusion-devices-via-netconf
  • feat/323-add-support-for-restconf-protocol-in-devices
  • feat/policy-refactor
  • feat/192-cttc-implement-telemetry-backend-collector-gnmi-openconfig
  • feat/307-update-python-version
  • feat/telemetry-collector-int
  • feat/automation-revisited
  • feat/313-tid-new-tapi-service-for-lsp-configuration-2
  • cnit_tapi
  • v5.0.0 protected
  • v4.0.0 protected
  • demo-dpiab-eucnc2024
  • v3.0.0 protected
  • v2.1.0 protected
  • v2.0.0 protected
  • v1.0.0 protected
27 results

ConstraintModel.py

Blame
  • Lluis Gifre's avatar
    Lluis Gifre Renom authored
    - Arranged .gitignore & .gitkeep files in common proto folder
    - Created specific run_tests_locally script for Context component
    - Moved imports from *.proto folder to common.proto folder
    - Adapted common.tools.object_factory to new proto definitions for ConfigRule and Constraint
    - Extended common.tools.type_checkers to new proto definitions for ConfigRule and Constraint
    - Removed context's genproto.sh script
    - Adapted Events generated to new timestamp data type
    - Minor code and linting fixing
    6908f606
    History
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    ConstraintModel.py 4.19 KiB
    # 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.
    
    import logging, operator
    from typing import Dict, List, Tuple, Union
    from common.orm.Database import Database
    from common.orm.HighLevel import get_or_create_object, update_or_create_object
    from common.orm.backend.Tools import key_to_str
    from common.orm.fields.ForeignKeyField import ForeignKeyField
    from common.orm.fields.IntegerField import IntegerField
    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 Constraint
    from common.tools.grpc.Tools import grpc_message_to_json_string
    from context.service.database.Tools import fast_hasher, remove_dict_key
    
    LOGGER = logging.getLogger(__name__)
    
    class ConstraintsModel(Model): # pylint: disable=abstract-method
        pk = PrimaryKeyField()
    
        def dump(self) -> List[Dict]:
            db_constraint_pks = self.references(ConstraintModel)
            constraints = [ConstraintModel(self.database, pk).dump(include_position=True) for pk,_ in db_constraint_pks]
            constraints = sorted(constraints, key=operator.itemgetter('position'))
            return [remove_dict_key(constraint, 'position') for constraint in constraints]
    
    class ConstraintModel(Model): # pylint: disable=abstract-method
        pk = PrimaryKeyField()
        constraints_fk = ForeignKeyField(ConstraintsModel)
        position = IntegerField(min_value=0, required=True)
        constraint_type = StringField(required=True, allow_empty=False)
        constraint_value = StringField(required=True, allow_empty=False)
    
        def dump(self, include_position=True) -> Dict: # pylint: disable=arguments-differ
            result = {
                'custom': {
                    'constraint_type': self.constraint_type,
                    'constraint_value': self.constraint_value,
                },
            }
            if include_position: result['position'] = self.position
            return result
    
    def set_constraint(
        database : Database, db_constraints : ConstraintsModel, grpc_constraint, position : int
    ) -> Tuple[Constraint, bool]:
        constraint_type = str(grpc_constraint.WhichOneof('constraint'))
        if constraint_type != 'custom':
            raise NotImplementedError('Constraint of type {:s} is not implemented: {:s}'.format(
                constraint_type, grpc_message_to_json_string(grpc_constraint)))
    
        str_constraint_key_hash = fast_hasher(grpc_constraint.custom.constraint_type)
        str_constraint_key = key_to_str([db_constraints.pk, str_constraint_key_hash], separator=':')
    
        result : Tuple[ConstraintModel, bool] = update_or_create_object(database, ConstraintModel, str_constraint_key, {
            'constraints_fk'  : db_constraints,
            'position'        : position,
            'constraint_type' : grpc_constraint.custom.constraint_type,
            'constraint_value': grpc_constraint.custom.constraint_value,
        })
        db_config_rule, updated = result
        return db_config_rule, updated
    
    def set_constraints(
        database : Database, db_parent_pk : str, constraints_name : str, grpc_constraints
    ) -> List[Tuple[Union[ConstraintsModel, ConstraintModel], bool]]:
    
        str_constraints_key = key_to_str([db_parent_pk, constraints_name], separator=':')
        result : Tuple[ConstraintsModel, bool] = get_or_create_object(database, ConstraintsModel, str_constraints_key)
        db_constraints, created = result
    
        db_objects = [(db_constraints, created)]
    
        for position,grpc_constraint in enumerate(grpc_constraints):
            result : Tuple[ConstraintModel, bool] = set_constraint(database, db_constraints, grpc_constraint, position)
            db_constraint, updated = result
            db_objects.append((db_constraint, updated))
    
        return db_objects