X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=planetstack%2Ftests%2FGetConfiguration.py;h=55d24671b05f59c9d6fff777a3d452cb33d3bae4;hb=543d7f6864bb0a9033693917ae6e88d24ab0026b;hp=37d35b4b37b636712a55e0ed93bb259890e4a8c3;hpb=0e8a2d74159a165e90f131a4a15643293dab5662;p=plstackapi.git diff --git a/planetstack/tests/GetConfiguration.py b/planetstack/tests/GetConfiguration.py index 37d35b4..55d2467 100644 --- a/planetstack/tests/GetConfiguration.py +++ b/planetstack/tests/GetConfiguration.py @@ -1,5 +1,6 @@ import os import json +import socket import sys import time @@ -9,8 +10,26 @@ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "planetstack.settings") from openstack.manager import OpenStackManager from core.models import Slice, Sliver, ServiceClass, Reservation, Tag, Network, User, Node, Image, Deployment, Site, NetworkTemplate, NetworkSlice +slice_name_map = {} + def ps_id_to_pl_id(x): - return 10000 + x + # Since we don't want the PlanetStack object IDs to conflict with existing + # PlanetLab object IDs in the CMI, just add 100000 to the PlanetStack object + # IDs. + return 100000 + x + +def pl_id_to_ps_id(x): + return x - 100000 + +def pl_slice_id(slice): + if slice.name.startswith("princeton_vcoblitz"): + # 70 is the slice id of princeton_vcoblitz on vicci + return 70 + else: + return ps_id_to_pl_id(slice.id) + +def ps_slicename_to_pl_slicename(x): + return slice_name_map.get(x,x) def filter_fields(src, fields): dest = {} @@ -29,34 +48,37 @@ def GetSlices(filter={}): slice = {"instantiation": "plc-instantiated", "description": "planetstack slice", - "slice_id": ps_id_to_pl_id(ps_slice.id), + "slice_id": pl_slice_id(ps_slice), "node_ids": node_ids, "url": "planetstack", "max_nodes": 1000, "peer_slice_id": None, "slice_tag_ids": [], "peer_id": None, - "site_id": ps_id_to_pl_id(ps.site_id), - "name": ps_slice.name} + "site_id": ps_id_to_pl_id(ps_slice.site_id), + "name": ps_slicename_to_pl_slicename(ps_slice.name)} # creator_person_id, person_ids, expires, created slices.append(slice) return slices -def GetNodes(node_ids, fields=None) - ps_nodes = Node.objects.filter(id__in=node_ids) +def GetNodes(node_ids=None, fields=None): + if node_ids: + ps_nodes = Node.objects.filter(id__in=[pl_id_to_ps_id(nid) for nid in node_ids]) + else: + ps_nodes = Node.objects.all() nodes = [] for ps_node in ps_nodes: slice_ids=[] for ps_sliver in ps_node.slivers.all(): - slice_ids.append(ps_id_to_pl_id(ps_sliver.slice.id)) + slice_ids.append(pl_slice_id(ps_sliver.slice)) node = {"node_id": ps_id_to_pl_id(ps_node.id), "site_id": ps_id_to_pl_id(ps_node.site_id), "node_type": "regular", "peer_node_id": None, - "hostname": node.name, + "hostname": ps_node.name, "conf_file_ids": [], "slice_ids": slice_ids, "model": "planetstack", @@ -75,7 +97,7 @@ def GetNodes(node_ids, fields=None) return nodes def GetTags(slicename,node_id): - return [] + return {} def GetSites(): ps_sites = Site.objects.all() @@ -83,7 +105,7 @@ def GetSites(): for ps_site in ps_sites: slice_ids=[] for ps_slice in ps_site.slices.all(): - slice_ids.append(ps_id_to_pl_id(ps_slice.id)) + slice_ids.append(pl_slice_id(ps_slice)) node_ids=[] for ps_node in ps_site.nodes.all(): @@ -115,14 +137,60 @@ def GetSites(): return sites - -def GetConfigurations(name): +def GetInterfaces(slicename, node_ids): + interfaces = [] + ps_slices = Slice.objects.filter(name=slicename) + for ps_slice in ps_slices: + for ps_sliver in ps_slice.slivers.all(): + node_id = ps_id_to_pl_id(ps_sliver.node_id) + if node_id in node_ids: + ps_node = ps_sliver.node + interface = {"node_id": node_id, + "ip": socket.gethostbyname(ps_node.name), + "broadcast": None, + "mac": "11:22:33:44:55:66", + "bwlimit": None, + "network": None, + "is_primary": True, + "dns1": None, + "hostname": None, + "netmask": None, + "interface_tag_ids": [], + "interface_id": node_id, # assume each node has only one interface + "gateway": None, + "dns2": None, + "type": "ipv4", + "method": "dhcp"} + interfaces.append(interface) + return interfaces + +def find_multi_slicename(orig_slicename): + """ + Because we sometimes have issues deleting a slice in planetstack and + creating a new one, allow us to use a prefix match, that way someone + can put a version number of the end of the slicename + """ + global slice_name_map + slices = Slice.objects.filter() + for slice in slices: + if slice.name.startswith(orig_slicename): + slice_name_map[slice.name] = orig_slicename + return slice.name + + return orig_slicename + + +def GetConfiguration(name): slicename = name["name"] if "node_id" in name: node_id = name["node_id"] else: node_id = 0 + slicename = find_multi_slicename(slicename) + + node_sliver_tags = GetTags(slicename, node_id) + slices = GetSlices({"name": slicename}) perhost = {} allinterfaces = {} @@ -136,7 +204,15 @@ def GetConfigurations(name): for node in nodes: nodemap[node['node_id']]=node['hostname'] - # interfaces + interfaces = GetInterfaces(slicename, node_ids) + hostipmap = {} + for interface in interfaces: + if nodemap[interface['node_id']] not in allinterfaces: + allinterfaces[nodemap[interface['node_id']]] = [] + interface['interface_tags'] = [] + allinterfaces[nodemap[interface['node_id']]].append(interface) + if interface['is_primary']: + hostipmap[nodemap[interface['node_id']]] = interface['ip'] for nid in node_ids: sliver_tags = GetTags(slicename,nid) @@ -161,5 +237,22 @@ def GetConfigurations(name): 'sites': sites, 'nodes': nodes} +if __name__ == '__main__': + find_multi_slicename("princeton_vcoblitz") # set up the mapping for princeton_vcoblitz2 -> princeton_vcoblitz + slices = GetSlices() + nodes = GetNodes() + + if ("-d" in sys.argv): + config = GetConfiguration({"name": "princeton_vcoblitz"}) + print config + print slices + print nodes + else: + configs={} + for slicename in ["princeton_vcoblitz"]: + configs[slicename] = GetConfiguration({"name": slicename}) + file("planetstack_config","w").write(json.dumps(configs)) + file("planetstack_slices","w").write(json.dumps(slices)) + file("planetstack_nodes","w").write(json.dumps(nodes))