Only ensure admin state on ports that exist
The linux bridge agent was calling ensure_port_admin state unconditionally on ports in treat_devices_added_or_updated. This would cause it to throw an error on interfaces that didn't exist so it would restart the entire processing loop. If another port was being updated in the same loop before this one, that port would experience a port status life-cycle of DOWN->BUILD->ACTIVE->BUILD->ACTIVE ^ <--- Exception in unrelated port causes cycle to start over again. This causes the bug below because the first active transition will cause Nova to boot the VM. At this point tempest tests expect the ports that belong to the VM to be in the ACTIVE state so it filters Neutron port list calls with "status=ACTIVE". Therefore tempest would not get any ports back and assume there was some kind of error with the port and bail. This patch just makes sure the admin state call is skipped if the port doesn't exist and it includes a basic unit test to prevent a regression. Closes-Bug: #1523638 Change-Id: I5330c6111cbb20bf45aec9ade7e30d34e8dd16ca
This commit is contained in:
parent
0482c534c8
commit
96c67e22f9
|
@ -1061,9 +1061,10 @@ class CommonAgentLoop(service.Service):
|
|||
# 1) An existing race with libvirt caused by the behavior of
|
||||
# the old implementation. See Bug #1312016
|
||||
# 2) The new code is much more readable
|
||||
self.mgr.ensure_port_admin_state(
|
||||
device,
|
||||
device_details['admin_state_up'])
|
||||
if interface_plugged:
|
||||
self.mgr.ensure_port_admin_state(
|
||||
device,
|
||||
device_details['admin_state_up'])
|
||||
# update plugin about port status if admin_state is up
|
||||
if device_details['admin_state_up']:
|
||||
if interface_plugged:
|
||||
|
|
|
@ -391,6 +391,25 @@ class TestCommonAgentLoop(base.BaseTestCase):
|
|||
'tap4']))
|
||||
agent.treat_devices_removed.assert_called_with(set(['tap1']))
|
||||
|
||||
def test_treat_devices_added_updated_no_local_interface(self):
|
||||
agent = self.agent
|
||||
mock_details = {'device': 'dev123',
|
||||
'port_id': 'port123',
|
||||
'network_id': 'net123',
|
||||
'admin_state_up': True,
|
||||
'network_type': 'vlan',
|
||||
'segmentation_id': 100,
|
||||
'physical_network': 'physnet1',
|
||||
'device_owner': constants.DEVICE_OWNER_NETWORK_PREFIX}
|
||||
agent.ext_manager = mock.Mock()
|
||||
agent.plugin_rpc = mock.Mock()
|
||||
agent.plugin_rpc.get_devices_details_list.return_value = [mock_details]
|
||||
agent.mgr = mock.Mock()
|
||||
agent.mgr.plug_interface.return_value = False
|
||||
agent.mgr.ensure_port_admin_state = mock.Mock()
|
||||
agent.treat_devices_added_updated(set(['tap1']))
|
||||
self.assertFalse(agent.mgr.ensure_port_admin_state.called)
|
||||
|
||||
def test_treat_devices_added_updated_admin_state_up_true(self):
|
||||
agent = self.agent
|
||||
mock_details = {'device': 'dev123',
|
||||
|
|
Loading…
Reference in New Issue