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)