Added routes to OMF nodes
[nepi.git] / src / nepi / testbeds / planetlab / interfaces.py
index 4c04e90..f4df82f 100644 (file)
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # -*- coding: utf-8 -*-
 
 from constants import TESTBED_ID
@@ -61,9 +60,16 @@ class NodeIface(object):
         
         if self.node is None or self.node._node_id is None:
             raise RuntimeError, "Cannot pick interface without an assigned node"
-        
+      
+        # HACK: SFA doesnt give the node_id!!
+        if not isinstance(self.node._node_id, int):
+            node_data = self._api.GetNodes(filters={'hostname':self.node.hostname}, fields=('node_id',))[0]
+            node_id = node_data['node_id']
+        else:
+            node_id = self.node._node_id
+
         avail = self._api.GetInterfaces(
-            node_id=self.node._node_id, 
+            node_id=node_id, 
             is_primary=self.primary,
             fields=('interface_id','mac','netmask','ip') )
         
@@ -131,7 +137,7 @@ class TunIface(object):
         self.up = None
         self.mtu = None
         self.snat = False
-        self.txqueuelen = None
+        self.txqueuelen = 1000
         self.pointopoint = None
         self.multicast = False
         self.bwlimit = None
@@ -170,7 +176,11 @@ class TunIface(object):
         # Generate an initial random cryptographic key to use for tunnelling
         # Upon connection, both endpoints will agree on a common one based on
         # this one.
-        self.tun_key = os.urandom(32).encode("base64").strip()
+        self.tun_key = ( ''.join(map(chr, [ 
+                    r.getrandbits(8) 
+                    for i in xrange(32) 
+                    for r in (random.SystemRandom(),) ])
+                ).encode("base64").strip() )        
         
 
     def __str__(self):
@@ -189,6 +199,14 @@ class TunIface(object):
         if self.peer_proto_impl:
             return self.peer_proto_impl.if_name
 
+    def if_up(self):
+        if self.peer_proto_impl:
+            return self.peer_proto_impl.if_up()
+
+    def if_down(self):
+        if self.peer_proto_impl:
+            return self.peer_proto_impl.if_down()
+
     def routes_here(self, route):
         """
         Returns True if the route should be attached to this interface
@@ -203,13 +221,13 @@ class TunIface(object):
             if pointopoint:
                 prefix = 32
                 
-            dest, destprefix, nexthop, metric = route
+            dest, destprefix, nexthop, metric, device = route
             
-            myNet = ipaddr.IPNetwork("%s/%d" % (addr, prefix))
-            gwIp = ipaddr.IPNetwork(nexthop)
+            myNet = ipaddr.IPv4Network("%s/%d" % (addr, prefix))
+            gwIp = ipaddr.IPv4Network(nexthop)
             
             if pointopoint:
-                peerIp = ipaddr.IPNetwork(pointopoint)
+                peerIp = ipaddr.IPv4Network(pointopoint)
                 
                 if gwIp == peerIp:
                     return True
@@ -560,6 +578,28 @@ class ClassQueueFilter(TunFilter):
         # Attributes
         self.module = "classqueue.py"
 
+class LoggingClassQueueFilter(ClassQueueFilter):
+    _TRACEMAP = ClassQueueFilter._TRACEMAP.copy()
+    _TRACEMAP.update({
+        # tracename : (remotename, localname)
+        'queue_stats_f'   : ('queue_stats_f', 'queue_stats_f'),
+        'queue_stats_b'   : ('queue_stats_b', 'queue_stats_b'),
+    })
+    
+    def __init__(self, api=None):
+        super(LoggingClassQueueFilter, self).__init__(api)
+        # Attributes
+        self.module = "loggingclassqueue.py classqueue.py"
+        
+    def _args_get(self):
+        # Inject outpath
+        args = dict(filter(lambda x:len(x)>1, map(lambda x:x.split('=',1),(self._args or "").split(','))))
+        args["outpath"] = "queue_stats"
+        return ",".join(map("=".join, args.iteritems()))
+    def _args_set(self, value):
+        self._args = value
+    args = property(_args_get, _args_set)
+
 class ToSQueueFilter(TunFilter):
     def __init__(self, api=None):
         super(ToSQueueFilter, self).__init__(api)