diff --git a/src/kpi_management/kpi_manager/database/service/KpiModel.py b/src/kpi_management/kpi_manager/database/service/KpiModel.py index 846f738f94cad77d0449c3abc0dc4554902b3aca..78276f59e41c9b6b26de8a960bc10526197fd182 100644 --- a/src/kpi_management/kpi_manager/database/service/KpiModel.py +++ b/src/kpi_management/kpi_manager/database/service/KpiModel.py @@ -18,7 +18,7 @@ from sqlalchemy import Column, Integer, String, Float, Text, ForeignKey # from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import registry from sqlalchemy.orm import sessionmaker, relationship - +from common.proto.kpi_management_pb2 import KpiDescriptor logging.basicConfig(level=logging.INFO) LOGGER = logging.getLogger(__name__) @@ -31,14 +31,14 @@ class Kpi(Base): __tablename__ = 'kpi' kpi_id = Column(UUID(as_uuid=False), primary_key=True) - kpi_description = Column(Text, nullable=False) - kpi_sample_type = Column(Integer, nullable=False) - device_id = Column(String, nullable=False) - endpoint_id = Column(String, nullable=False) - service_id = Column(String, nullable=False) - slice_id = Column(String, nullable=False) - connection_id = Column(String, nullable=False) - link_id = Column(String, nullable=False) + kpi_description = Column(Text , nullable=False) + kpi_sample_type = Column(Integer , nullable=False) + device_id = Column(String , nullable=False) + endpoint_id = Column(String , nullable=False) + service_id = Column(String , nullable=False) + slice_id = Column(String , nullable=False) + connection_id = Column(String , nullable=False) + link_id = Column(String , nullable=False) # helps in logging the information def __repr__(self): @@ -49,20 +49,39 @@ class Kpi(Base): f"link_id='{self.link_id}')>") @classmethod - def create_row_from_kpiDescriptor(cls, request): + def convert_KpiDescriptor_to_row(cls, request): """ Create an instance of Kpi from a request object. - Args: request: The request object containing the data. + Args: request: The request object containing the data. Returns: An instance of Kpi initialized with data from the request. """ return cls( - kpi_id=request.kpi_id.kpi_id.uuid, - kpi_description=request.kpi_description, - kpi_sample_type=request.kpi_sample_type, - device_id=request.device_id.device_uuid.uuid, - endpoint_id=request.endpoint_id.endpoint_uuid.uuid, - service_id=request.service_id.service_uuid.uuid, - slice_id=request.slice_id.slice_uuid.uuid, - connection_id=request.connection_id.connection_uuid.uuid, - link_id=request.link_id.link_uuid.uuid - ) \ No newline at end of file + kpi_id = request.kpi_id.kpi_id.uuid, + kpi_description = request.kpi_description, + kpi_sample_type = request.kpi_sample_type, + device_id = request.device_id.device_uuid.uuid, + endpoint_id = request.endpoint_id.endpoint_uuid.uuid, + service_id = request.service_id.service_uuid.uuid, + slice_id = request.slice_id.slice_uuid.uuid, + connection_id = request.connection_id.connection_uuid.uuid, + link_id = request.link_id.link_uuid.uuid + ) + + @classmethod + def convert_row_to_KpiDescriptor(cls, row): + """ + Create and return a dictionary representation of a Kpi instance. + Args: row: The Kpi instance (row) containing the data. + Returns: KpiDescriptor object + """ + response = KpiDescriptor() + response.kpi_id.kpi_id.uuid = row.kpi_id + response.kpi_description = row.kpi_description + response.kpi_sample_type = row.kpi_sample_type + response.service_id.service_uuid.uuid = row.service_id + response.device_id.device_uuid.uuid = row.device_id + response.slice_id.slice_uuid.uuid = row.slice_id + response.endpoint_id.endpoint_uuid.uuid = row.endpoint_id + response.connection_id.connection_uuid.uuid = row.connection_id + response.link_id.link_uuid.uuid = row.link_id + return response \ No newline at end of file diff --git a/src/kpi_management/kpi_manager/service/KpiManagerServiceServicerImpl.py b/src/kpi_management/kpi_manager/service/KpiManagerServiceServicerImpl.py index 3d96c98dde9599d93db113a7543896e70e2fcb8f..3a3052182d7c8cf724f5c1abbaeda4d3c07c5223 100644 --- a/src/kpi_management/kpi_manager/service/KpiManagerServiceServicerImpl.py +++ b/src/kpi_management/kpi_manager/service/KpiManagerServiceServicerImpl.py @@ -37,24 +37,13 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer): LOGGER.info('Init KpiManagerService') self.Kpi_DBobj = Kpi_DB() - @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def SetKpiDescriptor(self, request: KpiDescriptor, grpc_context: grpc.ServicerContext # type: ignore ) -> KpiId: # type: ignore response = KpiId() LOGGER.info("Received gRPC message object: {:}".format(request)) try: - # kpi_to_insert = KpiModel() - # kpi_to_insert.kpi_id = request.kpi_id.kpi_id.uuid - # kpi_to_insert.kpi_description = request.kpi_description - # kpi_to_insert.kpi_sample_type = request.kpi_sample_type - # kpi_to_insert.device_id = request.device_id.device_uuid.uuid - # kpi_to_insert.endpoint_id = request.endpoint_id.endpoint_uuid.uuid - # kpi_to_insert.service_id = request.service_id.service_uuid.uuid - # kpi_to_insert.slice_id = request.slice_id.slice_uuid.uuid - # kpi_to_insert.connection_id = request.connection_id.connection_uuid.uuid - # kpi_to_insert.link_id = request.link_id.link_uuid.uuid - kpi_to_insert = KpiModel.create_row_from_kpiDescriptor(request) + kpi_to_insert = KpiModel.convert_KpiDescriptor_to_row(request) if(self.Kpi_DBobj.add_row_to_db(kpi_to_insert)): response.kpi_id.uuid = request.kpi_id.kpi_id.uuid # LOGGER.info("Added Row: {:}".format(response)) @@ -71,15 +60,7 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer): kpi_id_to_search = request.kpi_id.uuid row = self.Kpi_DBobj.search_db_row_by_id(KpiModel, 'kpi_id', kpi_id_to_search) if row is not None: - response.kpi_id.kpi_id.uuid = row.kpi_id - response.kpi_description = row.kpi_description - response.kpi_sample_type = row.kpi_sample_type - response.service_id.service_uuid.uuid = row.service_id - response.device_id.device_uuid.uuid = row.device_id - response.slice_id.slice_uuid.uuid = row.slice_id - response.endpoint_id.endpoint_uuid.uuid = row.endpoint_id - response.connection_id.connection_uuid.uuid = row.connection_id - response.link_id.link_uuid.uuid = row.link_id + response = KpiModel.convert_row_to_KpiDescriptor(row) return response except Exception as e: LOGGER.info('Unable to search kpi id. {:}'.format(e)) @@ -118,15 +99,7 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer): try: if len(rows) != 0: for row in rows: - kpiDescriptor_obj = KpiDescriptor() - kpiDescriptor_obj.kpi_id.kpi_id.uuid = row.kpi_id - kpiDescriptor_obj.kpi_description = row.kpi_description - kpiDescriptor_obj.kpi_sample_type = row.kpi_sample_type - kpiDescriptor_obj.service_id.service_uuid.uuid = row.service_id - kpiDescriptor_obj.device_id.device_uuid.uuid = row.device_id - kpiDescriptor_obj.slice_id.slice_uuid.uuid = row.slice_id - kpiDescriptor_obj.endpoint_id.endpoint_uuid.uuid = row.endpoint_id - kpiDescriptor_obj.connection_id.connection_uuid.uuid = row.connection_id + kpiDescriptor_obj = KpiModel.convert_row_to_KpiDescriptor(row) response.kpi_descriptor_list.append(kpiDescriptor_obj) return response except Exception as e: diff --git a/src/kpi_management/kpi_manager/tests/test_kpi_manager.py b/src/kpi_management/kpi_manager/tests/test_kpi_manager.py index ca5f6af6f7a8d85679a0e6912590b3caa0774be5..531efc20ceaee4244331ad8cecef584e2f9b7e1e 100755 --- a/src/kpi_management/kpi_manager/tests/test_kpi_manager.py +++ b/src/kpi_management/kpi_manager/tests/test_kpi_manager.py @@ -43,7 +43,7 @@ from device.service.driver_api.DriverInstanceCache import DriverInstanceCache from device.service.DeviceService import DeviceService from device.client.DeviceClient import DeviceClient -from kpi_management.kpi_manager.tests.test_messages import create_kpi_descriptor_request +from kpi_management.kpi_manager.tests.test_messages import create_kpi_descriptor_request, create_kpi_filter_request # from monitoring.service.MonitoringService import MonitoringService from kpi_management.kpi_manager.service.KpiManagerService import KpiManagerService # from monitoring.client.MonitoringClient import MonitoringClient @@ -219,14 +219,32 @@ def test_SetKpiDescriptor(kpi_manager_client): def test_DeleteKpiDescriptor(kpi_manager_client): LOGGER.info(" >>> test_DeleteKpiDescriptor: START <<< ") # adding KPI - response = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) + response_id = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) # deleting KPI - del_response = kpi_manager_client.DeleteKpiDescriptor(response) - # verifing KPI - kpi_manager_client.GetKpiDescriptor(response) + del_response = kpi_manager_client.DeleteKpiDescriptor(response_id) + # select KPI + kpi_manager_client.GetKpiDescriptor(response_id) LOGGER.info("Response of delete method gRPC message object: {:}".format(del_response)) assert isinstance(del_response, Empty) +def test_GetKpiDescriptor(kpi_manager_client): + LOGGER.info(" >>> test_GetKpiDescriptor: START <<< ") + # adding KPI + response_id = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) + # get KPI + response = kpi_manager_client.GetKpiDescriptor(response_id) + LOGGER.info("Response gRPC message object: {:}".format(response)) + assert isinstance(response, KpiDescriptor) + +def test_SelectKpiDescriptor(kpi_manager_client): + LOGGER.info(" >>> test_SelectKpiDescriptor: START <<< ") + # adding KPI + kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) + # select KPI(s) + response = kpi_manager_client.SelectKpiDescriptor(create_kpi_filter_request()) + LOGGER.info("Response gRPC message object: {:}".format(response)) + assert isinstance(response, KpiDescriptorList) + # ---------- 2nd Iteration Tests ----------------- # def test_SetKpiDescriptor(kpi_manager_client): diff --git a/src/kpi_management/kpi_manager/tests/test_messages.py b/src/kpi_management/kpi_manager/tests/test_messages.py index 7c2933b7a874e5c501358ed8808ed9da95f41dcb..e1cb4ddf60412cbb19d2bf355d99cf9063105751 100644 --- a/src/kpi_management/kpi_manager/tests/test_messages.py +++ b/src/kpi_management/kpi_manager/tests/test_messages.py @@ -15,16 +15,45 @@ import uuid from common.proto import kpi_management_pb2 from common.proto.kpi_sample_types_pb2 import KpiSampleType +from common.proto.context_pb2 import DeviceId, LinkId, ServiceId, SliceId,\ + ConnectionId, EndPointId def create_kpi_descriptor_request(descriptor_name: str = "Test_name"): _create_kpi_request = kpi_management_pb2.KpiDescriptor() _create_kpi_request.kpi_id.kpi_id.uuid = str(uuid.uuid4()) _create_kpi_request.kpi_description = descriptor_name _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED - _create_kpi_request.device_id.device_uuid.uuid = 'DEV1' # pylint: disable=maybe-no-member - _create_kpi_request.service_id.service_uuid.uuid = 'SERV1' # pylint: disable=maybe-no-member + _create_kpi_request.device_id.device_uuid.uuid = 'DEV2' # pylint: disable=maybe-no-member + _create_kpi_request.service_id.service_uuid.uuid = 'SERV2' # pylint: disable=maybe-no-member _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC1' # pylint: disable=maybe-no-member _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END1' # pylint: disable=maybe-no-member _create_kpi_request.connection_id.connection_uuid.uuid = 'CON1' # pylint: disable=maybe-no-member _create_kpi_request.link_id.link_uuid.uuid = 'LNK1' # pylint: disable=maybe-no-member - return _create_kpi_request \ No newline at end of file + return _create_kpi_request + +def create_kpi_filter_request(): + _create_kpi_filter_request = kpi_management_pb2.KpiDescriptorFilter() + _create_kpi_filter_request.kpi_sample_type.append(KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED) + + device_id_obj = DeviceId() + service_id_obj = ServiceId() + slice_id_obj = SliceId() + endpoint_id_obj = EndPointId() + connection_id_obj = ConnectionId() + link_id_obj = LinkId() + + device_id_obj.device_uuid.uuid = "DEV2" + service_id_obj.service_uuid.uuid = "SERV2" + slice_id_obj.slice_uuid.uuid = "SLC1" + endpoint_id_obj.endpoint_uuid.uuid = "END1" + connection_id_obj.connection_uuid.uuid = "CON1" + link_id_obj.link_uuid.uuid = "LNK1" + + _create_kpi_filter_request.device_id.append(device_id_obj) + _create_kpi_filter_request.service_id.append(service_id_obj) + _create_kpi_filter_request.slice_id.append(slice_id_obj) + _create_kpi_filter_request.endpoint_id.append(endpoint_id_obj) + _create_kpi_filter_request.connection_id.append(connection_id_obj) + _create_kpi_filter_request.link_id.append(link_id_obj) + + return _create_kpi_filter_request \ No newline at end of file