Skip to content

Commit bce740d

Browse files
Jenkinsopenstack-gerrit
authored andcommitted
Merge "Add filtering options to os network list command"
2 parents 80ce3be + 9c473f4 commit bce740d

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
@@ -186,17 +186,60 @@ List networks
186186
.. code:: bash
187187
188188
os network list
189-
[--external]
189+
[--external | --internal]
190190
[--long]
191+
[--name <name>]
192+
[--enable | --disable]
193+
[--project <project> [--project-domain <project-domain>]]
194+
[--share | --no-share]
195+
[--status <status>]
191196
192197
.. option:: --external
193198
194199
List external networks
195200
201+
.. option:: --internal
202+
203+
List internal networks
204+
196205
.. option:: --long
197206
198207
List additional fields in output
199208
209+
.. option:: --name <name>
210+
211+
List networks according to their name
212+
213+
.. option:: --enable
214+
215+
List enabled networks
216+
217+
.. option:: --disable
218+
219+
List disabled networks
220+
221+
.. option:: --project <project>
222+
223+
List networks according to their project (name or ID)
224+
225+
.. option:: --project-domain <project-domain>
226+
227+
Domain the project belongs to (name or ID).
228+
This can be used in case collisions between project names exist.
229+
230+
.. option:: --share
231+
232+
List networks shared between projects
233+
234+
.. option:: --no-share
235+
236+
List networks not shared between projects
237+
238+
.. option:: --status <status>
239+
240+
List networks according to their status
241+
('ACTIVE', 'BUILD', 'DOWN', 'ERROR')
242+
200243
network set
201244
-----------
202245

openstackclient/network/v2/network.py

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

306306
def update_parser_common(self, parser):
307-
parser.add_argument(
307+
router_ext_group = parser.add_mutually_exclusive_group()
308+
router_ext_group.add_argument(
308309
'--external',
309310
action='store_true',
310-
default=False,
311311
help=_("List external networks")
312312
)
313+
router_ext_group.add_argument(
314+
'--internal',
315+
action='store_true',
316+
help=_("List internal networks")
317+
)
313318
parser.add_argument(
314319
'--long',
315320
action='store_true',
316-
default=False,
317321
help=_("List additional fields in output")
318322
)
323+
parser.add_argument(
324+
'--name',
325+
metavar='<name>',
326+
help=_("List networks according to their name")
327+
)
328+
admin_state_group = parser.add_mutually_exclusive_group()
329+
admin_state_group.add_argument(
330+
'--enable',
331+
action='store_true',
332+
help=_("List enabled networks")
333+
)
334+
admin_state_group.add_argument(
335+
'--disable',
336+
action='store_true',
337+
help=_("List disabled networks")
338+
)
339+
parser.add_argument(
340+
'--project',
341+
metavar='<project>',
342+
help=_("List networks according to their project (name or ID)")
343+
)
344+
identity_common.add_project_domain_option_to_parser(parser)
345+
shared_group = parser.add_mutually_exclusive_group()
346+
shared_group.add_argument(
347+
'--share',
348+
action='store_true',
349+
help=_("List networks shared between projects")
350+
)
351+
shared_group.add_argument(
352+
'--no-share',
353+
action='store_true',
354+
help=_("List networks not shared between projects")
355+
)
356+
parser.add_argument(
357+
'--status',
358+
metavar='<status>',
359+
choices=['ACTIVE', 'BUILD', 'DOWN', 'ERROR'],
360+
help=_("List networks according to their status "
361+
"('ACTIVE', 'BUILD', 'DOWN', 'ERROR')")
362+
)
319363
return parser
320364

321365
def take_action_network(self, client, parsed_args):
366+
identity_client = self.app.client_manager.identity
322367
if parsed_args.long:
323368
columns = (
324369
'id',
@@ -356,10 +401,36 @@ def take_action_network(self, client, parsed_args):
356401
'Subnets',
357402
)
358403

404+
args = {}
405+
359406
if parsed_args.external:
360-
args = {'router:external': True}
361-
else:
362-
args = {}
407+
args['router:external'] = True
408+
elif parsed_args.internal:
409+
args['router:external'] = False
410+
411+
if parsed_args.name is not None:
412+
args['name'] = parsed_args.name
413+
414+
if parsed_args.enable:
415+
args['admin_state_up'] = True
416+
elif parsed_args.disable:
417+
args['admin_state_up'] = False
418+
419+
if parsed_args.project:
420+
project = identity_common.find_project(
421+
identity_client,
422+
parsed_args.project,
423+
parsed_args.project_domain,
424+
)
425+
args['tenant_id'] = project.id
426+
427+
if parsed_args.share:
428+
args['shared'] = True
429+
elif parsed_args.no_share:
430+
args['shared'] = False
431+
432+
if parsed_args.status:
433+
args['status'] = parsed_args.status
363434

364435
data = client.networks(**args)
365436

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
@@ -498,6 +499,23 @@ def test_list_external(self):
498499
self.assertEqual(self.columns, columns)
499500
self.assertEqual(self.data, list(data))
500501

502+
def test_list_internal(self):
503+
arglist = [
504+
'--internal',
505+
]
506+
verifylist = [
507+
('internal', True),
508+
('long', False),
509+
]
510+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
511+
columns, data = self.cmd.take_action(parsed_args)
512+
513+
self.network.networks.assert_called_once_with(
514+
**{'router:external': False}
515+
)
516+
self.assertEqual(self.columns, columns)
517+
self.assertEqual(self.data, list(data))
518+
501519
def test_network_list_long(self):
502520
arglist = [
503521
'--long',
@@ -517,6 +535,150 @@ def test_network_list_long(self):
517535
self.assertEqual(self.columns_long, columns)
518536
self.assertEqual(self.data_long, list(data))
519537

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

521683
class TestSetNetwork(TestNetwork):
522684

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)