diff --git a/scripts/run_tests_locally-kpi_manager.sh b/scripts/run_tests_locally-kpi_manager.sh index 8ed855a8e34261173a3d788fa06777f0e66825a3..e56716dea8f5baf69fc82443559f4e01a6cb54c9 100755 --- a/scripts/run_tests_locally-kpi_manager.sh +++ b/scripts/run_tests_locally-kpi_manager.sh @@ -24,5 +24,5 @@ cd $PROJECTDIR/src # python3 kpi_manager/tests/test_unitary.py RCFILE=$PROJECTDIR/coverage/.coveragerc -python3 -m pytest --log-level=INFO --verbose \ +python3 -m pytest --log-level=INFO --log-cli-level=INFO --verbose \ kpi_manager/tests/test_unitary.py \ No newline at end of file diff --git a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py index f1d370f30b20e871d2dd3e636afa4cad6ba0110c..c37bf373fecbd45f41792c269f01883a66d833ea 100644 --- a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py +++ b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py @@ -19,8 +19,12 @@ from common.proto.context_pb2 import Empty from common.proto.kpi_manager_pb2_grpc import KpiManagerServiceServicer from common.proto.kpi_manager_pb2 import KpiId, KpiDescriptor, KpiDescriptorFilter, KpiDescriptorList from monitoring.service.NameMapping import NameMapping -from monitoring.service import ManagementDBTools +# from monitoring.service import ManagementDBTools +from telemetry.database.managementDB import managementDB +from telemetry.database.TelemetryModel import Kpi as KpiModel +from common.proto.context_pb2 import DeviceId, LinkId, ServiceId, SliceId,\ + ConnectionId, EndPointId LOGGER = logging.getLogger(__name__) @@ -29,77 +33,139 @@ METRICS_POOL = MetricsPool('Monitoring', 'KpiManager') class KpiManagerServiceServicerImpl(KpiManagerServiceServicer): def __init__(self, name_mapping : NameMapping): LOGGER.info('Init KpiManagerService') - - # Init sqlite monitoring db - self.management_db = ManagementDBTools.ManagementDB('monitoring.db') # why monitoring.db here??? - LOGGER.info('MetricsDB initialized --- KPI Manager Service') + self.managementDBobj = managementDB() @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def SetKpiDescriptor( - self, request: KpiDescriptor, grpc_context: grpc.ServicerContext # type: ignore - ) -> KpiId: # type: ignore + def SetKpiDescriptor(self, request: KpiDescriptor, grpc_context: grpc.ServicerContext # type: ignore + ) -> KpiId: # type: ignore response = KpiId() - kpi_description = request.kpi_description - kpi_sample_type = request.kpi_sample_type - kpi_device_id = request.device_id.device_uuid.uuid - kpi_endpoint_id = request.endpoint_id.endpoint_uuid.uuid - kpi_service_id = request.service_id.service_uuid.uuid - kpi_slice_id = request.slice_id.slice_uuid.uuid - kpi_connection_id = request.connection_id.connection_uuid.uuid - kpi_link_id = request.link_id.link_uuid.uuid - if request.kpi_id.kpi_id.uuid != "": + + 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.service_id.service_uuid.uuid + kpi_to_insert.endpoint_id = request.device_id.device_uuid.uuid + kpi_to_insert.service_id = request.slice_id.slice_uuid.uuid + kpi_to_insert.slice_id = request.endpoint_id.endpoint_uuid.uuid + kpi_to_insert.connection_id = request.connection_id.connection_uuid.uuid + # kpi_to_insert.link_id = request.link_id.link_id.uuid + self.managementDBobj.add_row_to_db(kpi_to_insert) response.kpi_id.uuid = request.kpi_id.kpi_id.uuid - # Here the code to modify an existing kpi - else: - data = self.management_db.insert_KPI( - kpi_description, kpi_sample_type, kpi_device_id, kpi_endpoint_id, - kpi_service_id, kpi_slice_id, kpi_connection_id, kpi_link_id) - response.kpi_id.uuid = str(data) - return response + LOGGER.info("Added Row: {:}".format(response)) + return response + except Exception as e: + LOGGER.info("Unable to create KpiModel class object. {:}".format(e)) + + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) + def GetKpiDescriptor(self, request: KpiId, grpc_context: grpc.ServicerContext # type: ignore + ) -> KpiDescriptor: # type: ignore + response = KpiDescriptor() - @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() + try: + kpi_id_to_search = request.kpi_id.uuid + row = self.managementDBobj.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 + return response + except Exception as e: + LOGGER.info('Unable to search kpi id. {:}'.format(e)) @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 + def DeleteKpiDescriptor(self, request: KpiId, grpc_context: grpc.ServicerContext + ) -> Empty: # type: ignore + try: + kpi_id_to_search = request.kpi_id.uuid + self.managementDBobj.delete_db_row_by_id(KpiModel, 'kpi_id', kpi_id_to_search) + except Exception as e: + LOGGER.info('Unable to search kpi id. {:}'.format(e)) + finally: + return Empty() @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 + def SelectKpiDescriptor(self, request: KpiDescriptorFilter, grpc_context: grpc.ServicerContext # type: ignore + ) -> KpiDescriptorList: # type: ignore + response = KpiDescriptorList() + # 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] + try: + rows = self.managementDBobj.select_with_filter(KpiModel, **filter_to_apply) + except Exception as e: + LOGGER.info('Unable to apply filter on kpi descriptor. {:}'.format(e)) + try: + if len(rows) != 0: + kpi_id_obj = KpiId() + device_id_obj = DeviceId() + endpoint_id_obj = EndPointId() + service_id_obj = ServiceId() + slice_id_obj = SliceId() + link_id_obj = LinkId() + + for row in rows: + kpiDescriptor_obj = KpiDescriptor() + kpiDescriptor_obj.kpi_id.kpi_id.uuid = row.kpi_id + # kpiDescriptor_obj.kpi_description = row.kpi_description + + 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 diff --git a/src/kpi_manager/tests/test_messages.py b/src/kpi_manager/tests/test_messages.py index 72ff74c1686c2d5fa35ee5a118aeca4dca0f4438..db6160be5fe35b1b2b8d55b73d2ff0400d189978 100755 --- a/src/kpi_manager/tests/test_messages.py +++ b/src/kpi_manager/tests/test_messages.py @@ -12,14 +12,53 @@ # See the License for the specific language governing permissions and # limitations under the License. +import uuid from common.proto import kpi_manager_pb2 from common.proto.kpi_sample_types_pb2 import KpiSampleType +from common.proto.context_pb2 import DeviceId, LinkId, ServiceId, SliceId,\ + ConnectionId, EndPointId -def kpi_id(): +# ---------------------- New Test Messages --------------------------------- +def create_kpi_id_request(): _kpi_id = kpi_manager_pb2.KpiId() - _kpi_id.kpi_id.uuid = str(1) # pylint: disable=maybe-no-member + _kpi_id.kpi_id.uuid = "34f73604-eca6-424f-9995-18b519ad0978" return _kpi_id +def create_kpi_descriptor_request(): + _create_kpi_request = kpi_manager_pb2.KpiDescriptor() + _create_kpi_request.kpi_id.kpi_id.uuid = 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 = 'DEV4' # 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 = '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_filter_request_a(): + _create_kpi_filter_request = kpi_manager_pb2.KpiDescriptorFilter() + _create_kpi_filter_request.kpi_sample_type.append(102) + + device_id_obj = DeviceId() + device_id_obj.device_uuid.uuid = "SERV3" + _create_kpi_filter_request.device_id.append(device_id_obj) + + # new_device_id = _create_kpi_filter_request.device_id.add() + # new_device_id.device_uuid.uuid = 'DEV3' + # 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 + +# -------------------- 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' @@ -33,6 +72,7 @@ def create_kpi_request(kpi_id_str): 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 diff --git a/src/kpi_manager/tests/test_unitary.py b/src/kpi_manager/tests/test_unitary.py index 75987a5f4320bc36ef0a298641e807c9c7dfb8fb..e60d2104e08cf57d63013369c7020ffda009f4a7 100755 --- a/src/kpi_manager/tests/test_unitary.py +++ b/src/kpi_manager/tests/test_unitary.py @@ -43,7 +43,9 @@ 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 +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 # from monitoring.service.MonitoringService import MonitoringService from kpi_manager.service.KpiManagerService import KpiManagerService # from monitoring.client.MonitoringClient import MonitoringClient @@ -63,7 +65,7 @@ from device.service.drivers import DRIVERS LOCAL_HOST = '127.0.0.1' MOCKSERVICE_PORT = 10000 -KPIMANAGER_SERVICE_PORT = MOCKSERVICE_PORT + get_service_port_grpc(ServiceNameEnum.KPIMANAGER) # avoid privileged ports +KPIMANAGER_SERVICE_PORT = MOCKSERVICE_PORT + get_service_port_grpc(ServiceNameEnum.KPIMANAGER) # type: ignore os.environ[get_env_var_name(ServiceNameEnum.KPIMANAGER, ENVVAR_SUFIX_SERVICE_HOST )] = str(LOCAL_HOST) os.environ[get_env_var_name(ServiceNameEnum.KPIMANAGER, ENVVAR_SUFIX_SERVICE_PORT_GRPC)] = str(KPIMANAGER_SERVICE_PORT) @@ -127,18 +129,18 @@ def device_service(context_service : MockContextService): # pylint: disable=rede LOGGER.info('Terminated DeviceService...') -@pytest.fixture(scope='session') -def device_client(device_service : DeviceService): # pylint: disable=redefined-outer-name,unused-argument - LOGGER.info('Initializing DeviceClient...') - _client = DeviceClient() +# @pytest.fixture(scope='session') +# def device_client(device_service : DeviceService): # pylint: disable=redefined-outer-name,unused-argument +# LOGGER.info('Initializing DeviceClient...') +# _client = DeviceClient() - LOGGER.info('Yielding DeviceClient...') - yield _client +# LOGGER.info('Yielding DeviceClient...') +# yield _client - LOGGER.info('Closing DeviceClient...') - _client.close() +# LOGGER.info('Closing DeviceClient...') +# _client.close() - LOGGER.info('Closed DeviceClient...') +# LOGGER.info('Closed DeviceClient...') @pytest.fixture(scope='session') def device_client(device_service : DeviceService): # pylint: disable=redefined-outer-name,unused-argument @@ -195,39 +197,64 @@ def kpi_manager_client(kpi_manager_service : KpiManagerService): # pylint: disab # Prepare Environment, should be the first test ################################################## -# ERROR on this test --- -def test_prepare_environment( - context_client : ContextClient, # pylint: disable=redefined-outer-name,unused-argument -): - context_id = json_context_id(DEFAULT_CONTEXT_NAME) - context_client.SetContext(Context(**json_context(DEFAULT_CONTEXT_NAME))) - context_client.SetTopology(Topology(**json_topology(DEFAULT_TOPOLOGY_NAME, context_id=context_id))) +# # ERROR on this test --- +# def test_prepare_environment( +# context_client : ContextClient, # pylint: disable=redefined-outer-name,unused-argument +# ): +# context_id = json_context_id(DEFAULT_CONTEXT_NAME) +# context_client.SetContext(Context(**json_context(DEFAULT_CONTEXT_NAME))) +# context_client.SetTopology(Topology(**json_topology(DEFAULT_TOPOLOGY_NAME, context_id=context_id))) ########################### # Tests Implementation of Kpi Manager ########################### -# Test case that makes use of client fixture to test server's CreateKpi method -def test_set_kpi(kpi_manager_client): # pylint: disable=redefined-outer-name - # make call to server - LOGGER.warning('test_create_kpi requesting') - for i in range(3): - response = kpi_manager_client.SetKpiDescriptor(create_kpi_request(str(i+1))) - LOGGER.debug(str(response)) - assert isinstance(response, KpiId) - -# Test case that makes use of client fixture to test server's DeleteKpi method -def test_delete_kpi(kpi_manager_client): # pylint: disable=redefined-outer-name - # make call to server - LOGGER.warning('delete_kpi requesting') - response = kpi_manager_client.SetKpiDescriptor(create_kpi_request('4')) - response = kpi_manager_client.DeleteKpiDescriptor(response) - LOGGER.debug(str(response)) - assert isinstance(response, Empty) - -# Test case that makes use of client fixture to test server's GetKpiDescriptor method -def test_select_kpi_descriptor(kpi_manager_client): # pylint: disable=redefined-outer-name - LOGGER.warning('test_selectkpidescritor begin') - response = kpi_manager_client.SelectKpiDescriptor(create_kpi_filter_request()) - LOGGER.debug(str(response)) +# ---------- 2nd Iteration Tests ----------------- +def test_SetKpiDescriptor(kpi_manager_client): + LOGGER.info(" >>> test_SetKpiDescriptor: START <<< ") + response = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) + assert isinstance(response, KpiId) + +def test_GetKpiDescriptor(kpi_manager_client): + LOGGER.info(" >>> test_GetKpiDescriptor: START <<< ") + response = kpi_manager_client.GetKpiDescriptor(create_kpi_id_request()) + assert isinstance(response, KpiDescriptor) + +def test_DeleteKpiDescriptor(kpi_manager_client): + LOGGER.info(" >>> test_DeleteKpiDescriptor: START <<< ") + response = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) + kpi_manager_client.DeleteKpiDescriptor(response) + kpi_manager_client.GetKpiDescriptor(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(" >>> test_SelectKpiDescriptor: END <<< {:}".format(response)) assert isinstance(response, KpiDescriptorList) + +# ------------- INITIAL TESTs ---------------- +# Test case that makes use of client fixture to test server's CreateKpi method +# def test_set_kpi(kpi_manager_client): # pylint: disable=redefined-outer-name +# # make call to server +# LOGGER.warning('test_create_kpi requesting') +# for i in range(3): +# response = kpi_manager_client.SetKpiDescriptor(create_kpi_request(str(i+1))) +# LOGGER.debug(str(response)) +# assert isinstance(response, KpiId) + +# # Test case that makes use of client fixture to test server's DeleteKpi method +# def test_delete_kpi(kpi_manager_client): # pylint: disable=redefined-outer-name +# # make call to server +# LOGGER.warning('delete_kpi requesting') +# response = kpi_manager_client.SetKpiDescriptor(create_kpi_request('4')) +# response = kpi_manager_client.DeleteKpiDescriptor(response) +# LOGGER.debug(str(response)) +# assert isinstance(response, Empty) + +# # Test case that makes use of client fixture to test server's GetKpiDescriptor method +# def test_select_kpi_descriptor(kpi_manager_client): # pylint: disable=redefined-outer-name +# LOGGER.warning('test_selectkpidescritor begin') +# response = kpi_manager_client.SelectKpiDescriptor(create_kpi_filter_request()) +# LOGGER.debug(str(response)) +# assert isinstance(response, KpiDescriptorList) diff --git a/src/telemetry/database/TelemetryDBmanager.py b/src/telemetry/database/TelemetryDBmanager.py index 6dc2868a1d213150c439c4e1736cf170fc9409f3..e2b1f63a2deab0f162bbc16ac2d42c93cca46840 100644 --- a/src/telemetry/database/TelemetryDBmanager.py +++ b/src/telemetry/database/TelemetryDBmanager.py @@ -89,7 +89,7 @@ class TelemetryDBmanager: def inser_kpi(self, request: KpiDescriptor): session = self.Session() try: - # Create a new Collector instance + # Create a new Kpi instance kpi_to_insert = KpiModel() kpi_to_insert.kpi_id = request.kpi_id.kpi_id.uuid kpi_to_insert.kpi_description = request.kpi_description diff --git a/src/telemetry/database/TelemetryEngine.py b/src/telemetry/database/TelemetryEngine.py index ebeaf378705260b6d230e0fe4f70b718d003ef4a..2b47e4ec86c70e5944212f7f9259cac834673a58 100644 --- a/src/telemetry/database/TelemetryEngine.py +++ b/src/telemetry/database/TelemetryEngine.py @@ -21,7 +21,6 @@ APP_NAME = 'tfs' ECHO = False # False: No dump SQL commands and transactions executed CRDB_URI_TEMPLATE = 'cockroachdb://{:s}:{:s}@127.0.0.1:{:s}/{:s}?sslmode={:s}' # CRDB_URI_TEMPLATE = 'cockroachdb://{:s}:{:s}@cockroachdb-public.{:s}.svc.cluster.local:{:s}/{:s}?sslmode={:s}' -# CRDB_URI_TEMPLATE = 'cockroachdb://{:s}:{:s}@cockroachdb-public.{:s}.svc.cluster.local:{:s}/{:s}?sslmode={:s}' class TelemetryEngine: # def __init__(self): @@ -51,6 +50,7 @@ class TelemetryEngine: @staticmethod def create_database(engine : sqlalchemy.engine.Engine) -> None: if not sqlalchemy_utils.database_exists(engine.url): + LOGGER.info("Database created. {:}".format(engine.url)) sqlalchemy_utils.create_database(engine.url) @staticmethod diff --git a/src/telemetry/database/managementDB.py b/src/telemetry/database/managementDB.py index f8d0ef9cbf647b17c2e74864be78ce5e729cd690..7061334772e46acdf8f530a62125efa23066755e 100644 --- a/src/telemetry/database/managementDB.py +++ b/src/telemetry/database/managementDB.py @@ -64,9 +64,60 @@ class managementDB: try: session.add(row) session.commit() - LOGGER.info(f"Row inserted into {row.__class__.__name__} table. {row.__class__.__name__} Id: : {row.collector_id}") + LOGGER.info(f"Row inserted into {row.__class__.__name__} table.") except Exception as e: session.rollback() LOGGER.error(f"Failed to insert new row into {row.__class__.__name__} table. {str(e)}") + finally: + session.close() + + def search_db_row_by_id(self, model, col_name, id_to_search): + session = self.Session() + try: + entity = session.query(model).filter_by(**{col_name: id_to_search}).first() + if entity: + LOGGER.info(f"{model.__name__} ID found: {str(entity)}") + return entity + else: + LOGGER.warning(f"{model.__name__} ID not found: {str(id_to_search)}") + return None + except Exception as e: + session.rollback() + LOGGER.info(f"Failed to retrieve {model.__name__} ID. {str(e)}") + raise + finally: + session.close() + + def delete_db_row_by_id(self, model, col_name, id_to_search): + session = self.Session() + try: + record = session.query(model).filter_by(**{col_name: id_to_search}).first() + if record: + session.delete(record) + session.commit() + LOGGER.info("Deleted %s with %s: %s", model.__name__, col_name, id_to_search) + else: + LOGGER.warning("%s with %s %s not found", model.__name__, col_name, id_to_search) + except Exception as e: + session.rollback() + LOGGER.error("Error deleting %s with %s %s: %s", model.__name__, col_name, id_to_search, e) + finally: + session.close() + + def select_with_filter(self, model, **filters): + session = self.Session() + try: + query = session.query(model) + for column, value in filters.items(): + query = query.filter(getattr(model, column) == value) # type: ignore + result = query.all() + if result: + LOGGER.info(f"Fetched filtered rows from {model.__name__} table with filters: {filters}- Results: {result}") # + else: + LOGGER.warning(f"No matching row found in {model.__name__} table with filters: {filters}") + return result + except Exception as e: + LOGGER.error(f"Error fetching filtered rows from {model.__name__} table with filters {filters} ::: {e}") + return [] finally: session.close() \ No newline at end of file diff --git a/src/telemetry/database/tests/telemetryDBtests.py b/src/telemetry/database/tests/telemetryDBtests.py index 14def9ef24e12360c793014e396b8c596f95a74f..9cb856a3da147d6438ac2119b70ff0daad1a1073 100644 --- a/src/telemetry/database/tests/telemetryDBtests.py +++ b/src/telemetry/database/tests/telemetryDBtests.py @@ -35,51 +35,52 @@ def test_telemetry_object_creation(): LOGGER.info('>>> Creating TelemetryDBmanager Object <<< ') TelemetryDBmanagerObj = TelemetryDBmanager() + TelemetryEngine.create_database(TelemetryDBmanagerObj.db_engine) - # LOGGER.info('>>> Creating database <<< ') - # TelemetryDBmanagerObj.create_database() + LOGGER.info('>>> Creating database <<< ') + TelemetryDBmanagerObj.create_database() - # LOGGER.info('>>> verifing database <<< ') - # TelemetryDBmanagerObj.list_databases() + LOGGER.info('>>> verifing database <<< ') + TelemetryDBmanagerObj.list_databases() # # LOGGER.info('>>> Droping Tables: ') # # TelemetryDBmanagerObj.drop_table("table_naem_here") - # LOGGER.info('>>> Creating Tables <<< ') - # TelemetryDBmanagerObj.create_tables() + LOGGER.info('>>> Creating Tables <<< ') + TelemetryDBmanagerObj.create_tables() LOGGER.info('>>> Verifing Table creation <<< ') TelemetryDBmanagerObj.verify_tables() - LOGGER.info('>>> TESTING: Row Insertion Operation: kpi Table <<<') - kpi_obj = create_kpi_request() - TelemetryDBmanagerObj.inser_kpi(kpi_obj) + # LOGGER.info('>>> TESTING: Row Insertion Operation: kpi Table <<<') + # kpi_obj = create_kpi_request() + # TelemetryDBmanagerObj.inser_kpi(kpi_obj) - LOGGER.info('>>> TESTING: Row Insertion Operation: collector Table <<<') - collector_obj = create_collector_request() - TelemetryDBmanagerObj.insert_collector(collector_obj) + # LOGGER.info('>>> TESTING: Row Insertion Operation: collector Table <<<') + # collector_obj = create_collector_request() + # TelemetryDBmanagerObj.insert_collector(collector_obj) - LOGGER.info('>>> TESTING: Get KpiDescriptor <<<') - kpi_id_obj = create_kpi_id_request() - TelemetryDBmanagerObj.get_kpi_descriptor(kpi_id_obj) + # LOGGER.info('>>> TESTING: Get KpiDescriptor <<<') + # kpi_id_obj = create_kpi_id_request() + # TelemetryDBmanagerObj.get_kpi_descriptor(kpi_id_obj) - LOGGER.info('>>> TESTING: Select Collector <<<') - collector_id_obj = create_collector_id_request() - TelemetryDBmanagerObj.get_collector(collector_id_obj) + # LOGGER.info('>>> TESTING: Select Collector <<<') + # collector_id_obj = create_collector_id_request() + # TelemetryDBmanagerObj.get_collector(collector_id_obj) - LOGGER.info('>>> TESTING: Applying kpi filter <<< ') - kpi_filter : dict[str, Any] = create_kpi_filter_request() - TelemetryDBmanagerObj.select_kpi_descriptor(**kpi_filter) + # LOGGER.info('>>> TESTING: Applying kpi filter <<< ') + # kpi_filter : dict[str, Any] = create_kpi_filter_request() + # TelemetryDBmanagerObj.select_kpi_descriptor(**kpi_filter) - LOGGER.info('>>> TESTING: Applying collector filter <<<') - collector_filter : dict[str, Any] = create_collector_filter_request() - TelemetryDBmanagerObj.select_collector(**collector_filter) + # LOGGER.info('>>> TESTING: Applying collector filter <<<') + # collector_filter : dict[str, Any] = create_collector_filter_request() + # TelemetryDBmanagerObj.select_collector(**collector_filter) - LOGGER.info('>>> TESTING: Delete KpiDescriptor ') - kpi_id_obj = create_kpi_id_request() - TelemetryDBmanagerObj.delete_kpi_descriptor(kpi_id_obj) + # LOGGER.info('>>> TESTING: Delete KpiDescriptor ') + # kpi_id_obj = create_kpi_id_request() + # TelemetryDBmanagerObj.delete_kpi_descriptor(kpi_id_obj) - LOGGER.info('>>> TESTING: Delete Collector ') - collector_id_obj = create_collector_id_request() - TelemetryDBmanagerObj.delete_collector(collector_id_obj) + # LOGGER.info('>>> TESTING: Delete Collector ') + # collector_id_obj = create_collector_id_request() + # TelemetryDBmanagerObj.delete_collector(collector_id_obj) \ No newline at end of file