From b9e357cbb5c38a95b226213a27adedae740eb1dc Mon Sep 17 00:00:00 2001 From: elumalai Date: Wed, 27 Apr 2022 09:58:38 +0530 Subject: [PATCH] Feature 10912: NS Update Change VNF Package for SW Changes Added support for feature Change VNF Package in NS Update Change-Id: I03161ddca656b861d0cc10be0067fbfa7e32eb2f Signed-off-by: elumalai --- osm_lcm/lcm.py | 1 + osm_lcm/ns.py | 143 ++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 137 insertions(+), 7 deletions(-) diff --git a/osm_lcm/lcm.py b/osm_lcm/lcm.py index 82947e9..9eb37fa 100644 --- a/osm_lcm/lcm.py +++ b/osm_lcm/lcm.py @@ -486,6 +486,7 @@ class Lcm: return # TODO cleaning of task just in case should be done elif command in ( "vnf_terminated", + "policy_updated", "terminated", "instantiated", "scaled", diff --git a/osm_lcm/ns.py b/osm_lcm/ns.py index 19b405b..a38cc4d 100644 --- a/osm_lcm/ns.py +++ b/osm_lcm/ns.py @@ -5398,6 +5398,110 @@ class NsLcm(LcmBase): self.logger.debug("Error removing VNF {}".format(e)) return "FAILED", "Error removing VNF {}".format(e) + async def _ns_redeploy_vnf( + self, nsr_id, nslcmop_id, db_vnfd, db_vnfr, db_nsr, + ): + """This method updates and redeploys VNF instances + + Args: + nsr_id: NS instance id + nslcmop_id: nslcmop id + db_vnfd: VNF descriptor + db_vnfr: VNF instance record + db_nsr: NS instance record + + Returns: + result: (str, str) COMPLETED/FAILED, details + """ + try: + count_index = 0 + stage = ["", "", ""] + logging_text = "Task ns={} update ".format(nsr_id) + latest_vnfd_revision = db_vnfd["_admin"].get("revision") + member_vnf_index = db_vnfr["member-vnf-index-ref"] + + # Terminate old VNF resources + update_db_nslcmops = self.db.get_one("nslcmops", {"_id": nslcmop_id}) + await self.terminate_vdus(db_vnfr, member_vnf_index, db_nsr, update_db_nslcmops, stage, logging_text) + + # old_vnfd_id = db_vnfr["vnfd-id"] + # new_db_vnfd = self.db.get_one("vnfds", {"_id": vnfd_id}) + new_db_vnfd = db_vnfd + # new_vnfd_ref = new_db_vnfd["id"] + # new_vnfd_id = vnfd_id + + # Create VDUR + new_vnfr_cp = [] + for cp in new_db_vnfd.get("ext-cpd", ()): + vnf_cp = { + "name": cp.get("id"), + "connection-point-id": cp.get("int-cpd", {}).get("cpd"), + "connection-point-vdu-id": cp.get("int-cpd", {}).get("vdu-id"), + "id": cp.get("id"), + } + new_vnfr_cp.append(vnf_cp) + new_vdur = update_db_nslcmops["operationParams"]["newVdur"] + # new_vdur = self._create_vdur_descriptor_from_vnfd(db_nsd, db_vnfd, old_db_vnfd, vnfd_id, db_nsr, member_vnf_index) + # new_vnfr_update = {"vnfd-ref": new_vnfd_ref, "vnfd-id": new_vnfd_id, "connection-point": new_vnfr_cp, "vdur": new_vdur, "ip-address": ""} + new_vnfr_update = {"revision": latest_vnfd_revision, "connection-point": new_vnfr_cp, "vdur": new_vdur, "ip-address": ""} + self.update_db_2("vnfrs", db_vnfr["_id"], new_vnfr_update) + updated_db_vnfr = self.db.get_one( + "vnfrs", {"member-vnf-index-ref": member_vnf_index, "nsr-id-ref": nsr_id} + ) + + # Instantiate new VNF resources + # update_db_nslcmops = self.db.get_one("nslcmops", {"_id": nslcmop_id}) + vca_scaling_info = [] + scaling_info = {"scaling_group_name": "vdu_autoscale", "vdu": [], "kdu": []} + scaling_info["scaling_direction"] = "OUT" + scaling_info["vdu-create"] = {} + scaling_info["kdu-create"] = {} + vdud_instantiate_list = db_vnfd["vdu"] + for index, vdud in enumerate(vdud_instantiate_list): + cloud_init_text = self._get_vdu_cloud_init_content( + vdud, db_vnfd + ) + if cloud_init_text: + additional_params = ( + self._get_vdu_additional_params(updated_db_vnfr, vdud["id"]) + or {} + ) + cloud_init_list = [] + if cloud_init_text: + # TODO Information of its own ip is not available because db_vnfr is not updated. + additional_params["OSM"] = get_osm_params( + updated_db_vnfr, vdud["id"], 1 + ) + cloud_init_list.append( + self._parse_cloud_init( + cloud_init_text, + additional_params, + db_vnfd["id"], + vdud["id"], + ) + ) + vca_scaling_info.append( + { + "osm_vdu_id": vdud["id"], + "member-vnf-index": member_vnf_index, + "type": "create", + "vdu_index": count_index, + } + ) + scaling_info["vdu-create"][vdud["id"]] = count_index + if self.ro_config.get("ng"): + self.logger.debug( + "New Resources to be deployed: {}".format(scaling_info)) + await self._scale_ng_ro( + logging_text, db_nsr, update_db_nslcmops, updated_db_vnfr, scaling_info, stage + ) + return "COMPLETED", "Done" + except (LcmException, asyncio.CancelledError): + raise + except Exception as e: + self.logger.debug("Error updating VNF {}".format(e)) + return "FAILED", "Error updating VNF {}".format(e) + async def _ns_charm_upgrade( self, ee_id, @@ -5538,6 +5642,8 @@ class NsLcm(LcmBase): step = "Checking if revision has changed in VNFD" if current_vnf_revision != latest_vnfd_revision: + change_type = "policy_updated" + # There is new revision of VNFD, update operation is required current_vnfd_path = vnfd_id + ":" + str(current_vnf_revision) latest_vnfd_path = vnfd_id @@ -5627,7 +5733,27 @@ class NsLcm(LcmBase): # There is no change in the charm package, then redeploy the VNF # based on new descriptor step = "Redeploying VNF" - # This part is in https://osm.etsi.org/gerrit/11943 + member_vnf_index = db_vnfr["member-vnf-index-ref"] + ( + result, + detailed_status + ) = await self._ns_redeploy_vnf( + nsr_id, + nslcmop_id, + latest_vnfd, + db_vnfr, + db_nsr + ) + if result == "FAILED": + nslcmop_operation_state = result + error_description_nslcmop = detailed_status + db_nslcmop_update["detailed-status"] = detailed_status + self.logger.debug( + logging_text + + " step {} Done with result {} {}".format( + step, nslcmop_operation_state, detailed_status + ) + ) else: step = "Checking if any charm package has changed or not" @@ -5677,7 +5803,10 @@ class NsLcm(LcmBase): ) step = "Updating policies" - # This part is in https://osm.etsi.org/gerrit/11943 + member_vnf_index = db_vnfr["member-vnf-index-ref"] + result = "COMPLETED" + detailed_status = "Done" + db_nslcmop_update["detailed-status"] = "Done" # If nslcmop_operation_state is None, so any operation is not failed. if not nslcmop_operation_state: @@ -5767,11 +5896,11 @@ class NsLcm(LcmBase): if nslcmop_operation_state: try: msg = { - "nsr_id": nsr_id, - "nslcmop_id": nslcmop_id, - "operationState": nslcmop_operation_state, - } - if change_type in ("vnf_terminated"): + "nsr_id": nsr_id, + "nslcmop_id": nslcmop_id, + "operationState": nslcmop_operation_state, + } + if change_type in ("vnf_terminated", "policy_updated"): msg.update({"vnf_member_index": member_vnf_index}) await self.msg.aiowrite("ns", change_type, msg, loop=self.loop) except Exception as e: -- 2.25.1