Merge "Ensure the returned pool has a matched cidr"

This commit is contained in:
Jenkins 2017-06-21 10:15:18 +00:00 committed by Gerrit Code Review
commit f4102b4868
2 changed files with 85 additions and 3 deletions

View File

@ -1450,10 +1450,15 @@ def ipam_request_pool():
raise exceptions.KuryrException(
("Specified subnetpool id/name({0}) does not "
"exist.").format(pool_id or pool_name))
pool_id = existing_pools[0]['id']
LOG.info("Using existing Neutron subnetpool %s successfully",
pool_id)
pool_id = existing_pools[0]['id']
prefixes = existing_pools[0]['prefixes']
pool_cidr = ipaddress.ip_network(six.text_type(prefixes[0]))
if pool_cidr == cidr:
LOG.info("Using existing Neutron subnetpool %s successfully",
pool_id)
else:
pool_id = _create_kuryr_subnetpool(subnet_cidr)['id']
else:
if v6:
default_pool_list = SUBNET_POOLS_V6

View File

@ -189,6 +189,83 @@ class TestKuryrIpam(base.TestKuryrBase):
decoded_json = jsonutils.loads(response.data)
self.assertEqual(fake_kuryr_subnetpool_id, decoded_json['PoolID'])
@mock.patch('kuryr_libnetwork.controllers.app.neutron.create_subnetpool')
@mock.patch('kuryr_libnetwork.controllers.app.neutron.list_subnetpools')
@mock.patch('kuryr_libnetwork.controllers.app.neutron.list_subnets')
@ddt.data((FAKE_IP4_CIDR), (FAKE_IP6_CIDR))
def test_ipam_driver_request_pool_with_unmatched_cidr(self,
pool_cidr, mock_list_subnets, mock_list_subnetpools,
mock_create_subnetpool):
fake_subnet = {"subnets": []}
mock_list_subnets.return_value = fake_subnet
subnet_ip4_cidr = '10.0.0.0/24'
subnet_ip6_cidr = 'fe80::/68'
if pool_cidr == FAKE_IP4_CIDR:
subnet_cidr = subnet_ip4_cidr
else:
subnet_cidr = subnet_ip6_cidr
pool_name = lib_utils.get_neutron_subnetpool_name(subnet_cidr)
prefixlen = ipaddress.ip_network(six.text_type(subnet_cidr)).prefixlen
new_subnetpool = {
'name': pool_name,
'default_prefixlen': prefixlen,
'prefixes': [subnet_cidr]}
fake_kuryr_subnetpool_id = uuidutils.generate_uuid()
fake_existing_subnetpool_id = uuidutils.generate_uuid()
if pool_cidr == FAKE_IP4_CIDR:
kuryr_subnetpools = self._get_fake_v4_subnetpools(
fake_kuryr_subnetpool_id, prefixes=[subnet_ip4_cidr])
existing_subnetpools = self._get_fake_v4_subnetpools(
fake_existing_subnetpool_id, prefixes=[pool_cidr])
options = {
const.NEUTRON_POOL_UUID_OPTION: fake_existing_subnetpool_id}
else:
kuryr_subnetpools = self._get_fake_v6_subnetpools(
fake_kuryr_subnetpool_id, prefixes=[subnet_ip6_cidr])
existing_subnetpools = self._get_fake_v6_subnetpools(
fake_existing_subnetpool_id, prefixes=[pool_cidr])
options = {
const.NEUTRON_V6_POOL_UUID_OPTION: fake_existing_subnetpool_id}
mock_list_subnetpools.side_effect = [
existing_subnetpools,
{'subnetpools': []}
]
fake_subnetpool_response = {
'subnetpool': kuryr_subnetpools['subnetpools'][0]
}
mock_create_subnetpool.return_value = fake_subnetpool_response
if pool_cidr == FAKE_IP4_CIDR:
subnet_cidr = subnet_ip4_cidr
fake_request = {
'AddressSpace': '',
'Pool': subnet_cidr,
'SubPool': subnet_cidr,
'Options': options,
'V6': False,
}
else:
subnet_cidr = subnet_ip6_cidr
fake_request = {
'AddressSpace': '',
'Pool': subnet_cidr,
'SubPool': subnet_cidr,
'Options': options,
'V6': True,
}
response = self.app.post('/IpamDriver.RequestPool',
content_type='application/json',
data=jsonutils.dumps(fake_request))
self.assertEqual(200, response.status_code)
mock_list_subnets.assert_called_with(cidr=subnet_cidr)
mock_create_subnetpool.assert_called_with(
{'subnetpool': new_subnetpool})
decoded_json = jsonutils.loads(response.data)
self.assertEqual(fake_kuryr_subnetpool_id, decoded_json['PoolID'])
@mock.patch('kuryr_libnetwork.controllers.app.neutron.list_subnetpools')
def test_ipam_driver_request_pool_with_default_v6pool(self,
mock_list_subnetpools):