def create_launch_template()

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)