Skip to content

Commit a176872

Browse files
Jenkinsopenstack-gerrit
authored andcommitted
Merge "Add filtering options to the address scope list command"
2 parents cc4ede8 + d12aa86 commit a176872

4 files changed

Lines changed: 193 additions & 1 deletion

File tree

doc/source/command-objects/address-scope.rst

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,35 @@ List address scopes
7272
.. code:: bash
7373
7474
os address scope list
75+
[--name <name>]
76+
[--ip-version <ip-version>]
77+
[--project <project> [--project-domain <project-domain>]]
78+
[--share | --no-share]
79+
80+
.. option:: --name <name>
81+
82+
List only address scopes of given name in output
83+
84+
.. option:: --ip-version <ip-version>
85+
86+
List address scopes of given IP version networks (4 or 6)
87+
88+
.. option:: --project <project>
89+
90+
List address scopes according to their project (name or ID)
91+
92+
.. option:: --project-domain <project-domain>
93+
94+
Domain the project belongs to (name or ID).
95+
This can be used in case collisions between project names exist.
96+
97+
.. option:: --share
98+
99+
List address scopes shared between projects
100+
101+
.. option:: --no-share
102+
103+
List address scopes not shared between projects
75104
76105
address scope set
77106
-----------------

openstackclient/network/v2/address_scope.py

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,9 +140,48 @@ def take_action(self, parsed_args):
140140
raise exceptions.CommandError(msg)
141141

142142

143+
# TODO(yanxing'an): Use the SDK resource mapped attribute names once the
144+
# OSC minimum requirements include SDK 1.0.
143145
class ListAddressScope(command.Lister):
144146
_description = _("List address scopes")
145147

148+
def get_parser(self, prog_name):
149+
parser = super(ListAddressScope, self).get_parser(prog_name)
150+
151+
parser.add_argument(
152+
'--name',
153+
metavar='<name>',
154+
help=_("List only address scopes of given name in output")
155+
)
156+
parser.add_argument(
157+
'--ip-version',
158+
type=int,
159+
choices=[4, 6],
160+
metavar='<ip-version>',
161+
dest='ip_version',
162+
help=_("List address scopes of given IP version networks (4 or 6)")
163+
)
164+
parser.add_argument(
165+
'--project',
166+
metavar="<project>",
167+
help=_("List address scopes according to their project "
168+
"(name or ID)")
169+
)
170+
identity_common.add_project_domain_option_to_parser(parser)
171+
172+
shared_group = parser.add_mutually_exclusive_group()
173+
shared_group.add_argument(
174+
'--share',
175+
action='store_true',
176+
help=_("List address scopes shared between projects")
177+
)
178+
shared_group.add_argument(
179+
'--no-share',
180+
action='store_true',
181+
help=_("List address scopes not shared between projects")
182+
)
183+
return parser
184+
146185
def take_action(self, parsed_args):
147186
client = self.app.client_manager.network
148187
columns = (
@@ -159,7 +198,27 @@ def take_action(self, parsed_args):
159198
'Shared',
160199
'Project',
161200
)
162-
data = client.address_scopes()
201+
attrs = {}
202+
if parsed_args.name:
203+
attrs['name'] = parsed_args.name
204+
if parsed_args.ip_version:
205+
attrs['ip_version'] = parsed_args.ip_version
206+
if parsed_args.share:
207+
attrs['shared'] = True
208+
attrs['is_shared'] = True
209+
if parsed_args.no_share:
210+
attrs['shared'] = False
211+
attrs['is_shared'] = False
212+
if 'project' in parsed_args and parsed_args.project is not None:
213+
identity_client = self.app.client_manager.identity
214+
project_id = identity_common.find_project(
215+
identity_client,
216+
parsed_args.project,
217+
parsed_args.project_domain,
218+
).id
219+
attrs['tenant_id'] = project_id
220+
attrs['project_id'] = project_id
221+
data = client.address_scopes(**attrs)
163222

164223
return (column_headers,
165224
(utils.get_item_properties(

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

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,104 @@ def test_address_scope_list(self):
275275
self.assertEqual(self.columns, columns)
276276
self.assertEqual(self.data, list(data))
277277

278+
def test_address_scope_list_name(self):
279+
arglist = [
280+
'--name', self.address_scopes[0].name,
281+
]
282+
verifylist = [
283+
('name', self.address_scopes[0].name),
284+
]
285+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
286+
columns, data = self.cmd.take_action(parsed_args)
287+
288+
self.network.address_scopes.assert_called_once_with(
289+
**{'name': self.address_scopes[0].name})
290+
self.assertEqual(self.columns, columns)
291+
self.assertEqual(self.data, list(data))
292+
293+
def test_address_scope_list_ip_version(self):
294+
arglist = [
295+
'--ip-version', str(4),
296+
]
297+
verifylist = [
298+
('ip_version', 4),
299+
]
300+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
301+
columns, data = self.cmd.take_action(parsed_args)
302+
303+
self.network.address_scopes.assert_called_once_with(
304+
**{'ip_version': 4})
305+
self.assertEqual(self.columns, columns)
306+
self.assertEqual(self.data, list(data))
307+
308+
def test_address_scope_list_project(self):
309+
project = identity_fakes_v3.FakeProject.create_one_project()
310+
self.projects_mock.get.return_value = project
311+
arglist = [
312+
'--project', project.id,
313+
]
314+
verifylist = [
315+
('project', project.id),
316+
]
317+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
318+
columns, data = self.cmd.take_action(parsed_args)
319+
320+
self.network.address_scopes.assert_called_once_with(
321+
**{'tenant_id': project.id, 'project_id': project.id})
322+
self.assertEqual(self.columns, columns)
323+
self.assertEqual(self.data, list(data))
324+
325+
def test_address_scope_project_domain(self):
326+
project = identity_fakes_v3.FakeProject.create_one_project()
327+
self.projects_mock.get.return_value = project
328+
arglist = [
329+
'--project', project.id,
330+
'--project-domain', project.domain_id,
331+
]
332+
verifylist = [
333+
('project', project.id),
334+
]
335+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
336+
337+
columns, data = self.cmd.take_action(parsed_args)
338+
filters = {'tenant_id': project.id, 'project_id': project.id}
339+
340+
self.network.address_scopes.assert_called_once_with(**filters)
341+
self.assertEqual(self.columns, columns)
342+
self.assertEqual(self.data, list(data))
343+
344+
def test_address_scope_list_share(self):
345+
arglist = [
346+
'--share',
347+
]
348+
verifylist = [
349+
('share', True),
350+
]
351+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
352+
columns, data = self.cmd.take_action(parsed_args)
353+
354+
self.network.address_scopes.assert_called_once_with(
355+
**{'shared': True, 'is_shared': True}
356+
)
357+
self.assertEqual(self.columns, columns)
358+
self.assertEqual(self.data, list(data))
359+
360+
def test_address_scope_list_no_share(self):
361+
arglist = [
362+
'--no-share',
363+
]
364+
verifylist = [
365+
('no_share', True),
366+
]
367+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
368+
columns, data = self.cmd.take_action(parsed_args)
369+
370+
self.network.address_scopes.assert_called_once_with(
371+
**{'shared': False, 'is_shared': False}
372+
)
373+
self.assertEqual(self.columns, columns)
374+
self.assertEqual(self.data, list(data))
375+
278376

279377
class TestSetAddressScope(TestAddressScope):
280378

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
features:
3+
- |
4+
Add ``--name``, ``--ip-version``, ``--project``, ``--project-domain``,
5+
``--share``, ``--no-share`` options to the ``address scope list`` command.
6+
[Bug `1636046 <https://bugs.launchpad.net/bugs/1636046>`_]

0 commit comments

Comments
 (0)