summaryrefslogtreecommitdiffstats
path: root/components/pm-subscription-handler/tests
diff options
context:
space:
mode:
authorSagarS <sagar.shetty@est.tech>2022-01-27 15:05:50 +0000
committerSagarS <sagar.shetty@est.tech>2022-02-07 18:04:39 +0000
commit2a21c78886d13c4266da639252d8fb899b7d34a5 (patch)
treeea006b6db878c6635f3f96479c19769f9f3e0e87 /components/pm-subscription-handler/tests
parent5b11f4ff05cf4bd3f042a4c531848b939e4ead8a (diff)
[DCAEGEN2] Update Administrative status for measurement group2.0.0-pmsh
Issue-ID: DCAEGEN2-2820 Change-Id: I290693edc5061c21bab6e0706eda02acb52e38e1 Signed-off-by: SagarS <sagar.shetty@est.tech>
Diffstat (limited to 'components/pm-subscription-handler/tests')
-rw-r--r--components/pm-subscription-handler/tests/services/test_measurement_group_service.py177
-rw-r--r--components/pm-subscription-handler/tests/services/test_subscription_service.py20
-rwxr-xr-xcomponents/pm-subscription-handler/tests/test_controller.py75
3 files changed, 256 insertions, 16 deletions
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 97353afe..f656513e 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
@@ -1,5 +1,5 @@
# ============LICENSE_START===================================================
-# Copyright (C) 2021 Nordix Foundation.
+# Copyright (C) 2021-2022 Nordix Foundation.
# ============================================================================
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -19,10 +19,13 @@
import json
import os
from unittest.mock import patch
-from mod.network_function import NetworkFunction
+
+from mod.api.custom_exception import InvalidDataException, DataConflictException
+from mod.network_function import NetworkFunction, NetworkFunctionFilter
from mod.pmsh_config import AppConfig
-from mod import db
-from tests.base_setup import BaseClassSetup
+from mod import db, aai_client
+from tests.base_setup import BaseClassSetup, create_subscription_data, \
+ create_multiple_network_function_data
from mod.api.services import measurement_group_service, nf_service
from mod.api.db_models import MeasurementGroupModel, NfMeasureGroupRelationalModel, \
SubscriptionModel, NetworkFunctionModel
@@ -69,7 +72,7 @@ class MeasurementGroupServiceTestCase(BaseClassSetup):
sub_model = SubscriptionModel('sub_publish', 'pmsh-operational-policy',
'pmsh-control-loop', 'LOCKED')
measurement_group_service.publish_measurement_group(
- sub_model, measurement_grp, nf_1)
+ sub_model, measurement_grp, nf_1, 'CREATE')
mock_mr.assert_called_once_with('policy_pm_publisher',
{'nfName': 'pnf_1',
'ipAddress': '2001:db8:3333:4444:5555:6666:7777:8888',
@@ -191,3 +194,167 @@ class MeasurementGroupServiceTestCase(BaseClassSetup):
subscription = self.subscription_request.replace('ExtraPM-All-gNB-R2B', new_sub_name)
subscription = subscription.replace('msrmt_grp_name', new_msrmt_grp_name)
return subscription
+
+ @patch.object(AppConfig, 'publish_to_topic')
+ def test_update_admin_status_to_locking(self, mock_mr):
+ super().setUpAppConf()
+ sub = create_subscription_data('sub')
+ nf_list = create_multiple_network_function_data(['pnf_101', 'pnf_102'])
+ db.session.add(sub)
+ for nf in nf_list:
+ nf_service.save_nf(nf)
+ measurement_group_service. \
+ apply_nf_status_to_measurement_group(nf.nf_name, sub.measurement_groups[0].
+ measurement_group_name,
+ SubNfState.CREATED.value)
+ db.session.commit()
+ measurement_group_service.update_admin_status(sub.measurement_groups[0], 'LOCKED')
+ meas_grp = measurement_group_service.query_meas_group_by_name('sub', 'MG1')
+ self.assertEqual(meas_grp.subscription_name, 'sub')
+ self.assertEqual(meas_grp.measurement_group_name, 'MG1')
+ self.assertEqual(meas_grp.administrative_state, 'LOCKING')
+ meas_group_nfs = db.session.query(NfMeasureGroupRelationalModel).filter(
+ NfMeasureGroupRelationalModel.measurement_grp_name == meas_grp.measurement_group_name)\
+ .all()
+ for nf in meas_group_nfs:
+ self.assertEqual(nf.nf_measure_grp_status, SubNfState.PENDING_DELETE.value)
+
+ @patch.object(AppConfig, 'publish_to_topic')
+ def test_update_admin_status_to_locked(self, mock_mr):
+ super().setUpAppConf()
+ sub = create_subscription_data('sub')
+ db.session.add(sub)
+ measurement_group_service.update_admin_status(sub.measurement_groups[0], 'LOCKED')
+ meas_grp = measurement_group_service.query_meas_group_by_name('sub', 'MG1')
+ self.assertEqual(meas_grp.subscription_name, 'sub')
+ self.assertEqual(meas_grp.measurement_group_name, 'MG1')
+ self.assertEqual(meas_grp.administrative_state, 'LOCKED')
+
+ @patch.object(AppConfig, 'publish_to_topic')
+ @patch.object(aai_client, '_get_all_aai_nf_data')
+ @patch.object(aai_client, 'get_aai_model_data')
+ @patch.object(NetworkFunctionFilter, 'get_network_function_filter')
+ def test_update_admin_status_to_unlocked_with_no_nfs(self, mock_filter_call,
+ mock_model_aai, mock_aai, mock_mr):
+ mock_aai.return_value = json.loads(self.aai_response_data)
+ mock_model_aai.return_value = json.loads(self.good_model_info)
+ super().setUpAppConf()
+ sub = create_subscription_data('sub')
+ sub.nfs = []
+ db.session.add(sub)
+ db.session.commit()
+ mock_filter_call.return_value = NetworkFunctionFilter.get_network_function_filter('sub')
+ measurement_group_service.update_admin_status(sub.measurement_groups[1], 'UNLOCKED')
+ meas_grp = measurement_group_service.query_meas_group_by_name('sub', 'MG2')
+ self.assertEqual(meas_grp.subscription_name, 'sub')
+ self.assertEqual(meas_grp.measurement_group_name, 'MG2')
+ self.assertEqual(meas_grp.administrative_state, 'UNLOCKED')
+ meas_group_nfs = db.session.query(NfMeasureGroupRelationalModel).filter(
+ NfMeasureGroupRelationalModel.measurement_grp_name == meas_grp.measurement_group_name)\
+ .all()
+ for nf in meas_group_nfs:
+ self.assertEqual(nf.nf_measure_grp_status, SubNfState.PENDING_CREATE.value)
+
+ @patch.object(AppConfig, 'publish_to_topic')
+ @patch.object(aai_client, '_get_all_aai_nf_data')
+ @patch.object(aai_client, 'get_aai_model_data')
+ @patch.object(NetworkFunctionFilter, 'get_network_function_filter')
+ def test_update_admin_status_to_unlocking(self, mock_filter_call,
+ mock_model_aai, mock_aai, mock_mr):
+ mock_aai.return_value = json.loads(self.aai_response_data)
+ mock_model_aai.return_value = json.loads(self.good_model_info)
+ super().setUpAppConf()
+ sub = create_subscription_data('sub')
+ db.session.add(sub)
+ db.session.commit()
+ mock_filter_call.return_value = NetworkFunctionFilter.get_network_function_filter('sub')
+ measurement_group_service.update_admin_status(sub.measurement_groups[1], 'UNLOCKED')
+ meas_grp = measurement_group_service.query_meas_group_by_name('sub', 'MG2')
+ self.assertEqual(meas_grp.subscription_name, 'sub')
+ self.assertEqual(meas_grp.measurement_group_name, 'MG2')
+ self.assertEqual(meas_grp.administrative_state, 'UNLOCKED')
+ meas_group_nfs = db.session.query(NfMeasureGroupRelationalModel).filter(
+ NfMeasureGroupRelationalModel.measurement_grp_name == meas_grp.measurement_group_name)\
+ .all()
+ for nf in meas_group_nfs:
+ self.assertEqual(nf.nf_measure_grp_status, SubNfState.PENDING_CREATE.value)
+
+ def test_update_admin_status_for_missing_measurement_group(self):
+ try:
+ measurement_group_service.update_admin_status(None, 'UNLOCKED')
+ except InvalidDataException as e:
+ self.assertEqual(e.args[0], 'Requested measurement group not available '
+ 'for admin status update')
+
+ def test_update_admin_status_for_data_conflict(self):
+ super().setUpAppConf()
+ sub = create_subscription_data('sub1')
+ sub.measurement_groups[0].administrative_state = 'LOCKING'
+ try:
+ measurement_group_service.update_admin_status(sub.measurement_groups[0], 'LOCKED')
+ except DataConflictException as e:
+ self.assertEqual(e.args[0], 'Cannot update admin status as Locked request'
+ ' is in progress for sub name: sub1 and '
+ 'meas group name: MG1')
+
+ def test_update_admin_status_for_same_state(self):
+ super().setUpAppConf()
+ sub = create_subscription_data('sub1')
+ try:
+ measurement_group_service.update_admin_status(sub.measurement_groups[0], 'UNLOCKED')
+ except InvalidDataException as e:
+ self.assertEqual(e.args[0], 'Measurement group is already in UNLOCKED '
+ 'state for sub name: sub1 and meas group '
+ 'name: MG1')
+
+ def test_lock_nf_to_meas_grp_for_locking_with_LOCKED_update(self):
+ sub = create_subscription_data('sub')
+ sub.measurement_groups[1].administrative_state = 'LOCKING'
+ nf_list = create_multiple_network_function_data(['pnf_101'])
+ db.session.add(sub)
+ for nf in nf_list:
+ nf_service.save_nf(nf)
+ measurement_group_service. \
+ apply_nf_status_to_measurement_group(nf.nf_name, sub.measurement_groups[1].
+ measurement_group_name,
+ SubNfState.PENDING_DELETE.value)
+ db.session.commit()
+ measurement_group_service.lock_nf_to_meas_grp(
+ "pnf_101", "MG2", SubNfState.DELETED.value)
+ measurement_grp_rel = (NfMeasureGroupRelationalModel.query.filter(
+ NfMeasureGroupRelationalModel.measurement_grp_name == 'MG2',
+ NfMeasureGroupRelationalModel.nf_name == 'pnf_101').one_or_none())
+ self.assertIsNone(measurement_grp_rel)
+ network_function = (NetworkFunctionModel.query.filter(
+ NetworkFunctionModel.nf_name == 'pnf_101').one_or_none())
+ self.assertIsNone(network_function)
+ meas_grp = measurement_group_service.query_meas_group_by_name('sub', 'MG2')
+ self.assertEqual(meas_grp.subscription_name, 'sub')
+ self.assertEqual(meas_grp.measurement_group_name, 'MG2')
+ self.assertEqual(meas_grp.administrative_state, 'LOCKED')
+
+ def test_lock_nf_to_meas_grp_with_no_LOCKED_update(self):
+ sub = create_subscription_data('sub')
+ sub.measurement_groups[1].administrative_state = 'LOCKING'
+ nf_list = create_multiple_network_function_data(['pnf_101', 'pnf_102'])
+ db.session.add(sub)
+ for nf in nf_list:
+ nf_service.save_nf(nf)
+ measurement_group_service. \
+ apply_nf_status_to_measurement_group(nf.nf_name, sub.measurement_groups[1].
+ measurement_group_name,
+ SubNfState.PENDING_DELETE.value)
+ db.session.commit()
+ measurement_group_service.lock_nf_to_meas_grp(
+ "pnf_101", "MG2", SubNfState.DELETED.value)
+ measurement_grp_rel = (NfMeasureGroupRelationalModel.query.filter(
+ NfMeasureGroupRelationalModel.measurement_grp_name == 'MG2',
+ NfMeasureGroupRelationalModel.nf_name == 'pnf_101').one_or_none())
+ self.assertIsNone(measurement_grp_rel)
+ network_function = (NetworkFunctionModel.query.filter(
+ NetworkFunctionModel.nf_name == 'pnf_101').one_or_none())
+ self.assertIsNone(network_function)
+ meas_grp = measurement_group_service.query_meas_group_by_name('sub', 'MG2')
+ self.assertEqual(meas_grp.subscription_name, 'sub')
+ self.assertEqual(meas_grp.measurement_group_name, 'MG2')
+ self.assertEqual(meas_grp.administrative_state, 'LOCKING')
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 44fb4eff..807806f8 100644
--- a/components/pm-subscription-handler/tests/services/test_subscription_service.py
+++ b/components/pm-subscription-handler/tests/services/test_subscription_service.py
@@ -1,5 +1,5 @@
# ============LICENSE_START===================================================
-# Copyright (C) 2021 Nordix Foundation.
+# Copyright (C) 2021-2022 Nordix Foundation.
# ============================================================================
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -101,7 +101,7 @@ class SubscriptionServiceTestCase(BaseClassSetup):
try:
subscription_service.create_subscription(subscription)
except InvalidDataException as exception:
- self.assertEqual(exception.invalid_message, ["AAI call failed"])
+ self.assertEqual(exception.args[0], ["AAI call failed"])
# Checking Rollback on publish failure with subscription and nfs captured
existing_subscription = (SubscriptionModel.query.filter(
@@ -122,7 +122,7 @@ class SubscriptionServiceTestCase(BaseClassSetup):
try:
subscription_service.create_subscription(subscription)
except InvalidDataException as exception:
- self.assertEqual(exception.invalid_message, ["AAI call failed"])
+ self.assertEqual(exception.args[0], ["AAI call failed"])
# Checking Rollback on AAI failure with subscription request saved
existing_subscription = (SubscriptionModel.query.filter(
@@ -134,7 +134,7 @@ class SubscriptionServiceTestCase(BaseClassSetup):
subscription_service.create_subscription(json.loads(self.subscription_request)
['subscription'])
except DuplicateDataException as exception:
- self.assertEqual(exception.duplicate_field_info,
+ self.assertEqual(exception.args[0],
"subscription Name: ExtraPM-All-gNB-R2B already exists.")
def test_missing_measurement_grp_name(self):
@@ -142,7 +142,7 @@ class SubscriptionServiceTestCase(BaseClassSetup):
try:
subscription_service.create_subscription(json.loads(subscription)['subscription'])
except InvalidDataException as exception:
- self.assertEqual(exception.invalid_message,
+ self.assertEqual(exception.args[0],
"No value provided for measurement group name")
def test_missing_administrative_state(self):
@@ -152,7 +152,7 @@ class SubscriptionServiceTestCase(BaseClassSetup):
try:
subscription_service.create_subscription(subscription['subscription'])
except InvalidDataException as exception:
- self.assertEqual(exception.invalid_message,
+ self.assertEqual(exception.args[0],
"No value provided for administrative state")
@patch.object(subscription_service, 'save_nf_filter')
@@ -319,7 +319,7 @@ class SubscriptionServiceTestCase(BaseClassSetup):
try:
subscription_service.check_missing_data(subscription)
except InvalidDataException as invalidEx:
- self.assertEqual(invalidEx.invalid_message, "No value provided in subscription name")
+ self.assertEqual(invalidEx.args[0], "No value provided in subscription name")
def test_check_missing_data_admin_status_missing(self):
subscription = self.subscription_request.replace(
@@ -328,7 +328,7 @@ class SubscriptionServiceTestCase(BaseClassSetup):
try:
subscription_service.check_missing_data(subscription)
except InvalidDataException as invalidEx:
- self.assertEqual(invalidEx.invalid_message,
+ self.assertEqual(invalidEx.args[0],
"No value provided for administrative state")
def test_check_missing_data_msr_grp_name(self):
@@ -337,7 +337,7 @@ class SubscriptionServiceTestCase(BaseClassSetup):
try:
subscription_service.check_missing_data(subscription)
except InvalidDataException as invalidEx:
- self.assertEqual(invalidEx.invalid_message,
+ self.assertEqual(invalidEx.args[0],
"No value provided for measurement group name")
def test_validate_nf_filter_with_no_filter_values(self):
@@ -346,7 +346,7 @@ class SubscriptionServiceTestCase(BaseClassSetup):
try:
subscription_service.validate_nf_filter(json.loads(nfFilter))
except InvalidDataException as invalidEx:
- self.assertEqual(invalidEx.invalid_message,
+ self.assertEqual(invalidEx.args[0],
"At least one filter within nfFilter must not be empty")
def test_db_string_to_list(self):
diff --git a/components/pm-subscription-handler/tests/test_controller.py b/components/pm-subscription-handler/tests/test_controller.py
index 1de7c175..94bfbfd6 100755
--- a/components/pm-subscription-handler/tests/test_controller.py
+++ b/components/pm-subscription-handler/tests/test_controller.py
@@ -22,8 +22,9 @@ from http import HTTPStatus
from mod import aai_client, db
from mod.api.controller import status, post_subscription, get_subscription_by_name, \
- get_subscriptions, get_meas_group_with_nfs, delete_subscription_by_name
+ get_subscriptions, get_meas_group_with_nfs, delete_subscription_by_name, update_admin_state
from tests.base_setup import BaseClassSetup
+from mod.api.custom_exception import InvalidDataException, DataConflictException
from mod.api.db_models import SubscriptionModel, NfMeasureGroupRelationalModel
from mod.subscription import SubNfState
from mod.network_function import NetworkFunctionFilter
@@ -252,3 +253,75 @@ class ControllerTestCase(BaseClassSetup):
def test_delete_sub_exception(self):
error, status_code = delete_subscription_by_name('None')
self.assertEqual(status_code, HTTPStatus.INTERNAL_SERVER_ERROR.value)
+
+ @patch('mod.pmsh_config.AppConfig.publish_to_topic', MagicMock(return_value=None))
+ def test_update_admin_state_api_for_locked_update(self):
+ sub = create_subscription_data('sub1')
+ nf_list = create_multiple_network_function_data(['pnf_101', 'pnf_102'])
+ db.session.add(sub)
+ for nf in nf_list:
+ nf_service.save_nf(nf)
+ measurement_group_service. \
+ apply_nf_status_to_measurement_group(nf.nf_name, sub.measurement_groups[0].
+ measurement_group_name,
+ SubNfState.CREATED.value)
+ db.session.commit()
+ response = update_admin_state('sub1', 'MG1', {'administrativeState': 'LOCKED'})
+ self.assertEqual(response[1], HTTPStatus.OK.value)
+ self.assertEqual(response[0], 'Successfully updated admin state')
+ mg_with_nfs, status_code = get_meas_group_with_nfs('sub1', 'MG1')
+ self.assertEqual(mg_with_nfs['subscriptionName'], 'sub1')
+ self.assertEqual(mg_with_nfs['measurementGroupName'], 'MG1')
+ self.assertEqual(mg_with_nfs['administrativeState'], 'LOCKING')
+ for nf in mg_with_nfs['networkFunctions']:
+ self.assertEqual(nf['nfMgStatus'], SubNfState.PENDING_DELETE.value)
+
+ @patch('mod.pmsh_config.AppConfig.publish_to_topic', MagicMock(return_value=None))
+ @patch.object(aai_client, '_get_all_aai_nf_data')
+ @patch.object(aai_client, 'get_aai_model_data')
+ @patch.object(NetworkFunctionFilter, 'get_network_function_filter')
+ def test_update_admin_state_api_for_unlocked_update(self, mock_filter_call,
+ mock_model_aai, mock_aai):
+ mock_aai.return_value = json.loads(self.aai_response_data)
+ mock_model_aai.return_value = json.loads(self.good_model_info)
+ sub = create_subscription_data('sub1')
+ db.session.add(sub)
+ nf_list = create_multiple_network_function_data(['pnf_101', 'pnf_102'])
+ for network_function in nf_list:
+ db.session.add(network_function)
+ db.session.commit()
+ mock_filter_call.return_value = NetworkFunctionFilter.get_network_function_filter('sub')
+ response = update_admin_state('sub1', 'MG2', {'administrativeState': 'UNLOCKED'})
+ self.assertEqual(response[1], HTTPStatus.OK.value)
+ self.assertEqual(response[0], 'Successfully updated admin state')
+ mg_with_nfs, status_code = get_meas_group_with_nfs('sub1', 'MG2')
+ self.assertEqual(mg_with_nfs['subscriptionName'], 'sub1')
+ self.assertEqual(mg_with_nfs['measurementGroupName'], 'MG2')
+ self.assertEqual(mg_with_nfs['administrativeState'], 'UNLOCKED')
+ for nf in mg_with_nfs['networkFunctions']:
+ self.assertEqual(nf['nfMgStatus'], SubNfState.PENDING_CREATE.value)
+
+ @patch('mod.api.services.measurement_group_service.update_admin_status',
+ MagicMock(side_effect=InvalidDataException('Bad request')))
+ def test_update_admin_state_api_invalid_data_exception(self):
+ error, status_code = update_admin_state('sub4', 'MG2',
+ {'administrativeState': 'UNLOCKED'})
+ self.assertEqual(status_code, HTTPStatus.BAD_REQUEST.value)
+ self.assertEqual(error, 'Bad request')
+
+ @patch('mod.api.services.measurement_group_service.update_admin_status',
+ MagicMock(side_effect=DataConflictException('Data conflict')))
+ def test_update_admin_state_api_data_conflict_exception(self):
+ error, status_code = update_admin_state('sub4', 'MG2',
+ {'administrativeState': 'UNLOCKED'})
+ self.assertEqual(status_code, HTTPStatus.CONFLICT.value)
+ self.assertEqual(error, 'Data conflict')
+
+ @patch('mod.api.services.measurement_group_service.update_admin_status',
+ MagicMock(side_effect=Exception('Server Error')))
+ def test_update_admin_state_api_exception(self):
+ error, status_code = update_admin_state('sub4', 'MG2',
+ {'administrativeState': 'UNLOCKED'})
+ self.assertEqual(status_code, HTTPStatus.INTERNAL_SERVER_ERROR.value)
+ self.assertEqual(error, 'Update admin status request was not processed for sub name: sub4 '
+ 'and meas group name: MG2 due to Exception : Server Error')