summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nova/network/manager.py43
-rw-r--r--nova/tests/test_network.py41
2 files changed, 46 insertions, 38 deletions
diff --git a/nova/network/manager.py b/nova/network/manager.py
index 9d0f080ba..8b86bc036 100644
--- a/nova/network/manager.py
+++ b/nova/network/manager.py
@@ -659,71 +659,64 @@ class NetworkManager(manager.SchedulerDependentManager):
network_size, cidr_v6, gateway_v6, bridge,
bridge_interface, dns1=None, dns2=None, **kwargs):
"""Create networks based on parameters."""
- fixed_net = netaddr.IPNetwork(cidr)
+ req_cidrs = self._validate_cidrs(context, cidr, num_networks, network_size)
+
if FLAGS.use_ipv6:
fixed_net_v6 = netaddr.IPNetwork(cidr_v6)
significant_bits_v6 = 64
network_size_v6 = 1 << 64
- for index in range(num_networks):
- start = index * network_size
- significant_bits = 32 - int(math.log(network_size, 2))
- cidr = '%s/%s' % (fixed_net[start], significant_bits)
- project_net = netaddr.IPNetwork(cidr)
+ count = 0
+ for req_cidr in req_cidrs:
+ count = count + 1
net = {}
net['bridge'] = bridge
net['bridge_interface'] = bridge_interface
net['dns1'] = dns1
net['dns2'] = dns2
- net['cidr'] = cidr
- net['multi_host'] = multi_host
- net['netmask'] = str(project_net.netmask)
- net['gateway'] = str(project_net[1])
- net['broadcast'] = str(project_net.broadcast)
- net['dhcp_start'] = str(project_net[2])
+ net['cidr'] = str(req_cidr)
+ net['netmask'] = str(req_cidr.netmask)
+ net['gateway'] = str(req_cidr[1])
+ net['broadcast'] = str(req_cidr.broadcast)
+ net['dhcp_start'] = str(req_cidr[2])
if num_networks > 1:
- net['label'] = '%s_%d' % (label, index)
+ net['label'] = '%s_%d' % (label, count)
else:
net['label'] = label
if FLAGS.use_ipv6:
- start_v6 = index * network_size_v6
+ start_v6 = count * network_size_v6
cidr_v6 = '%s/%s' % (fixed_net_v6[start_v6],
significant_bits_v6)
net['cidr_v6'] = cidr_v6
-
project_net_v6 = netaddr.IPNetwork(cidr_v6)
-
if gateway_v6:
# use a pre-defined gateway if one is provided
net['gateway_v6'] = str(gateway_v6)
else:
net['gateway_v6'] = str(project_net_v6[1])
-
net['netmask_v6'] = str(project_net_v6._prefixlen)
if kwargs.get('vpn', False):
# this bit here is for vlan-manager
del net['dns1']
del net['dns2']
- vlan = kwargs['vlan_start'] + index
- net['vpn_private_address'] = str(project_net[2])
- net['dhcp_start'] = str(project_net[3])
+ vlan = kwargs['vlan_start'] + count
+ net['vpn_private_address'] = str(req_cidr[2])
+ net['dhcp_start'] = str(req_cidr[3])
net['vlan'] = vlan
net['bridge'] = 'br%s' % vlan
# NOTE(vish): This makes ports unique accross the cloud, a more
# robust solution would be to make them uniq per ip
- net['vpn_public_port'] = kwargs['vpn_start'] + index
+ net['vpn_public_port'] = kwargs['vpn_start'] + count
- # None if network with cidr or cidr_v6 already exists
network = self.db.network_create_safe(context, net)
-
if network:
self._create_fixed_ips(context, network['id'])
else:
- raise ValueError(_('Network with cidr %s already exists') %
- cidr)
+ msg = "Error creating cidr %s, see log"
+ raise ValueError(_(msg) % str(cidr))
@property
def _bottom_reserved_ips(self): # pylint: disable=R0201
diff --git a/nova/tests/test_network.py b/nova/tests/test_network.py
index 1f5305b1d..424b5f098 100644
--- a/nova/tests/test_network.py
+++ b/nova/tests/test_network.py
@@ -361,21 +361,36 @@ class CommonNetworkTestCase(test.TestCase):
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/8'}])
+ 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_cidr_already_used(self):
-# mockany = self.mox.CreateMockAnything()
-# manager = self.FakeNetworkManager()
-# self.mox.StubOutWithMock(manager.db, 'network_get_by_cidr')
-# manager.db.network_get_by_cidr(mox.IgnoreArg(), '192.168.0.0/24')\
-# .AndReturn(mockany)
-# 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(self):
+ cidr = '192.168.0.0/24'
+ manager = self.FakeNetworkManager()
+ self.mox.StubOutWithMock(manager.db, 'network_create_safe')
+ ignore = mox.IgnoreArg()
+ fakecidr= {'id': 1, 'cidr': cidr}
+ manager.db.network_create_safe(ignore, ignore).AndReturn(fakecidr)
+ self.mox.StubOutWithMock(manager, '_create_fixed_ips')
+ manager._create_fixed_ips(ignore, ignore).AndReturn('foo')
+ self.mox.ReplayAll()
+ args = [None, 'foo', cidr, None, 1, 256, 'fd00::/48', None, None,
+ None]
+ # making it to the end, without err, is enough validation
+ 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)