Skip to content

Commit 92950b6

Browse files
committed
Add support for removing volume-type-access
OSC does not support to remove volume type access to project. This feature will provide support to remove volume type access from project. Closes-Bug:#1554890 Implements: bp cinder-command-support Change-Id: I029a4292da05f028e8937962cb845ec6e00b0279
1 parent e80048d commit 92950b6

4 files changed

Lines changed: 132 additions & 3 deletions

File tree

doc/source/command-objects/volume-type.rst

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,12 +151,25 @@ Unset volume type properties
151151
152152
os volume type unset
153153
[--property <key>]
154+
[--project <project>]
155+
[--project-domain <project-domain>]
154156
<volume-type>
155157
156158
.. option:: --property <key>
157159

158160
Property to remove from volume type (repeat option to remove multiple properties)
159161

162+
.. option:: --project <project>
163+
164+
Removes volume type access from project (name or ID) (admin only)
165+
166+
*Volume version 2 only*
167+
168+
.. option:: --project-domain <project-domain>
169+
170+
Domain the project belongs to (name or ID).
171+
This can be used in case collisions between project names exist.
172+
160173
.. _volume_type_unset-volume-type:
161174
.. describe:: <volume-type>
162175

openstackclient/tests/volume/v2/test_type.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,14 @@ def setUp(self):
394394
loaded=True
395395
)
396396

397+
# Return a project
398+
self.projects_mock.get.return_value = fakes.FakeResource(
399+
None,
400+
copy.deepcopy(identity_fakes.PROJECT),
401+
loaded=True,
402+
)
403+
404+
# Get the command object to test
397405
self.cmd = volume_type.UnsetVolumeType(self.app, None)
398406

399407
def test_type_unset(self):
@@ -413,3 +421,53 @@ def test_type_unset(self):
413421

414422
result = self.types_mock.get.return_value._keys
415423
self.assertNotIn('property', result)
424+
425+
def test_type_unset_project_access(self):
426+
arglist = [
427+
'--project', identity_fakes.project_id,
428+
volume_fakes.type_id,
429+
]
430+
verifylist = [
431+
('project', identity_fakes.project_id),
432+
('volume_type', volume_fakes.type_id),
433+
]
434+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
435+
436+
result = self.cmd.take_action(parsed_args)
437+
self.assertIsNone(result)
438+
439+
self.types_access_mock.remove_project_access.assert_called_with(
440+
volume_fakes.type_id,
441+
identity_fakes.project_id,
442+
)
443+
444+
def test_type_unset_not_called_without_project_argument(self):
445+
arglist = [
446+
'--project', '',
447+
volume_fakes.type_id,
448+
]
449+
verifylist = [
450+
('project', ''),
451+
('volume_type', volume_fakes.type_id),
452+
]
453+
454+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
455+
456+
result = self.cmd.take_action(parsed_args)
457+
self.assertIsNone(result)
458+
459+
self.assertFalse(self.types_access_mock.remove_project_access.called)
460+
461+
def test_type_unset_failed_with_missing_volume_type_argument(self):
462+
arglist = [
463+
'--project', 'identity_fakes.project_id',
464+
]
465+
verifylist = [
466+
('project', 'identity_fakes.project_id'),
467+
]
468+
469+
self.assertRaises(tests_utils.ParserException,
470+
self.check_parser,
471+
self.cmd,
472+
arglist,
473+
verifylist)

openstackclient/volume/v2/volume_type.py

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -261,17 +261,57 @@ def get_parser(self, prog_name):
261261
parser.add_argument(
262262
'--property',
263263
metavar='<key>',
264-
default=[],
265-
required=True,
266264
help='Remove a property from this volume type '
267265
'(repeat option to remove multiple properties)',
268266
)
267+
parser.add_argument(
268+
'--project',
269+
metavar='<project>',
270+
help='Removes volume type access to project (name or ID) '
271+
' (admin only)',
272+
)
273+
identity_common.add_project_domain_option_to_parser(parser)
274+
269275
return parser
270276

271277
def take_action(self, parsed_args):
272278
volume_client = self.app.client_manager.volume
279+
identity_client = self.app.client_manager.identity
280+
273281
volume_type = utils.find_resource(
274282
volume_client.volume_types,
275283
parsed_args.volume_type,
276284
)
277-
volume_type.unset_keys(parsed_args.property)
285+
286+
if (not parsed_args.property
287+
and not parsed_args.project):
288+
self.app.log.error("No changes requested\n")
289+
return
290+
291+
result = 0
292+
if parsed_args.property:
293+
try:
294+
volume_type.unset_keys(parsed_args.property)
295+
except Exception as e:
296+
self.app.log.error("Failed to unset volume type property: " +
297+
str(e))
298+
result += 1
299+
300+
if parsed_args.project:
301+
project_info = None
302+
try:
303+
project_info = identity_common.find_project(
304+
identity_client,
305+
parsed_args.project,
306+
parsed_args.project_domain)
307+
308+
volume_client.volume_type_access.remove_project_access(
309+
volume_type.id, project_info.id)
310+
except Exception as e:
311+
self.app.log.error("Failed to remove volume type access from"
312+
" project: " + str(e))
313+
result += 1
314+
315+
if result > 0:
316+
raise exceptions.CommandError("Command Failed: One or more of the"
317+
" operations failed")
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
---
2+
features:
3+
- |
4+
Added support for removing volume type access to project.
5+
6+
By default, volumes types are public.
7+
To create a private volume type the ``--private`` option must be included
8+
in the ``volume type create`` command.
9+
10+
To control access to a private volume type, user needs to add or remove
11+
access of a private volume type to project.
12+
13+
This feature enables user to remove private volume type access to a
14+
project using below command:
15+
16+
``volume type unset --project <project> <volume_type>``
17+
18+
[Bug 1554890 'https://bugs.launchpad.net/python-openstackclient/+bug/1554890'_]

0 commit comments

Comments
 (0)