Skip to content
Snippets Groups Projects
AnalyzerModel.py 5.18 KiB
Newer Older
  • Learn to ignore specific revisions
  • # Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
    
    #
    # 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
    import enum
    
    
    Waleed Akbar's avatar
    Waleed Akbar committed
    from sqlalchemy     import Column, String, Float, Enum, BigInteger, JSON
    
    from sqlalchemy.orm import registry
    from common.proto   import analytics_frontend_pb2
    from common.proto   import kpi_manager_pb2
    
    from sqlalchemy.dialects.postgresql import UUID, ARRAY
    
    
    logging.basicConfig(level=logging.INFO)
    LOGGER = logging.getLogger(__name__)
    
    # Create a base class for declarative models
    Base = registry().generate_base()
    
    class AnalyzerOperationMode (enum.Enum):
        BATCH     = analytics_frontend_pb2.AnalyzerOperationMode.ANALYZEROPERATIONMODE_BATCH
        STREAMING = analytics_frontend_pb2.AnalyzerOperationMode.ANALYZEROPERATIONMODE_STREAMING
    
    class Analyzer(Base):
        __tablename__ = 'analyzer'
    
    
    Waleed Akbar's avatar
    Waleed Akbar committed
        analyzer_id           = Column( UUID(as_uuid=False)        , primary_key=True)
        algorithm_name        = Column( String                     , nullable=False  )
        input_kpi_ids         = Column( ARRAY(UUID(as_uuid=False)) , nullable=False  )
        output_kpi_ids        = Column( ARRAY(UUID(as_uuid=False)) , nullable=False  )
        operation_mode        = Column( Enum(AnalyzerOperationMode), nullable=False  )
        parameters            = Column( JSON                       , nullable=True   )
        batch_min_duration_s  = Column( Float                      , nullable=False  )
        batch_max_duration_s  = Column( Float                      , nullable=False  )
        batch_min_size        = Column( BigInteger                 , nullable=False  )
        batch_max_size        = Column( BigInteger                 , nullable=False  )
    
    
        # helps in logging the information
        def __repr__(self):
    
    Waleed Akbar's avatar
    Waleed Akbar committed
                return (f"<Analyzer(analyzer_id='{self.analyzer_id}'       , algorithm_name='{self.algorithm_name}', "
                        f"input_kpi_ids={self.input_kpi_ids}               , output_kpi_ids={self.output_kpi_ids}, "
                        f"operation_mode='{self.operation_mode}'           , parameters={self.parameters}, "
                        f"batch_min_duration_s={self.batch_min_duration_s} , batch_max_duration_s={self.batch_max_duration_s}, "
                        f"batch_min_size={self.batch_min_size}             , batch_max_size={self.batch_max_size})>")
    
    
    
        @classmethod
        def ConvertAnalyzerToRow(cls, request):
            """
            Create an instance of Analyzer table rows from a request object.
            Args:    request: The request object containing analyzer gRPC message.
            Returns: A row (an instance of Analyzer table) initialized with content of the request.
            """
            return cls(
                analyzer_id          = request.analyzer_id.analyzer_id.uuid,
                algorithm_name       = request.algorithm_name,
                input_kpi_ids        = [k.kpi_id.uuid for k in request.input_kpi_ids],
                output_kpi_ids       = [k.kpi_id.uuid for k in request.output_kpi_ids],
                operation_mode       = AnalyzerOperationMode(request.operation_mode),   # converts integer to coresponding Enum class member
    
    Waleed Akbar's avatar
    Waleed Akbar committed
                parameters           = dict(request.parameters),
    
                batch_min_duration_s = request.batch_min_duration_s,
                batch_max_duration_s = request.batch_max_duration_s,
    
    Waleed Akbar's avatar
    Waleed Akbar committed
                batch_min_size       = request.batch_min_size,
                batch_max_size       = request.batch_max_size
    
            )
    
        @classmethod
        def ConvertRowToAnalyzer(cls, row):
            """
            Create and return an Analyzer gRPC message initialized with the content of a row.
            Args: row: The Analyzer table instance (row) containing the data.
            Returns:   An Analyzer gRPC message initialized with the content of the row.
            """
            # Create an instance of the Analyzer message
            response                              = analytics_frontend_pb2.Analyzer()
            response.analyzer_id.analyzer_id.uuid = row.analyzer_id
            response.algorithm_name               = row.algorithm_name
    
    Waleed Akbar's avatar
    Waleed Akbar committed
            response.operation_mode               = row.operation_mode.value
    
    Waleed Akbar's avatar
    Waleed Akbar committed
            response.parameters.update(row.parameters)
    
            
            for input_kpi_id in row.input_kpi_ids:
    
    Waleed Akbar's avatar
    Waleed Akbar committed
                _kpi_id = kpi_manager_pb2.KpiId()
    
                _kpi_id.kpi_id.uuid = input_kpi_id
                response.input_kpi_ids.append(_kpi_id)
            for output_kpi_id in row.output_kpi_ids:
    
    Waleed Akbar's avatar
    Waleed Akbar committed
                _kpi_id = kpi_manager_pb2.KpiId()
    
                _kpi_id.kpi_id.uuid = output_kpi_id
                response.output_kpi_ids.append(_kpi_id)
    
            response.batch_min_duration_s = row.batch_min_duration_s
            response.batch_max_duration_s = row.batch_max_duration_s
    
    Waleed Akbar's avatar
    Waleed Akbar committed
            response.batch_min_size       = row.batch_min_size
            response.batch_max_size       = row.batch_max_size
    
            return response