Skip to content

Commit 9e42daa

Browse files
author
reedip
committed
Add Subnet add/remove support to router
The following patch adds the support for "router add subnet" and "router remove subnet" to the OSC as a part of migration of Neutron's CLI commands. Partial-Bug: #1546849 Implements: blueprint neutron-client-advanced-router Change-Id: Ia3770c41026194bdb1543d4e67446f81936d44d1
1 parent 8ecdc57 commit 9e42daa

5 files changed

Lines changed: 186 additions & 0 deletions

File tree

doc/source/command-objects/router.rst

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,28 @@ Add a port to a router
2626

2727
Port to be added (name or ID)
2828

29+
router add subnet
30+
-----------------
31+
32+
Add a subnet to a router
33+
34+
.. program:: router add subnet
35+
.. code:: bash
36+
37+
os router add subnet
38+
<router>
39+
<subnet>
40+
41+
.. _router_add_subnet:
42+
43+
.. describe:: <router>
44+
45+
Router to which subnet will be added (name or ID)
46+
47+
.. describe:: <subnet>
48+
49+
Subnet to be added (name or ID)
50+
2951
router create
3052
-------------
3153

@@ -125,6 +147,27 @@ Remove a port from a router
125147
126148
Port to be removed (name or ID)
127149
150+
router remove subnet
151+
--------------------
152+
153+
Remove a subnet from a router
154+
155+
.. program:: router remove subnet
156+
.. code:: bash
157+
158+
os router remove subnet
159+
<router>
160+
<subnet>
161+
162+
.. _router_remove_subnet:
163+
164+
.. describe:: <router>
165+
166+
Router from which subnet will be removed (name or ID)
167+
168+
.. describe:: <subnet>
169+
170+
Subnet to be removed (name or ID)
128171
129172
router set
130173
----------

openstackclient/network/v2/router.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,33 @@ def take_action(self, parsed_args):
106106
parsed_args.router, ignore_missing=False), port_id=port.id)
107107

108108

109+
class AddSubnetToRouter(command.Command):
110+
"""Add a subnet to a router"""
111+
112+
def get_parser(self, prog_name):
113+
parser = super(AddSubnetToRouter, self).get_parser(prog_name)
114+
parser.add_argument(
115+
'router',
116+
metavar='<router>',
117+
help="Router to which subnet will be added (name or ID)",
118+
)
119+
parser.add_argument(
120+
'subnet',
121+
metavar='<subnet>',
122+
help="Subnet to be added (name or ID)",
123+
)
124+
return parser
125+
126+
def take_action(self, parsed_args):
127+
client = self.app.client_manager.network
128+
subnet = client.find_subnet(parsed_args.subnet,
129+
ignore_missing=False)
130+
client.router_add_interface(
131+
client.find_router(parsed_args.router,
132+
ignore_missing=False),
133+
subnet_id=subnet.id)
134+
135+
109136
class CreateRouter(command.ShowOne):
110137
"""Create a new router"""
111138

@@ -265,6 +292,33 @@ def take_action(self, parsed_args):
265292
parsed_args.router, ignore_missing=False), port_id=port.id)
266293

267294

295+
class RemoveSubnetFromRouter(command.Command):
296+
"""Remove a subnet from a router"""
297+
298+
def get_parser(self, prog_name):
299+
parser = super(RemoveSubnetFromRouter, self).get_parser(prog_name)
300+
parser.add_argument(
301+
'router',
302+
metavar='<router>',
303+
help="Router from which the subnet will be removed (name or ID)",
304+
)
305+
parser.add_argument(
306+
'subnet',
307+
metavar='<subnet>',
308+
help="Subnet to be removed (name or ID)",
309+
)
310+
return parser
311+
312+
def take_action(self, parsed_args):
313+
client = self.app.client_manager.network
314+
subnet = client.find_subnet(parsed_args.subnet,
315+
ignore_missing=False)
316+
client.router_remove_interface(
317+
client.find_router(parsed_args.router,
318+
ignore_missing=False),
319+
subnet_id=subnet.id)
320+
321+
268322
class SetRouter(command.Command):
269323
"""Set router properties"""
270324

openstackclient/tests/network/v2/test_router.py

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,46 @@ def test_add_port_required_options(self):
7070
self.assertIsNone(result)
7171

7272

73+
class TestAddSubnetToRouter(TestRouter):
74+
'''Add subnet to Router '''
75+
76+
_subnet = network_fakes.FakeSubnet.create_one_subnet()
77+
_router = network_fakes.FakeRouter.create_one_router(
78+
attrs={'subnet': _subnet.id})
79+
80+
def setUp(self):
81+
super(TestAddSubnetToRouter, self).setUp()
82+
self.network.router_add_interface = mock.Mock()
83+
self.cmd = router.AddSubnetToRouter(self.app, self.namespace)
84+
self.network.find_router = mock.Mock(return_value=self._router)
85+
self.network.find_subnet = mock.Mock(return_value=self._subnet)
86+
87+
def test_add_subnet_no_option(self):
88+
arglist = []
89+
verifylist = []
90+
91+
# Missing required args should bail here
92+
self.assertRaises(tests_utils.ParserException, self.check_parser,
93+
self.cmd, arglist, verifylist)
94+
95+
def test_add_subnet_required_options(self):
96+
arglist = [
97+
self._router.id,
98+
self._router.subnet,
99+
]
100+
verifylist = [
101+
('router', self._router.id),
102+
('subnet', self._router.subnet),
103+
]
104+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
105+
106+
result = self.cmd.take_action(parsed_args)
107+
self.network.router_add_interface.assert_called_with(
108+
self._router, **{'subnet_id': self._router.subnet})
109+
110+
self.assertIsNone(result)
111+
112+
73113
class TestCreateRouter(TestRouter):
74114

75115
# The new router created.
@@ -309,6 +349,45 @@ def test_remove_port_required_options(self):
309349
self.assertIsNone(result)
310350

311351

352+
class TestRemoveSubnetFromRouter(TestRouter):
353+
'''Remove subnet from Router '''
354+
355+
_subnet = network_fakes.FakeSubnet.create_one_subnet()
356+
_router = network_fakes.FakeRouter.create_one_router(
357+
attrs={'subnet': _subnet.id})
358+
359+
def setUp(self):
360+
super(TestRemoveSubnetFromRouter, self).setUp()
361+
self.network.router_remove_interface = mock.Mock()
362+
self.cmd = router.RemoveSubnetFromRouter(self.app, self.namespace)
363+
self.network.find_router = mock.Mock(return_value=self._router)
364+
self.network.find_subnet = mock.Mock(return_value=self._subnet)
365+
366+
def test_remove_subnet_no_option(self):
367+
arglist = []
368+
verifylist = []
369+
370+
# Missing required args should bail here
371+
self.assertRaises(tests_utils.ParserException, self.check_parser,
372+
self.cmd, arglist, verifylist)
373+
374+
def test_remove_subnet_required_options(self):
375+
arglist = [
376+
self._router.id,
377+
self._router.subnet,
378+
]
379+
verifylist = [
380+
('subnet', self._router.subnet),
381+
('router', self._router.id),
382+
]
383+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
384+
385+
result = self.cmd.take_action(parsed_args)
386+
self.network.router_remove_interface.assert_called_with(
387+
self._router, **{'subnet_id': self._router.subnet})
388+
self.assertIsNone(result)
389+
390+
312391
class TestSetRouter(TestRouter):
313392

314393
# The router to set.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
features:
3+
- |
4+
Add ``router add subnet`` command
5+
[Bug `1546849 <https://bugs.launchpad.net/bugs/1546849>`_]
6+
- |
7+
Add ``router remove subnet`` command
8+
[Bug `1546849 <https://bugs.launchpad.net/bugs/1546849>`_]

setup.cfg

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,10 +339,12 @@ openstack.network.v2 =
339339
port_show = openstackclient.network.v2.port:ShowPort
340340

341341
router_add_port = openstackclient.network.v2.router:AddPortToRouter
342+
router_add_subnet = openstackclient.network.v2.router:AddSubnetToRouter
342343
router_create = openstackclient.network.v2.router:CreateRouter
343344
router_delete = openstackclient.network.v2.router:DeleteRouter
344345
router_list = openstackclient.network.v2.router:ListRouter
345346
router_remove_port = openstackclient.network.v2.router:RemovePortFromRouter
347+
router_remove_subnet = openstackclient.network.v2.router:RemoveSubnetFromRouter
346348
router_set = openstackclient.network.v2.router:SetRouter
347349
router_show = openstackclient.network.v2.router:ShowRouter
348350

0 commit comments

Comments
 (0)