Cleanup fanout queues on ovs agent stop
Previously when a neutron-openvswitch-agent was stopped it left behind the following fanout queues in rabbitmq: neutron-vo-Network-1.0_fanout_someuuid neutron-vo-Port-1.1_fanout_someuuid neutron-vo-SecurityGroup-1.0_fanout_someuuid neutron-vo-SecurityGroupRule-1.0_fanout_someuuid neutron-vo-SubPort-1.0_fanout_someuuid neutron-vo-Subnet-1.0_fanout_someuuid neutron-vo-Trunk-1.1_fanout_someuuid In this change we ensure that all but the SubPort and Trunk fanout queues are correctly removed from rabbitmq by cleanly stopping the RemoteResourceCache when the agent stops. Partial-Bug: #1586731 Change-Id: I672f9414a1a8ed91e259e9379ca707a70f6b4467
This commit is contained in:
parent
ead685b938
commit
9ff46546cb
|
@ -49,6 +49,9 @@ class RemoteResourceCache(object):
|
||||||
def start_watcher(self):
|
def start_watcher(self):
|
||||||
self._watcher = RemoteResourceWatcher(self)
|
self._watcher = RemoteResourceWatcher(self)
|
||||||
|
|
||||||
|
def stop_watcher(self):
|
||||||
|
self._watcher.stop()
|
||||||
|
|
||||||
def get_resource_by_id(self, rtype, obj_id, agent_restarted=False):
|
def get_resource_by_id(self, rtype, obj_id, agent_restarted=False):
|
||||||
"""Returns None if it doesn't exist."""
|
"""Returns None if it doesn't exist."""
|
||||||
if obj_id in self._deleted_ids_by_type[rtype]:
|
if obj_id in self._deleted_ids_by_type[rtype]:
|
||||||
|
@ -263,3 +266,6 @@ class RemoteResourceWatcher(object):
|
||||||
else:
|
else:
|
||||||
# creates and updates are treated equally
|
# creates and updates are treated equally
|
||||||
self.rcache.record_resource_update(context, rtype, r)
|
self.rcache.record_resource_update(context, rtype, r)
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
self._connection.close()
|
||||||
|
|
|
@ -398,6 +398,9 @@ class CacheBackedPluginApi(PluginApi):
|
||||||
rcache.start_watcher()
|
rcache.start_watcher()
|
||||||
self.remote_resource_cache = rcache
|
self.remote_resource_cache = rcache
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
self.remote_resource_cache.stop_watcher()
|
||||||
|
|
||||||
|
|
||||||
# TODO(ralonsoh): move this method to neutron_lib.plugins.utils
|
# TODO(ralonsoh): move this method to neutron_lib.plugins.utils
|
||||||
def migrating_to_host(bindings, host=None):
|
def migrating_to_host(bindings, host=None):
|
||||||
|
|
|
@ -2850,6 +2850,8 @@ class OVSNeutronAgent(l2population_rpc.L2populationRpcCallBackTunnelMixin,
|
||||||
bridge_names=bridge_names,
|
bridge_names=bridge_names,
|
||||||
ovs=self.ovs) as pm:
|
ovs=self.ovs) as pm:
|
||||||
self.rpc_loop(polling_manager=pm)
|
self.rpc_loop(polling_manager=pm)
|
||||||
|
if self.plugin_rpc:
|
||||||
|
self.plugin_rpc.stop()
|
||||||
|
|
||||||
def _handle_sigterm(self, signum, frame):
|
def _handle_sigterm(self, signum, frame):
|
||||||
self.catch_sigterm = True
|
self.catch_sigterm = True
|
||||||
|
|
|
@ -2049,9 +2049,13 @@ class TestOvsNeutronAgent(object):
|
||||||
mock.patch.object(self.agent, 'rpc_loop') as mock_loop, \
|
mock.patch.object(self.agent, 'rpc_loop') as mock_loop, \
|
||||||
mock.patch.dict(self.agent.phys_brs, {'physnet0': ex_br_mock},
|
mock.patch.dict(self.agent.phys_brs, {'physnet0': ex_br_mock},
|
||||||
clear=True), \
|
clear=True), \
|
||||||
|
mock.patch.object(
|
||||||
|
self.agent.plugin_rpc,
|
||||||
|
'stop') as rpc_stop, \
|
||||||
mock.patch.object(self.agent.ovs.ovsdb, 'idl_monitor') as \
|
mock.patch.object(self.agent.ovs.ovsdb, 'idl_monitor') as \
|
||||||
mock_idl_monitor:
|
mock_idl_monitor:
|
||||||
self.agent.daemon_loop()
|
self.agent.daemon_loop()
|
||||||
|
rpc_stop.assert_called_once()
|
||||||
mock_get_pm.assert_called_with(
|
mock_get_pm.assert_called_with(
|
||||||
True, ovs_constants.DEFAULT_OVSDBMON_RESPAWN, bridge_names=[],
|
True, ovs_constants.DEFAULT_OVSDBMON_RESPAWN, bridge_names=[],
|
||||||
ovs=self.agent.ovs)
|
ovs=self.agent.ovs)
|
||||||
|
@ -2399,6 +2403,9 @@ class TestOvsNeutronAgent(object):
|
||||||
mock.patch.object(
|
mock.patch.object(
|
||||||
self.mod_agent.OVSNeutronAgent,
|
self.mod_agent.OVSNeutronAgent,
|
||||||
'_check_and_handle_signal') as check_and_handle_signal, \
|
'_check_and_handle_signal') as check_and_handle_signal, \
|
||||||
|
mock.patch.object(
|
||||||
|
self.agent.plugin_rpc,
|
||||||
|
'stop') as rpc_stop, \
|
||||||
mock.patch.object(self.agent.ovs.ovsdb, 'idl_monitor'):
|
mock.patch.object(self.agent.ovs.ovsdb, 'idl_monitor'):
|
||||||
process_network_ports.side_effect = Exception("Trigger resync")
|
process_network_ports.side_effect = Exception("Trigger resync")
|
||||||
check_ovs_status.return_value = ovs_constants.OVS_NORMAL
|
check_ovs_status.return_value = ovs_constants.OVS_NORMAL
|
||||||
|
@ -2406,6 +2413,7 @@ class TestOvsNeutronAgent(object):
|
||||||
self.agent.daemon_loop()
|
self.agent.daemon_loop()
|
||||||
self.assertTrue(update_stale.called)
|
self.assertTrue(update_stale.called)
|
||||||
cleanup.assert_not_called()
|
cleanup.assert_not_called()
|
||||||
|
rpc_stop.assert_called_once()
|
||||||
|
|
||||||
def test_set_rpc_timeout(self):
|
def test_set_rpc_timeout(self):
|
||||||
with mock.patch.object(n_rpc.BackingOffClient,
|
with mock.patch.object(n_rpc.BackingOffClient,
|
||||||
|
|
Loading…
Reference in New Issue