Skip to content

Commit 099c3bb

Browse files
Jenkinsopenstack-gerrit
authored andcommitted
Merge "Add "--project" option to "volume type create" command"
2 parents ba0e1b6 + e310682 commit 099c3bb

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
@@ -64,12 +64,23 @@ def get_parser(self, prog_name):
6464
help=_('Set a property on this volume type '
6565
'(repeat option to set multiple properties)'),
6666
)
67+
parser.add_argument(
68+
'--project',
69+
metavar='<project>',
70+
help=_("Allow <project> to access private type (name or ID) "
71+
"(Must be used with --private option)"),
72+
)
73+
identity_common.add_project_domain_option_to_parser(parser)
6774
return parser
6875

6976
def take_action(self, parsed_args):
70-
77+
identity_client = self.app.client_manager.identity
7178
volume_client = self.app.client_manager.volume
7279

80+
if parsed_args.project and not parsed_args.private:
81+
msg = _("--project is only allowed with --private")
82+
raise exceptions.CommandError(msg)
83+
7384
kwargs = {}
7485
if parsed_args.public:
7586
kwargs['is_public'] = True
@@ -82,6 +93,20 @@ def take_action(self, parsed_args):
8293
**kwargs
8394
)
8495
volume_type._info.pop('extra_specs')
96+
97+
if parsed_args.project:
98+
try:
99+
project_id = identity_common.find_project(
100+
identity_client,
101+
parsed_args.project,
102+
parsed_args.project_domain,
103+
).id
104+
volume_client.volume_type_access.add_project_access(
105+
volume_type.id, project_id)
106+
except Exception as e:
107+
msg = _("Failed to add project %(project)s access to "
108+
"type: %(e)s")
109+
LOG.error(msg % {'project': parsed_args.project, 'e': e})
85110
if parsed_args.property:
86111
result = volume_type.set_keys(parsed_args.property)
87112
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)