From 983a7c845949bd1bbf16136ff07801b283c735c1 Mon Sep 17 00:00:00 2001 From: Javi Moreno Date: Tue, 16 Nov 2021 04:15:32 -0500 Subject: [PATCH] Added GetKpiDescriptor Unit Test --- src/monitoring/client/monitoring_client.py | 5 ++ src/monitoring/service/MonitoringService.py | 1 - .../service/MonitoringServiceServicerImpl.py | 73 +++++++++++++++---- src/monitoring/tests/test_monitoring.py | 9 ++- 4 files changed, 71 insertions(+), 17 deletions(-) diff --git a/src/monitoring/client/monitoring_client.py b/src/monitoring/client/monitoring_client.py index 19d60bc3f..bebd629fc 100644 --- a/src/monitoring/client/monitoring_client.py +++ b/src/monitoring/client/monitoring_client.py @@ -47,6 +47,11 @@ class MonitoringClient: LOGGER.info('GetInstantKpi result: {}'.format(response)) return monitoring_pb2.Kpi() + def GetKpiDescriptor(self, request): + LOGGER.info('GetKpiDescriptor: {}'.format(request)) + response = self.server.GetKpiDescriptor(request) + LOGGER.info('GetKpiDescriptor result: {}'.format(response)) + return monitoring_pb2.KpiDescriptor() if __name__ == '__main__': # get port diff --git a/src/monitoring/service/MonitoringService.py b/src/monitoring/service/MonitoringService.py index 08a3c81b5..1b5b5c37a 100644 --- a/src/monitoring/service/MonitoringService.py +++ b/src/monitoring/service/MonitoringService.py @@ -2,7 +2,6 @@ from concurrent import futures import grpc -from monitoring.proto import monitoring_pb2_grpc from monitoring.service.MonitoringServiceServicerImpl import MonitoringServiceServicerImpl from monitoring.Config import GRPC_SERVICE_PORT, GRPC_MAX_WORKERS, GRPC_GRACE_PERIOD diff --git a/src/monitoring/service/MonitoringServiceServicerImpl.py b/src/monitoring/service/MonitoringServiceServicerImpl.py index bb4de08a2..6858da444 100644 --- a/src/monitoring/service/MonitoringServiceServicerImpl.py +++ b/src/monitoring/service/MonitoringServiceServicerImpl.py @@ -1,17 +1,22 @@ -import os -import grpc +import os,grpc,threading + from common.rpc_method_wrapper.ServiceExceptions import ServiceException +from common.logger import getJSONLogger + +from context.client.ContextClient import ContextClient +from monitoring.proto.context_pb2 import Empty from device.Config import GRPC_SERVICE_PORT from device.client.DeviceClient import DeviceClient from device.proto import device_pb2 + from monitoring.proto import context_pb2 from monitoring.service import sqlite_tools, influx_tools - from monitoring.proto import monitoring_pb2 from monitoring.proto import monitoring_pb2_grpc -from common.logger import getJSONLogger +from queue import Queue + LOGGER = getJSONLogger('monitoringservice-server') LOGGER.setLevel('DEBUG') @@ -100,7 +105,7 @@ class MonitoringServiceServicerImpl(monitoring_pb2_grpc.MonitoringServiceService # Creates the request to send to the device service monitor_device_request = device_pb2.MonitoringSettings() - kpiDescriptor = self.get_KpiDescriptor(request.kpi_id) + kpiDescriptor = self.GetKpiDescriptor(request.kpi_id, grpc_context) monitor_device_request.kpi_id.kpi_id.uuid = request.kpi_id.kpi_id.uuid monitor_device_request.kpi_descriptor.kpi_description = kpiDescriptor.kpi_description @@ -130,7 +135,7 @@ class MonitoringServiceServicerImpl(monitoring_pb2_grpc.MonitoringServiceService LOGGER.info('IncludeKpi') try: - kpiDescriptor = self.get_KpiDescriptor(request.kpi_id) + kpiDescriptor = self.GetKpiDescriptor(request.kpi_id, grpc_context) kpiSampleType = kpiDescriptor.kpi_sample_type kpiId = request.kpi_id.kpi_id.uuid @@ -165,17 +170,55 @@ class MonitoringServiceServicerImpl(monitoring_pb2_grpc.MonitoringServiceService LOGGER.info('GetInstantKpi') return monitoring_pb2.Kpi() - def get_KpiDescriptor(self, kpiId): + + def GetKpiDescriptor(self, request : monitoring_pb2.KpiId, grpc_context : grpc.ServicerContext) -> monitoring_pb2.KpiDescriptor: LOGGER.info('getting Kpi by KpiID') - kpi_db = self.sql_db.get_KPI(int(kpiId.kpi_id.uuid)) + try: + kpi_db = self.sql_db.get_KPI(int(request.kpi_id.uuid)) + print(kpi_db) + + kpiDescriptor = monitoring_pb2.KpiDescriptor() + + 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]) + + return kpiDescriptor + except ServiceException as e: + LOGGER.exception('GetKpiDescriptor exception') + grpc_context.abort(e.code, e.details) + + except Exception as e: # pragma: no cover + LOGGER.exception('GetKpiDescriptor exception') + + +class EventsCollector: + def __init__(self, context_client_grpc : ContextClient) -> None: # pylint: disable=redefined-outer-name + self._events_queue = Queue() + + self._device_stream = context_client_grpc.GetDeviceEvents(Empty()) + + self._device_thread = threading.Thread(target=self._collect, args=(self._device_stream ,), daemon=False) + + def _collect(self, events_stream) -> None: + try: + for event in events_stream: + self._events_queue.put_nowait(event) + except grpc.RpcError as e: + if e.code() != grpc.StatusCode.CANCELLED: # pylint: disable=no-member + raise # pragma: no cover + + def start(self): + self._device_thread.start() + + def get_event(self, block : bool = True, timeout : float = 0.1): + return self._events_queue.get(block=block, timeout=timeout) - kpiDescriptor = monitoring_pb2.KpiDescriptor() + def stop(self): - 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]) + self._device_stream.cancel() - return kpiDescriptor \ No newline at end of file + self._device_thread.join() diff --git a/src/monitoring/tests/test_monitoring.py b/src/monitoring/tests/test_monitoring.py index 60c5e7036..87ed11cd4 100644 --- a/src/monitoring/tests/test_monitoring.py +++ b/src/monitoring/tests/test_monitoring.py @@ -63,7 +63,7 @@ def kpi_id(): # form request kpi_id = monitoring_pb2.KpiId() - kpi_id.kpi_id.uuid = 'KPIID0000' + kpi_id.kpi_id.uuid = str(1) return kpi_id @@ -144,3 +144,10 @@ def test_getinstant_kpi(monitoring_client,kpi_id): response = monitoring_client.GetInstantKpi(kpi_id) LOGGER.debug(str(response)) assert isinstance(response, monitoring_pb2.Kpi) + +# Test case that makes use of client fixture to test server's GetInstantKpi method +def test_getkpidescritor_kpi(monitoring_client,kpi_id): + LOGGER.warning('test_getkpidescritor_kpi begin') + response = monitoring_client.GetKpiDescriptor(kpi_id) + LOGGER.debug(str(response)) + assert isinstance(response, monitoring_pb2.KpiDescriptor) \ No newline at end of file -- GitLab