Support provider networks in public network detection

The provider networks don't set router:external, but can also be
determined to be a thing that is the public network. We also need to
check that a thing with router:external=False doesn't have provider
network parameters set on it.

Change-Id: Ie8ee1329419bd1eee2c196f4a8624670aca1bc20
This commit is contained in:
Monty Taylor 2016-03-29 10:24:32 -07:00
parent 8f4717a255
commit 1853a54001
2 changed files with 67 additions and 4 deletions

View File

@ -1396,12 +1396,21 @@ class OpenStackCloud(object):
:returns: A list of network dicts if one is found
"""
self._external_networks = self._get_network(
_all_networks = self._get_network(
self._external_network_name_or_id,
self.use_external_network,
self._external_networks,
self._external_network_stamp,
filters={'router:external': True})
filters=None)
# Filter locally because we have an or condition
_external_networks = []
for network in _all_networks:
if (('router:external' in network
and network['router:external']) or
'provider:network_type' in network):
_external_networks.append(network)
# TODO(mordred): This needs to be mutex protected
self._external_networks = _external_networks
self._external_network_stamp = True
return self._external_networks
@ -1410,7 +1419,8 @@ class OpenStackCloud(object):
:returns: A list of network dicts if one is found
"""
self._internal_networks = self._get_network(
# Just router:external False is not enough.
_all_networks = self._get_network(
self._internal_network_name_or_id,
self.use_internal_network,
self._internal_networks,
@ -1418,6 +1428,12 @@ class OpenStackCloud(object):
filters={
'router:external': False,
})
_internal_networks = []
for network in _all_networks:
if 'provider:network_type' not in network:
_internal_networks.append(network)
# TODO(mordred): This needs to be mutex protected
self._internal_networks = _internal_networks
self._internal_network_stamp = True
return self._internal_networks

View File

@ -210,7 +210,8 @@ class TestMeta(base.TestCase):
mock_has_service.return_value = True
mock_search_networks.return_value = [{
'id': 'test-net-id',
'name': 'test-net'
'name': 'test-net',
'router:external': True,
}]
srv = meta.obj_to_dict(fakes.FakeServer(
@ -223,6 +224,52 @@ class TestMeta(base.TestCase):
self.assertEqual(PUBLIC_V4, ip)
@mock.patch.object(shade.OpenStackCloud, 'has_service')
@mock.patch.object(shade.OpenStackCloud, 'search_networks')
def test_get_server_external_provider_ipv4_neutron(
self, mock_search_networks,
mock_has_service):
# Testing Clouds with Neutron
mock_has_service.return_value = True
mock_search_networks.return_value = [{
'id': 'test-net-id',
'name': 'test-net',
'provider:network_type': 'vlan',
}]
srv = meta.obj_to_dict(fakes.FakeServer(
id='test-id', name='test-name', status='ACTIVE',
addresses={'test-net': [{
'addr': PUBLIC_V4,
'version': 4}]},
))
ip = meta.get_server_external_ipv4(cloud=self.cloud, server=srv)
self.assertEqual(PUBLIC_V4, ip)
@mock.patch.object(shade.OpenStackCloud, 'has_service')
@mock.patch.object(shade.OpenStackCloud, 'search_networks')
def test_get_server_external_none_ipv4_neutron(
self, mock_search_networks,
mock_has_service):
# Testing Clouds with Neutron
mock_has_service.return_value = True
mock_search_networks.return_value = [{
'id': 'test-net-id',
'name': 'test-net',
'router:external': False,
}]
srv = meta.obj_to_dict(fakes.FakeServer(
id='test-id', name='test-name', status='ACTIVE',
addresses={'test-net': [{
'addr': PUBLIC_V4,
'version': 4}]},
))
ip = meta.get_server_external_ipv4(cloud=self.cloud, server=srv)
self.assertEqual(None, ip)
def test_get_server_external_ipv4_neutron_accessIPv4(self):
srv = meta.obj_to_dict(fakes.FakeServer(
id='test-id', name='test-name', status='ACTIVE',