cfg/bin/instance-type-comment.py
Knut Ahlers f05fc4aab9
Add instance-type-comment script
Signed-off-by: Knut Ahlers <knut@ahlers.me>
2017-12-11 11:57:37 +01:00

105 lines
2.5 KiB
Python
Executable File

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright:
# 2017 Knut Ahlers <github.com/Luzifer>
# 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))