add slice_remap argument to RPC calls
diff --git a/planetstack/core/views/legacyapi.py b/planetstack/core/views/legacyapi.py
index e70fa57..fa6ffb8 100644
--- a/planetstack/core/views/legacyapi.py
+++ b/planetstack/core/views/legacyapi.py
@@ -5,13 +5,16 @@
import time
import traceback
import xmlrpclib
+
+# XXX for testing
+#sys.path.append("/opt/planetstack")
+#os.environ.setdefault("DJANGO_SETTINGS_MODULE", "planetstack.settings")
+
from core.models import Slice, Sliver, ServiceClass, Reservation, Tag, Network, User, Node, Image, Deployment, Site, NetworkTemplate, NetworkSlice
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
-slice_name_map = {}
-
def ps_id_to_pl_id(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
@@ -21,15 +24,19 @@
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
+# slice_remap is a dict of ps_slice_name -> (pl_slice_name, pl_slice_id)
+
+def pl_slice_id(slice, slice_remap={}):
+ if slice.name in slice_remap:
+ return int(slice_remap[slice.name][1])
else:
return ps_id_to_pl_id(slice.id)
-def ps_slicename_to_pl_slicename(x):
- return slice_name_map.get(x,x)
+def pl_slicename(slice, slice_remap={}):
+ if slice.name in slice_remap:
+ return slice_remap[slice.name][0]
+ else:
+ return slice.name
def filter_fields(src, fields):
dest = {}
@@ -38,17 +45,23 @@
dest[key] = value
return dest
-def GetSlices(filter={}):
- ps_slices = Slice.objects.filter(**filter)
+def GetSlices(filter={}, slice_remap={}):
+ #ps_slices = Slice.objects.filter(**filter)
+ ps_slices = Slice.objects.all()
slices = []
for ps_slice in ps_slices:
+ if (filter) and ("name" in filter):
+ remapped_name = slice_remap.get(ps_slice.name, (ps_slice.name,))[0]
+ if (remapped_name != filter["name"]):
+ continue
+
node_ids=[]
for ps_sliver in ps_slice.slivers.all():
node_ids.append(ps_id_to_pl_id(ps_sliver.node.id))
slice = {"instantiation": "plc-instantiated",
"description": "planetstack slice",
- "slice_id": pl_slice_id(ps_slice),
+ "slice_id": pl_slice_id(ps_slice, slice_remap),
"node_ids": node_ids,
"url": "planetstack",
"max_nodes": 1000,
@@ -56,14 +69,15 @@
"slice_tag_ids": [],
"peer_id": None,
"site_id": ps_id_to_pl_id(ps_slice.site_id),
- "name": ps_slicename_to_pl_slicename(ps_slice.name)}
+ "name": pl_slicename(ps_slice, slice_remap),
+ "planetstack_name": ps_slice.name}
# creator_person_id, person_ids, expires, created
slices.append(slice)
return slices
-def GetNodes(node_ids=None, fields=None):
+def GetNodes(node_ids=None, fields=None, slice_remap={}):
if node_ids:
ps_nodes = Node.objects.filter(id__in=[pl_id_to_ps_id(nid) for nid in node_ids])
else:
@@ -72,7 +86,7 @@
for ps_node in ps_nodes:
slice_ids=[]
for ps_sliver in ps_node.slivers.all():
- slice_ids.append(pl_slice_id(ps_sliver.slice))
+ slice_ids.append(pl_slice_id(ps_sliver.slice, slice_remap))
node = {"node_id": ps_id_to_pl_id(ps_node.id),
"site_id": ps_id_to_pl_id(ps_node.site_id),
@@ -99,19 +113,18 @@
def GetTags(slicename,node_id):
return {}
-def GetSites():
+def GetSites(slice_remap={}):
ps_sites = Site.objects.all()
sites = []
for ps_site in ps_sites:
slice_ids=[]
for ps_slice in ps_site.slices.all():
- slice_ids.append(pl_slice_id(ps_slice))
+ slice_ids.append(pl_slice_id(ps_slice, slice_remap))
node_ids=[]
for ps_node in ps_site.nodes.all():
node_ids.append(ps_id_to_pl_id(ps_node.id))
-
site = {"site_id": ps_id_to_pl_id(ps_site.id),
"node_ids": node_ids,
"pcu_ids": [],
@@ -164,34 +177,16 @@
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):
+def GetConfiguration(name, slice_remap={}):
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})
+ slices = GetSlices({"name": slicename}, slice_remap=slice_remap)
perhost = {}
allinterfaces = {}
hostipmap = {}
@@ -199,12 +194,13 @@
if len(slices)==1:
slice = slices[0]
node_ids = slice['node_ids']
- nodes = GetNodes(node_ids, ['hostname', 'node_id', 'site_id'])
+ nodes = GetNodes(node_ids, ['hostname', 'node_id', 'site_id'], slice_remap=slice_remap)
nodemap = {}
for node in nodes:
nodemap[node['node_id']]=node['hostname']
- interfaces = GetInterfaces(slicename, node_ids)
+ interfaces = GetInterfaces(slice["planetstack_name"], node_ids)
+ print "XXX", interfaces
hostipmap = {}
for interface in interfaces:
if nodemap[interface['node_id']] not in allinterfaces:
@@ -218,11 +214,11 @@
sliver_tags = GetTags(slicename,nid)
perhost[nodemap[nid]] = sliver_tags
- slivers = GetSlices()
+ slivers = GetSlices(slice_remap=slice_remap)
if node_id != 0:
slivers = [slice for slice in slivers if (node_id in slice.node_ids)]
- sites = GetSites()
+ sites = GetSites(slice_remap=slice_remap)
for site in sites:
site["site_tags"] = []
@@ -237,25 +233,35 @@
'sites': sites,
'nodes': nodes}
-def HandleGetConfiguration():
- find_multi_slicename("princeton_vcoblitz")
+DEFAULT_REMAP = {"princeton_vcoblitz2": ["princeton_vcoblitz", 70]}
+
+def HandleGetConfiguration1():
configs={}
for slicename in ["princeton_vcoblitz"]:
- configs[slicename] = GetConfiguration({"name": slicename})
+ configs[slicename] = GetConfiguration({"name": slicename}, DEFAULT_REMAP)
return configs
-def HandleGetNodes():
- find_multi_slicename("princeton_vcoblitz")
- return GetNodes()
+def HandleGetNodes1():
+ return GetNodes(slice_remap=DEFAULT_REMAP)
-def HandleGetSlices():
- find_multi_slicename("princeton_vcoblitz")
- return GetSlices()
+def HandleGetSlices1():
+ return GetSlices(slice_remap=DEFAULT_REMAP)
+def HandleGetConfiguration2(name, slice_remap):
+ return GetConfiguration(name, slice_remap=slice_remap)
-FUNCS = {"GetConfiguration": HandleGetConfiguration,
- "GetNodes": HandleGetNodes,
- "GetSlices": HandleGetSlices}
+def HandleGetNodes2(slice_remap):
+ return GetNodes(slice_remap=slice_remap)
+
+def HandleGetSlices2(slice_remap):
+ return GetSlices(slice_remap=slice_remap)
+
+FUNCS = {"GetConfiguration": HandleGetConfiguration1,
+ "GetNodes": HandleGetNodes1,
+ "GetSlices": HandleGetSlices1,
+ "GetConfiguration2": HandleGetConfiguration2,
+ "GetNodes2": HandleGetNodes2,
+ "GetSlices2": HandleGetSlices2}
@csrf_exempt
def LegacyXMLRPC(request):
@@ -264,7 +270,7 @@
(args, method) = xmlrpclib.loads(request.body)
result = None
if method in FUNCS:
- result = FUNCS[method]()
+ result = FUNCS[method](*args)
return HttpResponse(xmlrpclib.dumps((result,), methodresponse=True, allow_none=1))
except:
traceback.print_exc()
@@ -273,20 +279,17 @@
return HttpResponse("Not Implemented")
if __name__ == '__main__':
- find_multi_slicename("princeton_vcoblitz") # set up the mapping for princeton_vcoblitz2 -> princeton_vcoblitz
-
- slices = GetSlices()
- nodes = GetNodes()
+ slices = GetSlices(slice_remap = DEFAULT_REMAP)
+ nodes = GetNodes(slice_remap = DEFAULT_REMAP)
if ("-d" in sys.argv):
- config = GetConfiguration({"name": "princeton_vcoblitz"})
+ config = GetConfiguration({"name": "princeton_vcoblitz"}, slice_remap = DEFAULT_REMAP)
print config
print slices
print nodes
else:
configs={}
- for slicename in ["princeton_vcoblitz"]:
- configs[slicename] = GetConfiguration({"name": slicename})
+ configs[slicename] = GetConfiguration({"name": "princeton_vcoblitz"})
file("planetstack_config","w").write(json.dumps(configs))
file("planetstack_slices","w").write(json.dumps(slices))