def manage_action()

in source/Tools Integration/MGN-Integration/Lambdas/lambda_mgn_launch.py [0:0]


def manage_action(factoryservers, action):
  try:
    if action.strip() == 'Launch Test Instances' or action.strip() == 'Launch Cutover Instances' or action.strip() == '- Terminate Launched instances':
        final_result = []
        for account in factoryservers:
            action_result = None
            target_account_creds = lambda_mgn.assume_role(str(account['aws_accountid']))
            target_account_session = lambda_mgn.get_session(target_account_creds, account['aws_region'])
            mgn_client_base = target_account_session.client("mgn", region_name=account['aws_region'], config=boto_config)
            if action.strip() == 'Launch Test Instances':
                action_result = launch_test_servers(account, mgn_client_base)
                if action_result is not None and "ERROR" in action_result:
                   account['job_id'] = action_result
            elif action.strip() == 'Launch Cutover Instances':
                action_result = launch_cutover_servers(account, mgn_client_base)
                if action_result is not None and "ERROR" in action_result:
                   account['job_id'] = action_result
            elif action.strip() == '- Terminate Launched instances':
                action_result = terminate_launched_instances(account, mgn_client_base)
            final_result.append(action_result)
            if action_result is not None and "ERROR" in action_result:
                log.error(str(action_result))
                return action_result
        isSuccess = True
        for result in final_result:
            if result is not None and 'ERROR' in result:
                isSuccess = False
        if isSuccess == True:
            msg = 'SUCCESS: ' + action.strip() + ' was completed for all servers in this Wave'
            log.info(msg)
            return msg
        else:
            msg = 'ERROR: ' + action.strip() + ' failed'
            log.error(msg)
            return msg
    else:
        # Enable multithreading
        processes = []
        manager = multiprocessing.Manager()
        status_list = manager.list()
        return_dict = manager.dict()
        total_servers_count = 0
        max_threads = 30
        for account in factoryservers:
            total_servers_count = total_servers_count + len(account['servers'])
            target_account_creds = lambda_mgn.assume_role(str(account['aws_accountid']))
            print("##################################################################################")
            print("### Multithread processing Action, in Account: " + account['aws_accountid'] + ", Region: " + account['aws_region'] + " ###")
            print("##################################################################################")
            # Splitting the list into smaller chunks, max 30 chunks
            if len(account['servers']) < max_threads:
                for serverlist in chunks(account['servers'], len(account['servers'])):
                    print(serverlist)
                    p = multiprocessing.Process(target=multiprocessing_action, args=(serverlist, target_account_creds, account['aws_region'], action, return_dict, status_list, account['aws_accountid'], account['aws_region']))
                    processes.append(p)
                    p.start()
            else:
                for serverlist in chunks(account['servers'], max_threads):
                    print(serverlist)
                    p = multiprocessing.Process(target=multiprocessing_action, args=(serverlist, target_account_creds, account['aws_region'], action, return_dict, status_list, account['aws_accountid'], account['aws_region']))
                    processes.append(p)
                    p.start()

        # Waiting for all processes to finish
        for process in processes:
            process.join()
        final_status = 0
        for item in status_list:
            final_status += item
        print("")

        # Check if any errors in the updating process
        if len(return_dict.values()) > 0:
            log.error("ERROR: "  + action.strip() + " failed")
            print(return_dict.values())
            return str(return_dict.values()[0])
        else:
            if final_status == total_servers_count:
                msg = "SUCCESS: " + action.strip() + " for all servers in this Wave"
                log.info(msg)
                return msg
            else:
                msg = "ERROR: "  + action.strip() + " failed"
                log.error(msg)
                return msg

  except Exception as error:
        if ":" in str(error):
            log.error(str(error))
            err = ''
            msgs = str(error).split(":")[1:]
            for msg in msgs:
                err = err + msg
            return "ERROR: " + err
        else:
            log.error(str(error))
            return "ERROR: " + str(error)