#! /usr/bin/python import json import os import requests import sys from operator import itemgetter, attrgetter REST_API="http://alpha.opencloud.us:8000/plstackapi/" NODES_API = REST_API + "nodes/" SLICES_API = REST_API + "slices/" SLIVERS_API = REST_API + "slivers/" NETWORKSLIVERS_API = REST_API + "networkslivers/" opencloud_auth=("demo@onlab.us", "demo") def get_slice_id(slice_name): r = requests.get(SLICES_API + "?name=%s" % slice_name, auth=opencloud_auth) return r.json()[0]["id"] def get_node_id(host_name): r = requests.get(NODES_API) nodes = r.json() for node in nodes: if node["name"].lower() == host_name.lower(): return node["id"] print >> sys.stderr, "Error: failed to find node %s" % host_name sys.exit(-1) def get_slivers(slice_id=None, node_id=None): queries = [] if slice_id: queries.append("slice=%s" % str(slice_id)) if node_id: queries.append("node=%s" % str(node_id)) if queries: query_string = "?" + "&".join(queries) else: query_string = "" r = requests.get(SLIVERS_API + query_string, auth=opencloud_auth) return r.json() def main(): global opencloud_auth if len(sys.argv)!=5: print >> sys.stderr, "syntax: get_instance_name.py , , " sys.exit(-1) username = sys.argv[1] password = sys.argv[2] hostname = sys.argv[3] slice_name = sys.argv[4] opencloud_auth=(username, password) slice_id = get_slice_id(slice_name) node_id = get_node_id(hostname) slivers = get_slivers(slice_id, node_id) # get (instance_name, ip) pairs for instances with names and ips slivers = [x for x in slivers if x["instance_name"]] slivers = sorted(slivers, key = lambda sliver: sliver["instance_name"]) # return the last one in the list (i.e. the newest one) sliver_id = slivers[-1]["id"] r = requests.get(NETWORKSLIVERS_API + "?sliver=%s" % sliver_id, auth=opencloud_auth) networkSlivers = r.json() ips = [x["ip"] for x in networkSlivers] # XXX kinda hackish -- assumes private ips start with "10." and nat start with "172." # print a public IP if there is one for ip in ips: if (not ip.startswith("10")) and (not ip.startswith("172")): print ip return # otherwise print a privat ip for ip in ips: if (not ip.startswith("172")): print ip return # otherwise just print the first one print ips[0] if __name__ == "__main__": main()