Skip to content
Snippets Groups Projects
ConstraintsChecker.py 2.46 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.
    
    import grpc, logging
    from typing import Dict, List, Set, Tuple
    from common.Checkers import chk_string
    from common.exceptions.ServiceException import ServiceException
    from service.proto.context_pb2 import Constraint
    
    def check_constraint(
        logger : logging.Logger, constraint_number : int, parent_name : str, constraint : Constraint,
        add_constraints : Dict[str, Dict[str, Set[str]]]) -> Tuple[str, str]:
    
        try:
            constraint_type  = chk_string('constraint[#{}].constraint_type'.format(constraint_number),
                                          constraint.constraint_type,
                                          allow_empty=False)
            constraint_value = chk_string('constraint[#{}].constraint_value'.format(constraint_number),
                                          constraint.constraint_value,
                                          allow_empty=False)
        except Exception as e:
            logger.exception('Invalid arguments:')
            raise ServiceException(grpc.StatusCode.INVALID_ARGUMENT, str(e))
    
        if constraint_type in add_constraints:
            msg = 'Duplicated ConstraintType({}) in {}.'
            msg = msg.format(constraint_type, parent_name)
            raise ServiceException(grpc.StatusCode.INVALID_ARGUMENT, msg)
    
        add_constraints[constraint_type] = constraint_value
        return constraint_type, constraint_value
    
    def check_constraints(logger : logging.Logger, parent_name : str, constraints):
        add_constraints : Dict[str, str] = {}
        constraint_tuples : List[Tuple[str, str]] = []
        for constraint_number,constraint in enumerate(constraints):
            _parent_name = 'Constraint(#{}) of {}'.format(constraint_number, parent_name)
            constraint_type, constraint_value = check_constraint(
                logger, constraint_number, _parent_name, constraint, add_constraints)
            constraint_tuples.append((constraint_type, constraint_value))
        return constraint_tuples