Floating_ip create /31,32 shouldn't silent error

Fixes bug 1017682 the netaddr.IPNetwork.iter_hosts
method doesn't return any IPs when /32 or /31 and
should throw an exception instead of silent error

Change-Id: Id8875b6016a4dbb40b29d2f7687e6c35491e0129
This commit is contained in:
John Tran
2012-06-29 10:54:24 -07:00
parent 31dfb9736c
commit 1684c95568
2 changed files with 42 additions and 1 deletions

View File

@@ -343,7 +343,13 @@ class FloatingIpCommands(object):
try: try:
return [netaddr.IPAddress(addresses)] return [netaddr.IPAddress(addresses)]
except ValueError: except ValueError:
return netaddr.IPNetwork(addresses).iter_hosts() net = netaddr.IPNetwork(addresses)
if net.size < 4:
reason = _("/%s should be specified as single address(es) "
"not in cidr format") % net.prefixlen
raise exception.InvalidInput(reason=reason)
else:
return net.iter_hosts()
@args('--ip_range', dest="ip_range", metavar='<range>', help='IP range') @args('--ip_range', dest="ip_range", metavar='<range>', help='IP range')
@args('--pool', dest="pool", metavar='<pool>', help='Optional pool') @args('--pool', dest="pool", metavar='<pool>', help='Optional pool')

View File

@@ -22,6 +22,7 @@ import sys
from nova import context from nova import context
from nova import db from nova import db
from nova import exception
from nova import test from nova import test
from nova.tests.db import fakes as db_fakes from nova.tests.db import fakes as db_fakes
@@ -66,6 +67,40 @@ class FixedIpCommandsTestCase(test.TestCase):
'55.55.55.55') '55.55.55.55')
class FloatingIpCommandsTestCase(test.TestCase):
def setUp(self):
super(FloatingIpCommandsTestCase, self).setUp()
db_fakes.stub_out_db_network_api(self.stubs)
self.commands = nova_manage.FloatingIpCommands()
def test_address_to_hosts(self):
def assert_loop(result, expected):
for ip in result:
self.assertTrue(str(ip) in expected)
address_to_hosts = self.commands.address_to_hosts
# /32 and /31
self.assertRaises(exception.InvalidInput, address_to_hosts,
'192.168.100.1/32')
self.assertRaises(exception.InvalidInput, address_to_hosts,
'192.168.100.1/31')
# /30
expected = ["192.168.100.%s" % i for i in range(1, 3)]
result = address_to_hosts('192.168.100.0/30')
self.assertTrue(len(list(result)) == 2)
assert_loop(result, expected)
# /29
expected = ["192.168.100.%s" % i for i in range(1, 7)]
result = address_to_hosts('192.168.100.0/29')
self.assertTrue(len(list(result)) == 6)
assert_loop(result, expected)
# /28
expected = ["192.168.100.%s" % i for i in range(1, 15)]
result = address_to_hosts('192.168.100.0/28')
self.assertTrue(len(list(result)) == 14)
assert_loop(result, expected)
class NetworkCommandsTestCase(test.TestCase): class NetworkCommandsTestCase(test.TestCase):
def setUp(self): def setUp(self):
super(NetworkCommandsTestCase, self).setUp() super(NetworkCommandsTestCase, self).setUp()