Skip to content

Commit 7f66273

Browse files
Add resource option immutable
This patch adds the --immutable and --no-immutable option to the role, project and domain CLI. Related-Patch: https://review.opendev.org/#/c/712182/ Change-Id: I9c3bdd741f28bf558267fb217818d947597ce13e
1 parent 05da145 commit 7f66273

10 files changed

Lines changed: 523 additions & 11 deletions

File tree

doc/source/cli/command-objects/project.rst

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ Create new project
1616
[--domain <domain>]
1717
[--parent <project>]
1818
[--description <description>]
19+
[--immutable | --no-immutable]
1920
[--enable | --disable]
2021
[--property <key=value>]
2122
[--or-show]
@@ -46,6 +47,15 @@ Create new project
4647

4748
Disable project
4849

50+
.. option:: --immutable
51+
52+
Make project immutable. An immutable project may not be deleted or
53+
modified except to remove the immutable flag
54+
55+
.. option:: --no-immutable
56+
57+
Make project mutable (default)
58+
4959
.. option:: --property <key=value>
5060

5161
Add a property to :ref:`\<name\> <project_create-name>`
@@ -180,6 +190,7 @@ Set project properties
180190
[--name <name>]
181191
[--domain <domain>]
182192
[--description <description>]
193+
[--immutable | --no-immutable]
183194
[--enable | --disable]
184195
[--property <key=value>]
185196
[--tag <tag> | --clear-tags | --remove-tags <tag>]
@@ -199,6 +210,15 @@ Set project properties
199210
200211
Set project description
201212
213+
.. option:: --immutable
214+
215+
Make project immutable. An immutable project may not be deleted or
216+
modified except to remove the immutable flag
217+
218+
.. option:: --no-immutable
219+
220+
Make project mutable (default)
221+
202222
.. option:: --enable
203223
204224
Enable project (default)

doc/source/cli/command-objects/role.rst

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ Create new role
9797
openstack role create
9898
[--or-show]
9999
[--domain <domain>]
100+
[--immutable | --no-immutable]
100101
<name>
101102
102103
.. option:: --domain <domain>
@@ -119,6 +120,15 @@ Create new role
119120

120121
Add description about the role
121122

123+
.. option:: --immutable
124+
125+
Make role immutable. An immutable role may not be deleted or modified
126+
except to remove the immutable flag
127+
128+
.. option:: --no-immutable
129+
130+
Make role mutable (default)
131+
122132
role delete
123133
-----------
124134

@@ -253,6 +263,7 @@ Set role properties
253263
openstack role set
254264
[--name <name>]
255265
[--domain <domain>]
266+
[--immutable | --no-immutable]
256267
<role>
257268
258269
.. option:: --name <name>
@@ -269,6 +280,15 @@ Set role properties
269280

270281
Role to modify (name or ID)
271282

283+
.. option:: --immutable
284+
285+
Make role immutable. An immutable role may not be deleted or modified
286+
except to remove the immutable flag
287+
288+
.. option:: --no-immutable
289+
290+
Make role mutable (default)
291+
272292
role show
273293
---------
274294

openstackclient/identity/common.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,15 @@ def _find_identity_resource(identity_client_manager, name_or_id,
213213
return resource_type(None, {'id': name_or_id, 'name': name_or_id})
214214

215215

216+
def get_immutable_options(parsed_args):
217+
options = {}
218+
if parsed_args.immutable:
219+
options['immutable'] = True
220+
if parsed_args.no_immutable:
221+
options['immutable'] = False
222+
return options
223+
224+
216225
def add_user_domain_option_to_parser(parser):
217226
parser.add_argument(
218227
'--user-domain',
@@ -261,3 +270,18 @@ def add_inherited_option_to_parser(parser):
261270
help=_('Specifies if the role grant is inheritable to the sub '
262271
'projects'),
263272
)
273+
274+
275+
def add_resource_option_to_parser(parser):
276+
enable_group = parser.add_mutually_exclusive_group()
277+
enable_group.add_argument(
278+
'--immutable',
279+
action='store_true',
280+
help=_('Make resource immutable. An immutable project may not '
281+
'be deleted or modified except to remove the immutable flag'),
282+
)
283+
enable_group.add_argument(
284+
'--no-immutable',
285+
action='store_true',
286+
help=_('Make resource mutable (default)'),
287+
)

openstackclient/identity/v3/domain.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ def get_parser(self, prog_name):
6060
action='store_true',
6161
help=_('Return existing domain'),
6262
)
63+
common.add_resource_option_to_parser(parser)
6364
return parser
6465

6566
def take_action(self, parsed_args):
@@ -69,10 +70,13 @@ def take_action(self, parsed_args):
6970
if parsed_args.disable:
7071
enabled = False
7172

73+
options = common.get_immutable_options(parsed_args)
74+
7275
try:
7376
domain = identity_client.domains.create(
7477
name=parsed_args.name,
7578
description=parsed_args.description,
79+
options=options,
7680
enabled=enabled,
7781
)
7882
except ks_exc.Conflict:
@@ -163,6 +167,7 @@ def get_parser(self, prog_name):
163167
action='store_true',
164168
help=_('Disable domain'),
165169
)
170+
common.add_resource_option_to_parser(parser)
166171
return parser
167172

168173
def take_action(self, parsed_args):
@@ -180,6 +185,10 @@ def take_action(self, parsed_args):
180185
if parsed_args.disable:
181186
kwargs['enabled'] = False
182187

188+
options = common.get_immutable_options(parsed_args)
189+
if options:
190+
kwargs['options'] = options
191+
183192
identity_client.domains.update(domain.id, **kwargs)
184193

185194

openstackclient/identity/v3/project.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ def get_parser(self, prog_name):
7878
action='store_true',
7979
help=_('Return existing project'),
8080
)
81+
common.add_resource_option_to_parser(parser)
8182
tag.add_tag_option_to_parser_for_create(parser, _('project'))
8283
return parser
8384

@@ -99,6 +100,9 @@ def take_action(self, parsed_args):
99100
enabled = True
100101
if parsed_args.disable:
101102
enabled = False
103+
104+
options = common.get_immutable_options(parsed_args)
105+
102106
kwargs = {}
103107
if parsed_args.property:
104108
kwargs = parsed_args.property.copy()
@@ -111,6 +115,7 @@ def take_action(self, parsed_args):
111115
parent=parent,
112116
description=parsed_args.description,
113117
enabled=enabled,
118+
options=options,
114119
**kwargs
115120
)
116121
except ks_exc.Conflict:
@@ -317,6 +322,7 @@ def get_parser(self, prog_name):
317322
help=_('Set a property on <project> '
318323
'(repeat option to set multiple properties)'),
319324
)
325+
common.add_resource_option_to_parser(parser)
320326
tag.add_tag_option_to_parser_for_set(parser, _('project'))
321327
return parser
322328

@@ -336,6 +342,9 @@ def take_action(self, parsed_args):
336342
kwargs['enabled'] = True
337343
if parsed_args.disable:
338344
kwargs['enabled'] = False
345+
options = common.get_immutable_options(parsed_args)
346+
if options:
347+
kwargs['options'] = options
339348
if parsed_args.property:
340349
kwargs.update(parsed_args.property)
341350
tag.update_tags_in_args(parsed_args, project, kwargs)

openstackclient/identity/v3/role.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ def get_parser(self, prog_name):
191191
action='store_true',
192192
help=_('Return existing role'),
193193
)
194+
common.add_resource_option_to_parser(parser)
194195
return parser
195196

196197
def take_action(self, parsed_args):
@@ -201,10 +202,12 @@ def take_action(self, parsed_args):
201202
domain_id = common.find_domain(identity_client,
202203
parsed_args.domain).id
203204

205+
options = common.get_immutable_options(parsed_args)
206+
204207
try:
205208
role = identity_client.roles.create(
206209
name=parsed_args.name, domain=domain_id,
207-
description=parsed_args.description)
210+
description=parsed_args.description, options=options)
208211

209212
except ks_exc.Conflict:
210213
if parsed_args.or_show:
@@ -366,6 +369,7 @@ def get_parser(self, prog_name):
366369
metavar='<name>',
367370
help=_('Set role name'),
368371
)
372+
common.add_resource_option_to_parser(parser)
369373
return parser
370374

371375
def take_action(self, parsed_args):
@@ -376,12 +380,14 @@ def take_action(self, parsed_args):
376380
domain_id = common.find_domain(identity_client,
377381
parsed_args.domain).id
378382

383+
options = common.get_immutable_options(parsed_args)
379384
role = utils.find_resource(identity_client.roles,
380385
parsed_args.role,
381386
domain_id=domain_id)
382387

383388
identity_client.roles.update(role.id, name=parsed_args.name,
384-
description=parsed_args.description)
389+
description=parsed_args.description,
390+
options=options)
385391

386392

387393
class ShowRole(command.ShowOne):

0 commit comments

Comments
 (0)