Skip to content

Commit 717f242

Browse files
committed
identity: Migrate 'service' commands to SDK
Change-Id: I37d07a6c5cdc98680b8d65d596521cad2b049500
1 parent d9b95d7 commit 717f242

8 files changed

Lines changed: 179 additions & 101 deletions

File tree

openstackclient/identity/common.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from keystoneclient.v3 import groups
2121
from keystoneclient.v3 import projects
2222
from keystoneclient.v3 import users
23+
from openstack import exceptions as sdk_exceptions
2324
from osc_lib import exceptions
2425
from osc_lib import utils
2526

@@ -73,6 +74,39 @@ def find_service(identity_client, name_type_or_id):
7374
raise exceptions.CommandError(msg % name_type_or_id)
7475

7576

77+
def find_service_sdk(identity_client, name_type_or_id):
78+
"""Find a service by id, name or type."""
79+
80+
try:
81+
# search for service name or ID
82+
return identity_client.find_service(
83+
name_type_or_id, ignore_missing=False
84+
)
85+
except sdk_exceptions.ResourceNotFound:
86+
pass
87+
except sdk_exceptions.DuplicateResource as e:
88+
raise exceptions.CommandError(e.message)
89+
90+
# search for service type
91+
services = identity_client.services()
92+
result = None
93+
for service in services:
94+
if name_type_or_id == service.type:
95+
if result:
96+
msg = _(
97+
"Multiple service matches found for '%s', "
98+
"use an ID or name to be more specific."
99+
)
100+
raise exceptions.CommandError(msg % name_type_or_id)
101+
result = service
102+
103+
if result is None:
104+
msg = _("No service with a type, name or ID of '%s' exists.")
105+
raise exceptions.CommandError(msg % name_type_or_id)
106+
107+
return result
108+
109+
76110
def get_resource(manager, name_type_or_id):
77111
# NOTE (vishakha): Due to bug #1799153 and for any another related case
78112
# where GET resource API does not support the filter by name,

openstackclient/identity/v3/service.py

Lines changed: 49 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,31 @@
2828
LOG = logging.getLogger(__name__)
2929

3030

31+
def _format_service(service):
32+
columns = (
33+
'id',
34+
'name',
35+
'type',
36+
'is_enabled',
37+
'description',
38+
)
39+
column_headers = (
40+
'ID',
41+
'Name',
42+
'Type',
43+
'Enabled',
44+
'Description',
45+
)
46+
47+
return (
48+
column_headers,
49+
utils.get_item_properties(
50+
service,
51+
columns,
52+
),
53+
)
54+
55+
3156
class CreateService(command.ShowOne):
3257
_description = _("Create new service")
3358

@@ -66,17 +91,16 @@ def get_parser(self, prog_name):
6691
return parser
6792

6893
def take_action(self, parsed_args):
69-
identity_client = self.app.client_manager.identity
94+
identity_client = self.app.client_manager.sdk_connection.identity
7095

71-
service = identity_client.services.create(
96+
service = identity_client.create_service(
7297
name=parsed_args.name,
7398
type=parsed_args.type,
7499
description=parsed_args.description,
75-
enabled=parsed_args.is_enabled,
100+
is_enabled=parsed_args.is_enabled,
76101
)
77102

78-
service._info.pop('links')
79-
return zip(*sorted(service._info.items()))
103+
return _format_service(service)
80104

81105

82106
class DeleteService(command.Command):
@@ -93,12 +117,12 @@ def get_parser(self, prog_name):
93117
return parser
94118

95119
def take_action(self, parsed_args):
96-
identity_client = self.app.client_manager.identity
120+
identity_client = self.app.client_manager.sdk_connection.identity
97121
result = 0
98122
for i in parsed_args.service:
99123
try:
100-
service = common.find_service(identity_client, i)
101-
identity_client.services.delete(service.id)
124+
service = common.find_service_sdk(identity_client, i)
125+
identity_client.delete_service(service.id)
102126
except Exception as e:
103127
result += 1
104128
LOG.error(
@@ -131,13 +155,19 @@ def get_parser(self, prog_name):
131155
return parser
132156

133157
def take_action(self, parsed_args):
158+
identity_client = self.app.client_manager.sdk_connection.identity
159+
134160
if parsed_args.long:
135-
columns = ('ID', 'Name', 'Type', 'Description', 'Enabled')
161+
columns = ('id', 'name', 'type', 'description', 'is_enabled')
162+
column_headers = ('ID', 'Name', 'Type', 'Description', 'Enabled')
136163
else:
137-
columns = ('ID', 'Name', 'Type')
138-
data = self.app.client_manager.identity.services.list()
164+
columns = ('id', 'name', 'type')
165+
column_headers = ('ID', 'Name', 'Type')
166+
167+
data = identity_client.services()
168+
139169
return (
140-
columns,
170+
column_headers,
141171
(utils.get_item_properties(s, columns) for s in data),
142172
)
143173

@@ -185,20 +215,19 @@ def get_parser(self, prog_name):
185215
return parser
186216

187217
def take_action(self, parsed_args):
188-
identity_client = self.app.client_manager.identity
218+
identity_client = self.app.client_manager.sdk_connection.identity
189219

190-
service = common.find_service(identity_client, parsed_args.service)
220+
service = common.find_service_sdk(identity_client, parsed_args.service)
191221
kwargs = {}
192222
if parsed_args.type:
193223
kwargs['type'] = parsed_args.type
194224
if parsed_args.name:
195225
kwargs['name'] = parsed_args.name
196226
if parsed_args.description:
197227
kwargs['description'] = parsed_args.description
198-
if parsed_args.is_enabled is not None:
199-
kwargs['enabled'] = parsed_args.is_enabled
228+
kwargs['is_enabled'] = parsed_args.is_enabled
200229

201-
identity_client.services.update(service.id, **kwargs)
230+
identity_client.update_service(service.id, **kwargs)
202231

203232

204233
class ShowService(command.ShowOne):
@@ -214,9 +243,8 @@ def get_parser(self, prog_name):
214243
return parser
215244

216245
def take_action(self, parsed_args):
217-
identity_client = self.app.client_manager.identity
246+
identity_client = self.app.client_manager.sdk_connection.identity
218247

219-
service = common.find_service(identity_client, parsed_args.service)
248+
service = common.find_service_sdk(identity_client, parsed_args.service)
220249

221-
service._info.pop('links')
222-
return zip(*sorted(service._info.items()))
250+
return _format_service(service)

openstackclient/tests/functional/identity/v3/common.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class IdentityTests(base.TestCase):
4848
'parent_id',
4949
]
5050
ROLE_FIELDS = ['id', 'name', 'domain_id', 'description']
51-
SERVICE_FIELDS = ['id', 'enabled', 'name', 'type', 'description']
51+
SERVICE_FIELDS = ['ID', 'Enabled', 'Name', 'Type', 'Description']
5252
REGION_FIELDS = ['description', 'enabled', 'parent_region', 'region']
5353
ENDPOINT_FIELDS = [
5454
'id',
@@ -367,7 +367,7 @@ def _create_dummy_service(self, add_clean_up=True):
367367
if add_clean_up:
368368
service = self.parse_show_as_object(raw_output)
369369
self.addCleanup(
370-
self.openstack, 'service delete %s' % service['id']
370+
self.openstack, 'service delete %s' % service['ID']
371371
)
372372
items = self.parse_show(raw_output)
373373
self.assert_show_fields(items, self.SERVICE_FIELDS)

openstackclient/tests/functional/identity/v3/test_limit.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ def test_limit_create_with_service_name(self):
3232

3333
raw_output = self.openstack('service show %s' % service_id)
3434
items = self.parse_show(raw_output)
35-
service_name = self._extract_value_from_items('name', items)
35+
service_name = self._extract_value_from_items('Name', items)
3636

3737
project_name = self._create_dummy_project()
3838
raw_output = self.openstack('project show %s' % project_name)
@@ -73,7 +73,7 @@ def test_limit_create_with_project_name(self):
7373

7474
raw_output = self.openstack('service show %s' % service_id)
7575
items = self.parse_show(raw_output)
76-
service_name = self._extract_value_from_items('name', items)
76+
service_name = self._extract_value_from_items('Name', items)
7777

7878
project_name = self._create_dummy_project()
7979

openstackclient/tests/functional/identity/v3/test_registered_limit.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def test_registered_limit_create_with_service_id(self):
2929
'service show' ' %(service_name)s' % {'service_name': service_name}
3030
)
3131
service_items = self.parse_show(raw_output)
32-
service_id = self._extract_value_from_items('id', service_items)
32+
service_id = self._extract_value_from_items('ID', service_items)
3333

3434
raw_output = self.openstack(
3535
'registered limit create'

openstackclient/tests/functional/identity/v3/test_service.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,9 @@ def test_service_set(self):
6161
raw_output = self.openstack('service show %s' % new_service_name)
6262
# assert service details
6363
service = self.parse_show_as_object(raw_output)
64-
self.assertEqual(new_service_type, service['type'])
65-
self.assertEqual(new_service_name, service['name'])
66-
self.assertEqual(new_service_description, service['description'])
64+
self.assertEqual(new_service_type, service['Type'])
65+
self.assertEqual(new_service_name, service['Name'])
66+
self.assertEqual(new_service_description, service['Description'])
6767

6868
def test_service_show(self):
6969
service_name = self._create_dummy_service()

0 commit comments

Comments
 (0)