Skip to content

Commit 44cf358

Browse files
Jenkinsopenstack-gerrit
authored andcommitted
Merge "Add filtering options to os subnet pool list command"
2 parents 6d2412b + 1a6ae06 commit 44cf358

4 files changed

Lines changed: 256 additions & 31 deletions

File tree

doc/source/command-objects/subnet-pool.rst

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,11 +104,49 @@ List subnet pools
104104
105105
os subnet pool list
106106
[--long]
107+
[--share | --no-share]
108+
[--default | --no-default]
109+
[--project <project> [--project-domain <project-domain>]]
110+
[--name <name>]
111+
[--address-scope <address-scope>]
107112
108113
.. option:: --long
109114
110115
List additional fields in output
111116
117+
.. option:: --share
118+
119+
List subnets shared between projects
120+
121+
.. option:: --no-share
122+
123+
List subnets not shared between projects
124+
125+
.. option:: --default
126+
127+
List subnets used as the default external subnet pool
128+
129+
.. option:: --no-default
130+
131+
List subnets not used as the default external subnet pool
132+
133+
.. option:: --project <project>
134+
135+
List subnets according to their project (name or ID)
136+
137+
.. option:: --project-domain <project-domain>
138+
139+
Domain the project belongs to (name or ID).
140+
This can be used in case collisions between project names exist.
141+
142+
.. option:: --name <name>
143+
144+
List only subnets of given name in output
145+
146+
.. option:: --address-scope <address-scope>
147+
148+
List only subnets of given address scope (name or ID) in output
149+
112150
subnet pool set
113151
---------------
114152

openstackclient/network/v2/subnet_pool.py

Lines changed: 72 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -226,41 +226,82 @@ def get_parser(self, prog_name):
226226
default=False,
227227
help=_("List additional fields in output")
228228
)
229+
shared_group = parser.add_mutually_exclusive_group()
230+
shared_group.add_argument(
231+
'--share',
232+
action='store_true',
233+
help=_("List subnets shared between projects"),
234+
)
235+
shared_group.add_argument(
236+
'--no-share',
237+
action='store_true',
238+
help=_("List subnets not shared between projects"),
239+
)
240+
default_group = parser.add_mutually_exclusive_group()
241+
default_group.add_argument(
242+
'--default',
243+
action='store_true',
244+
help=_("List subnets used as the default external subnet pool"),
245+
)
246+
default_group.add_argument(
247+
'--no-default',
248+
action='store_true',
249+
help=_("List subnets not used as the default external subnet pool")
250+
)
251+
parser.add_argument(
252+
'--project',
253+
metavar='<project>',
254+
help=_("List subnets according to their project (name or ID)")
255+
)
256+
identity_common.add_project_domain_option_to_parser(parser)
257+
parser.add_argument(
258+
'--name',
259+
metavar='<name>',
260+
help=_("List only subnets of given name in output")
261+
)
262+
parser.add_argument(
263+
'--address-scope',
264+
metavar='<address-scope>',
265+
help=_("List only subnets of given address scope (name or ID) "
266+
"in output")
267+
)
229268
return parser
230269

231270
def take_action(self, parsed_args):
232-
data = self.app.client_manager.network.subnet_pools()
233-
271+
identity_client = self.app.client_manager.identity
272+
network_client = self.app.client_manager.network
273+
filters = {}
274+
if parsed_args.share:
275+
filters['shared'] = True
276+
elif parsed_args.no_share:
277+
filters['shared'] = False
278+
if parsed_args.default:
279+
filters['is_default'] = True
280+
elif parsed_args.no_default:
281+
filters['is_default'] = False
282+
if parsed_args.project:
283+
project_id = identity_common.find_project(
284+
identity_client,
285+
parsed_args.project,
286+
parsed_args.project_domain,
287+
).id
288+
filters['tenant_id'] = project_id
289+
if parsed_args.name is not None:
290+
filters['name'] = parsed_args.name
291+
if parsed_args.address_scope:
292+
address_scope = network_client.find_address_scope(
293+
parsed_args.address_scope,
294+
ignore_missing=False)
295+
filters['address_scope_id'] = address_scope.id
296+
data = network_client.subnet_pools(**filters)
297+
298+
headers = ('ID', 'Name', 'Prefixes')
299+
columns = ('id', 'name', 'prefixes')
234300
if parsed_args.long:
235-
headers = (
236-
'ID',
237-
'Name',
238-
'Prefixes',
239-
'Default Prefix Length',
240-
'Address Scope',
241-
'Default Subnet Pool',
242-
'Shared',
243-
)
244-
columns = (
245-
'id',
246-
'name',
247-
'prefixes',
248-
'default_prefixlen',
249-
'address_scope_id',
250-
'is_default',
251-
'shared',
252-
)
253-
else:
254-
headers = (
255-
'ID',
256-
'Name',
257-
'Prefixes',
258-
)
259-
columns = (
260-
'id',
261-
'name',
262-
'prefixes',
263-
)
301+
headers += ('Default Prefix Length', 'Address Scope',
302+
'Default Subnet Pool', 'Shared')
303+
columns += ('default_prefixlen', 'address_scope_id',
304+
'is_default', 'shared')
264305

265306
return (headers,
266307
(utils.get_item_properties(

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

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,144 @@ def test_subnet_pool_list_long(self):
400400
self.assertEqual(self.columns_long, columns)
401401
self.assertEqual(self.data_long, list(data))
402402

403+
def test_subnet_pool_list_no_share(self):
404+
arglist = [
405+
'--no-share',
406+
]
407+
verifylist = [
408+
('share', False),
409+
]
410+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
411+
412+
columns, data = self.cmd.take_action(parsed_args)
413+
filters = {'shared': False}
414+
415+
self.network.subnet_pools.assert_called_once_with(**filters)
416+
self.assertEqual(self.columns, columns)
417+
self.assertEqual(self.data, list(data))
418+
419+
def test_subnet_pool_list_share(self):
420+
arglist = [
421+
'--share',
422+
]
423+
verifylist = [
424+
('share', True),
425+
]
426+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
427+
428+
columns, data = self.cmd.take_action(parsed_args)
429+
filters = {'shared': True}
430+
431+
self.network.subnet_pools.assert_called_once_with(**filters)
432+
self.assertEqual(self.columns, columns)
433+
self.assertEqual(self.data, list(data))
434+
435+
def test_subnet_pool_list_no_default(self):
436+
arglist = [
437+
'--no-default',
438+
]
439+
verifylist = [
440+
('default', False),
441+
]
442+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
443+
444+
columns, data = self.cmd.take_action(parsed_args)
445+
filters = {'is_default': False}
446+
447+
self.network.subnet_pools.assert_called_once_with(**filters)
448+
self.assertEqual(self.columns, columns)
449+
self.assertEqual(self.data, list(data))
450+
451+
def test_subnet_pool_list_default(self):
452+
arglist = [
453+
'--default',
454+
]
455+
verifylist = [
456+
('default', True),
457+
]
458+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
459+
460+
columns, data = self.cmd.take_action(parsed_args)
461+
filters = {'is_default': True}
462+
463+
self.network.subnet_pools.assert_called_once_with(**filters)
464+
self.assertEqual(self.columns, columns)
465+
self.assertEqual(self.data, list(data))
466+
467+
def test_subnet_pool_list_project(self):
468+
project = identity_fakes_v3.FakeProject.create_one_project()
469+
self.projects_mock.get.return_value = project
470+
arglist = [
471+
'--project', project.id,
472+
]
473+
verifylist = [
474+
('project', project.id),
475+
]
476+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
477+
478+
columns, data = self.cmd.take_action(parsed_args)
479+
filters = {'tenant_id': project.id}
480+
481+
self.network.subnet_pools.assert_called_once_with(**filters)
482+
self.assertEqual(self.columns, columns)
483+
self.assertEqual(self.data, list(data))
484+
485+
def test_subnet_pool_list_project_domain(self):
486+
project = identity_fakes_v3.FakeProject.create_one_project()
487+
self.projects_mock.get.return_value = project
488+
arglist = [
489+
'--project', project.id,
490+
'--project-domain', project.domain_id,
491+
]
492+
verifylist = [
493+
('project', project.id),
494+
('project_domain', project.domain_id),
495+
]
496+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
497+
498+
columns, data = self.cmd.take_action(parsed_args)
499+
filters = {'tenant_id': project.id}
500+
501+
self.network.subnet_pools.assert_called_once_with(**filters)
502+
self.assertEqual(self.columns, columns)
503+
self.assertEqual(self.data, list(data))
504+
505+
def test_subnet_pool_list_name(self):
506+
subnet_pool = network_fakes.FakeSubnetPool.create_one_subnet_pool()
507+
self.network.find_network = mock.Mock(return_value=subnet_pool)
508+
arglist = [
509+
'--name', subnet_pool.name,
510+
]
511+
verifylist = [
512+
('name', subnet_pool.name),
513+
]
514+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
515+
516+
columns, data = self.cmd.take_action(parsed_args)
517+
filters = {'name': subnet_pool.name}
518+
519+
self.network.subnet_pools.assert_called_once_with(**filters)
520+
self.assertEqual(self.columns, columns)
521+
self.assertEqual(self.data, list(data))
522+
523+
def test_subnet_pool_list_address_scope(self):
524+
addr_scope = network_fakes.FakeAddressScope.create_one_address_scope()
525+
self.network.find_address_scope = mock.Mock(return_value=addr_scope)
526+
arglist = [
527+
'--address-scope', addr_scope.id,
528+
]
529+
verifylist = [
530+
('address_scope', addr_scope.id),
531+
]
532+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
533+
534+
columns, data = self.cmd.take_action(parsed_args)
535+
filters = {'address_scope_id': addr_scope.id}
536+
537+
self.network.subnet_pools.assert_called_once_with(**filters)
538+
self.assertEqual(self.columns, columns)
539+
self.assertEqual(self.data, list(data))
540+
403541

404542
class TestSetSubnetPool(TestSubnetPool):
405543

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
features:
3+
- |
4+
Make ``subnet pool list`` command supports listing up subnets with
5+
some filtering options by adding ``--share`` and ``--no-share``,
6+
``--project`` and ``--project-domain``, ``--default`` and ``--no-default``,
7+
``--name``, ``--address-scope`` options to the command.
8+
[Bug `1613926 <https://bugs.launchpad.net/bugs/1613926>`_]

0 commit comments

Comments
 (0)