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