diff --git a/neutron/agent/l3/ha_router.py b/neutron/agent/l3/ha_router.py index 82d24bc64c9..2775706f5ef 100644 --- a/neutron/agent/l3/ha_router.py +++ b/neutron/agent/l3/ha_router.py @@ -542,8 +542,11 @@ class HaRouter(router.RouterInfo): if ex_gw_port_id: interface_name = self.get_external_device_name(ex_gw_port_id) ns_name = self.get_gw_ns_name() - self.driver.set_link_status(interface_name, ns_name, - link_up=link_up) + if (not self.driver.set_link_status( + interface_name, namespace=ns_name, link_up=link_up) and + link_up): + LOG.error('Gateway interface for router %s was not set up; ' + 'router will not work properly', self.router_id) if link_up and set_gw: preserve_ips = self.get_router_preserve_ips() self._external_gateway_settings(ex_gw_port, interface_name, diff --git a/neutron/agent/linux/interface.py b/neutron/agent/linux/interface.py index 022488c4f56..c4919def686 100644 --- a/neutron/agent/linux/interface.py +++ b/neutron/agent/linux/interface.py @@ -322,14 +322,20 @@ class LinuxInterfaceDriver(object, metaclass=abc.ABCMeta): def set_link_status(self, device_name, namespace=None, link_up=True): ns_dev = ip_lib.IPWrapper(namespace=namespace).device(device_name) - if not ns_dev.exists(): - LOG.debug("Device %s may concurrently be deleted.", device_name) - return + try: + utils.wait_until_true(ns_dev.exists, timeout=3) + except utils.WaitTimeout: + LOG.debug('Device %s may have been deleted concurrently', + device_name) + return False + if link_up: ns_dev.link.set_up() else: ns_dev.link.set_down() + return True + class NullDriver(LinuxInterfaceDriver): def plug_new(self, network_id, port_id, device_name, mac_address,