Commit da366437 authored by Waleed Akbar's avatar Waleed Akbar
Browse files

KPI manager - Flow tested sucessfully

parent 8d398733
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
{
   "KPIs": 
   [
      "node_network_receive_packets_total",
      "node_network_receive_bytes_total",
      "node_network_transmit_bytes_total"
   ]
}
 No newline at end of file
+16 −57
Original line number Diff line number Diff line
@@ -37,10 +37,6 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer):
        LOGGER.info('Init KpiManagerService')
        self.Kpi_DBobj = Kpi_DB()
    
    @staticmethod
    def create_database_if_not_exist(engine: sqlalchemy.engine.Engine) -> None:
        if not sqlalchemy_utils.database_exists(engine.url):
            sqlalchemy_utils.create_database(engine.url)

    @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
    def SetKpiDescriptor(self, request: KpiDescriptor, grpc_context: grpc.ServicerContext # type: ignore
@@ -82,12 +78,13 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer):
                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
        except Exception as e:
            LOGGER.info('Unable to search kpi id. {:}'.format(e))

    @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
    def DeleteKpiDescriptor(self, request: KpiId, grpc_context: grpc.ServicerContext
    def DeleteKpiDescriptor(self, request: KpiId, grpc_context: grpc.ServicerContext # type: ignore
                            ) -> Empty: # type: ignore
        LOGGER.info("Received gRPC message object: {:}".format(request))
        try:
@@ -106,8 +103,13 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer):
        # LOGGER.info("Recevied requested Object: {:}".format(request))
        # re-structre the filter. create dynamic filter
        filter_to_apply = dict()
        filter_to_apply['device_id']       = request.device_id[0].device_uuid.uuid
        filter_to_apply['kpi_sample_type'] = request.kpi_sample_type[0]
        filter_to_apply['device_id']       = request.device_id[0].device_uuid.uuid
        filter_to_apply['endpoint_id']     = request.endpoint_id[0].endpoint_uuid.uuid
        filter_to_apply['service_id']      = request.service_id[0].service_uuid.uuid
        filter_to_apply['slice_id']        = request.slice_id[0].slice_uuid.uuid
        filter_to_apply['connection_id']   = request.connection_id[0].connection_uuid.uuid
        filter_to_apply['link_id']         = request.link_id[0].link_uuid.uuid
        try:
            rows = self.Kpi_DBobj.select_with_filter(KpiModel, **filter_to_apply)
        except Exception as e:
@@ -117,57 +119,14 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer):
                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_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
                    response.kpi_descriptor_list.append(kpiDescriptor_obj)
            return response
        except Exception as e:
            LOGGER.info('Unable to process response {:}'.format(e))
             

    # @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
    # def DeleteKpiDescriptor(self, request: KpiId, grpc_context: grpc.ServicerContext) -> Empty: # type: ignore
    #     kpi_id = int(request.kpi_id.uuid)
    #     kpi = self.management_db.get_KPI(kpi_id)
    #     if kpi:
    #         self.management_db.delete_KPI(kpi_id)
    #     else:
    #         LOGGER.info('DeleteKpi error: KpiID({:s}): not found in database'.format(str(kpi_id)))
    #     return Empty()

    # @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
    # def GetKpiDescriptor(self, request: KpiId, grpc_context: grpc.ServicerContext) -> KpiDescriptor: # type: ignore
    #     kpi_id = request.kpi_id.uuid
    #     kpi_db = self.management_db.get_KPI(int(kpi_id))
    #     kpiDescriptor = KpiDescriptor()
    #     if kpi_db is None:
    #         LOGGER.info('GetKpiDescriptor error: KpiID({:s}): not found in database'.format(str(kpi_id)))
    #     else:
    #         kpiDescriptor.kpi_description                       = kpi_db[1]
    #         kpiDescriptor.kpi_sample_type                       = kpi_db[2]
    #         kpiDescriptor.device_id.device_uuid.uuid            = str(kpi_db[3])
    #         kpiDescriptor.endpoint_id.endpoint_uuid.uuid        = str(kpi_db[4])
    #         kpiDescriptor.service_id.service_uuid.uuid          = str(kpi_db[5])
    #         kpiDescriptor.slice_id.slice_uuid.uuid              = str(kpi_db[6])
    #         kpiDescriptor.connection_id.connection_uuid.uuid    = str(kpi_db[7])
    #         kpiDescriptor.link_id.link_uuid.uuid                = str(kpi_db[8])
    #     return kpiDescriptor

    # @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
    # def SelectKpiDescriptor(self, request: KpiDescriptorFilter, grpc_context: grpc.ServicerContext) -> KpiDescriptorList: # type: ignore
    #     kpi_descriptor_list = KpiDescriptorList()
    #     data = self.management_db.get_KPIS()
    #     LOGGER.debug(f"data: {data}")
    #     for item in data:
    #         kpi_descriptor = KpiDescriptor()
    #         kpi_descriptor.kpi_id.kpi_id.uuid                   = str(item[0])
    #         kpi_descriptor.kpi_description                      = item[1]
    #         kpi_descriptor.kpi_sample_type                      = item[2]
    #         kpi_descriptor.device_id.device_uuid.uuid           = str(item[3])
    #         kpi_descriptor.endpoint_id.endpoint_uuid.uuid       = str(item[4])
    #         kpi_descriptor.service_id.service_uuid.uuid         = str(item[5])
    #         kpi_descriptor.slice_id.slice_uuid.uuid             = str(item[6])
    #         kpi_descriptor.connection_id.connection_uuid.uuid   = str(item[7])
    #         kpi_descriptor.link_id.link_uuid.uuid               = str(item[8])
    #         kpi_descriptor_list.kpi_descriptor_list.append(kpi_descriptor)
    #     return kpi_descriptor_list
 No newline at end of file
+4 −1
Original line number Diff line number Diff line
@@ -70,6 +70,9 @@ class Kpi_DB:
            return True
        except Exception as e:
            session.rollback()
            if "psycopg2.errors.UniqueViolation" in str(e):
                LOGGER.warning(f"Unique key voilation: {row.__class__.__name__} table. {str(e)}")
            else:
                LOGGER.error(f"Failed to insert new row into {row.__class__.__name__} table. {str(e)}")
            return False
        finally:
+25 −26
Original line number Diff line number Diff line
@@ -43,10 +43,8 @@ from device.service.driver_api.DriverInstanceCache import DriverInstanceCache
from device.service.DeviceService import DeviceService
from device.client.DeviceClient import DeviceClient

from kpi_manager.tests.test_messages import create_kpi_request, create_kpi_request_b, \
                create_kpi_request_c, create_kpi_request_d, create_kpi_filter_request, \
                create_kpi_descriptor_request, create_kpi_id_request, create_kpi_filter_request_a, \
                create_kpi_descriptor_request_a
from kpi_manager.tests.test_messages import create_kpi_descriptor_request, create_kpi_id_request, \
                                        create_kpi_filter_request_a, create_kpi_descriptor_request_a
# from monitoring.service.MonitoringService import MonitoringService
from kpi_manager.service.KpiManagerService import KpiManagerService
# from monitoring.client.MonitoringClient import MonitoringClient
@@ -215,33 +213,34 @@ def kpi_manager_client(kpi_manager_service : KpiManagerService): # pylint: disab
# ---------- 2nd Iteration Tests -----------------
def test_SetKpiDescriptor(kpi_manager_client):
    LOGGER.info(" >>> test_SetKpiDescriptor: START <<< ")
    _descriptors = ["node_network_receive_packets_total",
                       "node_network_receive_bytes_total",
                       "node_network_transmit_bytes_total"]
    with open("kpi_manager/service/KPI_configs.json", 'r') as file:
        data = json.load(file)
        _descriptors = data.get('KPIs', [])
    for _descritor_name in _descriptors:
        response = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request_a(_descritor_name))
        LOGGER.info("Response gRPC message object: {:}".format(response))
    assert isinstance(response, KpiId)

# def test_GetKpiDescriptor(kpi_manager_client):
#     LOGGER.info(" >>> test_GetKpiDescriptor: START <<< ")
#     response = kpi_manager_client.GetKpiDescriptor(create_kpi_id_request())
#     LOGGER.info("Response gRPC message object: {:}".format(response))
#     assert isinstance(response, KpiDescriptor)

# def test_DeleteKpiDescriptor(kpi_manager_client):
#     LOGGER.info(" >>> test_DeleteKpiDescriptor: START <<< ")
#     response = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request())
#     del_response = kpi_manager_client.DeleteKpiDescriptor(response)
#     kpi_manager_client.GetKpiDescriptor(response)
#     LOGGER.info("Response of delete method gRPC message object: {:}".format(del_response))
#     assert isinstance(response, KpiId)

# def test_SelectKpiDescriptor(kpi_manager_client):
#     LOGGER.info(" >>> test_SelectKpiDescriptor: START <<< ")
#     response = kpi_manager_client.SelectKpiDescriptor(create_kpi_filter_request_a())
#     LOGGER.info("Response gRPC message object: {:}".format(response))
#     assert isinstance(response, KpiDescriptorList)
def test_GetKpiDescriptor(kpi_manager_client):
    LOGGER.info(" >>> test_GetKpiDescriptor: START <<< ")
    response = kpi_manager_client.GetKpiDescriptor(create_kpi_id_request())
    LOGGER.info("Response gRPC message object: {:}".format(response))
    assert isinstance(response, KpiDescriptor)

def test_DeleteKpiDescriptor(kpi_manager_client):
    LOGGER.info(" >>> test_DeleteKpiDescriptor: START <<< ")
    response = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request())
    del_response = kpi_manager_client.DeleteKpiDescriptor(response)
    kpi_manager_client.GetKpiDescriptor(response)
    LOGGER.info("Response of delete method gRPC message object: {:}".format(del_response))
    assert isinstance(del_response, Empty)

def test_SelectKpiDescriptor(kpi_manager_client):
    LOGGER.info(" >>> test_SelectKpiDescriptor: START <<< ")
    kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request_a())
    response = kpi_manager_client.SelectKpiDescriptor(create_kpi_filter_request_a())
    LOGGER.info("Response gRPC message object: {:}".format(response))
    assert isinstance(response, KpiDescriptorList)

# ------------- INITIAL TESTs ----------------
# Test case that makes use of client fixture to test server's CreateKpi method
+82 −76
Original line number Diff line number Diff line
@@ -24,7 +24,7 @@ def create_kpi_id_request():
    _kpi_id.kpi_id.uuid = "34f73604-eca6-424f-9995-18b519ad0978"
    return _kpi_id

def create_kpi_descriptor_request_a(descriptor_name: str):
def create_kpi_descriptor_request_a(descriptor_name: str = "Test_name"):
    _create_kpi_request                                    = kpi_manager_pb2.KpiDescriptor()
    _create_kpi_request.kpi_id.kpi_id.uuid                 = str(uuid.uuid4())
    _create_kpi_request.kpi_description                    = descriptor_name
@@ -52,14 +52,87 @@ def create_kpi_descriptor_request():

def create_kpi_filter_request_a():
    _create_kpi_filter_request = kpi_manager_pb2.KpiDescriptorFilter()
    _create_kpi_filter_request.kpi_sample_type.append(102)
    _create_kpi_filter_request.kpi_sample_type.append(KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED)

    device_id_obj     = DeviceId()
    device_id_obj.device_uuid.uuid = "SERV3"
    endpoint_id_obj   = EndPointId()
    service_id_obj    = ServiceId()
    slice_id_obj      = SliceId()
    connection_id_obj = ConnectionId()
    link_id_obj       = LinkId()

    device_id_obj.device_uuid.uuid         = "DEV1"
    endpoint_id_obj.endpoint_uuid.uuid     = "END1"
    service_id_obj.service_uuid.uuid       = "SERV1"
    slice_id_obj.slice_uuid.uuid           = "SLC1"
    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.endpoint_id.append(endpoint_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.connection_id.append(connection_id_obj)
    _create_kpi_filter_request.link_id.append(link_id_obj)

    return _create_kpi_filter_request

# -------------------- Initial Test messages -------------------------------------

# def create_kpi_request(kpi_id_str):
#     _create_kpi_request                                     = kpi_manager_pb2.KpiDescriptor()
#     _create_kpi_request.kpi_description                     = 'KPI Description Test'
#     _create_kpi_request.kpi_sample_type                     = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED
#     _create_kpi_request.device_id.device_uuid.uuid          = 'DEV'  + str(kpi_id_str)
#     _create_kpi_request.service_id.service_uuid.uuid        = 'SERV' + str(kpi_id_str)
#     _create_kpi_request.slice_id.slice_uuid.uuid            = 'SLC'  + str(kpi_id_str)
#     _create_kpi_request.endpoint_id.endpoint_uuid.uuid      = 'END'  + str(kpi_id_str)
#     _create_kpi_request.connection_id.connection_uuid.uuid  = 'CON'  + str(kpi_id_str)
#     return _create_kpi_request

# def create_kpi_request_b():
#     _create_kpi_request                                    = kpi_manager_pb2.KpiDescriptor()
#     _create_kpi_request                                    = str(uuid.uuid4())
#     _create_kpi_request.kpi_description                    = 'KPI Description Test'
#     _create_kpi_request.kpi_sample_type                    = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED
#     _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           = 'SLC2'  # pylint: disable=maybe-no-member
#     _create_kpi_request.endpoint_id.endpoint_uuid.uuid     = 'END2'     # pylint: disable=maybe-no-member
#     _create_kpi_request.connection_id.connection_uuid.uuid = 'CON2'  # pylint: disable=maybe-no-member
#     return _create_kpi_request

# def create_kpi_request_c():
#     _create_kpi_request                                    = kpi_manager_pb2.KpiDescriptor()
#     _create_kpi_request.kpi_description                    = 'KPI Description Test'
#     _create_kpi_request.kpi_sample_type                    = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED
#     _create_kpi_request.device_id.device_uuid.uuid         = 'DEV3'     # pylint: disable=maybe-no-member
#     _create_kpi_request.service_id.service_uuid.uuid       = 'SERV3'    # pylint: disable=maybe-no-member
#     _create_kpi_request.slice_id.slice_uuid.uuid           = 'SLC3'  # pylint: disable=maybe-no-member
#     _create_kpi_request.endpoint_id.endpoint_uuid.uuid     = 'END3'     # pylint: disable=maybe-no-member
#     _create_kpi_request.connection_id.connection_uuid.uuid = 'CON3'  # pylint: disable=maybe-no-member
#     return _create_kpi_request

# def create_kpi_request_d():
#     _create_kpi_request                                    = kpi_manager_pb2.KpiDescriptor()
#     _create_kpi_request.kpi_description                    = 'KPI Description Test'
#     _create_kpi_request.kpi_sample_type                    = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED
#     _create_kpi_request.device_id.device_uuid.uuid         = 'DEV4'     # pylint: disable=maybe-no-member
#     _create_kpi_request.service_id.service_uuid.uuid       = 'SERV4'    # pylint: disable=maybe-no-member
#     _create_kpi_request.slice_id.slice_uuid.uuid           = 'SLC4'  # pylint: disable=maybe-no-member
#     _create_kpi_request.endpoint_id.endpoint_uuid.uuid     = 'END4'     # pylint: disable=maybe-no-member
#     _create_kpi_request.connection_id.connection_uuid.uuid = 'CON4'  # pylint: disable=maybe-no-member
#     return _create_kpi_request

# def kpi_descriptor_list():
#     _kpi_descriptor_list = kpi_manager_pb2.KpiDescriptorList()
#     return _kpi_descriptor_list

# def create_kpi_filter_request():
#     _create_kpi_filter_request             = kpi_manager_pb2.KpiDescriptorFilter()
#     _create_kpi_filter_request.kpi_sample_type.append(KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED)  
#     new_device_id                          = _create_kpi_filter_request.device_id.add()
    # new_device_id.device_uuid.uuid         = 'DEV3'
#     new_device_id.device_uuid.uuid         = 'DEV1'
#     new_service_id                         = _create_kpi_filter_request.service_id.add()
#     new_service_id.service_uuid.uuid       = 'SERV1'
#     new_slice_id                           = _create_kpi_filter_request.slice_id.add()
@@ -69,71 +142,4 @@ def create_kpi_filter_request_a():
#     new_connection_id                      = _create_kpi_filter_request.connection_id.add()
#     new_connection_id.connection_uuid.uuid = 'CON1'

    return _create_kpi_filter_request

# -------------------- Initial Test messages -------------------------------------

def create_kpi_request(kpi_id_str):
    _create_kpi_request                                     = kpi_manager_pb2.KpiDescriptor()
    _create_kpi_request.kpi_description                     = 'KPI Description Test'
    _create_kpi_request.kpi_sample_type                     = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED
    _create_kpi_request.device_id.device_uuid.uuid          = 'DEV'  + str(kpi_id_str)
    _create_kpi_request.service_id.service_uuid.uuid        = 'SERV' + str(kpi_id_str)
    _create_kpi_request.slice_id.slice_uuid.uuid            = 'SLC'  + str(kpi_id_str)
    _create_kpi_request.endpoint_id.endpoint_uuid.uuid      = 'END'  + str(kpi_id_str)
    _create_kpi_request.connection_id.connection_uuid.uuid  = 'CON'  + str(kpi_id_str)
    return _create_kpi_request

def create_kpi_request_b():
    _create_kpi_request                                    = kpi_manager_pb2.KpiDescriptor()
    _create_kpi_request                                    = str(uuid.uuid4())
    _create_kpi_request.kpi_description                    = 'KPI Description Test'
    _create_kpi_request.kpi_sample_type                    = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED
    _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           = 'SLC2'  # pylint: disable=maybe-no-member
    _create_kpi_request.endpoint_id.endpoint_uuid.uuid     = 'END2'     # pylint: disable=maybe-no-member
    _create_kpi_request.connection_id.connection_uuid.uuid = 'CON2'  # pylint: disable=maybe-no-member
    return _create_kpi_request

def create_kpi_request_c():
    _create_kpi_request                                    = kpi_manager_pb2.KpiDescriptor()
    _create_kpi_request.kpi_description                    = 'KPI Description Test'
    _create_kpi_request.kpi_sample_type                    = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED
    _create_kpi_request.device_id.device_uuid.uuid         = 'DEV3'     # pylint: disable=maybe-no-member
    _create_kpi_request.service_id.service_uuid.uuid       = 'SERV3'    # pylint: disable=maybe-no-member
    _create_kpi_request.slice_id.slice_uuid.uuid           = 'SLC3'  # pylint: disable=maybe-no-member
    _create_kpi_request.endpoint_id.endpoint_uuid.uuid     = 'END3'     # pylint: disable=maybe-no-member
    _create_kpi_request.connection_id.connection_uuid.uuid = 'CON3'  # pylint: disable=maybe-no-member
    return _create_kpi_request

def create_kpi_request_d():
    _create_kpi_request                                    = kpi_manager_pb2.KpiDescriptor()
    _create_kpi_request.kpi_description                    = 'KPI Description Test'
    _create_kpi_request.kpi_sample_type                    = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED
    _create_kpi_request.device_id.device_uuid.uuid         = 'DEV4'     # pylint: disable=maybe-no-member
    _create_kpi_request.service_id.service_uuid.uuid       = 'SERV4'    # pylint: disable=maybe-no-member
    _create_kpi_request.slice_id.slice_uuid.uuid           = 'SLC4'  # pylint: disable=maybe-no-member
    _create_kpi_request.endpoint_id.endpoint_uuid.uuid     = 'END4'     # pylint: disable=maybe-no-member
    _create_kpi_request.connection_id.connection_uuid.uuid = 'CON4'  # pylint: disable=maybe-no-member
    return _create_kpi_request

def kpi_descriptor_list():
    _kpi_descriptor_list = kpi_manager_pb2.KpiDescriptorList()
    return _kpi_descriptor_list

def create_kpi_filter_request():
    _create_kpi_filter_request             = kpi_manager_pb2.KpiDescriptorFilter()
    _create_kpi_filter_request.kpi_sample_type.append(KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED)  
    new_device_id                          = _create_kpi_filter_request.device_id.add()
    new_device_id.device_uuid.uuid         = 'DEV1'
    new_service_id                         = _create_kpi_filter_request.service_id.add()
    new_service_id.service_uuid.uuid       = 'SERV1'
    new_slice_id                           = _create_kpi_filter_request.slice_id.add()
    new_slice_id.slice_uuid.uuid           = 'SLC1'
    new_endpoint_id                        = _create_kpi_filter_request.endpoint_id.add()
    new_endpoint_id.endpoint_uuid.uuid     = 'END1'
    new_connection_id                      = _create_kpi_filter_request.connection_id.add()
    new_connection_id.connection_uuid.uuid = 'CON1'

    return _create_kpi_filter_request
 No newline at end of file
#     return _create_kpi_filter_request
 No newline at end of file