wingo - in flumotion/trunk: . flumotion/common flumotion/test

flumotion-commit at lists.fluendo.com flumotion-commit at lists.fluendo.com
Wed Feb 14 15:34:37 CET 2007


Author: wingo
Date: Wed Feb 14 15:34:35 2007
New Revision: 4487

Modified:
   flumotion/trunk/ChangeLog
   flumotion/trunk/flumotion/common/avltree.py
   flumotion/trunk/flumotion/common/netutils.py
   flumotion/trunk/flumotion/test/test_common_netutils.py
Log:
2007-02-14  Andy Wingo  <wingo at pobox.com>

	* flumotion/common/netutils.py (RoutingTable.addSubnet): Sanity
	check: net should not be too specific for mask.
	(RoutingTable.__iter__): Iterate the tree in reverse order, so we
	get most specific netmasks first.

	* flumotion/common/avltree.py (iteratereversed)
	(AVLTree.__iter__): Implement reverse iteration.

	* flumotion/test/test_common_netutils.py
	(TestRoutingTable.testBasicRouting): Rename from testRouting.
	(TestRoutingTable.testBasicRouting): New test, tests that more
	specific matching netmasks have precedence.



Modified: flumotion/trunk/ChangeLog
==============================================================================
--- flumotion/trunk/ChangeLog	(original)
+++ flumotion/trunk/ChangeLog	Wed Feb 14 15:34:35 2007
@@ -1,5 +1,18 @@
 2007-02-14  Andy Wingo  <wingo at pobox.com>
 
+	* flumotion/common/netutils.py (RoutingTable.addSubnet): Sanity
+	check: net should not be too specific for mask.
+	(RoutingTable.__iter__): Iterate the tree in reverse order, so we
+	get most specific netmasks first.
+
+	* flumotion/common/avltree.py (iteratereversed)
+	(AVLTree.__iter__): Implement reverse iteration.
+
+	* flumotion/test/test_common_netutils.py
+	(TestRoutingTable.testBasicRouting): Rename from testRouting.
+	(TestRoutingTable.testBasicRouting): New test, tests that more
+	specific matching netmasks have precedence.
+
 	* flumotion/test/Makefile.am (EXTRA_DIST): 
 	* flumotion/test/test_common_avltree.py: Add test for all kinds of
 	insertion/deletion patterns. Hopefully comprehensive.

Modified: flumotion/trunk/flumotion/common/avltree.py
==============================================================================
--- flumotion/trunk/flumotion/common/avltree.py	(original)
+++ flumotion/trunk/flumotion/common/avltree.py	Wed Feb 14 15:34:35 2007
@@ -254,6 +254,17 @@
         for x in iterate(r):
             yield x
 
+def iteratereversed(tree):
+    """Iterate over an AVL tree, starting with the highest-ordered
+    value."""
+    if tree is not None:
+        l, v, r, b = tree
+        for x in iteratereversed(r):
+            yield x
+        yield v
+        for x in iteratereversed(l):
+            yield x
+
 class AVLTree(object):
     def __init__(self, seq=()):
         self._len = len(seq)
@@ -275,3 +286,6 @@
 
     def __iter__(self):
         return iterate(self.tree)
+
+    def iterreversed(self):
+        return iteratereversed(self.tree)

Modified: flumotion/trunk/flumotion/common/netutils.py
==============================================================================
--- flumotion/trunk/flumotion/common/netutils.py	(original)
+++ flumotion/trunk/flumotion/common/netutils.py	Wed Feb 14 15:34:35 2007
@@ -124,6 +124,9 @@
 
     def addSubnet(self, route, ipv4String, maskBits=32):
         ipv4Int, mask = self._parseSubnet(ipv4String, maskBits)
+        if not ipv4Int & mask == ipv4Int:
+            raise ValueError('Net %s too specific for mask with %d bits'
+                             % (ipv4String, maskBits))
         self.avltree.insert((mask, ipv4Int, route))
 
     def removeSubnet(self, route, ipv4String, maskBits=32):
@@ -131,7 +134,7 @@
         self.avltree.delete((mask, ipv4Int, route))
 
     def __iter__(self):
-        return iter(self.avltree)
+        return self.avltree.iterreversed()
 
     def __len__(self):
         return len(self.avltree)

Modified: flumotion/trunk/flumotion/test/test_common_netutils.py
==============================================================================
--- flumotion/trunk/flumotion/test/test_common_netutils.py	(original)
+++ flumotion/trunk/flumotion/test/test_common_netutils.py	Wed Feb 14 15:34:35 2007
@@ -58,7 +58,7 @@
         net.removeSubnet('foo', '192.168.1.0', 24)
         self.assertEquals(len(net), 0)
         
-    def testRoute(self):
+    def testBasicRouting(self):
         net = RoutingTable()
 
         def ar(ip, route):
@@ -89,3 +89,22 @@
         ar('192.168.1.255', None)
         ar('192.168.0.255', None)
         ar('192.168.2.0', None)
+
+    def testRoutingPrecedence(self):
+        net = RoutingTable()
+
+        def ar(ip, route):
+            self.assertEquals(net.route(ip), route)
+
+        net.addSubnet('foo', '192.168.1.0', 32)
+        net.addSubnet('bar', '192.168.1.0', 24)
+
+        self.assertRaises(ValueError,
+                          net.addSubnet,
+                          'baz', '192.168.1.0', 16)
+
+        net.addSubnet('baz', '192.168.0.0', 16)
+
+        ar('192.168.1.0', 'foo')
+        ar('192.168.1.1', 'bar')
+        ar('192.168.2.1', 'baz')


More information about the flumotion-commit mailing list