summaryrefslogtreecommitdiffstats
path: root/nova/tests
diff options
context:
space:
mode:
authorJohn Tran <jtran@attinteractive.com>2011-08-14 04:10:26 +0000
committerTarmac <>2011-08-14 04:10:26 +0000
commita538f400b5ced8357fa0e892fffd5a01b8e63cec (patch)
tree103c701d706f63962eac1c6501757b91270907c8 /nova/tests
parent452b343811311acbe35ccb5a896569127647f613 (diff)
parent353fa4871069cf0b926f09aa00496002f65584cb (diff)
added logic to make the creation of networks (IPv4 only) validation a bit smarter:
- detects if the cidr is already in use - detects if any existing smaller networks are within the range of requested cidr(s) - detects if splitting a supernet into # of num_networks && network_size will fit - detects if requested cidr(s) are within range of already existing supernet (larger cidr). IPv6 logic remains intact yet had not been improved by this code.
Diffstat (limited to 'nova/tests')
-rw-r--r--nova/tests/test_network.py176
1 files changed, 176 insertions, 0 deletions
diff --git a/nova/tests/test_network.py b/nova/tests/test_network.py
index 2ca8b64f4..547a7a1fa 100644
--- a/nova/tests/test_network.py
+++ b/nova/tests/test_network.py
@@ -247,6 +247,17 @@ class CommonNetworkTestCase(test.TestCase):
return [dict(address='10.0.0.0'), dict(address='10.0.0.1'),
dict(address='10.0.0.2')]
+ def network_get_by_cidr(self, context, cidr):
+ raise exception.NetworkNotFoundForCidr()
+
+ def network_create_safe(self, context, net):
+ fakenet = {}
+ fakenet['id'] = 999
+ return fakenet
+
+ def network_get_all(self, context):
+ raise exception.NoNetworksFound()
+
def __init__(self):
self.db = self.FakeDB()
self.deallocate_called = None
@@ -254,6 +265,9 @@ class CommonNetworkTestCase(test.TestCase):
def deallocate_fixed_ip(self, context, address):
self.deallocate_called = address
+ def fake_create_fixed_ips(self, context, network_id):
+ return None
+
def test_remove_fixed_ip_from_instance(self):
manager = self.FakeNetworkManager()
manager.remove_fixed_ip_from_instance(None, 99, '10.0.0.1')
@@ -265,3 +279,165 @@ class CommonNetworkTestCase(test.TestCase):
self.assertRaises(exception.FixedIpNotFoundForSpecificInstance,
manager.remove_fixed_ip_from_instance,
None, 99, 'bad input')
+
+ def test_validate_cidrs(self):
+ manager = self.FakeNetworkManager()
+ nets = manager._validate_cidrs(None, '192.168.0.0/24', 1, 256)
+ self.assertEqual(1, len(nets))
+ cidrs = [str(net) for net in nets]
+ self.assertTrue('192.168.0.0/24' in cidrs)
+
+ def test_validate_cidrs_split_exact_in_half(self):
+ manager = self.FakeNetworkManager()
+ nets = manager._validate_cidrs(None, '192.168.0.0/24', 2, 128)
+ self.assertEqual(2, len(nets))
+ cidrs = [str(net) for net in nets]
+ self.assertTrue('192.168.0.0/25' in cidrs)
+ self.assertTrue('192.168.0.128/25' in cidrs)
+
+ def test_validate_cidrs_split_cidr_in_use_middle_of_range(self):
+ manager = self.FakeNetworkManager()
+ self.mox.StubOutWithMock(manager.db, 'network_get_all')
+ ctxt = mox.IgnoreArg()
+ manager.db.network_get_all(ctxt).AndReturn([{'id': 1,
+ 'cidr': '192.168.2.0/24'}])
+ self.mox.ReplayAll()
+ nets = manager._validate_cidrs(None, '192.168.0.0/16', 4, 256)
+ self.assertEqual(4, len(nets))
+ cidrs = [str(net) for net in nets]
+ exp_cidrs = ['192.168.0.0/24', '192.168.1.0/24', '192.168.3.0/24',
+ '192.168.4.0/24']
+ for exp_cidr in exp_cidrs:
+ self.assertTrue(exp_cidr in cidrs)
+ self.assertFalse('192.168.2.0/24' in cidrs)
+
+ def test_validate_cidrs_smaller_subnet_in_use(self):
+ manager = self.FakeNetworkManager()
+ self.mox.StubOutWithMock(manager.db, 'network_get_all')
+ ctxt = mox.IgnoreArg()
+ manager.db.network_get_all(ctxt).AndReturn([{'id': 1,
+ 'cidr': '192.168.2.9/25'}])
+ self.mox.ReplayAll()
+ # ValueError: requested cidr (192.168.2.0/24) conflicts with
+ # existing smaller cidr
+ args = [None, '192.168.2.0/24', 1, 256]
+ self.assertRaises(ValueError, manager._validate_cidrs, *args)
+
+ def test_validate_cidrs_split_smaller_cidr_in_use(self):
+ manager = self.FakeNetworkManager()
+ self.mox.StubOutWithMock(manager.db, 'network_get_all')
+ ctxt = mox.IgnoreArg()
+ manager.db.network_get_all(ctxt).AndReturn([{'id': 1,
+ 'cidr': '192.168.2.0/25'}])
+ self.mox.ReplayAll()
+ nets = manager._validate_cidrs(None, '192.168.0.0/16', 4, 256)
+ self.assertEqual(4, len(nets))
+ cidrs = [str(net) for net in nets]
+ exp_cidrs = ['192.168.0.0/24', '192.168.1.0/24', '192.168.3.0/24',
+ '192.168.4.0/24']
+ for exp_cidr in exp_cidrs:
+ self.assertTrue(exp_cidr in cidrs)
+ self.assertFalse('192.168.2.0/24' in cidrs)
+
+ def test_validate_cidrs_split_smaller_cidr_in_use2(self):
+ manager = self.FakeNetworkManager()
+ self.mox.StubOutWithMock(manager.db, 'network_get_all')
+ ctxt = mox.IgnoreArg()
+ manager.db.network_get_all(ctxt).AndReturn([{'id': 1,
+ 'cidr': '192.168.2.9/29'}])
+ self.mox.ReplayAll()
+ nets = manager._validate_cidrs(None, '192.168.2.0/24', 3, 32)
+ self.assertEqual(3, len(nets))
+ cidrs = [str(net) for net in nets]
+ exp_cidrs = ['192.168.2.32/27', '192.168.2.64/27', '192.168.2.96/27']
+ for exp_cidr in exp_cidrs:
+ self.assertTrue(exp_cidr in cidrs)
+ self.assertFalse('192.168.2.0/27' in cidrs)
+
+ def test_validate_cidrs_split_all_in_use(self):
+ manager = self.FakeNetworkManager()
+ self.mox.StubOutWithMock(manager.db, 'network_get_all')
+ ctxt = mox.IgnoreArg()
+ in_use = [{'id': 1, 'cidr': '192.168.2.9/29'},
+ {'id': 2, 'cidr': '192.168.2.64/26'},
+ {'id': 3, 'cidr': '192.168.2.128/26'}]
+ manager.db.network_get_all(ctxt).AndReturn(in_use)
+ self.mox.ReplayAll()
+ args = [None, '192.168.2.0/24', 3, 64]
+ # ValueError: Not enough subnets avail to satisfy requested num_
+ # networks - some subnets in requested range already
+ # in use
+ self.assertRaises(ValueError, manager._validate_cidrs, *args)
+
+ def test_validate_cidrs_one_in_use(self):
+ manager = self.FakeNetworkManager()
+ args = [None, '192.168.0.0/24', 2, 256]
+ # ValueError: network_size * num_networks exceeds cidr size
+ self.assertRaises(ValueError, manager._validate_cidrs, *args)
+
+ def test_validate_cidrs_already_used(self):
+ manager = self.FakeNetworkManager()
+ self.mox.StubOutWithMock(manager.db, 'network_get_all')
+ ctxt = mox.IgnoreArg()
+ manager.db.network_get_all(ctxt).AndReturn([{'id': 1,
+ 'cidr': '192.168.0.0/24'}])
+ self.mox.ReplayAll()
+ # ValueError: cidr already in use
+ args = [None, '192.168.0.0/24', 1, 256]
+ self.assertRaises(ValueError, manager._validate_cidrs, *args)
+
+ def test_validate_cidrs_too_many(self):
+ manager = self.FakeNetworkManager()
+ args = [None, '192.168.0.0/24', 200, 256]
+ # ValueError: Not enough subnets avail to satisfy requested
+ # num_networks
+ self.assertRaises(ValueError, manager._validate_cidrs, *args)
+
+ def test_validate_cidrs_split_partial(self):
+ manager = self.FakeNetworkManager()
+ nets = manager._validate_cidrs(None, '192.168.0.0/16', 2, 256)
+ returned_cidrs = [str(net) for net in nets]
+ self.assertTrue('192.168.0.0/24' in returned_cidrs)
+ self.assertTrue('192.168.1.0/24' in returned_cidrs)
+
+ def test_validate_cidrs_conflict_existing_supernet(self):
+ manager = self.FakeNetworkManager()
+ self.mox.StubOutWithMock(manager.db, 'network_get_all')
+ ctxt = mox.IgnoreArg()
+ fakecidr = [{'id': 1, 'cidr': '192.168.0.0/8'}]
+ manager.db.network_get_all(ctxt).AndReturn(fakecidr)
+ self.mox.ReplayAll()
+ args = [None, '192.168.0.0/24', 1, 256]
+ # ValueError: requested cidr (192.168.0.0/24) conflicts
+ # with existing supernet
+ self.assertRaises(ValueError, manager._validate_cidrs, *args)
+
+ def test_create_networks(self):
+ cidr = '192.168.0.0/24'
+ manager = self.FakeNetworkManager()
+ self.stubs.Set(manager, '_create_fixed_ips',
+ self.fake_create_fixed_ips)
+ args = [None, 'foo', cidr, None, 1, 256, 'fd00::/48', None, None,
+ None]
+ result = manager.create_networks(*args)
+ self.assertEqual(manager.create_networks(*args), None)
+
+ def test_create_networks_cidr_already_used(self):
+ manager = self.FakeNetworkManager()
+ self.mox.StubOutWithMock(manager.db, 'network_get_all')
+ ctxt = mox.IgnoreArg()
+ fakecidr = [{'id': 1, 'cidr': '192.168.0.0/24'}]
+ manager.db.network_get_all(ctxt).AndReturn(fakecidr)
+ self.mox.ReplayAll()
+ args = [None, 'foo', '192.168.0.0/24', None, 1, 256,
+ 'fd00::/48', None, None, None]
+ self.assertRaises(ValueError, manager.create_networks, *args)
+
+ def test_create_networks_many(self):
+ cidr = '192.168.0.0/16'
+ manager = self.FakeNetworkManager()
+ self.stubs.Set(manager, '_create_fixed_ips',
+ self.fake_create_fixed_ips)
+ args = [None, 'foo', cidr, None, 10, 256, 'fd00::/48', None, None,
+ None]
+ self.assertEqual(manager.create_networks(*args), None)