Skip to content

Commit 79653af

Browse files
author
Steve Martinelli
committed
Add --or-show support for v3 identity resources
Add --or-show for the following: * v3 roles * v3 projects * v3 domains * v3 users * v3 groups Closes-Bug: #1390389 Change-Id: Id4ef043e5fda6be49a515eb3fe138c813c393ec9
1 parent 7242113 commit 79653af

5 files changed

Lines changed: 106 additions & 27 deletions

File tree

‎openstackclient/identity/v3/domain.py‎

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@
2222
from cliff import command
2323
from cliff import lister
2424
from cliff import show
25+
from keystoneclient.openstack.common.apiclient import exceptions as ksc_exc
2526

2627
from openstackclient.common import utils
28+
from openstackclient.i18n import _ # noqa
2729

2830

2931
class CreateDomain(show.ShowOne):
@@ -55,16 +57,30 @@ def get_parser(self, prog_name):
5557
dest='enabled',
5658
action='store_false',
5759
help='Disable domain')
60+
parser.add_argument(
61+
'--or-show',
62+
action='store_true',
63+
help=_('Return existing domain'),
64+
)
5865
return parser
5966

6067
def take_action(self, parsed_args):
6168
self.log.debug('take_action(%s)', parsed_args)
6269
identity_client = self.app.client_manager.identity
63-
domain = identity_client.domains.create(
64-
name=parsed_args.name,
65-
description=parsed_args.description,
66-
enabled=parsed_args.enabled,
67-
)
70+
71+
try:
72+
domain = identity_client.domains.create(
73+
name=parsed_args.name,
74+
description=parsed_args.description,
75+
enabled=parsed_args.enabled,
76+
)
77+
except ksc_exc.Conflict as e:
78+
if parsed_args.or_show:
79+
domain = utils.find_resource(identity_client.domains,
80+
parsed_args.name)
81+
self.log.info('Returning existing domain %s', domain.name)
82+
else:
83+
raise e
6884

6985
domain._info.pop('links')
7086
return zip(*sorted(six.iteritems(domain._info)))

‎openstackclient/identity/v3/group.py‎

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@
2222
from cliff import command
2323
from cliff import lister
2424
from cliff import show
25+
from keystoneclient.openstack.common.apiclient import exceptions as ksc_exc
2526

2627
from openstackclient.common import utils
28+
from openstackclient.i18n import _ # noqa
2729
from openstackclient.identity import common
2830

2931

@@ -122,7 +124,11 @@ def get_parser(self, prog_name):
122124
'--domain',
123125
metavar='<group-domain>',
124126
help='References the domain ID or name which owns the group')
125-
127+
parser.add_argument(
128+
'--or-show',
129+
action='store_true',
130+
help=_('Return existing group'),
131+
)
126132
return parser
127133

128134
def take_action(self, parsed_args):
@@ -133,10 +139,20 @@ def take_action(self, parsed_args):
133139
parsed_args.domain).id
134140
else:
135141
domain = None
136-
group = identity_client.groups.create(
137-
name=parsed_args.name,
138-
domain=domain,
139-
description=parsed_args.description)
142+
143+
try:
144+
group = identity_client.groups.create(
145+
name=parsed_args.name,
146+
domain=domain,
147+
description=parsed_args.description)
148+
except ksc_exc.Conflict as e:
149+
if parsed_args.or_show:
150+
group = utils.find_resource(identity_client.groups,
151+
parsed_args.name,
152+
domain_id=domain)
153+
self.log.info('Returning existing group %s', group.name)
154+
else:
155+
raise e
140156

141157
group._info.pop('links')
142158
return zip(*sorted(six.iteritems(group._info)))

‎openstackclient/identity/v3/project.py‎

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,11 @@
2121
from cliff import command
2222
from cliff import lister
2323
from cliff import show
24+
from keystoneclient.openstack.common.apiclient import exceptions as ksc_exc
2425

2526
from openstackclient.common import parseractions
2627
from openstackclient.common import utils
28+
from openstackclient.i18n import _ # noqa
2729
from openstackclient.identity import common
2830

2931

@@ -67,6 +69,11 @@ def get_parser(self, prog_name):
6769
help='Property to add for this project '
6870
'(repeat option to set multiple properties)',
6971
)
72+
parser.add_argument(
73+
'--or-show',
74+
action='store_true',
75+
help=_('Return existing project'),
76+
)
7077
return parser
7178

7279
def take_action(self, parsed_args):
@@ -86,13 +93,22 @@ def take_action(self, parsed_args):
8693
if parsed_args.property:
8794
kwargs = parsed_args.property.copy()
8895

89-
project = identity_client.projects.create(
90-
name=parsed_args.name,
91-
domain=domain,
92-
description=parsed_args.description,
93-
enabled=enabled,
94-
**kwargs
95-
)
96+
try:
97+
project = identity_client.projects.create(
98+
name=parsed_args.name,
99+
domain=domain,
100+
description=parsed_args.description,
101+
enabled=enabled,
102+
**kwargs
103+
)
104+
except ksc_exc.Conflict as e:
105+
if parsed_args.or_show:
106+
project = utils.find_resource(identity_client.projects,
107+
parsed_args.name,
108+
domain_id=domain)
109+
self.log.info('Returning existing project %s', project.name)
110+
else:
111+
raise e
96112

97113
project._info.pop('links')
98114
return zip(*sorted(six.iteritems(project._info)))

‎openstackclient/identity/v3/role.py‎

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@
2222
from cliff import command
2323
from cliff import lister
2424
from cliff import show
25+
from keystoneclient.openstack.common.apiclient import exceptions as ksc_exc
2526

2627
from openstackclient.common import utils
28+
from openstackclient.i18n import _ # noqa
2729

2830

2931
class AddRole(command.Command):
@@ -149,13 +151,26 @@ def get_parser(self, prog_name):
149151
metavar='<role-name>',
150152
help='New role name',
151153
)
154+
parser.add_argument(
155+
'--or-show',
156+
action='store_true',
157+
help=_('Return existing role'),
158+
)
152159
return parser
153160

154161
def take_action(self, parsed_args):
155162
self.log.debug('take_action(%s)', parsed_args)
156163
identity_client = self.app.client_manager.identity
157164

158-
role = identity_client.roles.create(name=parsed_args.name)
165+
try:
166+
role = identity_client.roles.create(name=parsed_args.name)
167+
except ksc_exc.Conflict as e:
168+
if parsed_args.or_show:
169+
role = utils.find_resource(identity_client.roles,
170+
parsed_args.name)
171+
self.log.info('Returning existing role %s', role.name)
172+
else:
173+
raise e
159174

160175
role._info.pop('links')
161176
return zip(*sorted(six.iteritems(role._info)))

‎openstackclient/identity/v3/user.py‎

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@
2121
from cliff import command
2222
from cliff import lister
2323
from cliff import show
24+
from keystoneclient.openstack.common.apiclient import exceptions as ksc_exc
2425

2526
from openstackclient.common import utils
27+
from openstackclient.i18n import _ # noqa
2628
from openstackclient.identity import common
2729

2830

@@ -80,6 +82,11 @@ def get_parser(self, prog_name):
8082
action='store_true',
8183
help='Disable user',
8284
)
85+
parser.add_argument(
86+
'--or-show',
87+
action='store_true',
88+
help=_('Return existing user'),
89+
)
8390
return parser
8491

8592
def take_action(self, parsed_args):
@@ -106,15 +113,24 @@ def take_action(self, parsed_args):
106113
if parsed_args.password_prompt:
107114
parsed_args.password = utils.get_password(self.app.stdin)
108115

109-
user = identity_client.users.create(
110-
name=parsed_args.name,
111-
domain=domain_id,
112-
default_project=project_id,
113-
password=parsed_args.password,
114-
email=parsed_args.email,
115-
description=parsed_args.description,
116-
enabled=enabled
117-
)
116+
try:
117+
user = identity_client.users.create(
118+
name=parsed_args.name,
119+
domain=domain_id,
120+
default_project=project_id,
121+
password=parsed_args.password,
122+
email=parsed_args.email,
123+
description=parsed_args.description,
124+
enabled=enabled
125+
)
126+
except ksc_exc.Conflict as e:
127+
if parsed_args.or_show:
128+
user = utils.find_resource(identity_client.users,
129+
parsed_args.name,
130+
domain_id=domain_id)
131+
self.log.info('Returning existing user %s', user.name)
132+
else:
133+
raise e
118134

119135
user._info.pop('links')
120136
return zip(*sorted(six.iteritems(user._info)))

0 commit comments

Comments
 (0)