Merge "Fixes race condition in test_add_remove_fixed_ip"

This commit is contained in:
Zuul 2020-03-27 22:19:38 +00:00 committed by Gerrit Code Review
commit b47d1d2b8a
1 changed files with 22 additions and 52 deletions

View File

@ -86,12 +86,16 @@ class AttachInterfacesTestBase(base.BaseV2ComputeTest):
# apparently not enough? Add cleanup here.
self.addCleanup(self.delete_server, server['id'])
self._wait_for_validation(server, validation_resources)
try:
fip = set([validation_resources['floating_ip']['ip']])
except KeyError:
fip = ()
ifs = (self.interfaces_client.list_interfaces(server['id'])
['interfaceAttachments'])
body = waiters.wait_for_interface_status(
self.interfaces_client, server['id'], ifs[0]['port_id'], 'ACTIVE')
ifs[0]['port_state'] = body['port_state']
return server, ifs
return server, ifs, fip
class AttachInterfacesTestJSON(AttachInterfacesTestBase):
@ -226,7 +230,7 @@ class AttachInterfacesTestJSON(AttachInterfacesTestBase):
@decorators.idempotent_id('73fe8f02-590d-4bf1-b184-e9ca81065051')
@utils.services('network')
def test_create_list_show_delete_interfaces_by_network_port(self):
server, ifs = self._create_server_get_interfaces()
server, ifs, _ = self._create_server_get_interfaces()
interface_count = len(ifs)
self.assertGreater(interface_count, 0)
@ -268,7 +272,7 @@ class AttachInterfacesTestJSON(AttachInterfacesTestBase):
raise self.skipException("Only owner network supports "
"creating interface by fixed ip.")
server, ifs = self._create_server_get_interfaces()
server, ifs, _ = self._create_server_get_interfaces()
interface_count = len(ifs)
self.assertGreater(interface_count, 0)
@ -354,9 +358,8 @@ class AttachInterfacesUnderV243Test(AttachInterfacesTestBase):
not CONF.network.shared_physical_network):
raise self.skipException("Only owner network supports "
"creating interface by fixed ip.")
# Add and Remove the fixed IP to server.
server, ifs = self._create_server_get_interfaces()
server, ifs, fip = self._create_server_get_interfaces()
original_interface_count = len(ifs) # This is the number of ports.
self.assertGreater(original_interface_count, 0)
# Get the starting list of IPs on the server.
@ -369,6 +372,9 @@ class AttachInterfacesUnderV243Test(AttachInterfacesTestBase):
self.assertEqual(1, len(addresses), addresses) # number of networks
# Keep track of the original addresses so we can know which IP is new.
original_ips = [addr['addr'] for addr in list(addresses.values())[0]]
# Make sure the floating IP possibly assigned during
# server creation is always present in the set of original ips.
original_ips = set(original_ips).union(fip)
original_ip_count = len(original_ips)
self.assertGreater(original_ip_count, 0, addresses) # at least 1
network_id = ifs[0]['net_id']
@ -376,40 +382,22 @@ class AttachInterfacesUnderV243Test(AttachInterfacesTestBase):
# fixed IP on the same network (and same port since we only have one
# port).
self.servers_client.add_fixed_ip(server['id'], networkId=network_id)
# Wait for the ips count to increase by one.
def _get_server_floating_ips():
_floating_ips = []
_server = self.os_primary.servers_client.show_server(
server['id'])['server']
for _ip_set in _server['addresses']:
for _ip in _server['addresses'][_ip_set]:
if _ip['OS-EXT-IPS:type'] == 'floating':
_floating_ips.append(_ip['addr'])
return _floating_ips
def _wait_for_ip_increase():
def _wait_for_ip_change(expected_count):
_addresses = self.os_primary.servers_client.list_addresses(
server['id'])['addresses']
_ips = [addr['addr'] for addr in list(_addresses.values())[0]]
LOG.debug("Wait for IP increase. All IPs still associated to "
_ips = set([addr['addr'] for addr in list(_addresses.values())[0]])
# Make sure possible floating ip is always present in the set.
_ips = _ips.union(fip)
LOG.debug("Wait for change of IPs. All IPs still associated to "
"the server %(id)s: %(ips)s",
{'id': server['id'], 'ips': _ips})
if len(_ips) == original_ip_count + 1:
return True
elif len(_ips) == original_ip_count:
return False
# If not, lets remove any floating IP from the list and check again
_fips = _get_server_floating_ips()
_ips = [_ip for _ip in _ips if _ip not in _fips]
LOG.debug("Wait for IP increase. Fixed IPs still associated to "
"the server %(id)s: %(ips)s",
{'id': server['id'], 'ips': _ips})
return len(_ips) == original_ip_count + 1
return len(_ips) == expected_count
# Wait for the ips count to increase by one.
if not test_utils.call_until_true(
_wait_for_ip_increase, CONF.compute.build_timeout,
CONF.compute.build_interval):
_wait_for_ip_change, CONF.compute.build_timeout,
CONF.compute.build_interval, original_ip_count + 1):
raise lib_exc.TimeoutException(
'Timed out while waiting for IP count to increase.')
@ -428,26 +416,8 @@ class AttachInterfacesUnderV243Test(AttachInterfacesTestBase):
break
self.servers_client.remove_fixed_ip(server['id'], address=fixed_ip)
# Wait for the interface count to decrease by one.
def _wait_for_ip_decrease():
_addresses = self.os_primary.servers_client.list_addresses(
server['id'])['addresses']
_ips = [addr['addr'] for addr in list(_addresses.values())[0]]
LOG.debug("Wait for IP decrease. All IPs still associated to "
"the server %(id)s: %(ips)s",
{'id': server['id'], 'ips': _ips})
if len(_ips) == original_ip_count:
return True
# If not, lets remove any floating IP from the list and check again
_fips = _get_server_floating_ips()
_ips = [_ip for _ip in _ips if _ip not in _fips]
LOG.debug("Wait for IP decrease. Fixed IPs still associated to "
"the server %(id)s: %(ips)s",
{'id': server['id'], 'ips': _ips})
return len(_ips) == original_ip_count
if not test_utils.call_until_true(
_wait_for_ip_decrease, CONF.compute.build_timeout,
CONF.compute.build_interval):
_wait_for_ip_change, CONF.compute.build_timeout,
CONF.compute.build_interval, original_ip_count):
raise lib_exc.TimeoutException(
'Timed out while waiting for IP count to decrease.')