Skip to content

Commit 7242113

Browse files
author
Steve Martinelli
committed
Add additional support for --or-show
Add --or-show for the following: * v2 roles * v2 projects Change-Id: Ibbae19cda668575b9527fbd259f1298c48b8265b
1 parent c55fdb6 commit 7242113

4 files changed

Lines changed: 194 additions & 7 deletions

File tree

‎openstackclient/identity/v2_0/project.py‎

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,11 @@ def get_parser(self, prog_name):
6363
help=_('Property to add for this project '
6464
'(repeat option to set multiple properties)'),
6565
)
66+
parser.add_argument(
67+
'--or-show',
68+
action='store_true',
69+
help=_('Return existing project'),
70+
)
6671
return parser
6772

6873
def take_action(self, parsed_args):
@@ -76,12 +81,22 @@ def take_action(self, parsed_args):
7681
if parsed_args.property:
7782
kwargs = parsed_args.property.copy()
7883

79-
project = identity_client.tenants.create(
80-
parsed_args.name,
81-
description=parsed_args.description,
82-
enabled=enabled,
83-
**kwargs
84-
)
84+
try:
85+
project = identity_client.tenants.create(
86+
parsed_args.name,
87+
description=parsed_args.description,
88+
enabled=enabled,
89+
**kwargs
90+
)
91+
except ksc_exc.Conflict as e:
92+
if parsed_args.or_show:
93+
project = utils.find_resource(
94+
identity_client.tenants,
95+
parsed_args.name,
96+
)
97+
self.log.info('Returning existing project %s', project.name)
98+
else:
99+
raise e
85100

86101
info = {}
87102
info.update(project._info)

‎openstackclient/identity/v2_0/role.py‎

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
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 exceptions
2627
from openstackclient.common import utils
@@ -81,12 +82,27 @@ def get_parser(self, prog_name):
8182
'role_name',
8283
metavar='<role-name>',
8384
help=_('New role name'))
85+
parser.add_argument(
86+
'--or-show',
87+
action='store_true',
88+
help=_('Return existing role'),
89+
)
8490
return parser
8591

8692
def take_action(self, parsed_args):
8793
self.log.debug('take_action(%s)', parsed_args)
8894
identity_client = self.app.client_manager.identity
89-
role = identity_client.roles.create(parsed_args.role_name)
95+
try:
96+
role = identity_client.roles.create(parsed_args.role_name)
97+
except ksc_exc.Conflict as e:
98+
if parsed_args.or_show:
99+
role = utils.find_resource(
100+
identity_client.roles,
101+
parsed_args.role_name,
102+
)
103+
self.log.info('Returning existing role %s', role.name)
104+
else:
105+
raise e
90106

91107
info = {}
92108
info.update(role._info)

‎openstackclient/tests/identity/v2_0/test_project.py‎

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515

1616
import copy
1717

18+
from keystoneclient.openstack.common.apiclient import exceptions as ksc_exc
19+
1820
from openstackclient.identity.v2_0 import project
1921
from openstackclient.tests import fakes
2022
from openstackclient.tests.identity.v2_0 import fakes as identity_fakes
@@ -219,6 +221,89 @@ def test_project_create_property(self):
219221
)
220222
self.assertEqual(data, datalist)
221223

224+
def test_project_create_or_show_exists(self):
225+
def _raise_conflict(*args, **kwargs):
226+
raise ksc_exc.Conflict(None)
227+
228+
# need to make this throw an exception...
229+
self.projects_mock.create.side_effect = _raise_conflict
230+
231+
self.projects_mock.get.return_value = fakes.FakeResource(
232+
None,
233+
copy.deepcopy(identity_fakes.PROJECT),
234+
loaded=True,
235+
)
236+
237+
arglist = [
238+
'--or-show',
239+
identity_fakes.project_name,
240+
]
241+
verifylist = [
242+
('name', identity_fakes.project_name),
243+
('or_show', True),
244+
]
245+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
246+
247+
# DisplayCommandBase.take_action() returns two tuples
248+
columns, data = self.cmd.take_action(parsed_args)
249+
250+
# ProjectManager.create(name, description, enabled)
251+
self.projects_mock.get.assert_called_with(identity_fakes.project_name)
252+
253+
# Set expected values
254+
kwargs = {
255+
'description': None,
256+
'enabled': True,
257+
}
258+
self.projects_mock.create.assert_called_with(
259+
identity_fakes.project_name,
260+
**kwargs
261+
)
262+
263+
collist = ('description', 'enabled', 'id', 'name')
264+
self.assertEqual(collist, columns)
265+
datalist = (
266+
identity_fakes.project_description,
267+
True,
268+
identity_fakes.project_id,
269+
identity_fakes.project_name,
270+
)
271+
self.assertEqual(datalist, data)
272+
273+
def test_project_create_or_show_not_exists(self):
274+
arglist = [
275+
'--or-show',
276+
identity_fakes.project_name,
277+
]
278+
verifylist = [
279+
('name', identity_fakes.project_name),
280+
('or_show', True),
281+
]
282+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
283+
284+
# DisplayCommandBase.take_action() returns two tuples
285+
columns, data = self.cmd.take_action(parsed_args)
286+
287+
# Set expected values
288+
kwargs = {
289+
'description': None,
290+
'enabled': True,
291+
}
292+
self.projects_mock.create.assert_called_with(
293+
identity_fakes.project_name,
294+
**kwargs
295+
)
296+
297+
collist = ('description', 'enabled', 'id', 'name')
298+
self.assertEqual(collist, columns)
299+
datalist = (
300+
identity_fakes.project_description,
301+
True,
302+
identity_fakes.project_id,
303+
identity_fakes.project_name,
304+
)
305+
self.assertEqual(datalist, data)
306+
222307

223308
class TestProjectDelete(TestProject):
224309

‎openstackclient/tests/identity/v2_0/test_role.py‎

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
import copy
1717
import mock
1818

19+
from keystoneclient.openstack.common.apiclient import exceptions as ksc_exc
20+
1921
from openstackclient.common import exceptions
2022
from openstackclient.identity.v2_0 import role
2123
from openstackclient.tests import fakes
@@ -142,6 +144,75 @@ def test_role_create_no_options(self):
142144
)
143145
self.assertEqual(data, datalist)
144146

147+
def test_role_create_or_show_exists(self):
148+
def _raise_conflict(*args, **kwargs):
149+
raise ksc_exc.Conflict(None)
150+
151+
# need to make this throw an exception...
152+
self.roles_mock.create.side_effect = _raise_conflict
153+
154+
self.roles_mock.get.return_value = fakes.FakeResource(
155+
None,
156+
copy.deepcopy(identity_fakes.ROLE),
157+
loaded=True,
158+
)
159+
160+
arglist = [
161+
'--or-show',
162+
identity_fakes.role_name,
163+
]
164+
verifylist = [
165+
('role_name', identity_fakes.role_name),
166+
('or_show', True),
167+
]
168+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
169+
170+
# DisplayCommandBase.take_action() returns two tuples
171+
columns, data = self.cmd.take_action(parsed_args)
172+
173+
# RoleManager.get(name, description, enabled)
174+
self.roles_mock.get.assert_called_with(identity_fakes.role_name)
175+
176+
# RoleManager.create(name)
177+
self.roles_mock.create.assert_called_with(
178+
identity_fakes.role_name,
179+
)
180+
181+
collist = ('id', 'name')
182+
self.assertEqual(collist, columns)
183+
datalist = (
184+
identity_fakes.role_id,
185+
identity_fakes.role_name,
186+
)
187+
self.assertEqual(datalist, data)
188+
189+
def test_role_create_or_show_not_exists(self):
190+
arglist = [
191+
'--or-show',
192+
identity_fakes.role_name,
193+
]
194+
verifylist = [
195+
('role_name', identity_fakes.role_name),
196+
('or_show', True),
197+
]
198+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
199+
200+
# DisplayCommandBase.take_action() returns two tuples
201+
columns, data = self.cmd.take_action(parsed_args)
202+
203+
# RoleManager.create(name)
204+
self.roles_mock.create.assert_called_with(
205+
identity_fakes.role_name,
206+
)
207+
208+
collist = ('id', 'name')
209+
self.assertEqual(collist, columns)
210+
datalist = (
211+
identity_fakes.role_id,
212+
identity_fakes.role_name,
213+
)
214+
self.assertEqual(datalist, data)
215+
145216

146217
class TestRoleDelete(TestRole):
147218

0 commit comments

Comments
 (0)