From 99567388acfb0c0b9d3fc05430eaef3acb7ad9c5 Mon Sep 17 00:00:00 2001 From: Slawek Kaplonski Date: Thu, 9 Aug 2018 16:43:13 +0200 Subject: [PATCH] Create veth pair devices using pyroute2 Create of veth devices now uses pyroute2 and priv_sep. Change-Id: I8d0346dd1859010aba864ea908c7dcb118aa5412 Related-Bug: #1492714 --- neutron/agent/linux/ip_lib.py | 10 ++++------ neutron/tests/unit/agent/linux/test_ip_lib.py | 20 +++++++++---------- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/neutron/agent/linux/ip_lib.py b/neutron/agent/linux/ip_lib.py index a9f80feba5e..723db028077 100644 --- a/neutron/agent/linux/ip_lib.py +++ b/neutron/agent/linux/ip_lib.py @@ -179,18 +179,16 @@ class IPWrapper(SubProcessBase): return IPDevice(name, namespace=self.namespace) def add_veth(self, name1, name2, namespace2=None): - # TODO(slaweq): switch to pyroute2 when issue - # https://github.com/svinota/pyroute2/issues/463 - # will be closed - args = ['add', name1, 'type', 'veth', 'peer', 'name', name2] + peer = {'ifname': name2} if namespace2 is None: namespace2 = self.namespace else: self.ensure_namespace(namespace2) - args += ['netns', namespace2] + peer['net_ns_fd'] = namespace2 - self._as_root([], 'link', tuple(args)) + privileged.create_interface( + name1, self.namespace, 'veth', peer=peer) return (IPDevice(name1, namespace=self.namespace), IPDevice(name2, namespace=namespace2)) diff --git a/neutron/tests/unit/agent/linux/test_ip_lib.py b/neutron/tests/unit/agent/linux/test_ip_lib.py index e4c9df6e377..bfc1215604f 100644 --- a/neutron/tests/unit/agent/linux/test_ip_lib.py +++ b/neutron/tests/unit/agent/linux/test_ip_lib.py @@ -300,12 +300,11 @@ class TestIpWrapper(base.BaseTestCase): ip_lib.IPWrapper().add_tuntap('tap0') create.assert_called_once_with('tap0', None, 'tuntap', mode='tap') - def test_add_veth(self): + @mock.patch.object(priv_lib, 'create_interface') + def test_add_veth(self, create): ip_lib.IPWrapper().add_veth('tap0', 'tap1') - self.execute.assert_called_once_with([], 'link', - ('add', 'tap0', 'type', 'veth', - 'peer', 'name', 'tap1'), - run_as_root=True, namespace=None) + create.assert_called_once_with( + 'tap0', None, 'veth', peer={'ifname': 'tap1'}) @mock.patch.object(priv_lib, 'create_interface') def test_add_macvtap(self, create): @@ -319,16 +318,15 @@ class TestIpWrapper(base.BaseTestCase): ip_lib.IPWrapper().del_veth('fpr-1234') delete.assert_called_once_with('fpr-1234', None) - def test_add_veth_with_namespaces(self): + @mock.patch.object(priv_lib, 'create_interface') + def test_add_veth_with_namespaces(self, create): ns2 = 'ns2' with mock.patch.object(ip_lib.IPWrapper, 'ensure_namespace') as en: ip_lib.IPWrapper().add_veth('tap0', 'tap1', namespace2=ns2) en.assert_has_calls([mock.call(ns2)]) - self.execute.assert_called_once_with([], 'link', - ('add', 'tap0', 'type', 'veth', - 'peer', 'name', 'tap1', - 'netns', ns2), - run_as_root=True, namespace=None) + create.assert_called_once_with( + 'tap0', None, 'veth', + peer={'ifname': 'tap1', 'net_ns_fd': 'ns2'}) @mock.patch.object(priv_lib, 'create_interface') def test_add_dummy(self, create):