in build/update_instance_types.py [0:0]
def get_instances(filters, auth_map):
profile = auth_map.get('default', 'default')
ec2_api_response = []
paginator = boto3.Session(profile_name=profile).client('ec2').get_paginator('describe_instance_types')
for page in paginator.paginate():
ec2_api_response.extend(page['InstanceTypes'])
raw_instances = {i['InstanceType']: i for i in ec2_api_response}
ec2info = requests.get(INSTANCE_INFO).json()
for i in ec2info:
if i['instance_type'] in raw_instances:
raw_instances[i['instance_type']].update(i)
else:
raw_instances[i['instance_type']] = i
instance_prices = {}
region_map = {}
add_end = []
for ec2_filter in filters:
raw_instances = eval_filter(ec2_filter, raw_instances)
for r in raw_instances.values():
price = r.get('pricing', {}).get('us-east-1', {}).get('linux', {}).get('ondemand')
if price:
instance_regions = set(r['pricing'].keys())
for region_name in instance_regions:
if region_name not in region_map:
region_map[region_name] = [r['instance_type']]
else:
region_map[region_name].append(r['instance_type'])
instance_prices[r['instance_type']] = price
else:
i = r['instance_type'] if 'instance_type' in r else r.get('InstanceType')
if i:
add_end.append(i)
instance_prices = [k for k, v in sorted(instance_prices.items(), key=lambda item: item[1])] + add_end
return instance_prices, region_map