def export_instances()

in tools/vm-migrator/src/migrator/subnet.py [0:0]


def export_instances(project, zone, zone_2, zone_3, subnet_uri: uri.Subnet,
                     file_name):
    compute = get_compute()

    result_zone_2 = {}
    result_zone_3 = {}

    logging.info('fetching the inventory for the source subnet %s and zone %s',
                 subnet_uri.uri, zone)
    result = compute.instances().list(project=project,
                                      zone=zone,
                                      maxResults=10000).execute()
    if not result.get('items'):
        result = {'items': []}

    if zone_2:
        logging.info(
            'fetching the inventory for the source subnet %s and zone %s',
            subnet_uri.uri, zone_2)
        result_zone_2 = compute.instances().list(project=project,
                                                 zone=zone_2,
                                                 maxResults=10000).execute()
    if zone_3:
        logging.info(
            'fetching the inventory for the source subnet %s and zone %s',
            subnet_uri.uri, zone_3)
        result_zone_3 = compute.instances().list(project=project,
                                                 zone=zone_3,
                                                 maxResults=10000).execute()

    mydict = {}

    if result_zone_2.get('items') and zone_2:
        result['items'] = result['items'] + result_zone_2.get('items')

    if result_zone_3.get('items') and zone_3:
        result['items'] = result['items'] + result_zone_3.get('items')

    logging.info('Identified %i potential instance(s) in the given zones',
                 len(result['items']))

    instances_by_disk = {}

    for instances in result['items']:

        if instances['networkInterfaces'][0]['subnetwork'] \
                .endswith(subnet_uri.uri):
            csv = {
                'name': instances['name'],
                'id': instances['id'],
                'machine_type': instances['machineType'],
                'self_link': instances['selfLink'],
                'network': instances['networkInterfaces'][0]['network'],
                'internal_ip': instances['networkInterfaces'][0]['networkIP'],
                'subnet': instances['networkInterfaces'][0]['subnetwork']
            }
            instance_uri = uri.Instance.from_uri(instances['selfLink'])

            for i, disks in enumerate(instances['disks']):
                disk_uri = uri.Disk.from_uri(disks['source'])
                if i < 9:
                    csv['device_name_' + str(i + 1)] = disks['deviceName']
                    csv['disk_name_' + str(i + 1)] = disk_uri.name
                    instances_by_disk[disk_uri.abs_beta_uri] = instances['selfLink']
                else:
                    logging.warning(
                        'Too many disks: dropping disk name %s with and '
                        'device name %s', disk_uri.name, disks['deviceName'])

            alias_ips = instances['networkInterfaces'][0].get('aliasIpRanges')
            if alias_ips:
                logging.info('Found Alias IP for %s', instances['name'])
                for i in range(len(alias_ips)):
                    csv['alias_ip_' + str(i + 1)] = alias_ips[i]['ipCidrRange']

                    ip_name = get_alias_ip_name(instance_uri, subnet_uri,
                                                alias_ips[i]['ipCidrRange'])
                    if ip_name:
                        csv['alias_ip_name_' + str(i + 1)] = ip_name

                    if alias_ips[i].get('subnetworkRangeName'):
                        csv['range_name_' +
                            str(i + 1)] = alias_ips[i]['subnetworkRangeName']

            if instance.is_hosted_on_sole_tenant(instances):
                csv['node_group'] = instance.get_node_group(instances)

            # if backup will be needed - get fingerprint
            fingerprint = instances['networkInterfaces'][0].get('fingerprint')
            if fingerprint:
                logging.info(
                    'Found instance nic0 fingerprint for %s',
                    instances['name']
                )
                csv['fingerprint'] = fingerprint

            mydict[instances['selfLink']] = csv
        else:
            logging.debug(
                'Ignoring VM {} in subnet {} (looking for subnet {})'.format(
                    instances['name'],
                    instances['networkInterfaces'][0]['subnetwork'],
                    subnet_uri.uri))

    logging.info('fetching the disks for the source subnet %s and zone %s',
                 subnet_uri.uri, zone)
    result = compute.disks().list(project=project,
                                  zone=zone,
                                  maxResults=10000).execute()
    if not result.get('items'):
        result = {'items': []}

    if zone_2:
        logging.info(
            'fetching the disks for the source subnet %s and zone %s',
            subnet_uri.uri, zone_2)
        result_zone_2 = compute.disks().list(project=project,
                                             zone=zone_2,
                                             maxResults=10000).execute()
    if zone_3:
        logging.info(
            'fetching the disks for the source subnet %s and zone %s',
            subnet_uri.uri, zone_3)
        result_zone_3 = compute.disks().list(project=project,
                                             zone=zone_3,
                                             maxResults=10000).execute()

    if result_zone_2.get('items') and zone_2:
        result['items'] = result['items'] + result_zone_2.get('items')

    if result_zone_3.get('items') and zone_3:
        result['items'] = result['items'] + result_zone_3.get('items')

    for disks in result['items']:
        if disks['selfLink'] not in instances_by_disk:
            continue
        instance_link = instances_by_disk[disks['selfLink']]
        if 'labels' not in disks:
            continue
        for i in range(9):
            if mydict[instance_link]['disk_name_' + str(i + 1)] == \
                    disks['name']:
                mydict[instance_link]['disk_labels_' + str(i + 1)] = \
                    json.dumps(disks['labels'])
                break

    with open(file_name, 'w') as csvfile:

        writer = DictWriter(csvfile, fieldnames=fields.HEADERS)
        writer.writeheader()
        writer.writerows(mydict.values())

    logging.info(
        'Successfully written %i records to %s', len(mydict),
        file_name
    )

    return True