Updated to new IceHouse clients
[plstackapi.git] / planetstack / tests / GetConfiguration.py
index 872cd14..55d2467 100644 (file)
@@ -1,5 +1,6 @@
 import os
 import json
 import os
 import json
+import socket
 import sys
 import time
 
 import sys
 import time
 
@@ -9,6 +10,8 @@ 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
 
 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):
     # 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
 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
@@ -18,6 +21,16 @@ def ps_id_to_pl_id(x):
 def pl_id_to_ps_id(x):
     return x - 100000
 
 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 = {}
     for (key,value) in src.items():
 def filter_fields(src, fields):
     dest = {}
     for (key,value) in src.items():
@@ -35,7 +48,7 @@ def GetSlices(filter={}):
 
         slice = {"instantiation": "plc-instantiated",
                  "description": "planetstack slice",
 
         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,
                  "node_ids": node_ids,
                  "url": "planetstack",
                  "max_nodes": 1000,
@@ -43,20 +56,23 @@ def GetSlices(filter={}):
                  "slice_tag_ids": [],
                  "peer_id": None,
                  "site_id": ps_id_to_pl_id(ps_slice.site_id),
                  "slice_tag_ids": [],
                  "peer_id": None,
                  "site_id": ps_id_to_pl_id(ps_slice.site_id),
-                 "name": ps_slice.name}
+                 "name": ps_slicename_to_pl_slicename(ps_slice.name)}
 
                  # creator_person_id, person_ids, expires, created
 
         slices.append(slice)
     return slices
 
 
                  # 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=[pl_id_to_ps_id(nid) for nid 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():
     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 = {"node_id": ps_id_to_pl_id(ps_node.id),
                 "site_id": ps_id_to_pl_id(ps_node.site_id),
@@ -89,7 +105,7 @@ def GetSites():
     for ps_site in ps_sites:
         slice_ids=[]
         for ps_slice in ps_site.slices.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():
 
         node_ids=[]
         for ps_node in ps_site.nodes.all():
@@ -121,6 +137,48 @@ def GetSites():
 
     return sites
 
 
     return sites
 
+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"]
 
 def GetConfiguration(name):
     slicename = name["name"]
@@ -129,6 +187,8 @@ def GetConfiguration(name):
     else:
         node_id = 0
 
     else:
         node_id = 0
 
+    slicename = find_multi_slicename(slicename)
+
     node_sliver_tags = GetTags(slicename, node_id)
 
     slices = GetSlices({"name": slicename})
     node_sliver_tags = GetTags(slicename, node_id)
 
     slices = GetSlices({"name": slicename})
@@ -144,7 +204,15 @@ def GetConfiguration(name):
         for node in nodes:
             nodemap[node['node_id']]=node['hostname']
 
         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)
 
         for nid in node_ids:
             sliver_tags = GetTags(slicename,nid)
@@ -170,7 +238,21 @@ def GetConfiguration(name):
             'nodes': nodes}
 
 if __name__ == '__main__':
             'nodes': nodes}
 
 if __name__ == '__main__':
-    print GetConfiguration({"name": "smbaker-coblitz"})
+    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))