Skip to content

Commit 9c473f4

Browse files
author
Ha Van Tu
committed
Add filtering options to os network list command
This patch adds the following filtering options: '--name', '--internal', '--share' and '--no-share', '--enable' and '--disable', '--project' and '--project-domain', '--status'. Change-Id: I7e9dd372ee572c6ee8cdba7fac3182f9dc0a137b Partially-Implements: blueprint network-commands-options Closes-Bug: #1578819
1 parent 5ec435e commit 9c473f4

4 files changed

Lines changed: 290 additions & 7 deletions

File tree

doc/source/command-objects/network.rst

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,17 +181,60 @@ List networks
181181
.. code:: bash
182182
183183
os network list
184-
[--external]
184+
[--external | --internal]
185185
[--long]
186+
[--name <name>]
187+
[--enable | --disable]
188+
[--project <project> [--project-domain <project-domain>]]
189+
[--share | --no-share]
190+
[--status <status>]
186191
187192
.. option:: --external
188193
189194
List external networks
190195
196+
.. option:: --internal
197+
198+
List internal networks
199+
191200
.. option:: --long
192201
193202
List additional fields in output
194203
204+
.. option:: --name <name>
205+
206+
List networks according to their name
207+
208+
.. option:: --enable
209+
210+
List enabled networks
211+
212+
.. option:: --disable
213+
214+
List disabled networks
215+
216+
.. option:: --project <project>
217+
218+
List networks according to their project (name or ID)
219+
220+
.. option:: --project-domain <project-domain>
221+
222+
Domain the project belongs to (name or ID).
223+
This can be used in case collisions between project names exist.
224+
225+
.. option:: --share
226+
227+
List networks shared between projects
228+
229+
.. option:: --no-share
230+
231+
List networks not shared between projects
232+
233+
.. option:: --status <status>
234+
235+
List networks according to their status
236+
('ACTIVE', 'BUILD', 'DOWN', 'ERROR')
237+
195238
network set
196239
-----------
197240

openstackclient/network/v2/network.py

Lines changed: 77 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -295,21 +295,66 @@ class ListNetwork(common.NetworkAndComputeLister):
295295
"""List networks"""
296296

297297
def update_parser_common(self, parser):
298-
parser.add_argument(
298+
router_ext_group = parser.add_mutually_exclusive_group()
299+
router_ext_group.add_argument(
299300
'--external',
300301
action='store_true',
301-
default=False,
302302
help=_("List external networks")
303303
)
304+
router_ext_group.add_argument(
305+
'--internal',
306+
action='store_true',
307+
help=_("List internal networks")
308+
)
304309
parser.add_argument(
305310
'--long',
306311
action='store_true',
307-
default=False,
308312
help=_("List additional fields in output")
309313
)
314+
parser.add_argument(
315+
'--name',
316+
metavar='<name>',
317+
help=_("List networks according to their name")
318+
)
319+
admin_state_group = parser.add_mutually_exclusive_group()
320+
admin_state_group.add_argument(
321+
'--enable',
322+
action='store_true',
323+
help=_("List enabled networks")
324+
)
325+
admin_state_group.add_argument(
326+
'--disable',
327+
action='store_true',
328+
help=_("List disabled networks")
329+
)
330+
parser.add_argument(
331+
'--project',
332+
metavar='<project>',
333+
help=_("List networks according to their project (name or ID)")
334+
)
335+
identity_common.add_project_domain_option_to_parser(parser)
336+
shared_group = parser.add_mutually_exclusive_group()
337+
shared_group.add_argument(
338+
'--share',
339+
action='store_true',
340+
help=_("List networks shared between projects")
341+
)
342+
shared_group.add_argument(
343+
'--no-share',
344+
action='store_true',
345+
help=_("List networks not shared between projects")
346+
)
347+
parser.add_argument(
348+
'--status',
349+
metavar='<status>',
350+
choices=['ACTIVE', 'BUILD', 'DOWN', 'ERROR'],
351+
help=_("List networks according to their status "
352+
"('ACTIVE', 'BUILD', 'DOWN', 'ERROR')")
353+
)
310354
return parser
311355

312356
def take_action_network(self, client, parsed_args):
357+
identity_client = self.app.client_manager.identity
313358
if parsed_args.long:
314359
columns = (
315360
'id',
@@ -347,10 +392,36 @@ def take_action_network(self, client, parsed_args):
347392
'Subnets',
348393
)
349394

395+
args = {}
396+
350397
if parsed_args.external:
351-
args = {'router:external': True}
352-
else:
353-
args = {}
398+
args['router:external'] = True
399+
elif parsed_args.internal:
400+
args['router:external'] = False
401+
402+
if parsed_args.name is not None:
403+
args['name'] = parsed_args.name
404+
405+
if parsed_args.enable:
406+
args['admin_state_up'] = True
407+
elif parsed_args.disable:
408+
args['admin_state_up'] = False
409+
410+
if parsed_args.project:
411+
project = identity_common.find_project(
412+
identity_client,
413+
parsed_args.project,
414+
parsed_args.project_domain,
415+
)
416+
args['tenant_id'] = project.id
417+
418+
if parsed_args.share:
419+
args['shared'] = True
420+
elif parsed_args.no_share:
421+
args['shared'] = False
422+
423+
if parsed_args.status:
424+
args['status'] = parsed_args.status
354425

355426
data = client.networks(**args)
356427

openstackclient/tests/unit/network/v2/test_network.py

Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
import mock
1515
from mock import call
16+
import random
1617

1718
from osc_lib import exceptions
1819
from osc_lib import utils
@@ -491,6 +492,23 @@ def test_list_external(self):
491492
self.assertEqual(self.columns, columns)
492493
self.assertEqual(self.data, list(data))
493494

495+
def test_list_internal(self):
496+
arglist = [
497+
'--internal',
498+
]
499+
verifylist = [
500+
('internal', True),
501+
('long', False),
502+
]
503+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
504+
columns, data = self.cmd.take_action(parsed_args)
505+
506+
self.network.networks.assert_called_once_with(
507+
**{'router:external': False}
508+
)
509+
self.assertEqual(self.columns, columns)
510+
self.assertEqual(self.data, list(data))
511+
494512
def test_network_list_long(self):
495513
arglist = [
496514
'--long',
@@ -510,6 +528,150 @@ def test_network_list_long(self):
510528
self.assertEqual(self.columns_long, columns)
511529
self.assertEqual(self.data_long, list(data))
512530

531+
def test_list_name(self):
532+
test_name = "fakename"
533+
arglist = [
534+
'--name', test_name,
535+
]
536+
verifylist = [
537+
('external', False),
538+
('long', False),
539+
('name', test_name),
540+
]
541+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
542+
columns, data = self.cmd.take_action(parsed_args)
543+
544+
self.network.networks.assert_called_once_with(
545+
**{'name': test_name}
546+
)
547+
self.assertEqual(self.columns, columns)
548+
self.assertEqual(self.data, list(data))
549+
550+
def test_network_list_enable(self):
551+
arglist = [
552+
'--enable',
553+
]
554+
verifylist = [
555+
('long', False),
556+
('external', False),
557+
('enable', True),
558+
]
559+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
560+
columns, data = self.cmd.take_action(parsed_args)
561+
562+
self.network.networks.assert_called_once_with(
563+
**{'admin_state_up': True}
564+
)
565+
self.assertEqual(self.columns, columns)
566+
self.assertEqual(self.data, list(data))
567+
568+
def test_network_list_disable(self):
569+
arglist = [
570+
'--disable',
571+
]
572+
verifylist = [
573+
('long', False),
574+
('external', False),
575+
('disable', True)
576+
]
577+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
578+
columns, data = self.cmd.take_action(parsed_args)
579+
580+
self.network.networks.assert_called_once_with(
581+
**{'admin_state_up': False}
582+
)
583+
self.assertEqual(self.columns, columns)
584+
self.assertEqual(self.data, list(data))
585+
586+
def test_network_list_project(self):
587+
project = identity_fakes_v3.FakeProject.create_one_project()
588+
self.projects_mock.get.return_value = project
589+
arglist = [
590+
'--project', project.id,
591+
]
592+
verifylist = [
593+
('project', project.id),
594+
]
595+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
596+
597+
columns, data = self.cmd.take_action(parsed_args)
598+
self.network.networks.assert_called_once_with(
599+
**{'tenant_id': project.id}
600+
)
601+
602+
self.assertEqual(self.columns, columns)
603+
self.assertEqual(self.data, list(data))
604+
605+
def test_networ_list_project_domain(self):
606+
project = identity_fakes_v3.FakeProject.create_one_project()
607+
self.projects_mock.get.return_value = project
608+
arglist = [
609+
'--project', project.id,
610+
'--project-domain', project.domain_id,
611+
]
612+
verifylist = [
613+
('project', project.id),
614+
]
615+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
616+
617+
columns, data = self.cmd.take_action(parsed_args)
618+
filters = {'tenant_id': project.id}
619+
620+
self.network.networks.assert_called_once_with(**filters)
621+
622+
def test_network_list_share(self):
623+
arglist = [
624+
'--share',
625+
]
626+
verifylist = [
627+
('long', False),
628+
('share', True),
629+
]
630+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
631+
columns, data = self.cmd.take_action(parsed_args)
632+
633+
self.network.networks.assert_called_once_with(
634+
**{'shared': True}
635+
)
636+
self.assertEqual(self.columns, columns)
637+
self.assertEqual(self.data, list(data))
638+
639+
def test_network_list_no_share(self):
640+
arglist = [
641+
'--no-share',
642+
]
643+
verifylist = [
644+
('long', False),
645+
('no_share', True),
646+
]
647+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
648+
columns, data = self.cmd.take_action(parsed_args)
649+
650+
self.network.networks.assert_called_once_with(
651+
**{'shared': False}
652+
)
653+
self.assertEqual(self.columns, columns)
654+
self.assertEqual(self.data, list(data))
655+
656+
def test_network_list_status(self):
657+
choices = ['ACTIVE', 'BUILD', 'DOWN', 'ERROR']
658+
test_status = random.choice(choices)
659+
arglist = [
660+
'--status', test_status,
661+
]
662+
verifylist = [
663+
('long', False),
664+
('status', test_status),
665+
]
666+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
667+
columns, data = self.cmd.take_action(parsed_args)
668+
669+
self.network.networks.assert_called_once_with(
670+
**{'status': test_status}
671+
)
672+
self.assertEqual(self.columns, columns)
673+
self.assertEqual(self.data, list(data))
674+
513675

514676
class TestSetNetwork(TestNetwork):
515677

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
features:
3+
- |
4+
Add ``--internal``, ``--name``, ``--project`` and ``--project-domain``,
5+
``--enable`` and ``--disable``, ``--share`` and ``--no share``, ``--status``
6+
options to the ``network list`` command.
7+
[Bug `1578819 <https://bugs.launchpad.net/bugs/1578819>`_]

0 commit comments

Comments
 (0)