From d6a4fb836f7be64793f8d42b0a811eb81c50f455 Mon Sep 17 00:00:00 2001 From: Dean Troyer <dtroyer@gmail.com> Date: Fri, 11 May 2012 17:19:08 -0500 Subject: [PATCH] Update service commands * add {create|delete} service * allow 'service' arg to also search type attribute in show command Change-Id: I992359dc95fab1fbdab0666d5cbb75e44ba6e0f3 --- openstackclient/common/utils.py | 15 +++- openstackclient/identity/v2_0/service.py | 102 +++++++++++++++++------ setup.py | 8 +- 3 files changed, 94 insertions(+), 31 deletions(-) diff --git a/openstackclient/common/utils.py b/openstackclient/common/utils.py index b37ff80607..475efeca61 100644 --- a/openstackclient/common/utils.py +++ b/openstackclient/common/utils.py @@ -47,10 +47,17 @@ def find_resource(manager, name_or_id): # finally try to find entity by name try: return manager.find(name=name_or_id) - except exceptions.NotFound: - msg = "No %s with a name or ID of '%s' exists." % \ - (manager.resource_class.__name__.lower(), name_or_id) - raise exceptions.CommandError(msg) + # FIXME(dtroyer): The exception to catch here is dependent on which + # client library the manager passed in belongs to. + # Eventually this should be pulled from a common set + # of client exceptions. + except Exception as ex: + if '.NotFound' in type(ex).__name__: + msg = "No %s with a name or ID of '%s' exists." % \ + (manager.resource_class.__name__.lower(), name_or_id) + raise exceptions.CommandError(msg) + else: + raise def get_item_properties(item, fields, mixed_case_fields=[], formatters={}): diff --git a/openstackclient/identity/v2_0/service.py b/openstackclient/identity/v2_0/service.py index be0e7020da..08f04b75e2 100644 --- a/openstackclient/identity/v2_0/service.py +++ b/openstackclient/identity/v2_0/service.py @@ -24,37 +24,81 @@ 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 Create_Service(command.OpenStackCommand): +class CreateService(command.OpenStackCommand, show.ShowOne): """Create service command""" - # FIXME(dtroyer): Service commands are still WIP api = 'identity' - log = logging.getLogger(__name__) + log = logging.getLogger(__name__ + '.CreateService') def get_parser(self, prog_name): - parser = super(Create_Service, self).get_parser(prog_name) + parser = super(CreateService, self).get_parser(prog_name) parser.add_argument( - 'service_name', + 'name', metavar='<service-name>', help='New service name') + parser.add_argument( + '--type', + metavar='<service-type>', + required=True, + help='New service type', + ) + parser.add_argument( + '--description', + metavar='<service-description>', + help='New service description', + ) return parser def get_data(self, parsed_args): - self.log.info('v2.Create_Service.get_data(%s)' % parsed_args) + self.log.debug('get_data(%s)' % parsed_args) + identity_client = self.app.client_manager.identity + service = identity_client.services.create( + parsed_args.name, + parsed_args.type, + parsed_args.description, + ) + + info = {} + info.update(service._info) + return zip(*sorted(info.iteritems())) -class List_Service(command.OpenStackCommand, lister.Lister): +class DeleteService(command.OpenStackCommand): + """Delete service command""" + + api = 'identity' + log = logging.getLogger(__name__ + '.DeleteService') + + def get_parser(self, prog_name): + parser = super(DeleteService, self).get_parser(prog_name) + parser.add_argument( + 'service', + metavar='<service-id>', + help='ID of service 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.services.delete(parsed_args.service) + return + + +class ListService(command.OpenStackCommand, lister.Lister): """List service command""" api = 'identity' - log = logging.getLogger(__name__) + log = logging.getLogger(__name__ + '.ListService') def get_parser(self, prog_name): - parser = super(List_Service, self).get_parser(prog_name) + parser = super(ListService, self).get_parser(prog_name) parser.add_argument( '--long', action='store_true', @@ -63,7 +107,7 @@ class List_Service(command.OpenStackCommand, lister.Lister): return parser def get_data(self, parsed_args): - self.log.debug('v2.List_Service.get_data(%s)' % parsed_args) + self.log.debug('get_data(%s)' % parsed_args) if parsed_args.long: columns = ('ID', 'Name', 'Type', 'Description') else: @@ -73,33 +117,43 @@ class List_Service(command.OpenStackCommand, lister.Lister): (utils.get_item_properties( s, columns, formatters={}, - ) for s in data), - ) + ) for s in data), + ) -class Show_Service(command.OpenStackCommand, show.ShowOne): +class ShowService(command.OpenStackCommand, show.ShowOne): """Show service command""" api = 'identity' - log = logging.getLogger(__name__) + log = logging.getLogger(__name__ + '.ShowService') def get_parser(self, prog_name): - parser = super(Show_Service, self).get_parser(prog_name) + parser = super(ShowService, self).get_parser(prog_name) parser.add_argument( 'service', metavar='<service>', - help='Name or ID of service to display') + help='Type, name or ID of service to display') return parser def get_data(self, parsed_args): - self.log.info('v2.Show_Service.get_data(%s)' % 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) + try: + # search for the usual ID or name + 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." % \ + name_or_id + raise exceptions.CommandError(msg) info = {} - info.update(user._info) - - columns = sorted(info.keys()) - values = [info[c] for c in columns] - return (columns, values) + info.update(service._info) + return zip(*sorted(info.iteritems())) diff --git a/setup.py b/setup.py index ddca8b553a..13d7d76203 100644 --- a/setup.py +++ b/setup.py @@ -62,9 +62,11 @@ setuptools.setup( 'list_server=openstackclient.compute.v2.server:List_Server', 'show_server=openstackclient.compute.v2.server:Show_Server', 'create_service=' + - 'openstackclient.identity.v2_0.service:Create_Service', - 'list_service=openstackclient.identity.v2_0.service:List_Service', - 'show_service=openstackclient.identity.v2_0.service:Show_Service', + 'openstackclient.identity.v2_0.service:CreateService', + 'delete_service=' + + 'openstackclient.identity.v2_0.service:DeleteService', + 'list_service=openstackclient.identity.v2_0.service:ListService', + 'show_service=openstackclient.identity.v2_0.service:ShowService', 'create_tenant=' + 'openstackclient.identity.v2_0.tenant:Create_Tenant', 'delete_tenant=' +