From f8d9d32acf2ff6fbc14288497cf38284210fb374 Mon Sep 17 00:00:00 2001 From: elumalai Date: Wed, 8 May 2024 17:19:13 +0530 Subject: [PATCH] Bug 2370: Fix for Healing fails if the corresponding flavor does not exist in VIM Change-Id: Ic8c0b4bf6e39c1ad8d8d3ef3ee3acd0ad251615c Signed-off-by: elumalai --- NG-RO/osm_ng_ro/ns.py | 128 +++++++++++++++++- .../notes/fix_bug_2370-b686ceb8f3d6fec3.yaml | 81 +++++++++++ 2 files changed, 207 insertions(+), 2 deletions(-) create mode 100644 releasenotes/notes/fix_bug_2370-b686ceb8f3d6fec3.yaml diff --git a/NG-RO/osm_ng_ro/ns.py b/NG-RO/osm_ng_ro/ns.py index e5322b29..3afa3965 100644 --- a/NG-RO/osm_ng_ro/ns.py +++ b/NG-RO/osm_ng_ro/ns.py @@ -1918,6 +1918,7 @@ class Ns(object): vim_info: Dict[str, Any], target_record_id: str, target_id: str, + flavor_task_id: str, **kwargs: Dict[str, Any], ) -> Dict[str, Any]: """Function to process VDU parameters to recreate. @@ -2087,7 +2088,7 @@ class Ns(object): "description": existing_vdu["vdu-name"], "start": True, "image_id": vim_details["image"]["id"], - "flavor_id": vim_details["flavor"]["id"], + "flavor_id": "TASK-" + flavor_task_id, "affinity_group_list": affinity_group_list, "net_list": net_list, "cloud_config": cloud_config or None, @@ -2895,6 +2896,94 @@ class Ns(object): return volumes_list + def _process_recreate_flavor_params( + self, + existing_vdu: Dict[str, Any], + db_nsr: Dict[str, Any], + vim_info: Dict[str, Any], + target_record_id: str, + **kwargs: Dict[str, Any], + ) -> Dict[str, Any]: + """Method to process Flavor parameters to recreate. + + Args: + existing_vdu (Dict[str, Any]): [description] + db_nsr (Dict[str, Any]): [description] + vim_info (Dict[str, Any]): [description] + target_record_id (str): [description] + target_id (str): [description] + kwargs (dict) + + Returns: + vdu_flavor_dict: (Dict[str, Any]) + + """ + try: + vdu_flavor_id = existing_vdu.get("ns-flavor-id") + target_flavor = next( + filter( + lambda vdu_flavor_dict: vdu_flavor_dict["id"] == vdu_flavor_id, + db_nsr.get("flavor"), + ), + None, + ) + vdu_flavor_dict = Ns._process_flavor_params( + target_flavor=target_flavor, + indata={}, + vim_info=vim_info, + target_record_id=target_record_id, + **kwargs, + ) + vdu_flavor_dict["name"] = target_flavor["name"] + return vdu_flavor_dict + + except (DbException, KeyError, ValueError, TypeError) as error: + raise NsException(error) + + def _prepare_flavor_create_item( + self, + existing_instance: dict, + db_nsr: dict, + target_viminfo: dict, + target_record_id: str, + target_vim: str, + action_id: str, + task_index: int, + item_index: int, + db_record_flavor: str, + changes_list: list, + **kwargs, + ) -> str: + flavor_data = self._process_recreate_flavor_params( + existing_instance, + db_nsr, + target_viminfo, + target_record_id, + **kwargs, + ) + flavor_task_id = f"{action_id}:{task_index}" + + flavor_item = { + "deployment_info": { + "action_id": action_id, + "nsr_id": kwargs["nsr_id"], + "task_index": task_index, + }, + "target_id": target_vim, + "item": "flavor", + "action": "CREATE", + "target_record": f"{db_record_flavor}.{item_index}.vim_info.{target_vim}", + # "target_record_id": "{}.{}".format( + # db_record_flavor, existing_instance["id"] + # ), + "target_record_id": target_record_id, + "extra_dict": flavor_data, + "task_id": flavor_task_id, + } + changes_list.append(flavor_item) + + return flavor_task_id + def prepare_changes_to_recreate( self, indata, @@ -2917,6 +3006,7 @@ class Ns(object): # set list with diffs: changes_list = [] db_path = self.db_path_map["vdu"] + db_path_flavor = self.db_path_map["flavor"] target_list = indata.get("healVnfData", {}) vdu2cloud_init = indata.get("cloud_init_content") or {} ro_nsr_public_key = db_ro_nsr["public_key"] @@ -2927,6 +3017,7 @@ class Ns(object): vnfr_id = target_vnf["vnfInstanceId"] existing_vnf = db_vnfrs.get(vnfr_id, {}) db_record = "vnfrs:{}:{}".format(vnfr_id, db_path) + db_record_flavor = "nsrs:{}:{}".format(nsr_id, db_path_flavor) # vim_account_id = existing_vnf.get("vim-account-id", "") target_vdus = target_vnf.get("additionalParams", {}).get("vdu", []) @@ -2953,6 +3044,10 @@ class Ns(object): and instance["count-index"] == count_index ): existing_instance = instance + item_index_flv = instance.get("ns-flavor-id") + target_record_id_flv = "{}.{}".format( + db_record_flavor, instance.get("ns-flavor-id") + ) break else: item_index += 1 @@ -3001,7 +3096,34 @@ class Ns(object): delete_task_id = f"{action_id}:{task_index}" task_index += 1 - # step 2 vdu to be created + kwargs = { + "vnfr_id": vnfr_id, + "nsr_id": nsr_id, + "vnfr": existing_vnf, + "vdu2cloud_init": vdu2cloud_init, + "tasks_by_target_record_id": tasks_by_target_record_id, + "logger": self.logger, + "db": self.db, + "fs": self.fs, + "ro_nsr_public_key": ro_nsr_public_key, + } + + # step 2 check if old flavor exists or prepare to create it + flavor_task_id = self._prepare_flavor_create_item( + existing_instance=existing_instance, + db_nsr=db_nsr, + target_viminfo=target_viminfo, + target_record_id=target_record_id_flv, + target_vim=target_vim, + action_id=action_id, + task_index=task_index + 1, + item_index=item_index_flv, + db_record_flavor=db_record_flavor, + changes_list=changes_list, + **kwargs, + ) + + # step 3 vdu to be created kwargs = {} kwargs.update( { @@ -3023,11 +3145,13 @@ class Ns(object): target_viminfo, target_record_id, target_vim, + flavor_task_id, **kwargs, ) # The CREATE task depens on the DELETE task extra_dict["depends_on"] = [delete_task_id] + extra_dict["depends_on"].append(flavor_task_id) # Add volumes created from created_items if any # Ports should be deleted with delete task and automatically created with create task diff --git a/releasenotes/notes/fix_bug_2370-b686ceb8f3d6fec3.yaml b/releasenotes/notes/fix_bug_2370-b686ceb8f3d6fec3.yaml new file mode 100644 index 00000000..20ee4ba0 --- /dev/null +++ b/releasenotes/notes/fix_bug_2370-b686ceb8f3d6fec3.yaml @@ -0,0 +1,81 @@ +####################################################################################### +# Copyright ETSI Contributors and Others. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +# implied. +# See the License for the specific language governing permissions and +# limitations under the License. +####################################################################################### +--- +prelude: > + Replace this text with content to appear at the top of the section for this + release. All of the prelude content is merged together and then rendered + separately from the items listed in other parts of the file, so the text + needs to be worded so that both the prelude and the other items make sense + when read independently. This may mean repeating some details. Not every + release note requires a prelude. Usually only notes describing major + features or adding release theme details should have a prelude. +features: + - | + List new features here, or remove this section. All of the list items in + this section are combined when the release notes are rendered, so the text + needs to be worded so that it does not depend on any information only + available in another section, such as the prelude. This may mean repeating + some details. +issues: + - | + List known issues here, or remove this section. All of the list items in + this section are combined when the release notes are rendered, so the text + needs to be worded so that it does not depend on any information only + available in another section, such as the prelude. This may mean repeating + some details. +upgrade: + - | + List upgrade notes here, or remove this section. All of the list items in + this section are combined when the release notes are rendered, so the text + needs to be worded so that it does not depend on any information only + available in another section, such as the prelude. This may mean repeating + some details. +deprecations: + - | + List deprecations notes here, or remove this section. All of the list + items in this section are combined when the release notes are rendered, so + the text needs to be worded so that it does not depend on any information + only available in another section, such as the prelude. This may mean + repeating some details. +critical: + - | + Add critical notes here, or remove this section. All of the list items in + this section are combined when the release notes are rendered, so the text + needs to be worded so that it does not depend on any information only + available in another section, such as the prelude. This may mean repeating + some details. +security: + - | + Add security notes here, or remove this section. All of the list items in + this section are combined when the release notes are rendered, so the text + needs to be worded so that it does not depend on any information only + available in another section, such as the prelude. This may mean repeating + some details. +fixes: + - | + Add normal bug fixes here, or remove this section. All of the list items + in this section are combined when the release notes are rendered, so the + text needs to be worded so that it does not depend on any information only + available in another section, such as the prelude. This may mean repeating + some details. +other: + - | + Add other notes here, or remove this section. All of the list items in + this section are combined when the release notes are rendered, so the text + needs to be worded so that it does not depend on any information only + available in another section, such as the prelude. This may mean repeating + some details. -- 2.25.1