Bug 2042 fixed 15/12115/8 master
author36970 <jegan.s@tataelxsi.co.in>
Fri, 7 Jun 2024 05:44:08 +0000 (05:44 +0000)
committerescaleira <escaleira@av.it.pt>
Tue, 11 Jun 2024 13:49:31 +0000 (15:49 +0200)
Now, the vcaStatus is not overwritten when there are multiple KDUs
inside a KNF, or when there are both KNFs and VNFs inside an NS

Change-Id: I7f8f17d6cc5f5c519bc0895f23e0b8883979d33b
Signed-off-by: Pedro Escaleira <escaleira@av.it.pt>
Signed-off-by: 36970 <jegan.s@tataelxsi.co.in>
osm_lcm/lcm.py
osm_lcm/ns.py
tox.ini

index 9b62d82..f8a97ae 100644 (file)
@@ -21,6 +21,7 @@
 # DEBUG WITH PDB
 import pdb
 
+import os
 import asyncio
 import yaml
 import logging
@@ -880,6 +881,7 @@ if __name__ == "__main__":
                     file=sys.stderr,
                 )
                 exit(1)
+        config_file = os.path.realpath(os.path.normpath(os.path.abspath(config_file)))
         lcm = Lcm(config_file)
         asyncio.run(lcm.start())
     except (LcmException, getopt.GetoptError) as e:
index 25ae038..1714985 100644 (file)
@@ -265,14 +265,23 @@ class NsLcm(LcmBase):
             nsr = self.db.get_one(table="nsrs", q_filter=filter)
             current_ns_status = nsr.get("nsState")
 
-            # get vca status for NS
+            # First, we need to verify if the current vcaStatus is null, because if that is the case,
+            # MongoDB will not be able to create the fields used within the update key in the database
+            if not nsr.get("vcaStatus"):
+                # Write an empty dictionary to the vcaStatus field, it its value is null
+                self.update_db_2("nsrs", nsr_id, {"vcaStatus": dict()})
+
+            # Get vca status for NS
             status_dict = await self.n2vc.get_status(
                 namespace="." + nsr_id, yaml_format=False, vca_id=vca_id
             )
 
-            # vcaStatus
+            # Update the vcaStatus
+            db_key = f"vcaStatus.{nsr_id}.VNF"
             db_dict = dict()
-            db_dict["vcaStatus"] = status_dict
+
+            db_dict[db_key] = status_dict[nsr_id]
+            await self.n2vc.update_vca_status(db_dict[db_key], vca_id=vca_id)
 
             # update configurationStatus for this VCA
             try:
@@ -376,9 +385,27 @@ class NsLcm(LcmBase):
                 vca_id=vca_id,
             )
 
-            # vcaStatus
+            # First, we need to verify if the current vcaStatus is null, because if that is the case,
+            # MongoDB will not be able to create the fields used within the update key in the database
+            nsr = self.db.get_one(table="nsrs", q_filter=filter)
+            if not nsr.get("vcaStatus"):
+                # Write an empty dictionary to the vcaStatus field, it its value is null
+                self.update_db_2("nsrs", nsr_id, {"vcaStatus": dict()})
+
+            # Update the vcaStatus
+            db_key = f"vcaStatus.{nsr_id}.KNF"
             db_dict = dict()
-            db_dict["vcaStatus"] = {nsr_id: vca_status}
+
+            db_dict[db_key] = vca_status
+
+            if cluster_type in ("juju-bundle", "juju"):
+                # TODO -> this should be done in a more uniform way, I think in N2VC, in order to update the K8s VCA
+                #  status in a similar way between Juju Bundles and Helm Charts on this side
+                await self.k8sclusterjuju.update_vca_status(
+                    db_dict[db_key],
+                    kdu_instance,
+                    vca_id=vca_id,
+                )
 
             self.logger.debug(
                 f"Obtained VCA status for cluster type '{cluster_type}': {vca_status}"
@@ -5006,7 +5033,7 @@ class NsLcm(LcmBase):
                     vca_id=vca_id,
                     cluster_type=cluster_type,
                 )
-        else:
+        if db_nsr["_admin"]["deployed"]["VCA"]:
             for vca_index, _ in enumerate(db_nsr["_admin"]["deployed"]["VCA"]):
                 table, filter = "nsrs", {"_id": nsr_id}
                 path = "_admin.deployed.VCA.{}.".format(vca_index)
@@ -7912,6 +7939,7 @@ class NsLcm(LcmBase):
             old_config_status = db_nsr["config-status"]
 
             db_nsr_update = {
+                "operational-status": "healing",
                 "_admin.deployed.RO.operational-status": "healing",
             }
             self.update_db_2("nsrs", nsr_id, db_nsr_update)
@@ -8057,7 +8085,6 @@ class NsLcm(LcmBase):
                                 task_instantiation_info=tasks_dict_info,
                                 stage=stage,
                             )
-
         except (
             ROclient.ROClientException,
             DbException,
@@ -8079,6 +8106,15 @@ class NsLcm(LcmBase):
             )
         finally:
             error_list = list()
+            if db_vnfrs_list and target_list:
+                for vnfrs in db_vnfrs_list:
+                    for vnf_instance in target_list:
+                        if vnfrs["_id"] == vnf_instance.get("vnfInstanceId"):
+                            self.db.set_list(
+                                "vnfrs",
+                                {"_id": vnfrs["_id"]},
+                                {"_admin.modified": time()},
+                            )
             if exc:
                 error_list.append(str(exc))
             try:
diff --git a/tox.ini b/tox.ini
index d0d2da8..268ae78 100644 (file)
--- a/tox.ini
+++ b/tox.ini
@@ -65,7 +65,7 @@ commands =
 deps =  {[testenv]deps}
         -r{toxinidir}/requirements-dev.txt
         -r{toxinidir}/requirements-test.txt
-        pylint
+        pylint==3.1.1
 commands =
       pylint -E osm_lcm --extension-pkg-allow-list=pydantic # issue with pydantic (https://github.com/pydantic/pydantic/issues/1961)