# ============LICENSE_START======================================================= # ONAP - SO # ================================================================================ # Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved. # ================================================================================ # 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. # ============LICENSE_END========================================================= import os import logging import json import shutil import conf import ems_util OPERATION_NAME = "swFallback" logging.basicConfig(level=logging.INFO, format=conf.LOGGER_FORMAT, filename=ems_util.get_log_file(OPERATION_NAME)) logger = logging.getLogger(OPERATION_NAME) def fallback(ne_info_list): logger.info("NE info list: %s" % ne_info_list) ne_list = [] num_failure = 0 for ne_info in ne_info_list: if ne_info.get("status") == conf.STATUS_DOWNLOADING: ne_info["status"] = conf.STATUS_ACTIVATED ems_util.update_ne_info(ne_info) ne_entry = { "nEIdentification": ne_info["nEIdentification"], "swFallbackStatus": "fallbackSuccessful" } ne_list.append(ne_entry) continue sw_install_dir_in_ne = ems_util.get_install_dir(ne_info['omIP']) if ne_info.get("status") == conf.STATUS_INSTALLING: old_sw_version = ne_info.get("currentSwVersion", "") current_sw_version = ne_info.get("targetSwVersion", "") else: old_sw_version = ne_info.get("oldSwVersion", "") current_sw_version = ne_info.get("currentSwVersion", "") old_sw_dir = os.path.join(sw_install_dir_in_ne, old_sw_version) if not old_sw_version or not os.path.isdir(old_sw_dir): ne_entry = { "nEIdentification": ne_info["nEIdentification"], "swFallbackStatus": "fallbackUnsuccessful" } logger.error("oldSwVersion (%s) or oldSwDirectory (%s) is none" % (old_sw_version, old_sw_dir)) ne_list.append(ne_entry) num_failure += 1 continue current_sw_dir = os.path.join(sw_install_dir_in_ne, current_sw_version) if current_sw_version and os.path.isdir(current_sw_dir) and current_sw_dir != old_sw_dir: shutil.rmtree(current_sw_dir, ignore_errors=True) old_cwd = os.getcwd() os.chdir(sw_install_dir_in_ne) if os.path.islink(conf.CURRENT_VERSION_DIR): os.remove(conf.CURRENT_VERSION_DIR) os.symlink(old_sw_version, conf.CURRENT_VERSION_DIR) os.chdir(old_cwd) installed_sw_db = os.path.join(old_sw_dir, conf.INSTALLED_SW_FILE) if os.path.isfile(installed_sw_db): with open(installed_sw_db) as f_installed_sw: installed_sw_table = json.load(f_installed_sw) if not installed_sw_table: installed_sw_table = {} else: installed_sw_table = {} ne_info["installedSw"] = installed_sw_table if "oldSwVersion" in ne_info: ne_info["currentSwVersion"] = ne_info["oldSwVersion"] del ne_info["oldSwVersion"] if "targetSwVersion" in ne_info: del ne_info["targetSwVersion"] if "downloadedSwLocation" in ne_info: if os.path.isdir(ne_info["downloadedSwLocation"]): shutil.rmtree(ne_info["downloadedSwLocation"], ignore_errors=True) del ne_info["downloadedSwLocation"] ne_info["status"] = conf.STATUS_ACTIVATED ems_util.update_ne_info(ne_info) ne_entry = { "nEIdentification": ne_info["nEIdentification"], "swFallbackStatus": "fallbackSuccessful" } ne_list.append(ne_entry) if num_failure == 0: result = conf.RESULT_SUCCESS elif num_failure == len(ne_info_list): result = conf.RESULT_FAILURE else: result = conf.RESULT_PARTLY logger.info("Fallback SW result: %s" % result) ret_value = { "nEList": ne_list, "result": result } return ret_value