Skip to content

Commit a60e31a

Browse files
Jenkinsopenstack-gerrit
authored andcommitted
Merge "Add option to allow filtering by router on port list"
2 parents bc5b084 + 62a0246 commit a60e31a

3 files changed

Lines changed: 46 additions & 2 deletions

File tree

doc/source/command-objects/port.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,11 @@ List ports
108108
.. code:: bash
109109
110110
os port list
111+
[--router <router>]
112+
113+
.. option:: --router <router>
114+
115+
List only ports attached to this router (name or ID)
111116
112117
port set
113118
--------

openstackclient/network/v2/port.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,16 @@ def take_action(self, parsed_args):
243243
class ListPort(command.Lister):
244244
"""List ports"""
245245

246+
def get_parser(self, prog_name):
247+
parser = super(ListPort, self).get_parser(prog_name)
248+
parser.add_argument(
249+
'--router',
250+
metavar='<router>',
251+
dest='router',
252+
help='List only ports attached to this router (name or ID)',
253+
)
254+
return parser
255+
246256
def take_action(self, parsed_args):
247257
client = self.app.client_manager.network
248258

@@ -259,7 +269,14 @@ def take_action(self, parsed_args):
259269
'Fixed IP Addresses',
260270
)
261271

262-
data = client.ports()
272+
filters = {}
273+
if parsed_args.router:
274+
_router = client.find_router(parsed_args.router,
275+
ignore_missing=False)
276+
filters = {'device_id': _router.id}
277+
278+
data = client.ports(**filters)
279+
263280
return (column_headers,
264281
(utils.get_item_properties(
265282
s, columns,

openstackclient/tests/network/v2/test_port.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,8 +224,11 @@ def setUp(self):
224224

225225
# Get the command object to test
226226
self.cmd = port.ListPort(self.app, self.namespace)
227-
228227
self.network.ports = mock.Mock(return_value=self._ports)
228+
fake_router = network_fakes.FakeRouter.create_one_router({
229+
'id': 'fake-router-id',
230+
})
231+
self.network.find_router = mock.Mock(return_value=fake_router)
229232

230233
def test_port_list_no_options(self):
231234
arglist = []
@@ -239,6 +242,25 @@ def test_port_list_no_options(self):
239242
self.assertEqual(self.columns, columns)
240243
self.assertEqual(self.data, list(data))
241244

245+
def test_port_list_router_opt(self):
246+
arglist = [
247+
'--router', 'fake-router-name',
248+
]
249+
250+
verifylist = [
251+
('router', 'fake-router-name')
252+
]
253+
254+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
255+
256+
columns, data = self.cmd.take_action(parsed_args)
257+
258+
self.network.ports.assert_called_with(**{
259+
'device_id': 'fake-router-id'
260+
})
261+
self.assertEqual(self.columns, columns)
262+
self.assertEqual(self.data, list(data))
263+
242264

243265
class TestSetPort(TestPort):
244266

0 commit comments

Comments
 (0)