Skip to content

Commit a42664c

Browse files
Jenkinsopenstack-gerrit
authored andcommitted
Merge "Implement "network rbac set" command"
2 parents ab32f37 + fac3214 commit a42664c

6 files changed

Lines changed: 151 additions & 6 deletions

File tree

doc/source/command-objects/network-rbac.rst

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,32 @@ List network RBAC policies
8080
8181
os network rbac list
8282
83+
network rbac set
84+
----------------
85+
86+
Set network RBAC policy properties
87+
88+
.. program:: network rbac set
89+
.. code:: bash
90+
91+
os network rbac set
92+
[--target-project <target-project> [--target-project-domain <target-project-domain>]]
93+
<rbac-policy>
94+
95+
.. option:: --target-project <target-project>
96+
97+
The project to which the RBAC policy will be enforced (name or ID)
98+
99+
.. option:: --target-project-domain <target-project-domain>
100+
101+
Domain the target project belongs to (name or ID).
102+
This can be used in case collisions between project names exist.
103+
104+
.. _network_rbac_set-rbac-policy:
105+
.. describe:: <rbac-policy>
106+
107+
RBAC policy to be modified (ID only)
108+
83109
network rbac show
84110
-----------------
85111

functional/tests/network/v2/test_network_rbac.py

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,15 @@
1212

1313
import uuid
1414

15+
import testtools
16+
1517
from functional.common import test
1618

1719

1820
class NetworkRBACTests(test.TestCase):
1921
"""Functional tests for network rbac. """
2022
NET_NAME = uuid.uuid4().hex
23+
PROJECT_NAME = uuid.uuid4().hex
2124
OBJECT_ID = None
2225
ID = None
2326
HEADERS = ['ID']
@@ -39,10 +42,10 @@ def setUpClass(cls):
3942

4043
@classmethod
4144
def tearDownClass(cls):
42-
raw_output = cls.openstack('network rbac delete ' + cls.ID)
43-
cls.assertOutput('', raw_output)
44-
raw_output = cls.openstack('network delete ' + cls.OBJECT_ID)
45-
cls.assertOutput('', raw_output)
45+
raw_output_rbac = cls.openstack('network rbac delete ' + cls.ID)
46+
raw_output_network = cls.openstack('network delete ' + cls.OBJECT_ID)
47+
cls.assertOutput('', raw_output_rbac)
48+
cls.assertOutput('', raw_output_network)
4649

4750
def test_network_rbac_list(self):
4851
opts = self.get_opts(self.HEADERS)
@@ -53,3 +56,21 @@ def test_network_rbac_show(self):
5356
opts = self.get_opts(self.FIELDS)
5457
raw_output = self.openstack('network rbac show ' + self.ID + opts)
5558
self.assertEqual(self.ID + "\n", raw_output)
59+
60+
# TODO(Huanxuan Ao): This test can pass after bug
61+
# https://bugs.launchpad.net/python-openstackclient/+bug/1608903 fixed.
62+
@testtools.skip(
63+
'Skip because of the bug '
64+
'https://bugs.launchpad.net/python-openstackclient/+bug/1608903')
65+
def test_network_rbac_set(self):
66+
opts = self.get_opts(self.FIELDS)
67+
project_id = self.openstack(
68+
'project create ' + self.PROJECT_NAME + opts)
69+
self.openstack('network rbac set ' + self.ID +
70+
' --target-project ' + self.PROJECT_NAME)
71+
opts = self.get_opts(['target_project'])
72+
raw_output_rbac = self.openstack('network rbac show ' + self.ID + opts)
73+
raw_output_project = self.openstack(
74+
'project delete ' + self.PROJECT_NAME)
75+
self.assertEqual(project_id, raw_output_rbac)
76+
self.assertOutput('', raw_output_project)

openstackclient/network/v2/network_rbac.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,47 @@ def take_action(self, parsed_args):
186186
) for s in data))
187187

188188

189+
class SetNetworkRBAC(command.Command):
190+
"""Set network RBAC policy properties"""
191+
192+
def get_parser(self, prog_name):
193+
parser = super(SetNetworkRBAC, self).get_parser(prog_name)
194+
parser.add_argument(
195+
'rbac_policy',
196+
metavar="<rbac-policy>",
197+
help=_("RBAC policy to be modified (ID only)")
198+
)
199+
parser.add_argument(
200+
'--target-project',
201+
metavar="<target-project>",
202+
help=_('The project to which the RBAC policy '
203+
'will be enforced (name or ID)')
204+
)
205+
parser.add_argument(
206+
'--target-project-domain',
207+
metavar='<target-project-domain>',
208+
help=_('Domain the target project belongs to (name or ID). '
209+
'This can be used in case collisions between project names '
210+
'exist.'),
211+
)
212+
return parser
213+
214+
def take_action(self, parsed_args):
215+
client = self.app.client_manager.network
216+
obj = client.find_rbac_policy(parsed_args.rbac_policy,
217+
ignore_missing=False)
218+
attrs = {}
219+
if parsed_args.target_project:
220+
identity_client = self.app.client_manager.identity
221+
project_id = identity_common.find_project(
222+
identity_client,
223+
parsed_args.target_project,
224+
parsed_args.target_project_domain,
225+
).id
226+
attrs['target_tenant'] = project_id
227+
client.update_rbac_policy(obj, **attrs)
228+
229+
189230
class ShowNetworkRBAC(command.ShowOne):
190231
"""Display network RBAC policy details"""
191232

openstackclient/tests/network/v2/test_network_rbac.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,62 @@ def test_network_rbac_list(self):
317317
self.assertEqual(self.data, list(data))
318318

319319

320+
class TestSetNetworkRBAC(TestNetworkRBAC):
321+
322+
project = identity_fakes_v3.FakeProject.create_one_project()
323+
rbac_policy = network_fakes.FakeNetworkRBAC.create_one_network_rbac(
324+
attrs={'target_tenant': project.id})
325+
326+
def setUp(self):
327+
super(TestSetNetworkRBAC, self).setUp()
328+
329+
# Get the command object to test
330+
self.cmd = network_rbac.SetNetworkRBAC(self.app, self.namespace)
331+
332+
self.network.find_rbac_policy = mock.Mock(
333+
return_value=self.rbac_policy)
334+
self.network.update_rbac_policy = mock.Mock(return_value=None)
335+
self.projects_mock.get.return_value = self.project
336+
337+
def test_network_rbac_set_nothing(self):
338+
arglist = [
339+
self.rbac_policy.id,
340+
]
341+
verifylist = [
342+
('rbac_policy', self.rbac_policy.id),
343+
]
344+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
345+
346+
result = self.cmd.take_action(parsed_args)
347+
self.network.find_rbac_policy.assert_called_once_with(
348+
self.rbac_policy.id, ignore_missing=False
349+
)
350+
attrs = {}
351+
self.network.update_rbac_policy.assert_called_once_with(
352+
self.rbac_policy, **attrs)
353+
self.assertIsNone(result)
354+
355+
def test_network_rbac_set(self):
356+
arglist = [
357+
'--target-project', self.project.id,
358+
self.rbac_policy.id,
359+
]
360+
verifylist = [
361+
('target_project', self.project.id),
362+
('rbac_policy', self.rbac_policy.id),
363+
]
364+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
365+
366+
result = self.cmd.take_action(parsed_args)
367+
self.network.find_rbac_policy.assert_called_once_with(
368+
self.rbac_policy.id, ignore_missing=False
369+
)
370+
attrs = {'target_tenant': self.project.id}
371+
self.network.update_rbac_policy.assert_called_once_with(
372+
self.rbac_policy, **attrs)
373+
self.assertIsNone(result)
374+
375+
320376
class TestShowNetworkRBAC(TestNetworkRBAC):
321377

322378
rbac_policy = network_fakes.FakeNetworkRBAC.create_one_network_rbac()
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
22
features:
3-
- Add ``network rbac list``, ``network rbac show``, ``network rbac create``
4-
and ``network rbac delete`` commands.
3+
- Add ``network rbac list``, ``network rbac show``, ``network rbac create``,
4+
``network rbac delete`` and ``network rbac set`` commands.
55
[Blueprint `neutron-client-rbac <https://blueprints.launchpad.net/python-openstackclient/+spec/neutron-client-rbac>`_]

setup.cfg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,7 @@ openstack.network.v2 =
364364
network_rbac_create = openstackclient.network.v2.network_rbac:CreateNetworkRBAC
365365
network_rbac_delete = openstackclient.network.v2.network_rbac:DeleteNetworkRBAC
366366
network_rbac_list = openstackclient.network.v2.network_rbac:ListNetworkRBAC
367+
network_rbac_set = openstackclient.network.v2.network_rbac:SetNetworkRBAC
367368
network_rbac_show = openstackclient.network.v2.network_rbac:ShowNetworkRBAC
368369

369370
network_segment_list = openstackclient.network.v2.network_segment:ListNetworkSegment

0 commit comments

Comments
 (0)