diff --git a/neutron/agent/l3/agent.py b/neutron/agent/l3/agent.py index 3c754d46e95..9e9b8a99156 100644 --- a/neutron/agent/l3/agent.py +++ b/neutron/agent/l3/agent.py @@ -35,6 +35,9 @@ from neutron.agent.linux import external_process from neutron.agent.linux import ip_lib from neutron.agent.metadata import driver as metadata_driver from neutron.agent import rpc as agent_rpc +from neutron.callbacks import events +from neutron.callbacks import registry +from neutron.callbacks import resources from neutron.common import constants as l3_constants from neutron.common import exceptions as n_exc from neutron.common import ipv6_utils @@ -220,7 +223,6 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback, if self.conf.enable_metadata_proxy: self.metadata_driver = metadata_driver.MetadataDriver(self) - self.event_observers.add(self.metadata_driver) def _check_config_params(self): """Check items in configuration files. @@ -309,6 +311,8 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback, ri = self._create_router(router_id, router) self.event_observers.notify( adv_svc.AdvancedService.before_router_added, ri) + registry.notify(resources.ROUTER, events.BEFORE_CREATE, + self, router=ri) self.router_info[router_id] = ri @@ -326,12 +330,15 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback, self.event_observers.notify( adv_svc.AdvancedService.before_router_removed, ri) + registry.notify(resources.ROUTER, events.BEFORE_DELETE, + self, router=ri) ri.delete(self) del self.router_info[router_id] self.event_observers.notify( adv_svc.AdvancedService.after_router_removed, ri) + registry.notify(resources.ROUTER, events.AFTER_DELETE, self, router=ri) def update_fip_statuses(self, ri, existing_floating_ips, fip_statuses): # Identify floating IPs which were disabled @@ -413,15 +420,19 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback, ri.process(self) self.event_observers.notify( adv_svc.AdvancedService.after_router_added, ri) + registry.notify(resources.ROUTER, events.AFTER_CREATE, self, router=ri) def _process_updated_router(self, router): ri = self.router_info[router['id']] ri.router = router self.event_observers.notify( adv_svc.AdvancedService.before_router_updated, ri) + registry.notify(resources.ROUTER, events.BEFORE_UPDATE, + self, router=ri) ri.process(self) self.event_observers.notify( adv_svc.AdvancedService.after_router_updated, ri) + registry.notify(resources.ROUTER, events.AFTER_UPDATE, self, router=ri) def _process_router_update(self): for rp, update in self._queue.each_update_to_next_router(): diff --git a/neutron/agent/metadata/driver.py b/neutron/agent/metadata/driver.py index 9378a3a930c..c5088fd2c2e 100644 --- a/neutron/agent/metadata/driver.py +++ b/neutron/agent/metadata/driver.py @@ -22,6 +22,9 @@ from neutron.agent.common import config from neutron.agent.l3 import namespaces from neutron.agent.linux import external_process from neutron.agent.linux import utils +from neutron.callbacks import events +from neutron.callbacks import registry +from neutron.callbacks import resources from neutron.common import exceptions from neutron.services import advanced_service @@ -66,39 +69,10 @@ class MetadataDriver(advanced_service.AdvancedService): super(MetadataDriver, self).__init__(l3_agent) self.metadata_port = l3_agent.conf.metadata_port self.metadata_access_mark = l3_agent.conf.metadata_access_mark - - def after_router_added(self, router): - for c, r in self.metadata_filter_rules(self.metadata_port, - self.metadata_access_mark): - router.iptables_manager.ipv4['filter'].add_rule(c, r) - for c, r in self.metadata_mangle_rules(self.metadata_access_mark): - router.iptables_manager.ipv4['mangle'].add_rule(c, r) - for c, r in self.metadata_nat_rules(self.metadata_port): - router.iptables_manager.ipv4['nat'].add_rule(c, r) - router.iptables_manager.apply() - - if not router.is_ha: - self.spawn_monitored_metadata_proxy( - self.l3_agent.process_monitor, - router.ns_name, - self.metadata_port, - self.l3_agent.conf, - router_id=router.router_id) - - def before_router_removed(self, router): - for c, r in self.metadata_filter_rules(self.metadata_port, - self.metadata_access_mark): - router.iptables_manager.ipv4['filter'].remove_rule(c, r) - for c, r in self.metadata_mangle_rules(self.metadata_access_mark): - router.iptables_manager.ipv4['mangle'].remove_rule(c, r) - for c, r in self.metadata_nat_rules(self.metadata_port): - router.iptables_manager.ipv4['nat'].remove_rule(c, r) - router.iptables_manager.apply() - - self.destroy_monitored_metadata_proxy(self.l3_agent.process_monitor, - router.router['id'], - router.ns_name, - self.l3_agent.conf) + registry.subscribe( + after_router_added, resources.ROUTER, events.AFTER_CREATE) + registry.subscribe( + before_router_removed, resources.ROUTER, events.BEFORE_DELETE) @classmethod def metadata_filter_rules(cls, port, mark): @@ -192,3 +166,42 @@ class MetadataDriver(advanced_service.AdvancedService): uuid=router_id, namespace=ns_name, default_cmd_callback=callback) + + +def after_router_added(resource, event, l3_agent, **kwargs): + router = kwargs['router'] + proxy = l3_agent.metadata_driver + for c, r in proxy.metadata_filter_rules(proxy.metadata_port, + proxy.metadata_access_mark): + router.iptables_manager.ipv4['filter'].add_rule(c, r) + for c, r in proxy.metadata_mangle_rules(proxy.metadata_access_mark): + router.iptables_manager.ipv4['mangle'].add_rule(c, r) + for c, r in proxy.metadata_nat_rules(proxy.metadata_port): + router.iptables_manager.ipv4['nat'].add_rule(c, r) + router.iptables_manager.apply() + + if not router.is_ha: + proxy.spawn_monitored_metadata_proxy( + l3_agent.process_monitor, + router.ns_name, + proxy.metadata_port, + l3_agent.conf, + router_id=router.router_id) + + +def before_router_removed(resource, event, l3_agent, **kwargs): + router = kwargs['router'] + proxy = l3_agent.metadata_driver + for c, r in proxy.metadata_filter_rules(proxy.metadata_port, + proxy.metadata_access_mark): + router.iptables_manager.ipv4['filter'].remove_rule(c, r) + for c, r in proxy.metadata_mangle_rules(proxy.metadata_access_mark): + router.iptables_manager.ipv4['mangle'].remove_rule(c, r) + for c, r in proxy.metadata_nat_rules(proxy.metadata_port): + router.iptables_manager.ipv4['nat'].remove_rule(c, r) + router.iptables_manager.apply() + + proxy.destroy_monitored_metadata_proxy(l3_agent.process_monitor, + router.router['id'], + router.ns_name, + l3_agent.conf) diff --git a/neutron/tests/functional/agent/test_l3_agent.py b/neutron/tests/functional/agent/test_l3_agent.py old mode 100644 new mode 100755 index 930ca5ad183..719ab605af6 --- a/neutron/tests/functional/agent/test_l3_agent.py +++ b/neutron/tests/functional/agent/test_l3_agent.py @@ -36,6 +36,8 @@ from neutron.agent.linux import dhcp from neutron.agent.linux import external_process from neutron.agent.linux import ip_lib from neutron.agent.linux import utils +from neutron.callbacks import manager +from neutron.callbacks import registry from neutron.common import config as common_config from neutron.common import constants as l3_constants from neutron.common import utils as common_utils @@ -60,6 +62,12 @@ class L3AgentTestFramework(base.BaseOVSLinuxTestCase): def setUp(self): super(L3AgentTestFramework, self).setUp() mock.patch('neutron.agent.l3.agent.L3PluginApi').start() + + # TODO(pcm): Move this to BaseTestCase, if we find that more tests + # use this mechanism. + self._callback_manager = manager.CallbacksManager() + mock.patch.object(registry, '_get_callback_manager', + return_value=self._callback_manager).start() self.agent = self._configure_agent('agent1') def _get_config_opts(self): diff --git a/neutron/tests/unit/test_l3_agent.py b/neutron/tests/unit/test_l3_agent.py index a6021318a7b..67b5d174cdd 100644 --- a/neutron/tests/unit/test_l3_agent.py +++ b/neutron/tests/unit/test_l3_agent.py @@ -37,6 +37,8 @@ from neutron.agent.linux import external_process from neutron.agent.linux import interface from neutron.agent.linux import ra from neutron.agent.metadata import driver as metadata_driver +from neutron.callbacks import manager +from neutron.callbacks import registry from neutron.common import config as base_config from neutron.common import constants as l3_constants from neutron.common import exceptions as n_exc @@ -45,7 +47,6 @@ from neutron.openstack.common import uuidutils from neutron.plugins.common import constants as p_const from neutron.tests import base - _uuid = uuidutils.generate_uuid HOSTNAME = 'myhost' FAKE_ID = _uuid() @@ -310,6 +311,10 @@ class BasicRouterOperationsFramework(base.BaseTestCase): self.ri_kwargs = {'agent_conf': self.conf, 'interface_driver': self.mock_driver} + self._callback_manager = manager.CallbacksManager() + mock.patch.object(registry, '_get_callback_manager', + return_value=self._callback_manager).start() + def _process_router_instance_for_agent(self, agent, ri, router): ri.router = router if not ri.radvd: