Skip to content

Commit 4d7d7e6

Browse files
committed
network: Add tenant project filter for RBAC list
Implements a new parser argument "--target-project" to list RBAC policies for a specific tenant project only. This uses the already existing server-side query parameter "target_tenant". Story: 2009937 Task: 44824 Depends-On: https://review.opendev.org/c/openstack/openstacksdk/+/834442 Change-Id: I83ff07041a022e8795e3c5550c6a7aabb0c0d8c8 Signed-off-by: Jan Hartkopf <jhartkopf@inovex.de>
1 parent 7df94c9 commit 4d7d7e6

3 files changed

Lines changed: 39 additions & 0 deletions

File tree

openstackclient/network/v2/network_rbac.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,11 @@ def get_parser(self, prog_name):
217217
help=_('List network RBAC policies according to given '
218218
'action ("access_as_external" or "access_as_shared")')
219219
)
220+
parser.add_argument(
221+
'--target-project',
222+
metavar='<target-project>',
223+
help=_('List network RBAC policies for a specific target project')
224+
)
220225
parser.add_argument(
221226
'--long',
222227
action='store_true',
@@ -247,6 +252,16 @@ def take_action(self, parsed_args):
247252
query['object_type'] = parsed_args.type
248253
if parsed_args.action is not None:
249254
query['action'] = parsed_args.action
255+
if parsed_args.target_project is not None:
256+
project_id = "*"
257+
258+
if parsed_args.target_project != "*":
259+
identity_client = self.app.client_manager.identity
260+
project_id = identity_common.find_project(
261+
identity_client,
262+
parsed_args.target_project,
263+
).id
264+
query['target_project_id'] = project_id
250265

251266
data = client.rbac_policies(**query)
252267

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,9 @@ def setUp(self):
405405

406406
self.network.rbac_policies = mock.Mock(return_value=self.rbac_policies)
407407

408+
self.project = identity_fakes_v3.FakeProject.create_one_project()
409+
self.projects_mock.get.return_value = self.project
410+
408411
def test_network_rbac_list(self):
409412
arglist = []
410413
verifylist = []
@@ -466,6 +469,22 @@ def test_network_rbac_list_with_long(self):
466469
self.assertEqual(self.columns_long, columns)
467470
self.assertEqual(self.data_long, list(data))
468471

472+
def test_network_rbac_list_target_project_opt(self):
473+
arglist = [
474+
'--target-project', self.rbac_policies[0].target_project_id, ]
475+
verifylist = [
476+
('target_project', self.rbac_policies[0].target_project_id)]
477+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
478+
479+
# DisplayCommandBase.take_action() returns two tuples
480+
columns, data = self.cmd.take_action(parsed_args)
481+
482+
self.network.rbac_policies.assert_called_with(**{
483+
'target_project_id': self.project.id
484+
})
485+
self.assertEqual(self.columns, columns)
486+
self.assertEqual(self.data, list(data))
487+
469488

470489
class TestSetNetworkRBAC(TestNetworkRBAC):
471490

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
features:
3+
- |
4+
Add a new argument ``--target-project`` to the ``network rbac list``
5+
command to filter for a specific target project.

0 commit comments

Comments
 (0)