Skip to content

Commit e310682

Browse files
author
Huanxuan Ao
committed
Add "--project" option to "volume type create" command
Add "--project" and "--project-domain" options to "volume type create" command. We can use these options to add the type access to a given project when we create the volume type. Change-Id: I483a6b61dae137682c3d1f7527531b40e508ba92 Closes-Bug: #1602169
1 parent 5a21eb2 commit e310682

4 files changed

Lines changed: 67 additions & 1 deletion

File tree

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ Create new volume type
1616
[--description <description>]
1717
[--public | --private]
1818
[--property <key=value> [...] ]
19+
[--project <project>]
20+
[--project-domain <project-domain>]
1921
<name>
2022
2123
.. option:: --description <description>
@@ -40,6 +42,20 @@ Create new volume type
4042

4143
Set a property on this volume type (repeat option to set multiple properties)
4244

45+
.. option:: --project <project>
46+
47+
Allow <project> to access private type (name or ID)
48+
(Must be used with :option:`--private` option)
49+
50+
*Volume version 2 only*
51+
52+
.. option:: --project-domain <project-domain>
53+
54+
Domain the project belongs to (name or ID).
55+
This can be used in case collisions between project names exist.
56+
57+
*Volume version 2 only*
58+
4359
.. _volume_type_create-name:
4460
.. describe:: <name>
4561

openstackclient/tests/volume/v2/test_type.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
import copy
1616

17+
from osc_lib import exceptions
1718
from osc_lib import utils
1819

1920
from openstackclient.tests import fakes
@@ -41,6 +42,7 @@ def setUp(self):
4142

4243
class TestTypeCreate(TestType):
4344

45+
project = identity_fakes.FakeProject.create_one_project()
4446
columns = (
4547
'description',
4648
'id',
@@ -58,6 +60,7 @@ def setUp(self):
5860
)
5961

6062
self.types_mock.create.return_value = self.new_volume_type
63+
self.projects_mock.get.return_value = self.project
6164
# Get the command object to test
6265
self.cmd = volume_type.CreateVolumeType(self.app, None)
6366

@@ -89,12 +92,14 @@ def test_type_create_private(self):
8992
arglist = [
9093
"--description", self.new_volume_type.description,
9194
"--private",
95+
"--project", self.project.id,
9296
self.new_volume_type.name,
9397
]
9498
verifylist = [
9599
("description", self.new_volume_type.description),
96100
("public", False),
97101
("private", True),
102+
("project", self.project.id),
98103
("name", self.new_volume_type.name),
99104
]
100105
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -109,6 +114,21 @@ def test_type_create_private(self):
109114
self.assertEqual(self.columns, columns)
110115
self.assertEqual(self.data, data)
111116

117+
def test_public_type_create_with_project(self):
118+
arglist = [
119+
'--project', self.project.id,
120+
self.new_volume_type.name,
121+
]
122+
verifylist = [
123+
('project', self.project.id),
124+
('name', self.new_volume_type.name),
125+
]
126+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
127+
128+
self.assertRaises(exceptions.CommandError,
129+
self.cmd.take_action,
130+
parsed_args)
131+
112132

113133
class TestTypeDelete(TestType):
114134

openstackclient/volume/v2/volume_type.py

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,23 @@ def get_parser(self, prog_name):
6666
help=_('Set a property on this volume type '
6767
'(repeat option to set multiple properties)'),
6868
)
69+
parser.add_argument(
70+
'--project',
71+
metavar='<project>',
72+
help=_("Allow <project> to access private type (name or ID) "
73+
"(Must be used with --private option)"),
74+
)
75+
identity_common.add_project_domain_option_to_parser(parser)
6976
return parser
7077

7178
def take_action(self, parsed_args):
72-
79+
identity_client = self.app.client_manager.identity
7380
volume_client = self.app.client_manager.volume
7481

82+
if parsed_args.project and not parsed_args.private:
83+
msg = _("--project is only allowed with --private")
84+
raise exceptions.CommandError(msg)
85+
7586
kwargs = {}
7687
if parsed_args.public:
7788
kwargs['is_public'] = True
@@ -84,6 +95,20 @@ def take_action(self, parsed_args):
8495
**kwargs
8596
)
8697
volume_type._info.pop('extra_specs')
98+
99+
if parsed_args.project:
100+
try:
101+
project_id = identity_common.find_project(
102+
identity_client,
103+
parsed_args.project,
104+
parsed_args.project_domain,
105+
).id
106+
volume_client.volume_type_access.add_project_access(
107+
volume_type.id, project_id)
108+
except Exception as e:
109+
msg = _("Failed to add project %(project)s access to "
110+
"type: %(e)s")
111+
LOG.error(msg % {'project': parsed_args.project, 'e': e})
87112
if parsed_args.property:
88113
result = volume_type.set_keys(parsed_args.property)
89114
volume_type._info.update({'properties': utils.format_dict(result)})
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
features:
3+
- Add ``--project`` and ``--project-domain`` options to ``volume type create``
4+
command.
5+
[Bug `1602169 <https://bugs.launchpad.net/bugs/1602169>`_]

0 commit comments

Comments
 (0)