gre network builder wip
smbaker [Wed, 2 Jan 2013 03:40:01 +0000 (19:40 -0800)]
apps/gacks/bridgeconfig.py

index 3f625ff..28087a8 100644 (file)
@@ -3,12 +3,15 @@ class NetworkBuilder:
         self.plc = plc
 
     def set_tag(self, tagname, slice_id, node_id, value):
-        tags = self.plc.GetSliceTags({"tagname": tagname, "slice_id": slice_id, "node_id": node_id})
+        if node_id is not None:
+            tags = self.plc.GetSliceTags({"tagname": tagname, "slice_id": slice_id, "node_id": node_id})
+        else:
+            tags = self.plc.GetSliceTags({"tagname": tagname, "slice_id": slice_id})
         if tags:
             if tags[0]["value"] != value:
                 self.plc.UpdateSliceTag(tags[0]['slice_tag_id'], value)\r
         else:\r
-            self.plc.AddSliceTag(slice_id, "interface", value, node_id)
+            self.plc.AddSliceTag(slice_id, tagname, value, node_id)
 
 class NetworkBuilder_gre(NetworkBuilder):
     """ This sets up nodes using private bridges and GRE tunnels.
@@ -25,7 +28,7 @@ class NetworkBuilder_gre(NetworkBuilder):
     """
 
     def __init__(self, plc):
-        NetworkBuilder.init(self, plc)
+        NetworkBuilder.__init__(self, plc)
 
     def configure_slice(self, slice_name_or_id):
         slices = self.plc.GetSlices(slice_name_or_id, ["slice_id", "node_ids", "slice_tag_ids"])
@@ -38,7 +41,7 @@ class NetworkBuilder_gre(NetworkBuilder):
 
         nodes = self.plc.GetNodes(slice["node_ids"], ["node_id", "hostname"])
         interfaces = self.plc.GetInterfaces({"node_id": slice["node_ids"]}, ["node_id", "ip", "is_primary"])
-        topology = self.generate_star_topology(self, nodes)
+        topology = self.generate_star_topology(nodes)
 
         node_ips = {}
         for interface in interfaces:
@@ -51,23 +54,32 @@ class NetworkBuilder_gre(NetworkBuilder):
         bridge_name = "br-slice-" + str(slice_id)
         self.set_tag("slice_bridge_name", slice_id, None, bridge_name)
 
+        hostmap = []
         for (node_id,neighbor_list) in topology.items():
+            ip_addr = "10.2.%d.%d" % (node_id>>8, node_id&0xFF)
             neighbor_ip = [node_ips[x] for x in neighbor_list]
-            set_tag("slice_bridge_addr", slice_id, node_id, "10.1.%d.%d" % (node_id>>8, node_id&0xFF))
-            set_tag("slice_bridge_neighbors", slice_id, node_id, ",".join(neighbor_list))
-            set_tag("interface", "{'bridge':'%s', 'DEVICE':'eth0', 'BOOTPROTO':'static', 'ONBOOT':'yes', 'PRIMARY':'yes', 'IPADDR': '10.2.%d.%d', 'NETMASK': '255.0.0.0'}" % (bridge_name, node_id>>8, node_id&0xFF))
+            self.set_tag("slice_bridge_addr", slice_id, node_id, "10.1.%d.%d" % (node_id>>8, node_id&0xFF))
+            self.set_tag("slice_bridge_neighbors", slice_id, node_id, ",".join([str(x) for x in neighbor_list]))
+            self.set_tag("interface", slice_id, node_id, "{'bridge':'%s', 'DEVICE':'eth0', 'BOOTPROTO':'static', 'ONBOOT':'yes', 'PRIMARY':'yes', 'IPADDR': '%s', 'NETMASK': '255.0.0.0'}" % (bridge_name, ip_addr))
+
+            hostmap.append("%s node%d" % (ip_addr, node_id))
+
+        self.set_tag("slice_hostmap", slice_id, None, "\n".join(hostmap))
 
     def generate_star_topology(self, nodes):
         if not nodes:
             # if there are no nodes, then there is no topology
             return {}
 
+        topology = {}
+
         headnode = nodes[0]
         headnode_id = headnode["node_id"]
         for node in nodes[1:]:
             node_id = node["node_id"]
-            topology[headnode_id] = topology.get(headnode_id, []).apppend(node_id)
+            topology[headnode_id] = topology.get(headnode_id, []) + [node_id]
             topology[node_id] = [headnode_id]
+
         return topology
 
 class NetworkBuilder_10(NetworkBuilder):
@@ -81,6 +93,9 @@ class NetworkBuilder_10(NetworkBuilder):
         Nodes in one site cannot talk to nodes in another site
     """
 
+    def __init__(self, plc):
+        NetworkBuilder.__init__(self, plc)
+
     def configure_slice(self, slice_name_or_id):
         slices = self.plc.GetSlices(slice_name_or_id, ["slice_id", "node_ids", "slice_tag_ids"])
         if not slices: