diff --git a/neutron/agent/linux/ip_lib.py b/neutron/agent/linux/ip_lib.py index e2ffa7c163d..a579a319f22 100644 --- a/neutron/agent/linux/ip_lib.py +++ b/neutron/agent/linux/ip_lib.py @@ -445,6 +445,8 @@ class IpLinkCommand(IpDeviceCommandBase): privileged.set_link_attribute( self.name, self._parent.namespace, net_ns_fd=namespace) self._parent.namespace = namespace + common_utils.wait_until_true(lambda: self.exists, timeout=5, + sleep=0.5) def set_name(self, name): privileged.set_link_attribute( diff --git a/neutron/tests/functional/agent/linux/test_ip_lib.py b/neutron/tests/functional/agent/linux/test_ip_lib.py index a2922f71786..d9629a70247 100644 --- a/neutron/tests/functional/agent/linux/test_ip_lib.py +++ b/neutron/tests/functional/agent/linux/test_ip_lib.py @@ -1149,3 +1149,14 @@ class ListIpRoutesTestCase(functional_base.BaseSudoTestCase): return self.fail('Not matching route, routes: %s' % routes) + + +class IpLinkCommandTestCase(IpLibTestFramework): + + def test_set_netns(self): + device_name = ('int_' + uuidutils.generate_uuid())[ + :constants.DEVICE_NAME_MAX_LEN] + device = ip_lib.IPDevice(device_name, kind='dummy') + device.link.create() + namespace = self.useFixture(net_helpers.NamespaceFixture()) + device.link.set_netns(namespace.name) diff --git a/neutron/tests/unit/agent/linux/test_ip_lib.py b/neutron/tests/unit/agent/linux/test_ip_lib.py index c62f57ca453..7d88efee6fb 100644 --- a/neutron/tests/unit/agent/linux/test_ip_lib.py +++ b/neutron/tests/unit/agent/linux/test_ip_lib.py @@ -618,8 +618,9 @@ class TestIpLinkCommand(TestIPCmdBase): set_link_attribute.assert_called_once_with( self.parent.name, self.parent.namespace, state='down') + @mock.patch.object(priv_lib, 'interface_exists', return_value=True) @mock.patch.object(priv_lib, 'set_link_attribute') - def test_set_netns(self, set_link_attribute): + def test_set_netns(self, set_link_attribute, *args): original_namespace = self.parent.namespace self.link_cmd.set_netns('foo') set_link_attribute.assert_called_once_with(