| #!/usr/bin/python |
| |
| import sys |
| import argparse |
| import json |
| import os |
| import shutil |
| import random |
| import time |
| |
| import conf |
| import ems_util |
| |
| |
| def do_activate_sw(sw_version_to_be_activated, ne_info): |
| """ |
| return err, reason |
| """ |
| |
| installed_sw = ne_info.get("installedSw", {}) |
| if sw_version_to_be_activated in installed_sw: |
| target_sw_version = installed_sw[sw_version_to_be_activated]["version"] |
| else: |
| target_sw_version = sw_version_to_be_activated |
| |
| sw_install_dir_in_ne = conf.PNF_SIMULATORS_DIR + '/' + ne_info['omIP'] + conf.PNF_SW_INSTALL_DIR |
| target_sw_dir = sw_install_dir_in_ne + '/' + target_sw_version |
| if not os.path.isdir(target_sw_dir): |
| return True, "SW to be activated does not install" |
| |
| if "targetSwVersion" in ne_info: |
| if ne_info["targetSwVersion"] != target_sw_version: |
| return True, "Conflicted targetVersion with to be activated %s" % target_sw_version |
| del ne_info["targetSwVersion"] |
| |
| old_sw_version = ne_info.get("oldSwVersion", "") |
| |
| if target_sw_version != ne_info["currentSwVersion"]: |
| ne_info["oldSwVersion"] = ne_info["currentSwVersion"] |
| ne_info["currentSwVersion"] = target_sw_version |
| ne_info["status"] = conf.STATUS_ACTIVATING |
| ems_util.update_ne_info(ne_info) |
| |
| if target_sw_version != old_sw_version: |
| old_sw_dir = sw_install_dir_in_ne + '/' + old_sw_version |
| if old_sw_version and os.path.isdir(old_sw_dir): |
| shutil.rmtree(old_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(target_sw_version, conf.CURRENT_VERSION_DIR) |
| os.chdir(old_cwd) |
| |
| if "downloadedSwLocation" in ne_info: |
| if os.path.isdir(ne_info["downloadedSwLocation"]): |
| shutil.rmtree(ne_info["downloadedSwLocation"], ignore_errors=True) |
| del ne_info["downloadedSwLocation"] |
| |
| return False, None |
| |
| |
| def generate_notification(activate_process_id, activate_status, sw_version, failure_reason): |
| notification = { |
| "objectClass": "EMSClass", |
| "objectInstance": "EMSInstance", |
| "notificationId": random.randint(1, conf.MAX_INT), |
| "eventTime": time.asctime(), |
| "systemDN": "emssimulator", |
| "notificationType": "notifyActivateNESwStatusChanged", |
| "activateProcessId": activate_process_id, |
| "activateOperationStatus": activate_status, |
| "swVersion": sw_version |
| } |
| |
| if failure_reason: |
| notification["failureReason"] = failure_reason |
| |
| return notification |
| |
| |
| def activate_ne_sw(sw_version_to_be_activated, ne_id): |
| ne_info = ems_util.get_ne_info_from_db_by_id(ne_id) |
| |
| activate_process_id = random.randint(1, conf.MAX_INT) |
| result = conf.REQ_SUCCESS |
| ret_value = { |
| "activateProcessId": activate_process_id, |
| "result": result |
| } |
| |
| if not ne_info: |
| ret_value["result"] = conf.REQ_FAILURE |
| ret_value["reason"] = "Can not find NE %s" % ne_id |
| return ret_value |
| |
| err, reason = do_activate_sw(sw_version_to_be_activated, ne_info) |
| |
| if not err: |
| ne_info["status"] = conf.STATUS_ACTIVATED |
| ems_util.update_ne_info(ne_info) |
| activate_status = "NE_SWACTIVATION_SUCCESSFUL" |
| else: |
| ret_value["result"] = conf.REQ_FAILURE |
| ret_value["reason"] = reason |
| |
| activate_status = "NE_SWACTIVATION_FAILED" |
| |
| notification = generate_notification(activate_process_id, activate_status, sw_version_to_be_activated, reason) |
| ems_util.send_notification(notification, activate_process_id) |
| |
| # for automated software management, there is no listOfStepNumbersAndDurations |
| return ret_value |
| |
| |
| def main(): |
| parser = argparse.ArgumentParser() |
| |
| parser.add_argument("--swVersionToBeActivated", help="The NE software version to be activated", required=True) |
| parser.add_argument("--neIdentifier", help="The NE where the software can be activated", required=True) |
| |
| args = parser.parse_args() |
| |
| ret_value = activate_ne_sw(args.swVersionToBeActivated, args.neIdentifier) |
| print json.dumps(ret_value) |
| |
| if ret_value["result"] == conf.REQ_SUCCESS: |
| sys.exit(conf.RET_CODE_SUCCESS) |
| else: |
| sys.exit(conf.RET_CODE_FAILURE) |
| |
| |
| if __name__ == '__main__': |
| main() |