def verify_instance_status()

in source/Tools Integration/MGN-Integration/MGN-automation-scripts/3-Verify-instance-status.py [0:0]


def verify_instance_status(get_servers, token, UserHOST):
    auth = {"Authorization": token}
    instance_not_ready = 1
    while instance_not_ready > 0:
        instance_not_ready = 0
        print("******************************")
        print("* Getting Target Instance Id *")
        print("******************************")
        serverlist = InstanceList = GetInstanceId(get_servers)
        for account in serverlist:
            target_account_session = assume_role(str(account['aws_accountid']), account['aws_region'])
            print("")
            print("######################################################")
            print("#### In Account: " + account['aws_accountid'], ", region: " + account['aws_region'] + " ####")
            print("######################################################")
            #### Change this line, and not hardcoded endpoint_url
            ec2_client = target_account_session.client("ec2", region_name=account['aws_region'])
            instanceIds = []
            for server in account['servers']:
                if 'target_ec2InstanceID' in server:
                    if server['target_ec2InstanceID'] != '':
                        instanceIds.append(server['target_ec2InstanceID'])
            try:
                resp = ec2_client.describe_instance_status(InstanceIds=instanceIds, IncludeAllInstances=True)
            except botocore.exceptions.ClientError as e:
                if e.response['Error']['Code'] == 'InvalidInstanceID.NotFound':
                    print("")
                    print("*** Target instance IDs in MGN are no longer available, this is most likely due to the status being reverted and instances terminated. ***")
                    return
                else:
                    raise e
                    return
            for instance in account['servers']:
                if 'target_ec2InstanceID' in instance:
                    if instance['target_ec2InstanceID'] != '':
                        for status in resp['InstanceStatuses']:
                            if status['InstanceState']['Name'] == "running":
                                if instance['target_ec2InstanceID'] == status['InstanceId']:
                                    if status['InstanceStatus']['Status'].lower() == "ok" and status['SystemStatus']['Status'].lower() == "ok":
                                        instance['Status'] = "ok"
                                    elif status['InstanceStatus']['Status'].lower() == "impaired" and status['SystemStatus']['Status'].lower() == "ok":
                                        instance['Status'] = "impaired"
                                    else:
                                        instance['Status'] = "failed"
                            else:
                                instance['Status'] = "failed"
                    else:
                        instance['Status'] = "target_not_exist"
                else:
                     instance['Status'] = "not_in_mgn"
            # Print out result
            server_passed = {}
            server_failed = {}
            server_not_in_mgn = {}
            target_server_not_exist = {}
            for instance in account['servers']:
                if instance['Status'] == "ok":
                    server_passed[instance['server_fqdn']] = "ok"
                elif instance['Status'] == "failed":
                    server_failed[instance['server_fqdn']] = "failed"
                elif instance['Status'] == 'target_not_exist':
                    target_server_not_exist[instance['server_fqdn']] = "target_not_exist"
                elif instance['Status'] == 'not_in_mgn':
                    server_not_in_mgn[instance['server_fqdn']] = "not_in_mgn"
                elif instance['Status'] == "impaired":
                    server_failed[instance['server_fqdn']] = "impaired"

            if len(server_passed) > 0:
                print("----------------------------------------------------")
                print("- The following instances PASSED 2/2 status checks -")
                print("----------------------------------------------------")
                for passed in server_passed.keys():
                    print(passed)
                print("")
            if len(server_failed) > 0:
                instance_not_ready = instance_not_ready + 1
                print("-----------------------------------------------------------------")
                print("- WARNING: the following instances FAILED 2/2 status checks -----")
                print("-----------------------------------------------------------------")
                for failed in server_failed.keys():
                    print(failed)
                print("")
            if len(target_server_not_exist) > 0:
                instance_not_ready = instance_not_ready + 1
                print("----------------------------------------------------------------")
                print("-  The following source servers do not have a target instance  -")
                print("----------------------------------------------------------------")
                for target_not_exist in target_server_not_exist.keys():
                    print(target_not_exist)
                print("")
            if len(server_not_in_mgn) > 0:
                print("------------------------------------------------------------------")
                print("-  The following source servers do not exist in App Mig Service  -")
                print("------------------------------------------------------------------")
                for not_in_mgn in server_not_in_mgn.keys():
                    print(not_in_mgn)
                print("")

            # Updating migration factory migration_status attributes
            for instance in account['servers']:
                serverattr = ''
                if instance['Status'] == "ok":
                    serverattr = {"migration_status": "2/2 status checks : Passed"}
                elif instance['Status'] == "failed":
                    serverattr = {"migration_status": "2/2 status checks : Failed"}
                elif instance['Status'] == "target_not_exist":
                    serverattr = {"migration_status": "2/2 status checks : Target instance not exist"}
                elif instance['Status'] == "not_in_mgn":
                    serverattr = {"migration_status": "2/2 status checks : Server not in MGN"}
                elif instance['Status'] == "impaired":
                    serverattr = {"migration_status": "2/2 status checks : Failed"}
                updateserver = requests.put(UserHOST + serverendpoint + '/' + instance['server_id'], headers=auth, data=json.dumps(serverattr))
                if updateserver.status_code == 401:
                    print("Error: Access to migration_status attribute is denied")
                    sys.exit()
                elif updateserver.status_code != 200:
                    print("Error: Update migration_status attribute failed")
                    sys.exit()

        if instance_not_ready > 0:
            print("")
            print("***********************************************")
            print("* Instance booting up - retry after 2 minutes *")
            print("***********************************************")
            print("")
            time.sleep(120)