Add --or-show support for v3 identity resources

Add --or-show for the following:
  * v3 roles
  * v3 projects
  * v3 domains
  * v3 users
  * v3 groups

Closes-Bug: #1390389
Change-Id: Id4ef043e5fda6be49a515eb3fe138c813c393ec9
This commit is contained in:
Steve Martinelli 2014-11-14 01:59:14 -05:00
parent 7242113a8f
commit 79653afa7b
5 changed files with 106 additions and 27 deletions

@ -22,8 +22,10 @@ import sys
from cliff import command
from cliff import lister
from cliff import show
from keystoneclient.openstack.common.apiclient import exceptions as ksc_exc
from openstackclient.common import utils
from openstackclient.i18n import _ # noqa
class CreateDomain(show.ShowOne):
@ -55,16 +57,30 @@ class CreateDomain(show.ShowOne):
dest='enabled',
action='store_false',
help='Disable domain')
parser.add_argument(
'--or-show',
action='store_true',
help=_('Return existing domain'),
)
return parser
def take_action(self, parsed_args):
self.log.debug('take_action(%s)', parsed_args)
identity_client = self.app.client_manager.identity
domain = identity_client.domains.create(
name=parsed_args.name,
description=parsed_args.description,
enabled=parsed_args.enabled,
)
try:
domain = identity_client.domains.create(
name=parsed_args.name,
description=parsed_args.description,
enabled=parsed_args.enabled,
)
except ksc_exc.Conflict as e:
if parsed_args.or_show:
domain = utils.find_resource(identity_client.domains,
parsed_args.name)
self.log.info('Returning existing domain %s', domain.name)
else:
raise e
domain._info.pop('links')
return zip(*sorted(six.iteritems(domain._info)))

@ -22,8 +22,10 @@ import sys
from cliff import command
from cliff import lister
from cliff import show
from keystoneclient.openstack.common.apiclient import exceptions as ksc_exc
from openstackclient.common import utils
from openstackclient.i18n import _ # noqa
from openstackclient.identity import common
@ -122,7 +124,11 @@ class CreateGroup(show.ShowOne):
'--domain',
metavar='<group-domain>',
help='References the domain ID or name which owns the group')
parser.add_argument(
'--or-show',
action='store_true',
help=_('Return existing group'),
)
return parser
def take_action(self, parsed_args):
@ -133,10 +139,20 @@ class CreateGroup(show.ShowOne):
parsed_args.domain).id
else:
domain = None
group = identity_client.groups.create(
name=parsed_args.name,
domain=domain,
description=parsed_args.description)
try:
group = identity_client.groups.create(
name=parsed_args.name,
domain=domain,
description=parsed_args.description)
except ksc_exc.Conflict as e:
if parsed_args.or_show:
group = utils.find_resource(identity_client.groups,
parsed_args.name,
domain_id=domain)
self.log.info('Returning existing group %s', group.name)
else:
raise e
group._info.pop('links')
return zip(*sorted(six.iteritems(group._info)))

@ -21,9 +21,11 @@ import six
from cliff import command
from cliff import lister
from cliff import show
from keystoneclient.openstack.common.apiclient import exceptions as ksc_exc
from openstackclient.common import parseractions
from openstackclient.common import utils
from openstackclient.i18n import _ # noqa
from openstackclient.identity import common
@ -67,6 +69,11 @@ class CreateProject(show.ShowOne):
help='Property to add for this project '
'(repeat option to set multiple properties)',
)
parser.add_argument(
'--or-show',
action='store_true',
help=_('Return existing project'),
)
return parser
def take_action(self, parsed_args):
@ -86,13 +93,22 @@ class CreateProject(show.ShowOne):
if parsed_args.property:
kwargs = parsed_args.property.copy()
project = identity_client.projects.create(
name=parsed_args.name,
domain=domain,
description=parsed_args.description,
enabled=enabled,
**kwargs
)
try:
project = identity_client.projects.create(
name=parsed_args.name,
domain=domain,
description=parsed_args.description,
enabled=enabled,
**kwargs
)
except ksc_exc.Conflict as e:
if parsed_args.or_show:
project = utils.find_resource(identity_client.projects,
parsed_args.name,
domain_id=domain)
self.log.info('Returning existing project %s', project.name)
else:
raise e
project._info.pop('links')
return zip(*sorted(six.iteritems(project._info)))

@ -22,8 +22,10 @@ import sys
from cliff import command
from cliff import lister
from cliff import show
from keystoneclient.openstack.common.apiclient import exceptions as ksc_exc
from openstackclient.common import utils
from openstackclient.i18n import _ # noqa
class AddRole(command.Command):
@ -149,13 +151,26 @@ class CreateRole(show.ShowOne):
metavar='<role-name>',
help='New role name',
)
parser.add_argument(
'--or-show',
action='store_true',
help=_('Return existing role'),
)
return parser
def take_action(self, parsed_args):
self.log.debug('take_action(%s)', parsed_args)
identity_client = self.app.client_manager.identity
role = identity_client.roles.create(name=parsed_args.name)
try:
role = identity_client.roles.create(name=parsed_args.name)
except ksc_exc.Conflict as e:
if parsed_args.or_show:
role = utils.find_resource(identity_client.roles,
parsed_args.name)
self.log.info('Returning existing role %s', role.name)
else:
raise e
role._info.pop('links')
return zip(*sorted(six.iteritems(role._info)))

@ -21,8 +21,10 @@ import six
from cliff import command
from cliff import lister
from cliff import show
from keystoneclient.openstack.common.apiclient import exceptions as ksc_exc
from openstackclient.common import utils
from openstackclient.i18n import _ # noqa
from openstackclient.identity import common
@ -80,6 +82,11 @@ class CreateUser(show.ShowOne):
action='store_true',
help='Disable user',
)
parser.add_argument(
'--or-show',
action='store_true',
help=_('Return existing user'),
)
return parser
def take_action(self, parsed_args):
@ -106,15 +113,24 @@ class CreateUser(show.ShowOne):
if parsed_args.password_prompt:
parsed_args.password = utils.get_password(self.app.stdin)
user = identity_client.users.create(
name=parsed_args.name,
domain=domain_id,
default_project=project_id,
password=parsed_args.password,
email=parsed_args.email,
description=parsed_args.description,
enabled=enabled
)
try:
user = identity_client.users.create(
name=parsed_args.name,
domain=domain_id,
default_project=project_id,
password=parsed_args.password,
email=parsed_args.email,
description=parsed_args.description,
enabled=enabled
)
except ksc_exc.Conflict as e:
if parsed_args.or_show:
user = utils.find_resource(identity_client.users,
parsed_args.name,
domain_id=domain_id)
self.log.info('Returning existing user %s', user.name)
else:
raise e
user._info.pop('links')
return zip(*sorted(six.iteritems(user._info)))