Merge "Optimize router delete execution"

This commit is contained in:
Jenkins
2015-11-25 16:28:50 +00:00
committed by Gerrit Code Review
7 changed files with 44 additions and 47 deletions

View File

@@ -92,16 +92,11 @@ class DvrEdgeHaRouter(DvrEdgeRouter, HaRouter):
self._create_snat_namespace() self._create_snat_namespace()
super(DvrEdgeHaRouter, self).initialize(process_monitor) super(DvrEdgeHaRouter, self).initialize(process_monitor)
def process(self, agent): def process(self, agent, delete=False):
super(DvrEdgeHaRouter, self).process(agent) super(DvrEdgeHaRouter, self).process(agent, delete)
if self.ha_port: if self.ha_port:
self.enable_keepalived() self.enable_keepalived()
def delete(self, agent):
super(DvrEdgeHaRouter, self).delete(agent)
if self.snat_namespace:
self.snat_namespace.delete()
def get_router_cidrs(self, device): def get_router_cidrs(self, device):
return RouterInfo.get_router_cidrs(self, device) return RouterInfo.get_router_cidrs(self, device)

View File

@@ -186,3 +186,8 @@ class DvrEdgeRouter(dvr_local_router.DvrLocalRouter):
ns_name = dvr_snat_ns.SnatNamespace.get_snat_ns_name(self.router['id']) ns_name = dvr_snat_ns.SnatNamespace.get_snat_ns_name(self.router['id'])
super(DvrEdgeRouter, self).update_routing_table(operation, route, super(DvrEdgeRouter, self).update_routing_table(operation, route,
namespace=ns_name) namespace=ns_name)
def delete(self, agent):
super(DvrEdgeRouter, self).delete(agent)
if self.snat_namespace:
self.snat_namespace.delete()

View File

@@ -414,11 +414,11 @@ class DvrLocalRouter(dvr_router_base.DvrRouterBase):
def _handle_router_snat_rules(self, ex_gw_port, interface_name): def _handle_router_snat_rules(self, ex_gw_port, interface_name):
pass pass
def process_external(self, agent): def process_external(self, agent, delete=False):
ex_gw_port = self.get_ex_gw_port() ex_gw_port = self.get_ex_gw_port()
if ex_gw_port: if ex_gw_port:
self.create_dvr_fip_interfaces(ex_gw_port) self.create_dvr_fip_interfaces(ex_gw_port)
super(DvrLocalRouter, self).process_external(agent) super(DvrLocalRouter, self).process_external(agent, delete)
def create_dvr_fip_interfaces(self, ex_gw_port): def create_dvr_fip_interfaces(self, ex_gw_port):
floating_ips = self.get_floating_ips() floating_ips = self.get_floating_ips()
@@ -455,10 +455,10 @@ class DvrLocalRouter(dvr_router_base.DvrRouterBase):
# configured # configured
self.agent.process_router_add(self) self.agent.process_router_add(self)
def process(self, agent): def process(self, agent, delete=False):
ex_gw_port = self.get_ex_gw_port() ex_gw_port = self.get_ex_gw_port()
if ex_gw_port: if ex_gw_port:
self.fip_ns = agent.get_fip_ns(ex_gw_port['network_id']) self.fip_ns = agent.get_fip_ns(ex_gw_port['network_id'])
self.fip_ns.scan_fip_ports(self) self.fip_ns.scan_fip_ports(self)
super(DvrLocalRouter, self).process(agent) super(DvrLocalRouter, self).process(agent, delete)

View File

@@ -26,8 +26,8 @@ class DvrRouterBase(router.RouterInfo):
self.agent = agent self.agent = agent
self.host = host self.host = host
def process(self, agent): def process(self, agent, delete=False):
super(DvrRouterBase, self).process(agent) super(DvrRouterBase, self).process(agent, delete)
# NOTE: Keep a copy of the interfaces around for when they are removed # NOTE: Keep a copy of the interfaces around for when they are removed
self.snat_ports = self.get_snat_interfaces() self.snat_ports = self.get_snat_interfaces()

View File

@@ -385,8 +385,8 @@ class HaRouter(router.RouterInfo):
self.ha_network_removed() self.ha_network_removed()
self.disable_keepalived() self.disable_keepalived()
def process(self, agent): def process(self, agent, delete=False):
super(HaRouter, self).process(agent) super(HaRouter, self).process(agent, delete)
if self.ha_port: if self.ha_port:
self.enable_keepalived() self.enable_keepalived()

View File

@@ -261,7 +261,7 @@ class RouterInfo(object):
self.router['gw_port'] = None self.router['gw_port'] = None
self.router[l3_constants.INTERFACE_KEY] = [] self.router[l3_constants.INTERFACE_KEY] = []
self.router[l3_constants.FLOATINGIP_KEY] = [] self.router[l3_constants.FLOATINGIP_KEY] = []
self.process(agent) self.process(agent, delete=True)
self.disable_radvd() self.disable_radvd()
self.router_namespace.delete() self.router_namespace.delete()
@@ -646,8 +646,9 @@ class RouterInfo(object):
self.iptables_manager, self.iptables_manager,
interface_name) interface_name)
def process_external(self, agent): def process_external(self, agent, delete=False):
fip_statuses = {} fip_statuses = {}
if not delete:
try: try:
with self.iptables_manager.defer_apply(): with self.iptables_manager.defer_apply():
ex_gw_port = self.get_ex_gw_port() ex_gw_port = self.get_ex_gw_port()
@@ -671,6 +672,9 @@ class RouterInfo(object):
fip_statuses = self.put_fips_in_error_state() fip_statuses = self.put_fips_in_error_state()
finally: finally:
self.update_fip_statuses(agent, fip_statuses) self.update_fip_statuses(agent, fip_statuses)
else:
ex_gw_port = self.get_ex_gw_port()
self._process_external_gateway(ex_gw_port, agent.pd)
def update_fip_statuses(self, agent, fip_statuses): def update_fip_statuses(self, agent, fip_statuses):
# Identify floating IPs which were disabled # Identify floating IPs which were disabled
@@ -689,18 +693,19 @@ class RouterInfo(object):
agent.context, self.router_id, fip_statuses) agent.context, self.router_id, fip_statuses)
@common_utils.exception_logger() @common_utils.exception_logger()
def process(self, agent): def process(self, agent, delete=False):
"""Process updates to this router """Process updates to this router
This method is the point where the agent requests that updates be This method is the point where the agent requests that updates be
applied to this router. applied to this router.
:param agent: Passes the agent in order to send RPC messages. :param agent: Passes the agent in order to send RPC messages.
:param delete: Indicates whether this update is from a delete operation
""" """
LOG.debug("process router updates") LOG.debug("process router updates")
self._process_internal_ports(agent.pd) self._process_internal_ports(agent.pd)
agent.pd.sync_router(self.router['id']) agent.pd.sync_router(self.router['id'])
self.process_external(agent) self.process_external(agent, delete)
# Process static routes for router # Process static routes for router
self.routes_updated() self.routes_updated()

View File

@@ -167,14 +167,6 @@ def after_router_added(resource, event, l3_agent, **kwargs):
def before_router_removed(resource, event, l3_agent, **kwargs): def before_router_removed(resource, event, l3_agent, **kwargs):
router = kwargs['router'] router = kwargs['router']
proxy = l3_agent.metadata_driver 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, proxy.destroy_monitored_metadata_proxy(l3_agent.process_monitor,
router.router['id'], router.router['id'],