Update service commands

* add {create|delete} service
* allow 'service' arg to also search type attribute in show command

Change-Id: I992359dc95fab1fbdab0666d5cbb75e44ba6e0f3
This commit is contained in:
Dean Troyer 2012-05-11 17:19:08 -05:00
parent fd8197de6d
commit d6a4fb836f
3 changed files with 94 additions and 31 deletions
openstackclient
common
identity/v2_0
setup.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={}):

@ -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()))

@ -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=' +