From 24454771f523f65fce5e3dce91cfe8cd15fc8be7 Mon Sep 17 00:00:00 2001 From: SagarS Date: Tue, 9 Nov 2021 17:36:43 +0000 Subject: [DCAEGEN2] PMSH Response Event Handler Integration Issue-ID: DCAEGEN2-2915 Change-Id: I95b34a7b5b011760ae30c1485925dc19fde5e6c8 Signed-off-by: SagarS --- components/pm-subscription-handler/Changelog.md | 1 + .../mod/api/services/measurement_group_service.py | 55 ++++++++++- .../mod/api/services/subscription_service.py | 7 +- .../pmsh_service/mod/policy_response_handler.py | 71 ++++++++------ .../pmsh_service/pmsh_service_main.py | 3 +- .../services/test_measurement_group_service.py | 89 +++++++++++++++-- .../tests/services/test_subscription_service.py | 2 +- .../tests/test_policy_response_handler.py | 106 +++++++++++---------- 8 files changed, 238 insertions(+), 96 deletions(-) (limited to 'components/pm-subscription-handler') diff --git a/components/pm-subscription-handler/Changelog.md b/components/pm-subscription-handler/Changelog.md index 89237c35..8e0ee2f9 100755 --- a/components/pm-subscription-handler/Changelog.md +++ b/components/pm-subscription-handler/Changelog.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). * Added 2 new attributes to the subscription model (DCAEGEN2-2913) * Read subscription API by using subscription name (DCAEGEN2-2818) * Read All subscriptions API (DCAEGEN2-2847) +* PMSH Response Event Handler Integration (DCAEGEN2-2915) ## [1.3.2] ### Changed diff --git a/components/pm-subscription-handler/pmsh_service/mod/api/services/measurement_group_service.py b/components/pm-subscription-handler/pmsh_service/mod/api/services/measurement_group_service.py index 733d803e..cc07cc03 100644 --- a/components/pm-subscription-handler/pmsh_service/mod/api/services/measurement_group_service.py +++ b/components/pm-subscription-handler/pmsh_service/mod/api/services/measurement_group_service.py @@ -18,8 +18,8 @@ from mod.api.db_models import MeasurementGroupModel, NfMeasureGroupRelationalModel from mod import db, logger -from mod.subscription import SubNfState from mod.api.services import nf_service +from mod.network_function import NetworkFunction from mod.pmsh_config import MRTopic, AppConfig @@ -47,18 +47,19 @@ def save_measurement_group(measurement_group, subscription_name): return new_measurement_group -def apply_nf_to_measgroup(nf_name, measurement_group_name): +def apply_nf_status_to_measurement_group(nf_name, measurement_group_name, status): """ Associate and saves the measurement group with Network function Args: nf_name (string): Network function name. measurement_group_name (string): Measurement group name + status (string): nf status to apply on measurement group """ new_nf_measure_grp_rel = NfMeasureGroupRelationalModel( measurement_grp_name=measurement_group_name, nf_name=nf_name, - nf_measure_grp_status=SubNfState.PENDING_CREATE.value + nf_measure_grp_status=status ) db.session.add(new_nf_measure_grp_rel) @@ -86,3 +87,51 @@ def publish_measurement_group(sub_model, measurement_group, nf): } logger.debug(f'Event Body: {event_body}') AppConfig.get_instance().publish_to_topic(MRTopic.POLICY_PM_PUBLISHER.value, event_body) + + +def update_measurement_group_nf_status(measurement_group_name, status, nf_name): + """ Updates the status of a measurement grp for a particular nf + + Args: + measurement_group_name (string): Measurement group name + nf_name (string): The network function name + status (string): status of the network function for measurement group + """ + try: + logger.info(f'Performing update for measurement group name: {measurement_group_name},' + f' network function name: {nf_name} on status: {status}') + NfMeasureGroupRelationalModel.query.filter( + NfMeasureGroupRelationalModel.measurement_grp_name == measurement_group_name, + NfMeasureGroupRelationalModel.nf_name == nf_name). \ + update({NfMeasureGroupRelationalModel.nf_measure_grp_status: status}, + synchronize_session='evaluate') + db.session.commit() + except Exception as e: + logger.error(f'Failed to update nf: {nf_name} for measurement group: ' + f'{measurement_group_name} due to: {e}') + + +def delete_nf_to_measurement_group(nf_name, measurement_group_name, status): + """ Deletes a particular nf related to a measurement group name and + if no more relations of nf exist to measurement group then delete nf from PMSH + + Args: + nf_name (string): The network function name + measurement_group_name (string): Measurement group name + status (string): status of the network function for measurement group + """ + try: + logger.info(f'Performing delete for measurement group name: {measurement_group_name},' + f' network function name: {nf_name} on status: {status}') + nf_measurement_group_rel = NfMeasureGroupRelationalModel.query.filter( + NfMeasureGroupRelationalModel.measurement_grp_name == measurement_group_name, + NfMeasureGroupRelationalModel.nf_name == nf_name).one_or_none() + db.session.delete(nf_measurement_group_rel) + db.session.commit() + nf_relations = NfMeasureGroupRelationalModel.query.filter( + NfMeasureGroupRelationalModel.nf_name == nf_name).all() + if not nf_relations: + NetworkFunction.delete(nf_name=nf_name) + except Exception as e: + logger.error(f'Failed to delete nf: {nf_name} for measurement group: ' + f'{measurement_group_name} due to: {e}') diff --git a/components/pm-subscription-handler/pmsh_service/mod/api/services/subscription_service.py b/components/pm-subscription-handler/pmsh_service/mod/api/services/subscription_service.py index 96d50c27..c33c82fb 100644 --- a/components/pm-subscription-handler/pmsh_service/mod/api/services/subscription_service.py +++ b/components/pm-subscription-handler/pmsh_service/mod/api/services/subscription_service.py @@ -21,7 +21,7 @@ from mod.api.db_models import SubscriptionModel, NfSubRelationalModel, \ NetworkFunctionFilterModel, NetworkFunctionModel from mod.api.services import measurement_group_service, nf_service from mod.api.custom_exception import InvalidDataException, DuplicateDataException -from mod.subscription import AdministrativeState +from mod.subscription import AdministrativeState, SubNfState from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import joinedload @@ -143,8 +143,9 @@ def apply_measurement_grp_to_nfs(filtered_nfs, measurement_groups): for nf in filtered_nfs: logger.info(f'Saving measurement group to nf name, measure_grp_name: {nf.nf_name},' f'{measurement_group.measurement_group_name}') - measurement_group_service.apply_nf_to_measgroup( - nf.nf_name, measurement_group.measurement_group_name) + measurement_group_service.apply_nf_status_to_measurement_group( + nf.nf_name, measurement_group.measurement_group_name, + SubNfState.PENDING_CREATE.value) else: logger.info(f'No nfs added as measure_grp_name: ' f'{measurement_group.measurement_group_name} is LOCKED') diff --git a/components/pm-subscription-handler/pmsh_service/mod/policy_response_handler.py b/components/pm-subscription-handler/pmsh_service/mod/policy_response_handler.py index 09c97047..1bc58081 100644 --- a/components/pm-subscription-handler/pmsh_service/mod/policy_response_handler.py +++ b/components/pm-subscription-handler/pmsh_service/mod/policy_response_handler.py @@ -1,5 +1,5 @@ # ============LICENSE_START=================================================== -# Copyright (C) 2020 Nordix Foundation. +# Copyright (C) 2020-2021 Nordix Foundation. # ============================================================================ # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -15,33 +15,31 @@ # # SPDX-License-Identifier: Apache-2.0 # ============LICENSE_END===================================================== - import json - +from mod.pmsh_config import MRTopic, AppConfig from mod import logger -from mod.network_function import NetworkFunction -from mod.subscription import Subscription, AdministrativeState, subscription_nf_states +from mod.subscription import AdministrativeState, subscription_nf_states +from mod.api.db_models import MeasurementGroupModel +from mod.api.services import measurement_group_service policy_response_handle_functions = { AdministrativeState.LOCKED.value: { - 'success': NetworkFunction.delete, - 'failed': Subscription.update_sub_nf_status + 'success': measurement_group_service.delete_nf_to_measurement_group, + 'failed': measurement_group_service.update_measurement_group_nf_status }, AdministrativeState.UNLOCKED.value: { - 'success': Subscription.update_sub_nf_status, - 'failed': Subscription.update_sub_nf_status + 'success': measurement_group_service.update_measurement_group_nf_status, + 'failed': measurement_group_service.update_measurement_group_nf_status }, AdministrativeState.LOCKING.value: { - 'success': NetworkFunction.delete, - 'failed': Subscription.update_sub_nf_status + 'success': measurement_group_service.delete_nf_to_measurement_group, + 'failed': measurement_group_service.update_measurement_group_nf_status } } class PolicyResponseHandler: - def __init__(self, mr_sub, app_conf, app): - self.mr_sub = mr_sub - self.app_conf = app_conf + def __init__(self, app): self.app = app def poll_policy_topic(self): @@ -50,38 +48,49 @@ class PolicyResponseHandler: relevant subscription and then handles the response """ self.app.app_context().push() - administrative_state = self.app_conf.subscription.administrativeState logger.info('Polling MR for XNF activation/deactivation policy response events.') try: - response_data = self.mr_sub.get_from_topic('dcae_pmsh_policy_cl_input') + response_data = AppConfig.get_instance(). \ + get_from_topic(MRTopic.POLICY_PM_SUBSCRIBER.value, 'dcae_pmsh_policy_cl_input') for data in response_data: data = json.loads(data) - if data['status']['subscriptionName'] \ - == self.app_conf.subscription.subscriptionName: - nf_name = data['status']['nfName'] - response_message = data['status']['message'] - self._handle_response(self.app_conf.subscription.subscriptionName, - administrative_state, nf_name, response_message) + measurement_group_name = data['status']['measurementGroupName'] + subscription_name = data['status']['subscriptionName'] + measurement_group = (MeasurementGroupModel.query.filter( + MeasurementGroupModel.measurement_group_name == measurement_group_name, + subscription_name == MeasurementGroupModel + .subscription_name).one_or_none()) + nf_name = data['status']['nfName'] + response_message = data['status']['message'] + if measurement_group: + self._handle_response(measurement_group_name, + measurement_group.administrative_state, + nf_name, response_message) + else: + logger.info(f'Polled MR response provides missing measurement ' + f'group name : {measurement_group_name}') except Exception as err: logger.error(f'Error trying to poll policy response topic on MR: {err}', exc_info=True) @staticmethod - def _handle_response(subscription_name, administrative_state, nf_name, response_message): + def _handle_response(measurement_group_name, administrative_state, nf_name, response_message): """ Handles the response from Policy, updating the DB - Args: - subscription_name (str): The subscription name - administrative_state (str): The administrative state of the subscription - nf_name (str): The network function name - response_message (str): The message in the response regarding the state (success|failed) + measurement_group_name (string): The measurement group name + administrative_state (string): The administrative state of the measurement group + nf_name (string): The network function name + response_message (string): The message in the response + regarding the state (success|failed) """ - logger.info(f'Response from MR: Sub: {subscription_name} for ' + logger.info(f'Response from MR: measurement group name: {measurement_group_name} for ' f'NF: {nf_name} received, updating the DB') try: - sub_nf_status = subscription_nf_states[administrative_state][response_message].value + nf_measure_grp_status = subscription_nf_states[administrative_state][response_message]\ + .value policy_response_handle_functions[administrative_state][response_message]( - subscription_name=subscription_name, status=sub_nf_status, nf_name=nf_name) + measurement_group_name=measurement_group_name, status=nf_measure_grp_status, + nf_name=nf_name) except Exception as err: logger.error(f'Error changing nf_sub status in the DB: {err}') raise diff --git a/components/pm-subscription-handler/pmsh_service/pmsh_service_main.py b/components/pm-subscription-handler/pmsh_service/pmsh_service_main.py index 0b6544b5..fe151c0d 100755 --- a/components/pm-subscription-handler/pmsh_service/pmsh_service_main.py +++ b/components/pm-subscription-handler/pmsh_service/pmsh_service_main.py @@ -35,13 +35,12 @@ def main(): app_conf = AppConfig() pmsh_app_conf = NewAppConfig() policy_mr_pub = app_conf.get_mr_pub('policy_pm_publisher') - policy_mr_sub = app_conf.get_mr_sub('policy_pm_subscriber') aai_event_mr_sub = app_conf.get_mr_sub('aai_subscriber') except Exception as e: logger.error(f'Failed to get config and create application: {e}', exc_info=True) sys.exit(e) - policy_response_handler = PolicyResponseHandler(policy_mr_sub, app_conf, app) + policy_response_handler = PolicyResponseHandler(app) policy_response_handler_thread = PeriodicTask(25, policy_response_handler.poll_policy_topic) policy_response_handler_thread.name = 'policy_event_thread' logger.info('Start polling PMSH_CL_INPUT topic on DMaaP MR.') diff --git a/components/pm-subscription-handler/tests/services/test_measurement_group_service.py b/components/pm-subscription-handler/tests/services/test_measurement_group_service.py index 46c4bac7..97353afe 100644 --- a/components/pm-subscription-handler/tests/services/test_measurement_group_service.py +++ b/components/pm-subscription-handler/tests/services/test_measurement_group_service.py @@ -23,9 +23,9 @@ from mod.network_function import NetworkFunction from mod.pmsh_config import AppConfig from mod import db from tests.base_setup import BaseClassSetup -from mod.api.services import measurement_group_service -from mod.api.db_models import MeasurementGroupModel, NfMeasureGroupRelationalModel,\ - SubscriptionModel +from mod.api.services import measurement_group_service, nf_service +from mod.api.db_models import MeasurementGroupModel, NfMeasureGroupRelationalModel, \ + SubscriptionModel, NetworkFunctionModel from mod.subscription import SubNfState @@ -99,17 +99,94 @@ class MeasurementGroupServiceTestCase(BaseClassSetup): MeasurementGroupModel.subscription_name == 'ExtraPM-All-gNB-R2B').one_or_none()) self.assertIsNotNone(measurement_grp) - def test_apply_nf_to_measgroup(self): - measurement_group_service.apply_nf_to_measgroup("pnf_test", "measure_grp_name") + def test_apply_nf_to_measurement_group_status(self): + measurement_group_service.apply_nf_status_to_measurement_group( + "pnf_test", "measure_grp_name", SubNfState.PENDING_CREATE.value) db.session.commit() measurement_grp_rel = (NfMeasureGroupRelationalModel.query.filter( NfMeasureGroupRelationalModel.measurement_grp_name == 'measure_grp_name', NfMeasureGroupRelationalModel.nf_name == 'pnf_test').one_or_none()) - db.session.commit() self.assertIsNotNone(measurement_grp_rel) self.assertEqual(measurement_grp_rel.nf_measure_grp_status, SubNfState.PENDING_CREATE.value) + def test_update_measurement_group_nf_status(self): + measurement_group_service.apply_nf_status_to_measurement_group( + "pnf_test", "measure_grp_name", SubNfState.PENDING_CREATE.value) + measurement_group_service.update_measurement_group_nf_status( + "measure_grp_name", SubNfState.CREATED.value, "pnf_test") + db.session.commit() + measurement_grp_rel = (NfMeasureGroupRelationalModel.query.filter( + NfMeasureGroupRelationalModel.measurement_grp_name == 'measure_grp_name', + NfMeasureGroupRelationalModel.nf_name == 'pnf_test').one_or_none()) + self.assertIsNotNone(measurement_grp_rel) + self.assertEqual(measurement_grp_rel.nf_measure_grp_status, + SubNfState.CREATED.value) + + def test_delete_nf_to_measurement_group_without_nf_delete(self): + nf = NetworkFunction(nf_name='pnf_test1') + nf_service.save_nf(nf) + db.session.commit() + measurement_group_service.apply_nf_status_to_measurement_group( + "pnf_test1", "measure_grp_name1", SubNfState.PENDING_CREATE.value) + measurement_group_service.apply_nf_status_to_measurement_group( + "pnf_test1", "measure_grp_name2", SubNfState.PENDING_CREATE.value) + measurement_group_service.delete_nf_to_measurement_group( + "pnf_test1", "measure_grp_name1", SubNfState.DELETED.value) + measurement_grp_rel = (NfMeasureGroupRelationalModel.query.filter( + NfMeasureGroupRelationalModel.measurement_grp_name == 'measure_grp_name1', + NfMeasureGroupRelationalModel.nf_name == 'pnf_test1').one_or_none()) + self.assertIsNone(measurement_grp_rel) + network_function = (NetworkFunctionModel.query.filter( + NetworkFunctionModel.nf_name == 'pnf_test1').one_or_none()) + self.assertIsNotNone(network_function) + + def test_delete_nf_to_measurement_group_with_nf_delete(self): + nf = NetworkFunction(nf_name='pnf_test2') + nf_service.save_nf(nf) + db.session.commit() + measurement_group_service.apply_nf_status_to_measurement_group( + "pnf_test2", "measure_grp_name2", SubNfState.PENDING_CREATE.value) + measurement_group_service.delete_nf_to_measurement_group( + "pnf_test2", "measure_grp_name2", SubNfState.DELETED.value) + measurement_grp_rel = (NfMeasureGroupRelationalModel.query.filter( + NfMeasureGroupRelationalModel.measurement_grp_name == 'measure_grp_name2', + NfMeasureGroupRelationalModel.nf_name == 'pnf_test2').one_or_none()) + self.assertIsNone(measurement_grp_rel) + network_function = (NetworkFunctionModel.query.filter( + NetworkFunctionModel.nf_name == 'pnf_test2').one_or_none()) + self.assertIsNone(network_function) + + @patch.object(NetworkFunction, 'delete') + @patch('mod.logger.error') + def test_delete_nf_to_measurement_group_failure(self, mock_logger, nf_delete_func): + nf = NetworkFunction(nf_name='pnf_test2') + nf_service.save_nf(nf) + db.session.commit() + measurement_group_service.apply_nf_status_to_measurement_group( + "pnf_test2", "measure_grp_name2", SubNfState.PENDING_CREATE.value) + nf_delete_func.side_effect = Exception('delete failed') + measurement_group_service.delete_nf_to_measurement_group( + "pnf_test2", "measure_grp_name2", SubNfState.DELETED.value) + measurement_grp_rel = (NfMeasureGroupRelationalModel.query.filter( + NfMeasureGroupRelationalModel.measurement_grp_name == 'measure_grp_name2', + NfMeasureGroupRelationalModel.nf_name == 'pnf_test2').one_or_none()) + self.assertIsNone(measurement_grp_rel) + network_function = (NetworkFunctionModel.query.filter( + NetworkFunctionModel.nf_name == 'pnf_test2').one_or_none()) + self.assertIsNotNone(network_function) + mock_logger.assert_called_with('Failed to delete nf: pnf_test2 for ' + 'measurement group: measure_grp_name2 due to: delete failed') + + @patch.object(db.session, 'commit') + @patch('mod.logger.error') + def test_update_nf_to_measurement_group_failure(self, mock_logger, db_commit_call): + db_commit_call.side_effect = Exception('update failed') + measurement_group_service.update_measurement_group_nf_status( + "measure_grp_name2", SubNfState.CREATE_FAILED.value, "pnf_test2") + mock_logger.assert_called_with('Failed to update nf: pnf_test2 for ' + 'measurement group: measure_grp_name2 due to: update failed') + def create_test_subs(self, new_sub_name, new_msrmt_grp_name): subscription = self.subscription_request.replace('ExtraPM-All-gNB-R2B', new_sub_name) subscription = subscription.replace('msrmt_grp_name', new_msrmt_grp_name) diff --git a/components/pm-subscription-handler/tests/services/test_subscription_service.py b/components/pm-subscription-handler/tests/services/test_subscription_service.py index 86bf2639..8f3f0f4f 100644 --- a/components/pm-subscription-handler/tests/services/test_subscription_service.py +++ b/components/pm-subscription-handler/tests/services/test_subscription_service.py @@ -171,7 +171,7 @@ class SubscriptionServiceTestCase(BaseClassSetup): @patch.object(aai_client, '_get_all_aai_nf_data') @patch.object(aai_client, 'get_aai_model_data') - @patch.object(measurement_group_service, 'apply_nf_to_measgroup') + @patch.object(measurement_group_service, 'apply_nf_status_to_measurement_group') @patch.object(NetworkFunctionFilter, 'get_network_function_filter') def test_apply_measurement_grp_to_nfs(self, mock_filter_call, mock_apply_nf, mock_model_aai, mock_aai): diff --git a/components/pm-subscription-handler/tests/test_policy_response_handler.py b/components/pm-subscription-handler/tests/test_policy_response_handler.py index 9bf15939..3e6abf94 100644 --- a/components/pm-subscription-handler/tests/test_policy_response_handler.py +++ b/components/pm-subscription-handler/tests/test_policy_response_handler.py @@ -15,30 +15,26 @@ # # SPDX-License-Identifier: Apache-2.0 # ============LICENSE_END===================================================== -from unittest.mock import patch +from unittest.mock import patch, MagicMock -from mod.api.db_models import SubscriptionModel +from mod import db from mod.network_function import NetworkFunction from mod.policy_response_handler import PolicyResponseHandler, policy_response_handle_functions from mod.subscription import AdministrativeState, SubNfState -from tests.base_setup import BaseClassSetup +from tests.base_setup import BaseClassSetup, create_subscription_data class PolicyResponseHandlerTest(BaseClassSetup): - @classmethod def setUpClass(cls): super().setUpClass() @patch('mod.create_app') - @patch('mod.pmsh_utils._MrSub') - def setUp(self, mock_mr_sub, mock_app): + def setUp(self, mock_app): super().setUp() - self.mock_policy_mr_sub = mock_mr_sub + super().setUpAppConf() self.nf = NetworkFunction(nf_name='nf1') - self.policy_response_handler = PolicyResponseHandler(self.mock_policy_mr_sub, - self.app_conf, - mock_app) + self.policy_response_handler = PolicyResponseHandler(mock_app) def tearDown(self): super().tearDown() @@ -52,46 +48,67 @@ class PolicyResponseHandlerTest(BaseClassSetup): with patch.dict(policy_response_handle_functions, {AdministrativeState.LOCKED.value: {'success': mock_delete}}): self.policy_response_handler._handle_response( - self.app_conf.subscription.subscriptionName, + 'msr_grp_name', AdministrativeState.LOCKED.value, self.nf.nf_name, 'success') - mock_delete.assert_called() - @patch('mod.subscription.Subscription.update_sub_nf_status') + @patch('mod.api.services.measurement_group_service.update_measurement_group_nf_status') def test_handle_response_locked_failed(self, mock_update_sub_nf): with patch.dict(policy_response_handle_functions, {AdministrativeState.LOCKED.value: {'failed': mock_update_sub_nf}}): self.policy_response_handler._handle_response( - self.app_conf.subscription.subscriptionName, + 'msr_grp_name', AdministrativeState.LOCKED.value, self.nf.nf_name, 'failed') mock_update_sub_nf.assert_called_with( - subscription_name=self.app_conf.subscription.subscriptionName, + measurement_group_name='msr_grp_name', + status=SubNfState.DELETE_FAILED.value, nf_name=self.nf.nf_name) + + @patch('mod.network_function.NetworkFunction.delete') + def test_handle_response_locking_success(self, mock_delete): + with patch.dict(policy_response_handle_functions, + {AdministrativeState.LOCKING.value: {'success': mock_delete}}): + self.policy_response_handler._handle_response( + 'msr_grp_name', + AdministrativeState.LOCKING.value, + self.nf.nf_name, 'success') + mock_delete.assert_called() + + @patch('mod.api.services.measurement_group_service.update_measurement_group_nf_status') + def test_handle_response_locking_failed(self, mock_update_sub_nf): + with patch.dict(policy_response_handle_functions, + {AdministrativeState.LOCKING.value: {'failed': mock_update_sub_nf}}): + self.policy_response_handler._handle_response( + 'msr_grp_name', + AdministrativeState.LOCKING.value, + self.nf.nf_name, 'failed') + mock_update_sub_nf.assert_called_with( + measurement_group_name='msr_grp_name', status=SubNfState.DELETE_FAILED.value, nf_name=self.nf.nf_name) - @patch('mod.subscription.Subscription.update_sub_nf_status') + @patch('mod.api.services.measurement_group_service.update_measurement_group_nf_status') def test_handle_response_unlocked_success(self, mock_update_sub_nf): with patch.dict(policy_response_handle_functions, {AdministrativeState.UNLOCKED.value: {'success': mock_update_sub_nf}}): self.policy_response_handler._handle_response( - self.app_conf.subscription.subscriptionName, + 'msr_grp_name', AdministrativeState.UNLOCKED.value, self.nf.nf_name, 'success') mock_update_sub_nf.assert_called_with( - subscription_name=self.app_conf.subscription.subscriptionName, + measurement_group_name='msr_grp_name', status=SubNfState.CREATED.value, nf_name=self.nf.nf_name) - @patch('mod.subscription.Subscription.update_sub_nf_status') + @patch('mod.api.services.measurement_group_service.update_measurement_group_nf_status') def test_handle_response_unlocked_failed(self, mock_update_sub_nf): with patch.dict(policy_response_handle_functions, {AdministrativeState.UNLOCKED.value: {'failed': mock_update_sub_nf}}): self.policy_response_handler._handle_response( - self.app_conf.subscription.subscriptionName, + 'msr_grp_name', AdministrativeState.UNLOCKED.value, self.nf.nf_name, 'failed') mock_update_sub_nf.assert_called_with( - subscription_name=self.app_conf.subscription.subscriptionName, + measurement_group_name='msr_grp_name', status=SubNfState.CREATE_FAILED.value, nf_name=self.nf.nf_name) def test_handle_response_exception(self): @@ -99,45 +116,34 @@ class PolicyResponseHandlerTest(BaseClassSetup): 'wrong_state', 'nf1', 'wrong_message') @patch('mod.policy_response_handler.PolicyResponseHandler._handle_response') - @patch('mod.subscription.Subscription.get') - def test_poll_policy_topic_calls_methods_correct_sub(self, mock_get_sub, mock_handle_response): + @patch('mod.pmsh_config.AppConfig.get_from_topic') + def test_poll_policy_topic_calls_methods_correct_mg(self, mock_policy_mr_sub, + mock_handle_response): response_data = ['{"name": "ResponseEvent","status": { "subscriptionName": ' - '"ExtraPM-All-gNB-R2B", "nfName": "pnf300", "message": "success" } }'] - self.mock_policy_mr_sub.get_from_topic.return_value = response_data - mock_get_sub.return_value = SubscriptionModel(subscription_name='ExtraPM-All-gNB-R2B', - operational_policy_name='policy-name', - control_loop_name='control-loop-name', - status=AdministrativeState.UNLOCKED.value) + '"ExtraPM-All-gNB-R2B2", "nfName": "pnf300", "message": "success", ' + '"measurementGroupName":"MG1"} }'] + mock_policy_mr_sub.return_value = response_data + sub_model = create_subscription_data('ExtraPM-All-gNB-R2B2') + db.session.add(sub_model) + db.session.commit() self.policy_response_handler.poll_policy_topic() - self.mock_policy_mr_sub.get_from_topic.assert_called() - mock_handle_response.assert_called_with(self.app_conf.subscription.subscriptionName, + mock_handle_response.assert_called_with("MG1", AdministrativeState.UNLOCKED.value, 'pnf300', 'success') @patch('mod.policy_response_handler.PolicyResponseHandler._handle_response') - @patch('mod.subscription.Subscription.get') - def test_poll_policy_topic_no_method_calls_incorrect_sub(self, mock_get_sub, - mock_handle_response): + @patch('mod.pmsh_config.AppConfig.get_from_topic') + def test_poll_policy_topic_no_method_calls_unavailable_mg(self, mock_policy_mr_sub, + mock_handle_response): response_data = ['{"name": "ResponseEvent","status": { "subscriptionName": ' - '"Different_Subscription", "nfName": "pnf300", "message": "success" } }'] - self.mock_policy_mr_sub.get_from_topic.return_value = response_data - mock_get_sub.return_value = SubscriptionModel(subscription_name='ExtraPM-All-gNB-R2B', - operational_policy_name='policy-name', - control_loop_name='control-loop-name', - status=AdministrativeState.UNLOCKED.value) + '"Different_Subscription", "nfName": "pnf300", "message": "success",' + '"measurementGroupName":"msr_grp_name" } }'] + mock_policy_mr_sub.return_value = response_data self.policy_response_handler.poll_policy_topic() - - self.mock_policy_mr_sub.get_from_topic.assert_called() - mock_handle_response.assert_not_called() + @patch('mod.pmsh_config.AppConfig.get_from_topic', MagicMock(return_value='wrong_return')) @patch('mod.logger.error') - @patch('mod.subscription.Subscription.get') - def test_poll_policy_topic_exception(self, mock_get_sub, mock_logger): - self.mock_policy_mr_sub.get_from_topic.return_value = 'wrong_return' - mock_get_sub.return_value = SubscriptionModel(subscription_name='ExtraPM-All-gNB-R2B', - operational_policy_name='policy-name', - control_loop_name='control-loop-name', - status=AdministrativeState.UNLOCKED.value) + def test_poll_policy_topic_exception(self, mock_logger): self.policy_response_handler.poll_policy_topic() mock_logger.assert_called() -- cgit 1.2.3-korg