Skip to content

Instantly share code, notes, and snippets.

@jcsalterego
Created April 11, 2012 16:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jcsalterego/2360240 to your computer and use it in GitHub Desktop.
Save jcsalterego/2360240 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python
import locale
from libcloud.compute.types import Provider
from libcloud.compute.providers import get_driver
RACKSPACE_USER = 'YOUR_USERNAME_HERE'
RACKSPACE_KEY = 'YOUR_API_KEY_HERE'
HOURS_PER_MONTH = 730.484 # according to magical google calculator
DELIMITER = '\t'
# helper to convert items in list to str, and join with DELIMITER
def assemble_line(words):
return DELIMITER.join([str(word) for word in words])
def format_price(price):
# for US-style dollar amounts
locale.setlocale(locale.LC_ALL, 'en_US')
return '${}'.format(locale.format('%0.2f', price, grouping=True))
def main():
Driver = get_driver(Provider.RACKSPACE)
conn = Driver(RACKSPACE_USER, RACKSPACE_KEY)
nodes = conn.list_nodes()
sizes = conn.list_sizes()
nodes_by_size = {}
summary = []
output = []
# sort nodes by name
nodes.sort(lambda x, y: cmp(x.name, y.name))
for node in nodes:
size = [s for s in sizes if s.id == node.extra['flavorId']][0]
size_name = str(size.ram)
if size in nodes_by_size:
nodes_by_size[size].append(node)
else:
nodes_by_size[size] = [node]
month_price = size.price * HOURS_PER_MONTH
output.append((node.name, size_name, format_price(month_price)))
# calculate total monthly price, broken down by size
for size, nodes in nodes_by_size.iteritems():
num_nodes = len(nodes)
month_price = size.price * HOURS_PER_MONTH
nodes_total_price = month_price * num_nodes
summary.append((size.ram, # size
num_nodes, # number of nodes
format_price(month_price), # price per node per month
format_price(nodes_total_price))) # total price per month
total_num_nodes = sum(len(nodes) for nodes in nodes_by_size.values())
total_price = sum(size.price * HOURS_PER_MONTH * len(nodes)
for size, nodes
in nodes_by_size.iteritems())
summary.append(('',
total_num_nodes,
'',
format_price(total_price)))
# output
print('Summary')
print(assemble_line(('Size',
'Nodes',
'$/Nodes/Month',
'$/Month')))
print('\n'.join([assemble_line(line) for line in summary]))
print
print('Inventory')
print('\n'.join([assemble_line(line) for line in output]))
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment