Skip to content

Commit 2643df7

Browse files
Jenkinsopenstack-gerrit
authored andcommitted
Merge "Make endpoint commands more consistent"
2 parents 845f670 + bea6e6a commit 2643df7

File tree

5 files changed

+74
-118
lines changed

5 files changed

+74
-118
lines changed

openstackclient/identity/common.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# Copyright 2012-2013 OpenStack Foundation
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License"); you may
4+
# not use this file except in compliance with the License. You may obtain
5+
# a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12+
# License for the specific language governing permissions and limitations
13+
# under the License.
14+
#
15+
16+
"""Common identity code"""
17+
18+
from keystoneclient import exceptions as identity_exc
19+
from openstackclient.common import exceptions
20+
from openstackclient.common import utils
21+
22+
23+
def find_service(identity_client, name_type_or_id):
24+
"""Find a service by id, name or type."""
25+
26+
try:
27+
# search for the usual ID or name
28+
return utils.find_resource(identity_client.services, name_type_or_id)
29+
except exceptions.CommandError:
30+
try:
31+
# search for service type
32+
return identity_client.services.find(type=name_type_or_id)
33+
# FIXME(dtroyer): This exception should eventually come from
34+
# common client exceptions
35+
except identity_exc.NotFound:
36+
msg = ("No service with a type, name or ID of '%s' exists."
37+
% name_type_or_id)
38+
raise exceptions.CommandError(msg)

openstackclient/identity/v2_0/endpoint.py

Lines changed: 24 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,8 @@
2222
from cliff import lister
2323
from cliff import show
2424

25-
from keystoneclient import exceptions as identity_exc
26-
from openstackclient.common import exceptions
2725
from openstackclient.common import utils
26+
from openstackclient.identity import common
2827

2928

3029
class CreateEndpoint(show.ShowOne):
@@ -45,6 +44,7 @@ def get_parser(self, prog_name):
4544
parser.add_argument(
4645
'--publicurl',
4746
metavar='<public-url>',
47+
required=True,
4848
help='New endpoint public URL')
4949
parser.add_argument(
5050
'--adminurl',
@@ -59,8 +59,7 @@ def get_parser(self, prog_name):
5959
def take_action(self, parsed_args):
6060
self.log.debug('take_action(%s)' % parsed_args)
6161
identity_client = self.app.client_manager.identity
62-
service = utils.find_resource(identity_client.services,
63-
parsed_args.service)
62+
service = common.find_service(identity_client, parsed_args.service)
6463
endpoint = identity_client.endpoints.create(
6564
parsed_args.region,
6665
service.id,
@@ -120,8 +119,7 @@ def take_action(self, parsed_args):
120119
data = identity_client.endpoints.list()
121120

122121
for ep in data:
123-
service = utils.find_resource(
124-
identity_client.services, ep.service_id)
122+
service = common.find_service(identity_client, ep.service_id)
125123
ep.service_name = service.name
126124
ep.service_type = service.type
127125
return (columns,
@@ -139,77 +137,30 @@ class ShowEndpoint(show.ShowOne):
139137
def get_parser(self, prog_name):
140138
parser = super(ShowEndpoint, self).get_parser(prog_name)
141139
parser.add_argument(
142-
'service',
143-
metavar='<service>',
144-
help='Name or ID of service endpoint to display')
145-
parser.add_argument(
146-
'--type',
147-
metavar='<endpoint-type>',
148-
default='publicURL',
149-
help='Endpoint type: publicURL, internalURL, adminURL ' +
150-
'(default publicURL)')
151-
parser.add_argument(
152-
'--attr',
153-
metavar='<endpoint-attribute>',
154-
help='Endpoint attribute to use for selection')
155-
parser.add_argument(
156-
'--value',
157-
metavar='<endpoint-value>',
158-
help='Value of endpoint attribute to use for selection')
159-
parser.add_argument(
160-
'--all',
161-
action='store_true',
162-
default=False,
163-
help='Show all endpoints for this service')
140+
'endpoint_or_service',
141+
metavar='<endpoint_or_service>',
142+
help='Endpoint ID or name, type or ID of service to display')
164143
return parser
165144

166145
def take_action(self, parsed_args):
167146
self.log.debug('take_action(%s)' % parsed_args)
168147
identity_client = self.app.client_manager.identity
169-
170-
if not parsed_args.all:
171-
# Find endpoint filtered by a specific attribute or service type
172-
kwargs = {
173-
'service_type': parsed_args.service,
174-
'endpoint_type': parsed_args.type,
175-
}
176-
if parsed_args.attr and parsed_args.value:
177-
kwargs.update({
178-
'attr': parsed_args.attr,
179-
'filter_value': parsed_args.value,
180-
})
181-
elif parsed_args.attr or parsed_args.value:
182-
msg = 'Both --attr and --value required'
183-
raise exceptions.CommandError(msg)
184-
185-
url = identity_client.service_catalog.url_for(**kwargs)
186-
info = {'%s.%s' % (parsed_args.service, parsed_args.type): url}
187-
return zip(*sorted(six.iteritems(info)))
188-
else:
189-
# The Identity 2.0 API doesn't support retrieving a single
190-
# endpoint so we have to do this ourselves
191-
try:
192-
service = utils.find_resource(identity_client.services,
193-
parsed_args.service)
194-
except exceptions.CommandError:
195-
try:
196-
# search for service type
197-
service = identity_client.services.find(
198-
type=parsed_args.service)
199-
# FIXME(dtroyer): This exception should eventually come from
200-
# common client exceptions
201-
except identity_exc.NotFound:
202-
msg = "No service with a type, name or ID of '%s' exists" \
203-
% parsed_args.service
204-
raise exceptions.CommandError(msg)
205-
206-
data = identity_client.endpoints.list()
148+
data = identity_client.endpoints.list()
149+
match = None
150+
for ep in data:
151+
if ep.id == parsed_args.endpoint_or_service:
152+
match = ep
153+
service = common.find_service(identity_client, ep.service_id)
154+
if match is None:
155+
service = common.find_service(identity_client,
156+
parsed_args.endpoint_or_service)
207157
for ep in data:
208158
if ep.service_id == service.id:
209-
info = {}
210-
info.update(ep._info)
211-
service = utils.find_resource(identity_client.services,
212-
ep.service_id)
213-
info['service_name'] = service.name
214-
info['service_type'] = service.type
215-
return zip(*sorted(six.iteritems(info)))
159+
match = ep
160+
if match is None:
161+
return None
162+
info = {}
163+
info.update(match._info)
164+
info['service_name'] = service.name
165+
info['service_type'] = service.type
166+
return zip(*sorted(six.iteritems(info)))

openstackclient/identity/v2_0/service.py

Lines changed: 3 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@
2222
from cliff import lister
2323
from cliff import show
2424

25-
from keystoneclient import exceptions as identity_exc
2625
from openstackclient.common import exceptions
2726
from openstackclient.common import utils
27+
from openstackclient.identity import common
2828

2929

3030
class CreateService(show.ShowOne):
@@ -83,12 +83,7 @@ def get_parser(self, prog_name):
8383
def take_action(self, parsed_args):
8484
self.log.debug('take_action(%s)' % parsed_args)
8585
identity_client = self.app.client_manager.identity
86-
87-
service = utils.find_resource(
88-
identity_client.services,
89-
parsed_args.service,
90-
)
91-
86+
service = common.find_service(identity_client, parsed_args.service)
9287
identity_client.services.delete(service.id)
9388
return
9489

@@ -159,24 +154,7 @@ def take_action(self, parsed_args):
159154
"exists." % (parsed_args.service))
160155
raise exceptions.CommandError(msg)
161156
else:
162-
try:
163-
# search for the usual ID or name
164-
service = utils.find_resource(
165-
identity_client.services,
166-
parsed_args.service,
167-
)
168-
except exceptions.CommandError:
169-
try:
170-
# search for service type
171-
service = identity_client.services.find(
172-
type=parsed_args.service)
173-
# FIXME(dtroyer): This exception should eventually come from
174-
# common client exceptions
175-
except identity_exc.NotFound:
176-
msg = ("No service with a type, name or ID of '%s' exists."
177-
% parsed_args.service)
178-
raise exceptions.CommandError(msg)
179-
157+
service = common.find_service(identity_client, parsed_args.service)
180158
info = {}
181159
info.update(service._info)
182160
return zip(*sorted(six.iteritems(info)))

openstackclient/identity/v3/endpoint.py

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
from cliff import show
2525

2626
from openstackclient.common import utils
27+
from openstackclient.identity import common
2728

2829

2930
class CreateEndpoint(show.ShowOne):
@@ -69,8 +70,7 @@ def get_parser(self, prog_name):
6970
def take_action(self, parsed_args):
7071
self.log.debug('take_action(%s)' % parsed_args)
7172
identity_client = self.app.client_manager.identity
72-
service = utils.find_resource(identity_client.services,
73-
parsed_args.service)
73+
service = common.find_service(identity_client, parsed_args.service)
7474

7575
endpoint = identity_client.endpoints.create(
7676
service=service.id,
@@ -122,8 +122,7 @@ def take_action(self, parsed_args):
122122
data = identity_client.endpoints.list()
123123

124124
for ep in data:
125-
service = utils.find_resource(
126-
identity_client.services, ep.service_id)
125+
service = common.find_service(identity_client, ep.service_id)
127126
ep.service_name = service.name
128127
ep.service_type = service.type
129128
return (columns,
@@ -182,8 +181,7 @@ def take_action(self, parsed_args):
182181
identity_client = self.app.client_manager.identity
183182
endpoint = utils.find_resource(identity_client.endpoints,
184183
parsed_args.endpoint)
185-
service = utils.find_resource(identity_client.services,
186-
parsed_args.service)
184+
service = common.find_service(identity_client, parsed_args.service)
187185

188186
if (not parsed_args.interface and not parsed_args.url
189187
and not parsed_args.service and not parsed_args.region):
@@ -221,8 +219,7 @@ def take_action(self, parsed_args):
221219
endpoint = utils.find_resource(identity_client.endpoints,
222220
parsed_args.endpoint)
223221

224-
service = utils.find_resource(identity_client.services,
225-
endpoint.service_id)
222+
service = common.find_service(identity_client, endpoint.service_id)
226223

227224
info = {}
228225
info.update(endpoint._info)

openstackclient/identity/v3/service.py

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
from cliff import show
2424

2525
from openstackclient.common import utils
26+
from openstackclient.identity import common
2627

2728

2829
class CreateService(show.ShowOne):
@@ -90,10 +91,7 @@ def take_action(self, parsed_args):
9091
self.log.debug('take_action(%s)' % parsed_args)
9192
identity_client = self.app.client_manager.identity
9293

93-
service = utils.find_resource(
94-
identity_client.services,
95-
parsed_args.service,
96-
)
94+
service = common.find_service(identity_client, parsed_args.service)
9795

9896
identity_client.services.delete(service.id)
9997
return
@@ -161,10 +159,7 @@ def take_action(self, parsed_args):
161159
and not parsed_args.disable):
162160
return
163161

164-
service = utils.find_resource(
165-
identity_client.services,
166-
parsed_args.service,
167-
)
162+
service = common.find_service(identity_client, parsed_args.service)
168163

169164
kwargs = service._info
170165
if parsed_args.type:
@@ -203,9 +198,6 @@ def take_action(self, parsed_args):
203198
self.log.debug('take_action(%s)' % parsed_args)
204199
identity_client = self.app.client_manager.identity
205200

206-
service = utils.find_resource(
207-
identity_client.services,
208-
parsed_args.service,
209-
)
201+
service = common.find_service(identity_client, parsed_args.service)
210202

211203
return zip(*sorted(six.iteritems(service._info)))

0 commit comments

Comments
 (0)