import os
import json
+import socket
import sys
import time
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 = {}
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",
return nodes
def GetTags(slicename,node_id):
- return []
+ return {}
def GetSites():
ps_sites = Site.objects.all()
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():
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 = {}
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)
'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))