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