diff options
| author | Huanxuan Ao <huanxuan.ao@easystack.cn> | 2016-08-02 19:30:25 +0800 |
|---|---|---|
| committer | Huanxuan Ao <huanxuan.ao@easystack.cn> | 2016-08-03 10:49:57 +0800 |
| commit | fac321458166cccffc0eb1d13a986a01c9e6d33e (patch) | |
| tree | 44cdcd6377652ae8b607678e645d4dc7cd6aff93 /openstackclient | |
| parent | 2a1c2b227581477a1d010b5dbc5e92657b3ba372 (diff) | |
| download | python-openstackclient-fac321458166cccffc0eb1d13a986a01c9e6d33e.tar.gz | |
Implement "network rbac set" command
Add "network rbac set" command which just supports
setting a target project.
Also, This patch adds the doc, unit test and functional test.
But there is a bug of showing network RBAC
https://bugs.launchpad.net/python-openstacksdk/+bug/1608903
We need to skip the functional test before this bug fixed.
Change-Id: I756f448bb333cf1098a735e57a1c5dc4edf195d4
Partially-Implements: blueprint neutron-client-rbac
Diffstat (limited to 'openstackclient')
| -rw-r--r-- | openstackclient/network/v2/network_rbac.py | 41 | ||||
| -rw-r--r-- | openstackclient/tests/network/v2/test_network_rbac.py | 56 |
2 files changed, 97 insertions, 0 deletions
diff --git a/openstackclient/network/v2/network_rbac.py b/openstackclient/network/v2/network_rbac.py index 62968376..f4dfd4e7 100644 --- a/openstackclient/network/v2/network_rbac.py +++ b/openstackclient/network/v2/network_rbac.py @@ -186,6 +186,47 @@ class ListNetworkRBAC(command.Lister): ) for s in data)) +class SetNetworkRBAC(command.Command): + """Set network RBAC policy properties""" + + def get_parser(self, prog_name): + parser = super(SetNetworkRBAC, self).get_parser(prog_name) + parser.add_argument( + 'rbac_policy', + metavar="<rbac-policy>", + help=_("RBAC policy to be modified (ID only)") + ) + parser.add_argument( + '--target-project', + metavar="<target-project>", + help=_('The project to which the RBAC policy ' + 'will be enforced (name or ID)') + ) + parser.add_argument( + '--target-project-domain', + metavar='<target-project-domain>', + help=_('Domain the target project belongs to (name or ID). ' + 'This can be used in case collisions between project names ' + 'exist.'), + ) + return parser + + def take_action(self, parsed_args): + client = self.app.client_manager.network + obj = client.find_rbac_policy(parsed_args.rbac_policy, + ignore_missing=False) + attrs = {} + if parsed_args.target_project: + identity_client = self.app.client_manager.identity + project_id = identity_common.find_project( + identity_client, + parsed_args.target_project, + parsed_args.target_project_domain, + ).id + attrs['target_tenant'] = project_id + client.update_rbac_policy(obj, **attrs) + + class ShowNetworkRBAC(command.ShowOne): """Display network RBAC policy details""" diff --git a/openstackclient/tests/network/v2/test_network_rbac.py b/openstackclient/tests/network/v2/test_network_rbac.py index 5d6e9cfa..6255ada7 100644 --- a/openstackclient/tests/network/v2/test_network_rbac.py +++ b/openstackclient/tests/network/v2/test_network_rbac.py @@ -317,6 +317,62 @@ class TestListNetworkRABC(TestNetworkRBAC): self.assertEqual(self.data, list(data)) +class TestSetNetworkRBAC(TestNetworkRBAC): + + project = identity_fakes_v3.FakeProject.create_one_project() + rbac_policy = network_fakes.FakeNetworkRBAC.create_one_network_rbac( + attrs={'target_tenant': project.id}) + + def setUp(self): + super(TestSetNetworkRBAC, self).setUp() + + # Get the command object to test + self.cmd = network_rbac.SetNetworkRBAC(self.app, self.namespace) + + self.network.find_rbac_policy = mock.Mock( + return_value=self.rbac_policy) + self.network.update_rbac_policy = mock.Mock(return_value=None) + self.projects_mock.get.return_value = self.project + + def test_network_rbac_set_nothing(self): + arglist = [ + self.rbac_policy.id, + ] + verifylist = [ + ('rbac_policy', self.rbac_policy.id), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + result = self.cmd.take_action(parsed_args) + self.network.find_rbac_policy.assert_called_once_with( + self.rbac_policy.id, ignore_missing=False + ) + attrs = {} + self.network.update_rbac_policy.assert_called_once_with( + self.rbac_policy, **attrs) + self.assertIsNone(result) + + def test_network_rbac_set(self): + arglist = [ + '--target-project', self.project.id, + self.rbac_policy.id, + ] + verifylist = [ + ('target_project', self.project.id), + ('rbac_policy', self.rbac_policy.id), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + result = self.cmd.take_action(parsed_args) + self.network.find_rbac_policy.assert_called_once_with( + self.rbac_policy.id, ignore_missing=False + ) + attrs = {'target_tenant': self.project.id} + self.network.update_rbac_policy.assert_called_once_with( + self.rbac_policy, **attrs) + self.assertIsNone(result) + + class TestShowNetworkRBAC(TestNetworkRBAC): rbac_policy = network_fakes.FakeNetworkRBAC.create_one_network_rbac() |
