[PMSH] Operational policy and control loop updates 00/125500/6
authorraviteja.karumuri <raviteja.karumuri@est.tech>
Sun, 31 Oct 2021 19:09:19 +0000 (19:09 +0000)
committerraviteja.karumuri <raviteja.karumuri@est.tech>
Fri, 5 Nov 2021 14:36:17 +0000 (14:36 +0000)
Issue-ID: DCAEGEN2-2913

Signed-off-by: raviteja.karumuri <raviteja.karumuri@est.tech>
Change-Id: Ie64383aa55b07ef4387e9b1e8a2414f37901f0da

19 files changed:
components/pm-subscription-handler/Changelog.md
components/pm-subscription-handler/pmsh_service/mod/aai_event_handler.py
components/pm-subscription-handler/pmsh_service/mod/api/db_models.py
components/pm-subscription-handler/pmsh_service/mod/api/services/measurement_group_service.py
components/pm-subscription-handler/pmsh_service/mod/api/services/nf_service.py
components/pm-subscription-handler/pmsh_service/mod/api/services/subscription_service.py
components/pm-subscription-handler/pmsh_service/mod/pmsh_config.py
components/pm-subscription-handler/pmsh_service/mod/pmsh_utils.py
components/pm-subscription-handler/pmsh_service/mod/subscription.py
components/pm-subscription-handler/pmsh_service/mod/subscription_handler.py
components/pm-subscription-handler/tests/data/create_subscription_request.json
components/pm-subscription-handler/tests/data/pm_subscription_event.json
components/pm-subscription-handler/tests/services/test_measurement_group_service.py
components/pm-subscription-handler/tests/services/test_nf_service.py
components/pm-subscription-handler/tests/services/test_subscription_service.py
components/pm-subscription-handler/tests/test_pmsh_utils.py
components/pm-subscription-handler/tests/test_policy_response_handler.py
components/pm-subscription-handler/tests/test_subscription.py
components/pm-subscription-handler/tests/test_subscription_handler.py

index eff8419..5fe19ba 100755 (executable)
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
 * Updated PMSH app configuration, simplified existing config (DCAEGEN2-2814)
 * Created Schema definitions in swagger file according to the new structure (DCAEGEN2-2889)
 * Implemented Create Subscription public API (DCAEGEN2-2819)
+* Added 2 new attributes to the subscription model (DCAEGEN2-2913)
 
 ## [1.3.2]
 ### Changed
index 6fc4ba9..a00c164 100755 (executable)
@@ -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.
@@ -78,7 +78,7 @@ def process_aai_events(mr_sub, mr_pub, app, app_conf):
 def _process_event(action, nf, mr_pub, app_conf):
     if action == AAIEvent.UPDATE.value:
         logger.info(f'Update event found for network function {nf.nf_name}')
-        app_conf.subscription.create_subscription_on_nfs([nf], mr_pub, app_conf)
+        app_conf.subscription.create_subscription_on_nfs([nf], mr_pub)
     elif action == AAIEvent.DELETE.value:
         logger.info(f'Delete event found for network function {nf.nf_name}')
         NetworkFunction.delete(nf_name=nf.nf_name)
index 2b340e2..49ca058 100755 (executable)
@@ -26,6 +26,8 @@ class SubscriptionModel(db.Model):
     __tablename__ = 'subscriptions'
     id = Column(Integer, primary_key=True, autoincrement=True)
     subscription_name = Column(String(100), unique=True, nullable=False)
+    operational_policy_name = Column(String(80), nullable=False)
+    control_loop_name = Column(String(80))
     status = Column(String(20))
 
     nfs = relationship(
@@ -43,12 +45,17 @@ class SubscriptionModel(db.Model):
         cascade='all, delete-orphan',
         backref='subscription')
 
-    def __init__(self, subscription_name, status):
+    def __init__(self, subscription_name, operational_policy_name, control_loop_name, status):
         self.subscription_name = subscription_name
+        self.operational_policy_name = operational_policy_name
+        self.control_loop_name = control_loop_name
         self.status = status
 
     def __repr__(self):
-        return f'subscription_name: {self.subscription_name}, status: {self.status}'
+        return f'subscription_name: {self.subscription_name},' \
+               f'operational_policy_name: {self.operational_policy_name},' \
+               f'control_loop_name: {self.control_loop_name},' \
+               f'status: {self.status}'
 
     def __eq__(self, other):
         if isinstance(self, other.__class__):
@@ -59,7 +66,10 @@ class SubscriptionModel(db.Model):
         sub_nfs = NfSubRelationalModel.query.filter(
             NfSubRelationalModel.subscription_name == self.subscription_name).all()
         db.session.remove()
-        return {'subscription_name': self.subscription_name, 'subscription_status': self.status,
+        return {'subscription_name': self.subscription_name,
+                'operational_policy_name': self.operational_policy_name,
+                'control_loop_name': self.control_loop_name,
+                'subscription_status': self.status,
                 'network_functions': [sub_nf.serialize_nf() for sub_nf in sub_nfs]}
 
 
index 329dc85..733d803 100644 (file)
@@ -63,19 +63,19 @@ def apply_nf_to_measgroup(nf_name, measurement_group_name):
     db.session.add(new_nf_measure_grp_rel)
 
 
-def publish_measurement_group(subscription_name, measurement_group, nf):
+def publish_measurement_group(sub_model, measurement_group, nf):
     """
     Publishes an event for measurement group against nfs to MR
 
     Args:
-        subscription_name (string): Subscription name to publish against nf
+        sub_model(SubscriptionModel): Subscription model object
         measurement_group (MeasurementGroupModel): Measurement group to publish
         nf (NetworkFunction): Network function to publish.
    """
-    event_body = nf_service.create_nf_event_body(nf, 'CREATE')
+    event_body = nf_service.create_nf_event_body(nf, 'CREATE', sub_model)
     event_body['subscription'] = {
         "administrativeState": measurement_group.administrative_state,
-        "subscriptionName": subscription_name,
+        "subscriptionName": sub_model.subscription_name,
         "fileBasedGP": measurement_group.file_based_gp,
         "fileLocation": measurement_group.file_location,
         "measurementGroup": {
@@ -84,4 +84,5 @@ def publish_measurement_group(subscription_name, measurement_group, nf):
             "managedObjectDNsBasic": measurement_group.managed_object_dns_basic
         }
     }
+    logger.debug(f'Event Body: {event_body}')
     AppConfig.get_instance().publish_to_topic(MRTopic.POLICY_PM_PUBLISHER.value, event_body)
index 1fca766..6d43147 100644 (file)
@@ -37,25 +37,25 @@ def capture_filtered_nfs(sub_name):
     return aai_client.get_pmsh_nfs_from_aai(AppConfig.get_instance(), nf_filter)
 
 
-def create_nf_event_body(nf, change_type):
+def create_nf_event_body(nf, change_type, sub_model):
     """
     Creates a network function event body to publish on MR
 
     Args:
         nf (NetworkFunction): the Network function to include in the event.
         change_type (string): define the change type to be applied on node
+        sub_model(SubscriptionModel): Subscription model object
     Returns:
         dict: network function event body to publish on MR.
     """
-    app_conf = AppConfig.get_instance()
     return {'nfName': nf.nf_name,
             'ipAddress': nf.ipv4_address if nf.ipv6_address in (None, '')
             else nf.ipv6_address,
             'blueprintName': nf.sdnc_model_name,
             'blueprintVersion': nf.sdnc_model_version,
-            'policyName': app_conf.operational_policy_name,
+            'operationalPolicyName': sub_model.operational_policy_name,
             'changeType': change_type,
-            'closedLoopControlName': app_conf.control_loop_name}
+            'controlLoopName': sub_model.control_loop_name}
 
 
 def save_nf(nf):
index 1485beb..ea1640c 100644 (file)
@@ -39,24 +39,28 @@ def create_subscription(subscription):
     logger.info(f'Initiating create subscription for: {subscription["subscriptionName"]}')
     perform_validation(subscription)
     try:
-        sub_name, measurement_groups = save_subscription_request(subscription)
+        sub_model, measurement_groups = save_subscription_request(subscription)
         db.session.commit()
         logger.info(f'Successfully saved subscription request for: '
                     f'{subscription["subscriptionName"]}')
-        filtered_nfs = nf_service.capture_filtered_nfs(sub_name)
+        filtered_nfs = nf_service.capture_filtered_nfs(sub_model.subscription_name)
         if filtered_nfs:
-            logger.info(f'Applying the filtered nfs for subscription: {sub_name}')
+            logger.info(f'Applying the filtered nfs for subscription: '
+                        f'{sub_model.subscription_name}')
             save_filtered_nfs(filtered_nfs)
-            apply_subscription_to_nfs(filtered_nfs, sub_name)
+            apply_subscription_to_nfs(filtered_nfs, sub_model.subscription_name)
             unlocked_msmt_groups = apply_measurement_grp_to_nfs(filtered_nfs, measurement_groups)
             db.session.commit()
             if unlocked_msmt_groups:
-                publish_measurement_grp_to_nfs(sub_name, filtered_nfs, unlocked_msmt_groups)
+                publish_measurement_grp_to_nfs(sub_model, filtered_nfs,
+                                               unlocked_msmt_groups)
             else:
-                logger.error(f'All measurement groups are locked for subscription: {sub_name}, '
+                logger.error(f'All measurement groups are locked for subscription: '
+                             f'{sub_model.subscription_name}, '
                              f'please verify/check measurement groups.')
         else:
-            logger.error(f'No network functions found for subscription: {sub_name}, '
+            logger.error(f'No network functions found for subscription: '
+                         f'{sub_model.subscription_name}, '
                          f'please verify/check NetworkFunctionFilter.')
     except IntegrityError as e:
         db.session.rollback()
@@ -68,12 +72,13 @@ def create_subscription(subscription):
         db.session.remove()
 
 
-def publish_measurement_grp_to_nfs(subscription_name, filtered_nfs, measurement_groups):
+def publish_measurement_grp_to_nfs(sub_model, filtered_nfs,
+                                   measurement_groups):
     """
     Publishes an event for measurement groups against nfs
 
     Args:
-        subscription_name (string): subscription name against nfs
+        sub_model(SubscriptionModel): Subscription model object
         filtered_nfs (list[NetworkFunction])): list of filtered network functions
         measurement_groups (list[MeasurementGroupModel]): list of unlocked measurement group
     """
@@ -83,11 +88,11 @@ def publish_measurement_grp_to_nfs(subscription_name, filtered_nfs, measurement_
                 logger.info(f'Publishing event for nf name, measure_grp_name: {nf.nf_name},'
                             f'{measurement_group.measurement_group_name}')
                 measurement_group_service.publish_measurement_group(
-                    subscription_name, measurement_group, nf)
+                    sub_model, measurement_group, nf)
             except Exception as ex:
                 logger.error(f'Publish event failed for nf name, measure_grp_name, sub_name: '
                              f'{nf.nf_name},{measurement_group.measurement_group_name}, '
-                             f'{subscription_name} with error: {ex}')
+                             f'{sub_model.subscription_name} with error: {ex}')
 
 
 def save_filtered_nfs(filtered_nfs):
@@ -157,6 +162,8 @@ def check_missing_data(subscription):
     """
     if subscription['subscriptionName'].strip() in (None, ''):
         raise InvalidDataException("No value provided in subscription name")
+    if subscription['operationalPolicyName'].strip() in (None, ''):
+        raise InvalidDataException("Value required for operational Policy Name")
 
     for measurement_group in subscription.get('measurementGroups'):
         measurement_group_details = measurement_group['measurementGroup']
@@ -200,7 +207,7 @@ def save_subscription_request(subscription):
         list[MeasurementGroupModel]: list of measurement groups
     """
     logger.info(f'Saving subscription request for: {subscription["subscriptionName"]}')
-    sub_name = save_subscription(subscription).subscription_name
+    sub_model = save_subscription(subscription)
     save_nf_filter(subscription["nfFilter"], subscription["subscriptionName"])
     measurement_groups = []
     for measurement_group in subscription['measurementGroups']:
@@ -208,7 +215,7 @@ def save_subscription_request(subscription):
             measurement_group_service.save_measurement_group(
                 measurement_group['measurementGroup'],
                 subscription["subscriptionName"]))
-    return sub_name, measurement_groups
+    return sub_model, measurement_groups
 
 
 def check_duplicate_fields(subscription_name):
@@ -235,9 +242,18 @@ def save_subscription(subscription):
 
     Args:
         subscription (dict): subscription model to be saved.
+    Returns:
+        subscription_model(SubscriptionModel): subscription model
+                                               which is added to the session
     """
-    subscription_model = SubscriptionModel(subscription_name=subscription["subscriptionName"],
-                                           status=AdministrativeState.LOCKED.value)
+    control_loop_name = ""
+    if 'controlLoopName' in subscription:
+        control_loop_name = subscription['controlLoopName']
+    subscription_model = \
+        SubscriptionModel(subscription_name=subscription["subscriptionName"],
+                          operational_policy_name=subscription["operationalPolicyName"],
+                          control_loop_name=control_loop_name,
+                          status=AdministrativeState.LOCKED.value)
     db.session.add(subscription_model)
     return subscription_model
 
index a6fe38a..9c282ab 100644 (file)
@@ -69,9 +69,6 @@ class AppConfig(metaclass=MetaSingleton):
         self.streams_subscribes = app_config['config'].get('streams_subscribes')
         # TODO: aaf_creds variable should be removed on code cleanup
         self.aaf_creds = {'aaf_id': self.aaf_id, 'aaf_pass': self.aaf_pass}
-        # TODO: changes under discussion once resolve is confirmed will be removed
-        self.operational_policy_name = 'pmsh-operational-policy'
-        self.control_loop_name = 'pmsh-control-loop'
 
     @staticmethod
     def get_instance():
index 26ada11..d1790bb 100755 (executable)
@@ -76,7 +76,9 @@ class AppConfig:
         self.operational_policy_name = conf['config'].get('operational_policy_name')
         self.control_loop_name = conf['config'].get('control_loop_name')
         self.sub_schema = _load_sub_schema_from_file()
-        self.subscription = Subscription(**conf['config']['pmsh_policy']['subscription'])
+        self.subscription = Subscription(self.control_loop_name,
+                                         self.operational_policy_name,
+                                         **conf['config']['pmsh_policy']['subscription'])
         self.nf_filter = None
 
     def __new__(cls, *args, **kwargs):
@@ -129,7 +131,11 @@ class AppConfig:
         """
         try:
             app_conf = self._get_pmsh_config()
-            self.subscription = Subscription(**app_conf['config']['pmsh_policy']['subscription'])
+            self.operational_policy_name = app_conf['config'].get('operational_policy_name')
+            self.control_loop_name = app_conf['config'].get('control_loop_name')
+            self.subscription = Subscription(self.control_loop_name,
+                                             self.operational_policy_name,
+                                             **app_conf['config']['pmsh_policy']['subscription'])
             logger.info("AppConfig data has been refreshed")
         except Exception:
             logger.error('Failed to refresh PMSH AppConfig')
@@ -236,17 +242,17 @@ class _MrPub(_DmaapMrClient):
         except Exception as e:
             raise e
 
-    def publish_subscription_event_data(self, subscription, nf, app_conf):
+    def publish_subscription_event_data(self, subscription, nf):
         """
         Update the Subscription dict with xnf and policy name then publish to DMaaP MR topic.
 
         Args:
             subscription (Subscription): the `Subscription` <Subscription> object.
             nf (NetworkFunction): the NetworkFunction to include in the event.
-            app_conf (AppConfig): the application configuration.
         """
         try:
-            subscription_event = subscription.prepare_subscription_event(nf, app_conf)
+            subscription_event = subscription.prepare_subscription_event(nf)
+            logger.debug(f'Subscription event: {subscription_event}')
             self.publish_to_topic(subscription_event)
         except Exception as e:
             logger.error(f'Failed to publish to topic {self.topic_url}: {e}', exc_info=True)
index 7e878cd..bdfed18 100755 (executable)
@@ -62,13 +62,15 @@ def _get_nf_objects(nf_sub_relationships):
 
 
 class Subscription:
-    def __init__(self, **kwargs):
+    def __init__(self, control_loop_name, operational_policy_name, **kwargs):
         self.subscriptionName = kwargs.get('subscriptionName')
         self.administrativeState = kwargs.get('administrativeState')
         self.fileBasedGP = kwargs.get('fileBasedGP')
         self.fileLocation = kwargs.get('fileLocation')
         self.nfFilter = kwargs.get('nfFilter')
         self.measurementGroups = kwargs.get('measurementGroups')
+        self.control_loop_name = control_loop_name
+        self.operational_policy_name = operational_policy_name
         self.create()
 
     def update_sub_params(self, admin_state, file_based_gp, file_location, meas_groups):
@@ -87,8 +89,12 @@ class Subscription:
             existing_subscription = (SubscriptionModel.query.filter(
                 SubscriptionModel.subscription_name == self.subscriptionName).one_or_none())
             if existing_subscription is None:
-                new_subscription = SubscriptionModel(subscription_name=self.subscriptionName,
-                                                     status=AdministrativeState.LOCKED.value)
+                new_subscription = \
+                    SubscriptionModel(subscription_name=self.subscriptionName,
+                                      operational_policy_name=self.operational_policy_name,
+                                      control_loop_name=self.control_loop_name,
+                                      status=AdministrativeState.LOCKED.value)
+
                 db.session.add(new_subscription)
                 db.session.commit()
                 return new_subscription
@@ -117,18 +123,19 @@ class Subscription:
         finally:
             db.session.remove()
 
-    def prepare_subscription_event(self, nf, app_conf):
+    def prepare_subscription_event(self, nf):
         """Prepare the sub event for publishing
 
         Args:
             nf (NetworkFunction): the AAI nf.
-            app_conf (AppConfig): the application configuration.
 
         Returns:
             dict: the Subscription event to be published.
         """
         try:
-            clean_sub = {k: v for k, v in self.__dict__.items() if k != 'nfFilter'}
+            clean_sub = \
+                {k: v for k, v in self.__dict__.items() if
+                 (k != 'nfFilter' and k != 'control_loop_name' and k != 'operational_policy_name')}
             if self.administrativeState == AdministrativeState.LOCKING.value:
                 change_type = 'DELETE'
             else:
@@ -139,9 +146,9 @@ class Subscription:
                 'ipAddress': nf.ipv4_address if nf.ipv6_address in (None, '') else nf.ipv6_address,
                 'blueprintName': nf.sdnc_model_name,
                 'blueprintVersion': nf.sdnc_model_version,
-                'policyName': app_conf.operational_policy_name,
+                'operationalPolicyName': self.operational_policy_name,
                 'changeType': change_type,
-                'closedLoopControlName': app_conf.control_loop_name,
+                'controlLoopName': self.control_loop_name,
                 'subscription': clean_sub}
             return sub_event
         except Exception as e:
@@ -207,13 +214,12 @@ class Subscription:
         db.session.remove()
         return sub_models
 
-    def create_subscription_on_nfs(self, nfs, mr_pub, app_conf):
+    def create_subscription_on_nfs(self, nfs, mr_pub):
         """ Publishes an event to create a Subscription on an nf
 
         Args:
             nfs(list[NetworkFunction]): A list of NetworkFunction Objects.
             mr_pub (_MrPub): MR publisher
-            app_conf (AppConfig): the application configuration.
         """
         try:
             existing_nfs = self.get_network_functions()
@@ -221,26 +227,25 @@ class Subscription:
             for nf in [new_nf for new_nf in nfs if new_nf not in existing_nfs]:
                 logger.info(f'Publishing event to create '
                             f'Sub: {self.subscriptionName} on nf: {nf.nf_name}')
-                mr_pub.publish_subscription_event_data(self, nf, app_conf)
+                mr_pub.publish_subscription_event_data(self, nf)
                 self.add_network_function_to_subscription(nf, sub_model)
                 self.update_sub_nf_status(self.subscriptionName, SubNfState.PENDING_CREATE.value,
                                           nf.nf_name)
         except Exception as err:
             raise Exception(f'Error publishing create event to MR: {err}')
 
-    def delete_subscription_from_nfs(self, nfs, mr_pub, app_conf):
+    def delete_subscription_from_nfs(self, nfs, mr_pub):
         """ Publishes an event to delete a Subscription from an nf
 
         Args:
             nfs(list[NetworkFunction]): A list of NetworkFunction Objects.
             mr_pub (_MrPub): MR publisher
-            app_conf (AppConfig): the application configuration.
         """
         try:
             for nf in nfs:
                 logger.debug(f'Publishing Event to delete '
                              f'Sub: {self.subscriptionName} from the nf: {nf.nf_name}')
-                mr_pub.publish_subscription_event_data(self, nf, app_conf)
+                mr_pub.publish_subscription_event_data(self, nf)
                 self.update_sub_nf_status(self.subscriptionName,
                                           SubNfState.PENDING_DELETE.value,
                                           nf.nf_name)
index 22654b8..29f9121 100644 (file)
@@ -79,8 +79,7 @@ class SubscriptionHandler:
                                                      self.app_conf.subscription.fileLocation,
                                                      self.app_conf.subscription.measurementGroups)
         nfs_in_aai = aai_client.get_pmsh_nfs_from_aai(self.app_conf, self.app_conf.nf_filter)
-        self.app_conf.subscription.create_subscription_on_nfs(nfs_in_aai, self.mr_pub,
-                                                              self.app_conf)
+        self.app_conf.subscription.create_subscription_on_nfs(nfs_in_aai, self.mr_pub)
         self.app_conf.subscription.update_subscription_status()
 
     def _deactivate(self):
@@ -89,7 +88,7 @@ class SubscriptionHandler:
             self.stop_aai_event_thread()
             self.app_conf.subscription.administrativeState = AdministrativeState.LOCKING.value
             logger.info('Subscription is now LOCKING/DEACTIVATING.')
-            self.app_conf.subscription.delete_subscription_from_nfs(nfs, self.mr_pub, self.app_conf)
+            self.app_conf.subscription.delete_subscription_from_nfs(nfs, self.mr_pub)
             self.app_conf.subscription.update_subscription_status()
 
     def _start_aai_event_thread(self):
@@ -117,8 +116,7 @@ class SubscriptionHandler:
                     logger.info(f'Retry deletion of subscription '
                                 f'{self.app_conf.subscription.subscriptionName} '
                                 f'from NF: {nf.nf_name}')
-                    self.app_conf.subscription.delete_subscription_from_nfs([nf], self.mr_pub,
-                                                                            self.app_conf)
+                    self.app_conf.subscription.delete_subscription_from_nfs([nf], self.mr_pub)
                     nf.increment_retry_count()
                 else:
                     logger.error(f'Failed to delete the subscription '
index 0b2f86f..bc089a9 100644 (file)
@@ -1,6 +1,8 @@
 {
   "subscription": {
     "subscriptionName": "ExtraPM-All-gNB-R2B",
+    "operationalPolicyName":"pmsh-operational-policy",
+    "controlLoopName":"pmsh-control-loop",
     "nfFilter": {
       "nfNames": [
         "^pnf.*",
index 6b94373..6a7fe34 100755 (executable)
@@ -2,9 +2,9 @@
    "nfName":"pnf_1",\r
    "blueprintName": "some-name",\r
    "blueprintVersion": "some-version",\r
-   "policyName":"pmsh-operational-policy",\r
+   "operationalPolicyName":"pmsh-operational-policy",\r
    "changeType":"CREATE",\r
-   "closedLoopControlName":"pmsh-control-loop",\r
+   "controlLoopName":"pmsh-control-loop",\r
    "ipAddress": "204.120.0.15",\r
    "subscription":{\r
       "subscriptionName":"ExtraPM-All-gNB-R2B",\r
@@ -54,4 +54,4 @@
          }\r
       ]\r
    }\r
-}
\ No newline at end of file
+}\r
index e22b230..46c4bac 100644 (file)
@@ -24,7 +24,8 @@ 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
+from mod.api.db_models import MeasurementGroupModel, NfMeasureGroupRelationalModel,\
+    SubscriptionModel
 from mod.subscription import SubNfState
 
 
@@ -65,16 +66,18 @@ class MeasurementGroupServiceTestCase(BaseClassSetup):
                                                 'msg_publish', 'UNLOCKED',
                                                 15, 'pm.xml', [{"measurementType": "counter_a"}],
                                                 [{"DN": "string"}])
+        sub_model = SubscriptionModel('sub_publish', 'pmsh-operational-policy',
+                                      'pmsh-control-loop', 'LOCKED')
         measurement_group_service.publish_measurement_group(
-            'sub_publish', measurement_grp, nf_1)
+            sub_model, measurement_grp, nf_1)
         mock_mr.assert_called_once_with('policy_pm_publisher',
                                         {'nfName': 'pnf_1',
                                          'ipAddress': '2001:db8:3333:4444:5555:6666:7777:8888',
                                          'blueprintName': 'blah',
                                          'blueprintVersion': 1.0,
-                                         'policyName': 'pmsh-operational-policy',
+                                         'operationalPolicyName': 'pmsh-operational-policy',
                                          'changeType': 'CREATE',
-                                         'closedLoopControlName': 'pmsh-control-loop',
+                                         'controlLoopName': 'pmsh-control-loop',
                                          'subscription':
                                              {'administrativeState': 'UNLOCKED',
                                               'subscriptionName': 'sub_publish',
index 6063a8b..d582499 100644 (file)
@@ -20,7 +20,7 @@ import json
 import os
 from unittest.mock import patch
 from flask import current_app
-from mod.api.db_models import NetworkFunctionModel
+from mod.api.db_models import NetworkFunctionModel, SubscriptionModel
 from mod import aai_client
 from tests.base_setup import BaseClassSetup
 from mod.api.services import nf_service
@@ -78,16 +78,19 @@ class NetworkFunctionServiceTestCase(BaseClassSetup):
         subscription = json.loads(self.subscription_request)['subscription']
         mock_filter_call.return_value = NetworkFunctionFilter(**subscription["nfFilter"])
         nf = nf_service.capture_filtered_nfs(subscription["subscriptionName"])[0]
-        event_body = nf_service.create_nf_event_body(nf, 'CREATE')
+        sub_model = SubscriptionModel(subscription["subscriptionName"],
+                                      subscription['operationalPolicyName'],
+                                      subscription['controlLoopName'], 'LOCKED')
+        event_body = nf_service.create_nf_event_body(nf, 'CREATE', sub_model)
         self.assertEqual(event_body['nfName'], nf.nf_name)
         self.assertEqual(event_body['ipAddress'], nf.ipv6_address)
         self.assertEqual(event_body['blueprintName'], nf.sdnc_model_name)
         self.assertEqual(event_body['blueprintVersion'], nf.sdnc_model_version)
-        self.assertEqual(event_body['policyName'],
-                         self.app_conf.operational_policy_name)
+        self.assertEqual(event_body['operationalPolicyName'],
+                         sub_model.operational_policy_name)
         self.assertEqual(event_body['changeType'], 'CREATE')
-        self.assertEqual(event_body['closedLoopControlName'],
-                         self.app_conf.control_loop_name)
+        self.assertEqual(event_body['controlLoopName'],
+                         sub_model.control_loop_name)
 
     @patch.object(aai_client, '_get_all_aai_nf_data')
     @patch.object(aai_client, 'get_aai_model_data')
index dca6d87..a0e4d54 100644 (file)
@@ -202,6 +202,9 @@ class SubscriptionServiceTestCase(BaseClassSetup):
         mock_publish.return_value = None
         subscription = self.create_test_subs('xtraPM-All-gNB-R2B-new2', 'msrmt_grp_name-new2')
         subscription = json.loads(subscription)['subscription']
+        sub_model = SubscriptionModel(subscription["subscriptionName"],
+                                      subscription['operationalPolicyName'],
+                                      subscription['controlLoopName'], 'LOCKED')
         measurement_grp = MeasurementGroupModel('subscription_name_1',
                                                 'msrmt_grp_name', 'UNLOCKED',
                                                 15, 'pm.xml', [], [])
@@ -211,7 +214,7 @@ class SubscriptionServiceTestCase(BaseClassSetup):
         mock_filter_call.return_value = NetworkFunctionFilter(**subscription["nfFilter"])
         filtered_nfs = nf_service.capture_filtered_nfs(subscription["subscriptionName"])
         subscription_service.publish_measurement_grp_to_nfs(
-            subscription["subscriptionName"], filtered_nfs, measurement_grps)
+            sub_model, filtered_nfs, measurement_grps)
         # Two unlocked measurement Group published
         self.assertEqual(mock_publish.call_count, 6)
 
@@ -229,6 +232,9 @@ class SubscriptionServiceTestCase(BaseClassSetup):
         mock_publish.side_effect = Exception('Publish failed')
         subscription = self.create_test_subs('xtraPM-All-gNB-R2B-new2', 'msrmt_grp_name-new2')
         subscription = json.loads(subscription)['subscription']
+        sub_model = SubscriptionModel(subscription["subscriptionName"],
+                                      subscription['operationalPolicyName'],
+                                      subscription['controlLoopName'], 'LOCKED')
         measurement_grp = MeasurementGroupModel('subscription_name_1',
                                                 'msrmt_grp_name', 'UNLOCKED',
                                                 15, 'pm.xml', [], [])
@@ -238,7 +244,7 @@ class SubscriptionServiceTestCase(BaseClassSetup):
         mock_filter_call.return_value = NetworkFunctionFilter(**subscription["nfFilter"])
         filtered_nfs = nf_service.capture_filtered_nfs(subscription["subscriptionName"])
         subscription_service.publish_measurement_grp_to_nfs(
-            subscription["subscriptionName"], filtered_nfs, measurement_grps)
+            sub_model, filtered_nfs, measurement_grps)
         mock_logger.assert_called_with('Publish event failed for nf name, measure_grp_name, '
                                        'sub_name: pnf_33_ericsson,meas2, xtraPM-All-gNB-R2B-new2 '
                                        'with error: Publish failed')
index 5aab65e..57f20dd 100644 (file)
@@ -90,8 +90,7 @@ class PmshUtilsTestCase(BaseClassSetup):
                 self.app_conf.subscription,
                 NetworkFunction(nf_name='pnf_1',
                                 model_invariant_id='some-id',
-                                model_version_id='some-id'),
-                self.app_conf)
+                                model_version_id='some-id'))
             pub_to_topic_call.assert_called_once()
 
     @responses.activate
index 26a06fc..9bf1593 100644 (file)
@@ -1,5 +1,5 @@
 # ============LICENSE_START===================================================
-#  Copyright (C) 2019-2020 Nordix Foundation.
+#  Copyright (C) 2019-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.
@@ -105,6 +105,8 @@ class PolicyResponseHandlerTest(BaseClassSetup):
                          '"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)
         self.policy_response_handler.poll_policy_topic()
         self.mock_policy_mr_sub.get_from_topic.assert_called()
@@ -120,6 +122,8 @@ class PolicyResponseHandlerTest(BaseClassSetup):
                          '"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)
         self.policy_response_handler.poll_policy_topic()
 
@@ -132,6 +136,8 @@ class PolicyResponseHandlerTest(BaseClassSetup):
     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)
         self.policy_response_handler.poll_policy_topic()
         mock_logger.assert_called()
index 3921aa9..538baf3 100755 (executable)
@@ -114,7 +114,7 @@ class SubscriptionTest(BaseClassSetup):
     @patch('mod.subscription.Subscription.update_sub_nf_status')
     def test_process_activate_subscription(self, mock_update_sub_nf, mock_add_nfs):
         self.app_conf.subscription.create_subscription_on_nfs([list(self.xnfs)[0]],
-                                                              self.mock_mr_pub, self.app_conf)
+                                                              self.mock_mr_pub)
 
         mock_add_nfs.assert_called()
         self.assertTrue(self.mock_mr_pub.publish_subscription_event_data.called)
@@ -126,8 +126,7 @@ class SubscriptionTest(BaseClassSetup):
     def test_process_deactivate_subscription(self, mock_update_sub_nf, mock_get_nfs):
         self.app_conf.subscription.administrativeState = 'LOCKED'
         mock_get_nfs.return_value = [list(self.xnfs)[0]]
-        self.app_conf.subscription.delete_subscription_from_nfs(self.xnfs, self.mock_mr_pub,
-                                                                self.app_conf)
+        self.app_conf.subscription.delete_subscription_from_nfs(self.xnfs, self.mock_mr_pub)
         self.assertTrue(self.mock_mr_pub.publish_subscription_event_data.called)
         self.assertEqual(mock_update_sub_nf.call_count, 3)
 
@@ -146,7 +145,7 @@ class SubscriptionTest(BaseClassSetup):
                              model_version_id='some-id')
         nf.sdnc_model_name = 'some-name'
         nf.sdnc_model_version = 'some-version'
-        actual_sub_event = self.app_conf.subscription.prepare_subscription_event(nf, self.app_conf)
+        actual_sub_event = self.app_conf.subscription.prepare_subscription_event(nf)
         print(actual_sub_event)
         self.assertEqual(expected_sub_event, actual_sub_event)
 
@@ -162,7 +161,7 @@ class SubscriptionTest(BaseClassSetup):
                              model_version_id='some-id')
         nf.sdnc_model_name = 'some-name'
         nf.sdnc_model_version = 'some-version'
-        actual_sub_event = self.app_conf.subscription.prepare_subscription_event(nf, self.app_conf)
+        actual_sub_event = self.app_conf.subscription.prepare_subscription_event(nf)
         print(actual_sub_event)
         self.assertEqual(expected_sub_event, actual_sub_event)
 
index ecc45f6..fe33832 100644 (file)
@@ -76,7 +76,7 @@ class SubscriptionHandlerTest(BaseClassSetup):
         sub_handler.execute()
         self.assertEqual(AdministrativeState.UNLOCKED.value,
                          self.app_conf.subscription.administrativeState)
-        mock_activate_sub.assert_called_with(self.nfs, self.mock_mr_pub, self.app_conf)
+        mock_activate_sub.assert_called_with(self.nfs, self.mock_mr_pub)
 
     @patch('mod.subscription.Subscription.get_network_functions', MagicMock(return_value=nfs))
     @patch('mod.pmsh_utils.AppConfig.refresh_config', MagicMock(return_value=get_pmsh_config()))
@@ -89,7 +89,7 @@ class SubscriptionHandlerTest(BaseClassSetup):
         sub_handler = SubscriptionHandler(self.mock_mr_pub, self.mock_mr_sub, self.app,
                                           self.app_conf)
         sub_handler.execute()
-        mock_deactivate_sub.assert_called_with(self.nfs, self.mock_mr_pub, self.app_conf)
+        mock_deactivate_sub.assert_called_with(self.nfs, self.mock_mr_pub)
 
     @patch('mod.subscription_handler.SubscriptionHandler._start_aai_event_thread', MagicMock())
     @patch('mod.pmsh_utils.AppConfig.refresh_config', MagicMock(return_value=get_pmsh_config()))