From 0c4e131c6ea6f6756e0d6cb2f5dd6e2a399d7829 Mon Sep 17 00:00:00 2001 From: Dean Troyer Date: Mon, 14 May 2012 17:43:30 -0500 Subject: [PATCH] Add endpoint CRUD commands * add {create|delete|list|show} endpoint commands Change-Id: Ife9fa789d5818d63288b09687b43d802b1b97858 --- openstackclient/common/utils.py | 2 +- openstackclient/identity/v2_0/endpoint.py | 226 ++++++++++++++++++++++ setup.py | 8 + 3 files changed, 235 insertions(+), 1 deletion(-) create mode 100644 openstackclient/identity/v2_0/endpoint.py diff --git a/openstackclient/common/utils.py b/openstackclient/common/utils.py index 475efeca..ea8170bc 100644 --- a/openstackclient/common/utils.py +++ b/openstackclient/common/utils.py @@ -52,7 +52,7 @@ def find_resource(manager, name_or_id): # Eventually this should be pulled from a common set # of client exceptions. except Exception as ex: - if '.NotFound' in type(ex).__name__: + if type(ex).__name__ == 'NotFound': msg = "No %s with a name or ID of '%s' exists." % \ (manager.resource_class.__name__.lower(), name_or_id) raise exceptions.CommandError(msg) diff --git a/openstackclient/identity/v2_0/endpoint.py b/openstackclient/identity/v2_0/endpoint.py new file mode 100644 index 00000000..e22ecd02 --- /dev/null +++ b/openstackclient/identity/v2_0/endpoint.py @@ -0,0 +1,226 @@ +# Copyright 2012 OpenStack LLC. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +""" +Endpoint action implementations +""" + +import logging + +from cliff import lister +from cliff import show + +from keystoneclient import exceptions as identity_exc +from openstackclient.common import command +from openstackclient.common import exceptions +from openstackclient.common import utils + + +class CreateEndpoint(command.OpenStackCommand, show.ShowOne): + """Create endpoint command""" + + api = 'identity' + log = logging.getLogger(__name__ + '.CreateEndpoint') + + def get_parser(self, prog_name): + parser = super(CreateEndpoint, self).get_parser(prog_name) + parser.add_argument( + 'service', + metavar='', + help='New endpoint service') + parser.add_argument( + '--region', + metavar='', + help='New endpoint region') + parser.add_argument( + '--publicurl', + metavar='', + help='New endpoint public URL') + parser.add_argument( + '--adminurl', + metavar='', + help='New endpoint admin URL') + parser.add_argument( + '--internalurl', + metavar='', + help='New endpoint internal URL') + return parser + + def get_data(self, parsed_args): + self.log.debug('get_data(%s)' % parsed_args) + identity_client = self.app.client_manager.identity + service = utils.find_resource( + identity_client.services, parsed_args.service) + endpoint = identity_client.endpoints.create( + parsed_args.region, + service.id, + parsed_args.publicurl, + parsed_args.adminurl, + parsed_args.internalurl, + ) + + info = {} + info.update(endpoint._info) + info['service_name'] = service.name + info['service_type'] = service.type + return zip(*sorted(info.iteritems())) + + +class DeleteEndpoint(command.OpenStackCommand): + """Delete endpoint command""" + + api = 'identity' + log = logging.getLogger(__name__ + '.DeleteEndpoint') + + def get_parser(self, prog_name): + parser = super(DeleteEndpoint, self).get_parser(prog_name) + parser.add_argument( + 'endpoint', + metavar='', + help='ID of endpoint to delete') + return parser + + def run(self, parsed_args): + self.log.debug('run(%s)' % parsed_args) + identity_client = self.app.client_manager.identity + identity_client.endpoints.delete(parsed_args.endpoint) + return + + +class ListEndpoint(command.OpenStackCommand, lister.Lister): + """List endpoint command""" + + api = 'identity' + log = logging.getLogger(__name__ + '.ListEndpoint') + + def get_parser(self, prog_name): + parser = super(ListEndpoint, self).get_parser(prog_name) + parser.add_argument( + '--long', + action='store_true', + default=False, + help='Additional fields are listed in output') + return parser + + def get_data(self, parsed_args): + self.log.debug('get_data(%s)' % parsed_args) + identity_client = self.app.client_manager.identity + if parsed_args.long: + columns = ('ID', 'Region', 'Service Name', 'Service Type', + 'PublicURL', 'AdminURL', 'InternalURL') + else: + columns = ('ID', 'Region', 'Service Name', 'Service Type') + data = identity_client.endpoints.list() + + for ep in data: + service = utils.find_resource( + identity_client.services, ep.service_id) + ep.service_name = service.name + ep.service_type = service.type + return (columns, + (utils.get_item_properties( + s, columns, + formatters={}, + ) for s in data), + ) + + +class ShowEndpoint(command.OpenStackCommand, show.ShowOne): + """Show endpoint command""" + + api = 'identity' + log = logging.getLogger(__name__ + '.ShowEndpoint') + + def get_parser(self, prog_name): + parser = super(ShowEndpoint, self).get_parser(prog_name) + parser.add_argument( + 'service', + metavar='', + help='Name or ID of service endpoint to display') + parser.add_argument( + '--type', + metavar='', + default='publicURL', + help='Endpoint type: publicURL, internalURL, adminURL ' + \ + '(default publicURL)') + parser.add_argument( + '--attr', + metavar='', + help='Endpoint attribute to use for selection') + parser.add_argument( + '--value', + metavar='', + help='Value of endpoint attribute to use for selection') + parser.add_argument( + '--all', + action='store_true', + default=False, + help='Show all endpoints for this service') + return parser + + def get_data(self, parsed_args): + self.log.debug('get_data(%s)' % parsed_args) + identity_client = self.app.client_manager.identity + + if not parsed_args.all: + # Find endpoint filtered by a specific attribute or service type + kwargs = { + 'service_type': parsed_args.service, + 'endpoint_type': parsed_args.type, + } + if parsed_args.attr and parsed_args.value: + kwargs.update({ + 'attr': parsed_args.attr, + 'filter_value': parsed_args.value, + }) + elif parsed_args.attr or parsed_args.value: + msg = 'Both --attr and --value required' + raise exceptions.CommandError(msg) + + url = identity_client.service_catalog.url_for(**kwargs) + info = {'%s.%s' % (parsed_args.service, parsed_args.type): url} + return zip(*sorted(info.iteritems())) + else: + # The Identity 2.0 API doesn't support retrieving a single + # endpoint so we have to do this ourselves + try: + service = utils.find_resource( + identity_client.services, parsed_args.service) + except exceptions.CommandError: + try: + # search for service type + service = identity_client.services.find( + type=parsed_args.service) + # FIXME(dtroyer): This exception should eventually come from + # common client exceptions + except identity_exc.NotFound: + msg = "No service with a type, name or ID of '%s' exists" \ + % parsed_args.service + raise exceptions.CommandError(msg) + else: + raise + + data = identity_client.endpoints.list() + for ep in data: + if ep.service_id == service.id: + info = {} + info.update(ep._info) + service = utils.find_resource( + identity_client.services, ep.service_id) + info['service_name'] = service.name + info['service_type'] = service.type + return zip(*sorted(info.iteritems())) diff --git a/setup.py b/setup.py index 922a462f..4cfccb04 100644 --- a/setup.py +++ b/setup.py @@ -61,6 +61,14 @@ setuptools.setup( 'openstack.cli': [ 'list_server=openstackclient.compute.v2.server:ListServer', 'show_server=openstackclient.compute.v2.server:ShowServer', + 'create_endpoint=' + + 'openstackclient.identity.v2_0.endpoint:CreateEndpoint', + 'delete_endpoint=' + + 'openstackclient.identity.v2_0.endpoint:DeleteEndpoint', + 'list_endpoint=' + + 'openstackclient.identity.v2_0.endpoint:ListEndpoint', + 'show_endpoint=' + + 'openstackclient.identity.v2_0.endpoint:ShowEndpoint', 'create_service=' + 'openstackclient.identity.v2_0.service:CreateService', 'delete_service=' +