<reponame>aws-samples/bulk-aws-migration-using-cloudendure-automation<filename>CreateImages.py<gh_stars>1-10
#Copyright 2008-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.

#Permission is hereby granted, free of charge, to any person obtaining a copy of this
#software and associated documentation files (the "Software"), to deal in the Software
#without restriction, including without limitation the rights to use, copy, modify,
#merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
#permit persons to whom the Software is furnished to do so.

#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
#INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
#PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
#HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
#OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
#SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

from __future__ import print_function
import sys
import requests
import json
import yaml
import os
import boto3
import datetime
from botocore.exceptions import ClientError

def createimage(session, headers, endpoint, HOST, projectname, configfile, region):
           
    r = requests.get(HOST + endpoint.format('projects'), headers=headers, cookies=session)
    if r.status_code != 200:
        print("ERROR: Failed to fetch the project....")
        sys.exit(1)
    try:
        # Get Project ID
        projects = json.loads(r.text)["items"]
        project_exist = False
        for project in projects:
            if project["name"] == projectname:
               project_id = project["id"]
               project_exist = True
        if project_exist == False:
            print("ERROR: Project Name does not exist....")
            sys.exit(2)
    except:
        print(sys.exc_info())
        sys.exit(6)
        
    with open(os.path.join(sys.path[0], configfile), 'r') as ymlfile:
     config = yaml.load(ymlfile, yaml.FullLoader)
    
    migration_wave = config["project"]["waves"]
              
    m = requests.get(HOST + endpoint.format('projects/{}/machines').format(project_id), headers=headers, cookies=session)
    
    data = json.loads(m.text)["items"]
    machinelist = {}
    machine_exist = False
    
    for machine in data:
      machinelist[machine['id']] = machine['sourceProperties']['name']
      machine_name=machine['sourceProperties']['name']
      r_id=machine['replica']
      
      r = requests.get(HOST + endpoint.format('projects/{}/replicas/{}').format(project_id, r_id), headers=headers, cookies=session)
      replicas = json.loads(r.text)
      instance_id = replicas['machineCloudId']
      machine_exist = True
      try:
          ec2_client = boto3.client("ec2", region_name=region)
      except ClientError as e:
          print("Unexpected error(Make sure you have entered correct AWS region & AWS credentials available on machine): %s" % e)
          return
      
      timestamp = datetime.datetime.utcnow().strftime('%Y%m%d')
      try:
          image = ec2_client.create_image(InstanceId=instance_id, Name=machine_name+'-'+timestamp, Description='Image of CloudEndure migrated instance: '+machine_name,
                                         NoReboot=True,
                                         TagSpecifications=[
                                            {
                                                'ResourceType': 'image',
                                                'Tags': [
                                                    {
                                                        'Key': 'Name',
                                                        'Value': machine_name
                                                    },
                                                    {
                                                        'Key': 'instance',
                                                        'Value': instance_id
                                                    },
                                                    {
                                                        'Key': 'migration-wave',
                                                        'Value': migration_wave
                                                    },                                                
                                                ]
                                            },
                                        ]
                                        )
          print("Image creation initiated for "+ machine_name + " with image id: " + image['ImageId'])  
      except:
          print("Create AMI failed")
      
    if machine_exist == False:
        print ('There are no machines launched in cutover mode. No instances available to create image.')
        return
          