Add instance-type-comment script
Signed-off-by: Knut Ahlers <knut@ahlers.me>
This commit is contained in:
parent
331df65c33
commit
f05fc4aab9
1 changed files with 104 additions and 0 deletions
104
bin/instance-type-comment.py
Executable file
104
bin/instance-type-comment.py
Executable file
|
@ -0,0 +1,104 @@
|
|||
#!/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))
|
Loading…
Reference in a new issue