summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2015-04-02 20:35:46 +0000
committerGerrit Code Review <review@openstack.org>2015-04-02 20:35:46 +0000
commit10286abe752f9baff92f9326bea6d176a46ed8af (patch)
tree13881a519c16ef03478aee1d479774d91d7acc60
parenta38d294f1e1ad515d86952e297d2b4d437d99cff (diff)
parent593b64dee4c0923fc85d6656e29a2beb27f27b17 (diff)
downloadneutron-10286abe752f9baff92f9326bea6d176a46ed8af.tar.gz
Merge "Refactoring of L3 agent notifications for router"
-rw-r--r--neutron/agent/l3/agent.py13
-rw-r--r--neutron/agent/metadata/driver.py79
-rwxr-xr-x[-rw-r--r--]neutron/tests/functional/agent/test_l3_agent.py8
-rw-r--r--neutron/tests/unit/test_l3_agent.py7
4 files changed, 72 insertions, 35 deletions
diff --git a/neutron/agent/l3/agent.py b/neutron/agent/l3/agent.py
index 3c754d46e9..9e9b8a9915 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 9378a3a930..c5088fd2c2 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
index 930ca5ad18..719ab605af 100644..100755
--- 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 a6021318a7..67b5d174cd 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: