diff --git a/bin/instance-type-comment.py b/bin/instance-type-comment.py new file mode 100755 index 0000000..f58214c --- /dev/null +++ b/bin/instance-type-comment.py @@ -0,0 +1,104 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Copyright: +# 2017 Knut Ahlers +# License: +# Apache v2.0 +# https://www.apache.org/licenses/LICENSE-2.0.html + +from __future__ import print_function + +# included +import json +import os +import sys +import time + +# external requirement +import requests + +SOURCE_FILE = 'https://ec2instances.info/instances.json' +CACHE_TIME = 7 * 24 * 3600 +CACHE_FILE = os.path.expanduser('~/.local/share/itc/instances.json') +REGION_FALLBACK = 'eu-west-1' + + +def beautify_ecu(ecu): + if ecu == 'variable': + return 'var' + return str(ecu).strip('.0') + + +def beautify_mem(mem): + return str(mem).strip('.0') + + +def get_region(): + if 'AWS_REGION' in os.environ: + return os.environ['AWS_REGION'] + if 'AWS_DEFAULT_REGION' in os.environ: + return os.environ['AWS_DEFAULT_REGION'] + return REGION_FALLBACK + + +def monthly_pricing(hourly_rate): + price = float(hourly_rate) * 24 * 365 / 12 + return round(price) + + +def renew_cache(): + least_mod_time = time.time() - CACHE_TIME + if os.path.isfile(CACHE_FILE) and os.path.getmtime(CACHE_FILE) > least_mod_time: + return + + try: + os.makedirs(os.path.dirname(CACHE_FILE)) + except OSError: + # Creating an existing directory will fail which is okay + pass + + with open(CACHE_FILE, 'w') as cf: + cf.write(requests.get(SOURCE_FILE).text) + + return + + +def generate_comment(instance_type): + renew_cache() + region = get_region() + + instances = json.loads(open(CACHE_FILE, 'r').read()) + for instance in instances: + if instance['instance_type'] != instance_type: + continue + + if region not in instance['pricing']: + print('Region "{}" is unknown in pricing table.'.format(region)) + return None + + return '{vcpu} ({ecu}) / {mem} / {network} / ${price:.0f}'.format( + vcpu=instance['vCPU'], + ecu=beautify_ecu(instance['ECU']), + mem=beautify_mem(instance['memory']), + network=instance['network_performance'], + price=monthly_pricing( + instance['pricing'][region]['linux']['ondemand']), + ) + + +def main(args): + comment = generate_comment(args[1]) + if comment is None: + return 1 + + print(' InstanceTypeComment: {}'.format(comment)) + return 0 + + +if __name__ == '__main__': + if len(sys.argv) < 2: + print( + 'Please supply an instance type to format: e.g. {} m4.large'.format(sys.argv[0])) + sys.exit(1) + sys.exit(main(sys.argv))