[PMSH] Add Resource Name to filter options 77/113877/9
authoregernug <gerard.nugent@est.tech>
Wed, 14 Oct 2020 07:52:49 +0000 (08:52 +0100)
committeregernug <gerard.nugent@est.tech>
Thu, 19 Nov 2020 09:16:15 +0000 (09:16 +0000)
Issue-ID: DCAEGEN2-2402
Change-Id: I2242d36ca34e0b8ac085ce790b19b7ad51352c63
Signed-off-by: egernug <gerard.nugent@est.tech>
components/pm-subscription-handler/Changelog.md
components/pm-subscription-handler/pmsh_service/mod/aai_client.py
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/network_function.py
components/pm-subscription-handler/tests/data/filter_test_data.json
components/pm-subscription-handler/tests/test_aai_event_handler.py
components/pm-subscription-handler/tests/test_aai_service.py
components/pm-subscription-handler/tests/test_network_function.py
components/pm-subscription-handler/tests/test_network_function_filter.py

index 09afe1c..ea375ba 100755 (executable)
@@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
 ## [1.2.0]
 ### Changed
 * Bug fix prevent sub threads from crashing permanently (DCAEGEN2-2501)
+* Added Resource Name (model-name) to filter (DCAEGEN2-2402)
 
 ## [1.1.2]
 ### Changed
index 48f757d..fff91e7 100755 (executable)
@@ -138,7 +138,7 @@ def _filter_nf_data(nf_data, app_conf):
                 ip_address=nf['properties'].get('ipaddress-v4-oam'),
                 model_invariant_id=nf['properties'].get('model-invariant-id'),
                 model_version_id=nf['properties'].get('model-version-id'))
-            if not new_nf.set_sdnc_params(app_conf):
+            if not new_nf.set_nf_model_params(app_conf):
                 continue
             if app_conf.nf_filter.is_nf_in_filter(new_nf):
                 nf_list.append(new_nf)
index f39f1f4..fd9f625 100755 (executable)
@@ -66,7 +66,7 @@ def process_aai_events(mr_sub, mr_pub, app, app_conf):
                                      ip_address=aai_entity['ipaddress-v4-oam'],
                                      model_invariant_id=aai_entity['model-invariant-id'],
                                      model_version_id=aai_entity['model-version-id'])
-                if not nf.set_sdnc_params(app_conf):
+                if not nf.set_nf_model_params(app_conf):
                     continue
                 if app_conf.nf_filter.is_nf_in_filter(nf):
                     _process_event(action, nf, mr_pub, app_conf)
index b6735cc..ea9603e 100755 (executable)
@@ -60,6 +60,7 @@ class NetworkFunctionModel(db.Model):
     ip_address = Column(String(50))
     model_invariant_id = Column(String(100))
     model_version_id = Column(String(100))
+    model_name = Column(String(100))
     sdnc_model_name = Column(String(100))
     sdnc_model_version = Column(String(100))
 
@@ -68,12 +69,14 @@ class NetworkFunctionModel(db.Model):
         cascade='all, delete-orphan',
         backref='nf')
 
-    def __init__(self, nf_name, ip_address, model_invariant_id, model_version_id, sdnc_model_name,
+    def __init__(self, nf_name, ip_address, model_invariant_id,
+                 model_version_id, model_name, sdnc_model_name,
                  sdnc_model_version):
         self.nf_name = nf_name
         self.ip_address = ip_address
         self.model_invariant_id = model_invariant_id
         self.model_version_id = model_version_id
+        self.model_name = model_name
         self.sdnc_model_name = sdnc_model_name
         self.sdnc_model_version = sdnc_model_version
 
@@ -128,5 +131,6 @@ class NfSubRelationalModel(db.Model):
                 'nf_sub_status': self.nf_sub_status,
                 'model_invariant_id': nf.model_invariant_id,
                 'model_version_id': nf.model_version_id,
+                'model_name': nf.model_name,
                 'sdnc_model_name': nf.sdnc_model_name,
                 'sdnc_model_version': nf.sdnc_model_version}
index 3f38388..a6d2164 100755 (executable)
@@ -30,12 +30,14 @@ class NetworkFunction:
         self.ip_address = kwargs.get('ip_address')
         self.model_invariant_id = kwargs.get('model_invariant_id')
         self.model_version_id = kwargs.get('model_version_id')
+        self.model_name = kwargs.get('model_name')
         self.sdnc_model_name = sdnc_model_name
         self.sdnc_model_version = sdnc_model_version
 
     @classmethod
     def nf_def(cls):
-        return cls(nf_name=None, ip_address=None, model_invariant_id=None, model_version_id=None,
+        return cls(nf_name=None, ip_address=None, model_invariant_id=None,
+                   model_version_id=None, model_name=None,
                    sdnc_model_name=None, sdnc_model_version=None)
 
     def __str__(self):
@@ -43,6 +45,7 @@ class NetworkFunction:
                f'ipaddress-v4-oam: {self.ip_address}, ' \
                f'model-invariant-id: {self.model_invariant_id}, ' \
                f'model-version-id: {self.model_version_id}, ' \
+               f'model-name: {self.model_name}, ' \
                f'sdnc-model-name: {self.sdnc_model_name}, ' \
                f'sdnc-model-version: {self.sdnc_model_version}'
 
@@ -52,12 +55,14 @@ class NetworkFunction:
             self.ip_address == other.ip_address and \
             self.model_invariant_id == other.model_invariant_id and \
             self.model_version_id == other.model_version_id and \
+            self.model_name == other.model_name and \
             self.sdnc_model_name == other.sdnc_model_name and \
             self.sdnc_model_version == other.sdnc_model_version
 
     def __hash__(self):
         return hash((self.nf_name, self.ip_address, self.model_invariant_id,
-                     self.model_version_id, self.sdnc_model_name, self.sdnc_model_version))
+                     self.model_version_id, self.model_name,
+                     self.sdnc_model_name, self.sdnc_model_version))
 
     def create(self):
         """ Creates a NetworkFunction database entry """
@@ -69,6 +74,7 @@ class NetworkFunction:
                                           ip_address=self.ip_address,
                                           model_invariant_id=self.model_invariant_id,
                                           model_version_id=self.model_version_id,
+                                          model_name=self.model_name,
                                           sdnc_model_name=self.sdnc_model_name,
                                           sdnc_model_version=self.sdnc_model_version)
             db.session.add(new_nf)
@@ -80,23 +86,24 @@ class NetworkFunction:
                          f' returning this network function..')
             return existing_nf
 
-    def set_sdnc_params(self, app_conf):
+    def set_nf_model_params(self, app_conf):
         params_set = True
         try:
             sdnc_model_data = mod.aai_client.get_aai_model_data(app_conf, self.model_invariant_id,
                                                                 self.model_version_id, self.nf_name)
+
             try:
                 self.sdnc_model_name = sdnc_model_data['sdnc-model-name']
                 self.sdnc_model_version = sdnc_model_data['sdnc-model-version']
+                self.model_name = sdnc_model_data['model-name']
                 return params_set
             except KeyError as e:
                 logger.info(f'Skipping NF {self.nf_name} as there is no '
                             f'sdnc-model data associated in AAI: {e}', exc_info=True)
-                return not params_set
         except Exception as e:
             logger.error(f'Failed to get sdnc-model info for XNF {self.nf_name} from AAI: {e}',
                          exc_info=True)
-            return not params_set
+        return not params_set
 
     @staticmethod
     def get(nf_name):
@@ -140,6 +147,7 @@ class NetworkFunctionFilter:
         self.nf_names = kwargs.get('nfNames')
         self.model_invariant_ids = kwargs.get('modelInvariantIDs')
         self.model_version_ids = kwargs.get('modelVersionIDs')
+        self.model_names = kwargs.get('modelNames')
         self.regex_matcher = re.compile('|'.join(raw_regex for raw_regex in self.nf_names))
 
     def is_nf_in_filter(self, nf):
@@ -158,4 +166,6 @@ class NetworkFunctionFilter:
             match = False
         if self.model_version_ids and nf.model_version_id not in self.model_version_ids:
             match = False
+        if self.model_names and nf.model_name not in self.model_names:
+            match = False
         return match
index 0d8fc7c..2033624 100644 (file)
@@ -1,4 +1,48 @@
 [
+    {
+      "testName": "test_filter_model_name_true",
+      "nfFilter":{
+            "nfNames":[
+                 "^pnf.*",
+                 "^vnf.*"
+            ],
+            "modelInvariantIDs": [
+            ],
+            "modelVersionIDs": [
+
+            ],
+            "modelNames": [
+                "pnf102"
+            ]
+         },
+      "nfName": "pnf1",
+      "modelInvariantUUID": "7129e420-d396-4efb-af02-6b83499b12f8",
+      "modelVersionID": "e80a6ae3-cafd-4d24-850d-e14c084a5ca9",
+      "modelName": "pnf102",
+      "expectedResult": true
+    },
+    {
+      "testName": "test_filter_model_name_false",
+      "nfFilter":{
+            "nfNames":[
+                 "^pnf.*",
+                 "^vnf.*"
+            ],
+            "modelInvariantIDs": [
+            ],
+            "modelVersionIDs": [
+
+            ],
+            "modelNames": [
+                "pnf102"
+            ]
+         },
+      "nfName": "pnf1",
+      "modelInvariantUUID": "7129e420-d396-4efb-af02-6b83499b12f8",
+      "modelVersionID": "e80a6ae3-cafd-4d24-850d-e14c084a5ca9",
+      "modelName": "Wrong_Model_Name",
+      "expectedResult": false
+    },
     {
       "testName": "test_filter_true_on_xnf",
       "nfFilter":{
             ],
             "modelVersionIDs": [
 
+            ],
+            "modelNames": [
+
             ]
          },
       "nfName": "pnf1",
       "modelInvariantUUID": "7129e420-d396-4efb-af02-6b83499b12f8",
       "modelVersionID": "e80a6ae3-cafd-4d24-850d-e14c084a5ca9",
+      "modelName": "pnf102",
       "expectedResult": true
     },
     {
             ],
             "modelVersionIDs": [
 
+            ],
+            "modelNames": [
+
             ]
          },
       "nfName": "PNF-33",
       "modelInvariantUUID": "7129e420-d396-4efb-af02-6b83499b12f8",
       "modelVersionID": "e80a6ae3-cafd-4d24-850d-e14c084a5ca9",
+      "modelName": "pnf102",
       "expectedResult": false
     },
     {
             ],
             "modelVersionIDs": [
 
+            ],
+            "modelNames": [
+
             ]
          },
       "nfName": "pnf1",
       "modelInvariantUUID": "7129e420-d396-4efb-af02-6b83499b12f8",
       "modelVersionID": "e80a6ae3-cafd-4d24-850d-e14c084a5ca9",
+      "modelName": "pnf102",
       "expectedResult": true
     },
     {
             ],
             "modelVersionIDs": [
 
+            ],
+            "modelNames": [
+
             ]
          },
       "nfName": "pnf1",
       "modelInvariantUUID": "WrongModelInvariantUUID",
       "modelVersionID": "e80a6ae3-cafd-4d24-850d-e14c084a5ca9",
+      "modelName": "pnf102",
       "expectedResult": false
     },
     {
             ],
             "modelVersionIDs": [
 
+            ],
+            "modelNames": [
+
             ]
          },
       "nfName": "pnf1",
       "modelInvariantUUID": "WrongModelInvariantUUID",
       "modelVersionID": "e80a6ae3-cafd-4d24-850d-e14c084a5ca9",
+      "modelName": "pnf102",
       "expectedResult": false
     },
     {
             ],
             "modelVersionIDs": [
                 "e80a6ae3-cafd-4d24-850d-e14c084a5ca9"
+            ],
+            "modelNames": [
+
             ]
          },
       "nfName": "pnf1",
       "modelInvariantUUID": "7129e420-d396-4efb-af02-6b83499b12f8",
       "modelVersionID": "e80a6ae3-cafd-4d24-850d-e14c084a5ca9",
+      "modelName": "pnf102",
       "expectedResult": true
     },
     {
             ],
             "modelVersionIDs": [
                 "e80a6ae3-cafd-4d24-850d-e14c084a5ca9"
+            ],
+            "modelNames": [
+
             ]
          },
       "nfName": "pnf1",
       "modelInvariantUUID": "7129e420-d396-4efb-af02-6b83499b12f8",
       "modelVersionID": "WrongModelVersionID",
+      "modelName": "pnf102",
       "expectedResult": false
     },
     {
             ],
             "modelVersionIDs": [
                 "e80a6ae3-cafd-4d24-850d-e14c084a5ca9"
+            ],
+            "modelNames": [
+
             ]
          },
       "nfName": "pnf1",
       "modelInvariantUUID": "7129e420-d396-4efb-af02-6b83499b12f8",
       "modelVersionID": "WrongModelVersionID",
+      "modelName": "pnf102",
       "expectedResult": false
     }
 ]
index dc5243d..47a36f5 100755 (executable)
@@ -44,7 +44,7 @@ class AAIEventHandlerTest(BaseClassSetup):
     def tearDownClass(cls):
         super().tearDownClass()
 
-    @patch('mod.network_function.NetworkFunction.set_sdnc_params')
+    @patch('mod.network_function.NetworkFunction.set_nf_model_params')
     @patch('mod.subscription.Subscription.activate_subscription')
     @patch('mod.aai_event_handler.NetworkFunction.delete')
     def test_process_aai_update_and_delete_events(self, mock_nf_delete, mock_activate_sub,
index 2769485..27c0f40 100644 (file)
@@ -47,7 +47,7 @@ class AaiClientTestCase(BaseClassSetup):
     def tearDownClass(cls):
         super().tearDownClass()
 
-    @patch('mod.network_function.NetworkFunction.set_sdnc_params')
+    @patch('mod.network_function.NetworkFunction.set_nf_model_params')
     @patch.object(Session, 'get')
     @patch.object(Session, 'put')
     def test_aai_client_get_pm_sub_data_success(self, mock_put_session, mock_get_session,
index c930c41..5a1a6ba 100755 (executable)
@@ -90,9 +90,9 @@ class NetworkFunctionTests(BaseClassSetup):
     @patch('mod.aai_client.get_aai_model_data')
     def test_set_sdnc_params_true(self, mock_get_aai_model):
         mock_get_aai_model.return_value = self.good_model_info
-        self.assertTrue(self.nf_1.set_sdnc_params(self.app_conf))
+        self.assertTrue(self.nf_1.set_nf_model_params(self.app_conf))
 
     @patch('mod.aai_client.get_aai_model_data')
     def test_set_sdnc_params_false(self, mock_get_aai_model):
         mock_get_aai_model.return_value = self.bad_model_info
-        self.assertFalse(self.nf_1.set_sdnc_params(self.app_conf))
+        self.assertFalse(self.nf_1.set_nf_model_params(self.app_conf))
index 2151925..f536937 100644 (file)
@@ -44,12 +44,14 @@ def load_test_cases():
 class NetworkFunctionFilterTest(TestCase):
 
     @parameterized.expand(load_test_cases, name_func=custom_name_func)
-    def test(self, test_name, nf_filter, nf_name, model_invariant_uuid, model_version_id,
+    def test(self, test_name, nf_filter, nf_name, model_invariant_uuid,
+             model_version_id, model_name,
              expected_result):
         nf_filter = NetworkFunctionFilter(**nf_filter)
         self.assertEqual(nf_filter.is_nf_in_filter(NetworkFunction(nf_name=nf_name,
                                                    model_invariant_id=model_invariant_uuid,
-                                                   model_version_id=model_version_id)),
+                                                   model_version_id=model_version_id,
+                                                   model_name=model_name)),
                          expected_result)
 
     def test_filter_true_on_multiple_modelInvariantIDs(self):
@@ -61,12 +63,16 @@ class NetworkFunctionFilterTest(TestCase):
                 '7129e420-d396-4efb-af02-6b83499b12f8'
             ],
             "modelVersionIDs": [
+            ],
+            "modelNames": [
+
             ]
         })
         self.assertTrue(nf_filter.is_nf_in_filter(
             NetworkFunction(nf_name='pnf1',
                             model_invariant_id='7129e420-d396-4efb-af02-6b83499b12f8',
-                            model_version_id='e80a6ae3-cafd-4d24-850d-e14c084a5ca9')))
+                            model_version_id='e80a6ae3-cafd-4d24-850d-e14c084a5ca9',
+                            model_name='pnf_102')))
 
     def test_filter_false_on_modelInvariantIDs_being_false_and_pnfname_being_true(self):
         nf_filter = NetworkFunctionFilter(**{
@@ -79,9 +85,13 @@ class NetworkFunctionFilterTest(TestCase):
                 '7129e420-d396-4efb-af02-6b83499b12f8'
             ],
             "modelVersionIDs": [
+            ],
+            "modelNames": [
+
             ]
         })
         self.assertFalse(nf_filter.is_nf_in_filter(
             NetworkFunction(nf_name='pnf1',
                             model_invariant_id='WrongModelInvariantUUID',
-                            model_version_id='e80a6ae3-cafd-4d24-850d-e14c084a5ca9')))
+                            model_version_id='e80a6ae3-cafd-4d24-850d-e14c084a5ca9',
+                            model_name='pnf_102')))