From 9b7ff6d3bd4059699c54180aca02e11d5fe07f21 Mon Sep 17 00:00:00 2001 From: Carl Baldwin Date: Mon, 31 Aug 2015 21:31:57 +0000 Subject: [PATCH] Allow passing arbitrary ip route parameters to add/delete_route There are arguments to ip route like scope and dev that will need to be passed to add_route and delete_route. This patch allows them to be passed using kwargs. Change-Id: I06d46bee9ca333c6a308d1af961bd9eadab9db97 Partially-Implements: blueprint address-scopes --- neutron/agent/linux/ip_lib.py | 38 +++++++------------ neutron/tests/unit/agent/linux/test_ip_lib.py | 26 ++++++++++--- 2 files changed, 34 insertions(+), 30 deletions(-) diff --git a/neutron/agent/linux/ip_lib.py b/neutron/agent/linux/ip_lib.py index c7acd047b..428c95260 100644 --- a/neutron/agent/linux/ip_lib.py +++ b/neutron/agent/linux/ip_lib.py @@ -619,39 +619,25 @@ class IpRouteCommand(IpDeviceCommandBase): yield route - def list_routes(self, ip_version): + def list_routes(self, ip_version, **kwargs): args = ['list'] args += self._dev_args() args += self._table_args() + for k, v in kwargs.items(): + args += [k, v] output = self._run([ip_version], tuple(args)) - return [r for r in self._parse_routes(ip_version, output)] + return [r for r in self._parse_routes(ip_version, output, **kwargs)] def list_onlink_routes(self, ip_version): - args = ['list'] - args += self._dev_args() - args += ['scope', 'link'] - args += self._table_args() - - output = self._run([ip_version], tuple(args)) - return [r for r in self._parse_routes(ip_version, output, scope='link') - if 'src' not in r] + routes = self.list_routes(ip_version, scope='link') + return [r for r in routes if 'src' not in r] def add_onlink_route(self, cidr): - ip_version = get_ip_version(cidr) - args = ['replace', cidr] - args += self._dev_args() - args += ['scope', 'link'] - args += self._table_args() - self._as_root([ip_version], tuple(args)) + self.add_route(cidr, scope='link') def delete_onlink_route(self, cidr): - ip_version = get_ip_version(cidr) - args = ['del', cidr] - args += self._dev_args() - args += ['scope', 'link'] - args += self._table_args() - self._as_root([ip_version], tuple(args)) + self.delete_route(cidr, scope='link') def get_gateway(self, scope=None, filters=None, ip_version=None): options = [ip_version] if ip_version else [] @@ -733,22 +719,26 @@ class IpRouteCommand(IpDeviceCommandBase): 'proto', 'kernel', 'dev', device)) - def add_route(self, cidr, via=None, table=None): + def add_route(self, cidr, via=None, table=None, **kwargs): ip_version = get_ip_version(cidr) args = ['replace', cidr] if via: args += ['via', via] args += self._dev_args() args += self._table_args(table) + for k, v in kwargs.items(): + args += [k, v] self._as_root([ip_version], tuple(args)) - def delete_route(self, cidr, via=None, table=None): + def delete_route(self, cidr, via=None, table=None, **kwargs): ip_version = get_ip_version(cidr) args = ['del', cidr] if via: args += ['via', via] args += self._dev_args() args += self._table_args(table) + for k, v in kwargs.items(): + args += [k, v] self._as_root([ip_version], tuple(args)) diff --git a/neutron/tests/unit/agent/linux/test_ip_lib.py b/neutron/tests/unit/agent/linux/test_ip_lib.py index 587601f91..2de408d76 100644 --- a/neutron/tests/unit/agent/linux/test_ip_lib.py +++ b/neutron/tests/unit/agent/linux/test_ip_lib.py @@ -958,6 +958,13 @@ class TestIpRouteCommand(TestIPCmdBase): 'dev', self.parent.name, 'table', self.table)) + def test_add_route_with_scope(self): + self.route_cmd.add_route(self.cidr, scope='link') + self._assert_sudo([self.ip_version], + ('replace', self.cidr, + 'dev', self.parent.name, + 'scope', 'link')) + def test_delete_route(self): self.route_cmd.delete_route(self.cidr, self.ip, self.table) self._assert_sudo([self.ip_version], @@ -973,6 +980,13 @@ class TestIpRouteCommand(TestIPCmdBase): 'dev', self.parent.name, 'table', self.table)) + def test_delete_route_with_scope(self): + self.route_cmd.delete_route(self.cidr, scope='link') + self._assert_sudo([self.ip_version], + ('del', self.cidr, + 'dev', self.parent.name, + 'scope', 'link')) + def test_list_routes(self): self.parent._run.return_value = ( "default via 172.124.4.1 dev eth0 metric 100\n" @@ -1002,24 +1016,24 @@ class TestIpRouteCommand(TestIPCmdBase): self.ip_version) self.assertEqual(['10.0.0.0/22'], [r['cidr'] for r in routes]) self._assert_call([self.ip_version], - ('list', 'dev', self.parent.name, 'scope', 'link', - 'table', self.table)) + ('list', 'dev', self.parent.name, + 'table', self.table, 'scope', 'link')) def test_add_onlink_route_subtable(self): self.route_cmd.table(self.table).add_onlink_route(self.cidr) self._assert_sudo([self.ip_version], ('replace', self.cidr, 'dev', self.parent.name, - 'scope', 'link', - 'table', self.table)) + 'table', self.table, + 'scope', 'link')) def test_delete_onlink_route_subtable(self): self.route_cmd.table(self.table).delete_onlink_route(self.cidr) self._assert_sudo([self.ip_version], ('del', self.cidr, 'dev', self.parent.name, - 'scope', 'link', - 'table', self.table)) + 'table', self.table, + 'scope', 'link')) class TestIPv6IpRouteCommand(TestIpRouteCommand): -- 2.45.2