in source/Tools Integration/MGN-Integration/Lambdas/lambda_mgn_template.py [0:0]
def create_launch_template(factoryserver, action, new_launch_template, launch_template_data_latest, mgn_client, ec2_client, verify_instance_profile, launch_template_latest_ver):
try:
# Update Launch template
## Update disk type
for blockdevice in new_launch_template['BlockDeviceMappings']:
blockdevice['Ebs']['VolumeType'] = 'gp3'
blockdevice['Ebs']['Iops'] = 3000
blockdevice['Ebs']['Throughput'] = 125
## update instance type
if 'instanceType' in factoryserver:
new_launch_template['InstanceType'] = factoryserver['instanceType']
## update tenancy
p_tenancy = {}
if 'tenancy' in factoryserver:
license = {}
if factoryserver["tenancy"].lower() == "shared":
p_tenancy['Tenancy'] = 'default'
license = {'osByol': False}
elif factoryserver["tenancy"].lower() == "dedicated":
p_tenancy['Tenancy'] = 'dedicated'
license = {'osByol': False}
elif factoryserver["tenancy"].lower() == "dedicated host":
p_tenancy['Tenancy'] = 'host'
license = {'osByol': True}
else:
p_tenancy['Tenancy'] = 'default'
license = {'osByol': False}
if factoryserver['server_os_family'].lower() == 'linux':
license = {'osByol': True}
mgn_client.update_launch_configuration(licensing=license, sourceServerID=factoryserver['source_server_id'])
else:
p_tenancy['Tenancy'] = 'default'
new_launch_template['Placement'] = p_tenancy
## update instance profile
if len(verify_instance_profile) > 0:
instance_profile_name = {}
instance_profile_name['Arn'] = verify_instance_profile['InstanceProfile']['Arn']
new_launch_template['IamInstanceProfile'] = instance_profile_name
## update tags
if 'tags' in factoryserver:
for tags in new_launch_template['TagSpecifications']:
if tags['ResourceType'] == 'instance' or tags['ResourceType'] == 'volume':
for item in factoryserver['tags']:
if 'key' in item:
item['Key'] = item['key']
del item['key']
if 'value' in item:
item['Value'] = item['value']
del item['value']
TagExist = False
for tag in tags['Tags']:
if item['Key'].lower() == tag['Key'].lower():
tag['Value'] = item['Value']
TagExist = True
log.info("Pid: " + str(os.getpid()) + " - Replaced existing value for tag: " + tag['Key'] + " on server: " + factoryserver['server_name'])
if TagExist == False:
tags['Tags'].append(item)
## Update Subnet Id and security group Ids
for nic in new_launch_template['NetworkInterfaces']:
if 'private_ip' in factoryserver:
if factoryserver['private_ip'] is not None and factoryserver['private_ip'].strip() != '':
ipaddrs = []
ip = {}
ip['Primary'] = True
ip['PrivateIpAddress'] = factoryserver['private_ip']
ipaddrs.append(ip)
nic['PrivateIpAddresses'] = ipaddrs
## Update Launch template with Test SG and subnet
if action == "Launch Test Instances":
for nic in new_launch_template['NetworkInterfaces']:
nic['Groups'] = factoryserver['securitygroup_IDs_test']
nic['SubnetId'] = factoryserver['subnet_IDs_test'][0]
log.info("Pid: " + str(os.getpid()) + " - *** Create New Test Launch Template data: ***")
print(new_launch_template)
new_template = ec2_client.create_launch_template_version(LaunchTemplateId=factoryserver['launch_template_id'], SourceVersion=str(launch_template_latest_ver), LaunchTemplateData=new_launch_template)
new_template_ver = new_template['LaunchTemplateVersion']['VersionNumber']
if new_template['ResponseMetadata']['HTTPStatusCode'] != 200 :
msg = "ERROR: Update Failed - Test Launch Template for server: " + factoryserver['server_name']
log.error("Pid: " + str(os.getpid()) + " - " + msg)
return msg
else:
msg = "Update SUCCESS: Test Launch template updated for server: " + factoryserver['server_name']
log.info("Pid: " + str(os.getpid()) + " - " + msg)
log.info("Pid: " + str(os.getpid()) + " - Test Template updated, the latest version is: " + str(new_template_ver))
set_default_ver = ec2_client.modify_launch_template(LaunchTemplateId=factoryserver['launch_template_id'],DefaultVersion=str(new_template_ver))
## Update Launch template with Cutover SG and subnet
elif action == "Launch Cutover Instances":
for nic in new_launch_template['NetworkInterfaces']:
nic['Groups'] = factoryserver['securitygroup_IDs']
nic['SubnetId'] = factoryserver['subnet_IDs'][0]
log.info("Pid: " + str(os.getpid()) + " - *** Create New Cutover Launch Template data: ***")
print(new_launch_template)
new_template = ec2_client.create_launch_template_version(LaunchTemplateId=factoryserver['launch_template_id'], SourceVersion=str(launch_template_latest_ver), LaunchTemplateData=new_launch_template)
new_template_ver = new_template['LaunchTemplateVersion']['VersionNumber']
if new_template['ResponseMetadata']['HTTPStatusCode'] != 200 :
msg = "ERROR: Update Failed - Cutover Launch Template for server: " + factoryserver['server_name']
log.error("Pid: " + str(os.getpid()) + " - " + msg)
return msg
else:
msg = "Update SUCCESS: Cutover Launch template updated for server: " + factoryserver['server_name']
log.info("Pid: " + str(os.getpid()) + " - " + msg)
log.info("Pid: " + str(os.getpid()) + " - Cutover Template updated, the latest version is: " + str(new_template_ver))
set_default_ver = ec2_client.modify_launch_template(LaunchTemplateId=factoryserver['launch_template_id'],DefaultVersion=str(new_template_ver))
## Validating Launch template with both test and cutover info
elif action == "Validate Launch Template":
status = False
### Update Launch template with test SG and subnet
for nic in new_launch_template['NetworkInterfaces']:
nic['Groups'] = factoryserver['securitygroup_IDs_test']
nic['SubnetId'] = factoryserver['subnet_IDs_test'][0]
log.info("Pid: " + str(os.getpid()) + " - *** Validate New Test Launch Template data: ***")
print(new_launch_template)
new_template_test = ec2_client.create_launch_template_version(LaunchTemplateId=factoryserver['launch_template_id'], SourceVersion=str(launch_template_latest_ver), LaunchTemplateData=new_launch_template)
new_template_ver_test = new_template_test['LaunchTemplateVersion']['VersionNumber']
log.info("Pid: " + str(os.getpid()) + " - Test Template updated, the latest version is: " + str(new_template_ver_test))
if new_template_test['ResponseMetadata']['HTTPStatusCode'] != 200 :
status = False
msg = "ERROR: Validation failed - Test Launch Template data for server: " + factoryserver['server_name']
log.error("Pid: " + str(os.getpid()) + " - " + msg)
return msg
else:
msg = "SUCCESS: Test Launch template validated for server: " + factoryserver['server_name']
log.info("Pid: " + str(os.getpid()) + " - " + msg)
status = True
set_default_ver_test = ec2_client.modify_launch_template(LaunchTemplateId=factoryserver['launch_template_id'],DefaultVersion=str(new_template_ver_test))
### Update Launch template with cutover SG and subnet
for nic in new_launch_template['NetworkInterfaces']:
nic['Groups'] = factoryserver['securitygroup_IDs']
nic['SubnetId'] = factoryserver['subnet_IDs'][0]
log.info("Pid: " + str(os.getpid()) + " - *** Validate New Cutover Launch Template data: ***")
print(new_launch_template)
new_template_cutover = ec2_client.create_launch_template_version(LaunchTemplateId=factoryserver['launch_template_id'], SourceVersion=str(new_template_ver_test), LaunchTemplateData=new_launch_template)
new_template_ver_cutover = new_template_cutover['LaunchTemplateVersion']['VersionNumber']
log.info("Pid: " + str(os.getpid()) + " - Cutover Template updated, the latest version is: " + str(new_template_ver_cutover))
if new_template_cutover['ResponseMetadata']['HTTPStatusCode'] != 200 :
status = False
msg = "ERROR: Validation failed - Cutover Launch Template data for server: " + factoryserver['server_name']
log.error("Pid: " + str(os.getpid()) + " - " + msg)
return msg
else:
msg = "SUCCESS: Cutover Launch template validated for server: " + factoryserver['server_name']
log.info("Pid: " + str(os.getpid()) + " - " + msg)
status = True
set_default_ver_cutover = ec2_client.modify_launch_template(LaunchTemplateId=factoryserver['launch_template_id'],DefaultVersion=str(new_template_ver_cutover))
### Revert Launch template back to old version
latest_template = ec2_client.create_launch_template_version(LaunchTemplateId=factoryserver['launch_template_id'], SourceVersion=str(new_template_ver_cutover), LaunchTemplateData=launch_template_data_latest)
latest_template_ver = latest_template['LaunchTemplateVersion']['VersionNumber']
log.info("Pid: " + str(os.getpid()) + " - Template reverted back after validation, the latest version is: " + str(latest_template_ver))
if latest_template['ResponseMetadata']['HTTPStatusCode'] != 200 :
status = False
msg = "ERROR: Revert to old version failed for server: " + factoryserver['server_name']
log.error("Pid: " + str(os.getpid()) + " - " + msg)
return msg
else:
status = True
set_default_ver_latest = ec2_client.modify_launch_template(LaunchTemplateId=factoryserver['launch_template_id'],DefaultVersion=str(latest_template_ver))
if status == True:
msg = "SUCCESS: All Launch templates validated for server: " + factoryserver['server_name']
log.info("Pid: " + str(os.getpid()) + " - " + msg)
return msg
else:
msg = "ERROR: Launch template validation failed for server: " + factoryserver['server_name']
log.error("Pid: " + str(os.getpid()) + " - " + msg)
return msg
except Exception as error:
if ":" in str(error):
err = ''
msgs = str(error).split(":")[1:]
for msg in msgs:
err = err + msg
log.error("Pid: " + str(os.getpid()) + " - ERROR: " + err)
return "ERROR: " + err
else:
log.error("Pid: " + str(os.getpid()) + " - ERROR: " + str(error))
return "ERROR: " + str(error)