Skip to content

Commit 6c73946

Browse files
Jenkinsopenstack-gerrit
authored andcommitted
Merge "Add Subnet add/remove support to router"
2 parents b70afef + 9e42daa commit 6c73946

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
@@ -111,6 +111,33 @@ def take_action(self, parsed_args):
111111
parsed_args.router, ignore_missing=False), port_id=port.id)
112112

113113

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

@@ -268,6 +295,33 @@ def take_action(self, parsed_args):
268295
parsed_args.router, ignore_missing=False), port_id=port.id)
269296

270297

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

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.
@@ -307,6 +347,45 @@ def test_remove_port_required_options(self):
307347
self.assertIsNone(result)
308348

309349

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

312391
# 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)