summaryrefslogtreecommitdiff
path: root/openstackclient/identity/v3
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient/identity/v3')
-rw-r--r--openstackclient/identity/v3/consumer.py22
-rw-r--r--openstackclient/identity/v3/domain.py2
-rw-r--r--openstackclient/identity/v3/endpoint.py71
-rw-r--r--openstackclient/identity/v3/federation_protocol.py66
-rw-r--r--openstackclient/identity/v3/identity_provider.py33
-rw-r--r--openstackclient/identity/v3/mapping.py39
-rw-r--r--openstackclient/identity/v3/policy.py63
-rw-r--r--openstackclient/identity/v3/project.py4
-rw-r--r--openstackclient/identity/v3/region.py4
-rw-r--r--openstackclient/identity/v3/role.py4
-rw-r--r--openstackclient/identity/v3/service.py32
-rw-r--r--openstackclient/identity/v3/token.py85
-rw-r--r--openstackclient/identity/v3/user.py55
13 files changed, 292 insertions, 188 deletions
diff --git a/openstackclient/identity/v3/consumer.py b/openstackclient/identity/v3/consumer.py
index b7e57d8d..ffbd5104 100644
--- a/openstackclient/identity/v3/consumer.py
+++ b/openstackclient/identity/v3/consumer.py
@@ -27,7 +27,7 @@ from openstackclient.common import utils
class CreateConsumer(show.ShowOne):
- """Create consumer command"""
+ """Create new consumer"""
log = logging.getLogger(__name__ + '.CreateConsumer')
@@ -35,7 +35,7 @@ class CreateConsumer(show.ShowOne):
parser = super(CreateConsumer, self).get_parser(prog_name)
parser.add_argument(
'--description',
- metavar='<consumer-description>',
+ metavar='<description>',
help='New consumer description',
)
return parser
@@ -51,7 +51,7 @@ class CreateConsumer(show.ShowOne):
class DeleteConsumer(command.Command):
- """Delete consumer command"""
+ """Delete consumer"""
log = logging.getLogger(__name__ + '.DeleteConsumer')
@@ -60,7 +60,7 @@ class DeleteConsumer(command.Command):
parser.add_argument(
'consumer',
metavar='<consumer>',
- help='ID of consumer to delete',
+ help='Consumer to delete',
)
return parser
@@ -74,7 +74,7 @@ class DeleteConsumer(command.Command):
class ListConsumer(lister.Lister):
- """List consumer command"""
+ """List consumers"""
log = logging.getLogger(__name__ + '.ListConsumer')
@@ -90,7 +90,7 @@ class ListConsumer(lister.Lister):
class SetConsumer(command.Command):
- """Set consumer command"""
+ """Set consumer properties"""
log = logging.getLogger(__name__ + '.SetConsumer')
@@ -99,11 +99,11 @@ class SetConsumer(command.Command):
parser.add_argument(
'consumer',
metavar='<consumer>',
- help='ID of consumer to change',
+ help='Consumer to modify',
)
parser.add_argument(
'--description',
- metavar='<new-consumer-description>',
+ metavar='<description>',
help='New consumer description',
)
return parser
@@ -118,7 +118,7 @@ class SetConsumer(command.Command):
kwargs['description'] = parsed_args.description
if not len(kwargs):
- sys.stdout.write("Consumer not updated, no arguments present")
+ sys.stdout.write('Consumer not updated, no arguments present')
return
consumer = identity_client.oauth1.consumers.update(
@@ -127,7 +127,7 @@ class SetConsumer(command.Command):
class ShowConsumer(show.ShowOne):
- """Show consumer command"""
+ """Display consumer details"""
log = logging.getLogger(__name__ + '.ShowConsumer')
@@ -136,7 +136,7 @@ class ShowConsumer(show.ShowOne):
parser.add_argument(
'consumer',
metavar='<consumer>',
- help='ID of consumer to display',
+ help='Consumer to display',
)
return parser
diff --git a/openstackclient/identity/v3/domain.py b/openstackclient/identity/v3/domain.py
index 189f0970..38f99a97 100644
--- a/openstackclient/identity/v3/domain.py
+++ b/openstackclient/identity/v3/domain.py
@@ -187,7 +187,7 @@ class SetDomain(command.Command):
class ShowDomain(show.ShowOne):
- """Show domain details"""
+ """Display domain details"""
log = logging.getLogger(__name__ + '.ShowDomain')
diff --git a/openstackclient/identity/v3/endpoint.py b/openstackclient/identity/v3/endpoint.py
index eba7ca14..52db5ace 100644
--- a/openstackclient/identity/v3/endpoint.py
+++ b/openstackclient/identity/v3/endpoint.py
@@ -35,7 +35,7 @@ def get_service_name(service):
class CreateEndpoint(show.ShowOne):
- """Create endpoint command"""
+ """Create new endpoint"""
log = logging.getLogger(__name__ + '.CreateEndpoint')
@@ -44,27 +44,31 @@ class CreateEndpoint(show.ShowOne):
parser.add_argument(
'service',
metavar='<service>',
- help='Name or ID of new endpoint service')
+ help='New endpoint service (name or ID)',
+ )
parser.add_argument(
'interface',
metavar='<interface>',
choices=['admin', 'public', 'internal'],
- help='New endpoint interface, must be admin, public or internal')
+ help='New endpoint interface type (admin, public or internal)',
+ )
parser.add_argument(
'url',
metavar='<url>',
- help='New endpoint URL')
+ help='New endpoint URL',
+ )
parser.add_argument(
'--region',
- metavar='<region>',
- help='New endpoint region')
+ metavar='<region-id>',
+ help='New endpoint region ID',
+ )
enable_group = parser.add_mutually_exclusive_group()
enable_group.add_argument(
'--enable',
dest='enabled',
action='store_true',
default=True,
- help='Enable endpoint',
+ help='Enable endpoint (default)',
)
enable_group.add_argument(
'--disable',
@@ -96,7 +100,7 @@ class CreateEndpoint(show.ShowOne):
class DeleteEndpoint(command.Command):
- """Delete endpoint command"""
+ """Delete endpoint"""
log = logging.getLogger(__name__ + '.DeleteEndpoint')
@@ -104,8 +108,9 @@ class DeleteEndpoint(command.Command):
parser = super(DeleteEndpoint, self).get_parser(prog_name)
parser.add_argument(
'endpoint',
- metavar='<endpoint>',
- help='ID of endpoint to delete')
+ metavar='<endpoint-id>',
+ help='Endpoint ID to delete',
+ )
return parser
def take_action(self, parsed_args):
@@ -118,7 +123,7 @@ class DeleteEndpoint(command.Command):
class ListEndpoint(lister.Lister):
- """List endpoint command"""
+ """List endpoints"""
log = logging.getLogger(__name__ + '.ListEndpoint')
@@ -127,17 +132,19 @@ class ListEndpoint(lister.Lister):
parser.add_argument(
'--service',
metavar='<service>',
- help='Filter by a specific service')
+ help='Filter by service',
+ )
parser.add_argument(
'--interface',
metavar='<interface>',
choices=['admin', 'public', 'internal'],
- help='Filter by a specific interface, must be admin, public or'
- ' internal')
+ help='Filter by interface type (admin, public or internal)',
+ )
parser.add_argument(
'--region',
- metavar='<region>',
- help='Filter by a specific region')
+ metavar='<region-id>',
+ help='Filter by region ID',
+ )
return parser
def take_action(self, parsed_args):
@@ -167,7 +174,7 @@ class ListEndpoint(lister.Lister):
class SetEndpoint(command.Command):
- """Set endpoint command"""
+ """Set endpoint properties"""
log = logging.getLogger(__name__ + '.SetEndpoint')
@@ -175,25 +182,30 @@ class SetEndpoint(command.Command):
parser = super(SetEndpoint, self).get_parser(prog_name)
parser.add_argument(
'endpoint',
- metavar='<endpoint>',
- help='ID of endpoint to update')
+ metavar='<endpoint-id>',
+ help='Endpoint ID to modify',
+ )
+ parser.add_argument(
+ '--region',
+ metavar='<region-id>',
+ help='New endpoint region ID',
+ )
parser.add_argument(
'--interface',
metavar='<interface>',
choices=['admin', 'public', 'internal'],
- help='New endpoint interface, must be admin|public|internal')
+ help='New endpoint interface type (admin, public or internal)',
+ )
parser.add_argument(
'--url',
metavar='<url>',
- help='New endpoint URL')
+ help='New endpoint URL',
+ )
parser.add_argument(
'--service',
metavar='<service>',
- help='Name or ID of new endpoint service')
- parser.add_argument(
- '--region',
- metavar='<region>',
- help='New endpoint region')
+ help='New endpoint service (name or ID)',
+ )
enable_group = parser.add_mutually_exclusive_group()
enable_group.add_argument(
'--enable',
@@ -245,7 +257,7 @@ class SetEndpoint(command.Command):
class ShowEndpoint(show.ShowOne):
- """Show endpoint command"""
+ """Display endpoint details"""
log = logging.getLogger(__name__ + '.ShowEndpoint')
@@ -253,8 +265,9 @@ class ShowEndpoint(show.ShowOne):
parser = super(ShowEndpoint, self).get_parser(prog_name)
parser.add_argument(
'endpoint',
- metavar='<endpoint>',
- help='ID of endpoint to display')
+ metavar='<endpoint-id>',
+ help='Endpoint ID to display',
+ )
return parser
def take_action(self, parsed_args):
diff --git a/openstackclient/identity/v3/federation_protocol.py b/openstackclient/identity/v3/federation_protocol.py
index 693ec94e..57e8255e 100644
--- a/openstackclient/identity/v3/federation_protocol.py
+++ b/openstackclient/identity/v3/federation_protocol.py
@@ -25,7 +25,7 @@ from openstackclient.common import utils
class CreateProtocol(show.ShowOne):
- """Create new Federation Protocol tied to an Identity Provider"""
+ """Create new federation protocol"""
log = logging.getLogger(__name__ + 'CreateProtocol')
@@ -34,16 +34,19 @@ class CreateProtocol(show.ShowOne):
parser.add_argument(
'federation_protocol',
metavar='<name>',
- help='Protocol (must be unique per Identity Provider')
+ help='New federation protocol name (must be unique per identity '
+ ' provider)')
parser.add_argument(
'--identity-provider',
metavar='<identity-provider>',
- help=('Identity Provider you want to add the Protocol to '
- '(must already exist)'), required=True)
+ required=True,
+ help='Identity provider that will support the new federation '
+ ' protocol (name or ID) (required)')
parser.add_argument(
'--mapping',
- metavar='<mapping>', required=True,
- help='Mapping you want to be used (must already exist)')
+ metavar='<mapping>',
+ required=True,
+ help='Mapping that is to be used (name or ID) (required)')
return parser
@@ -66,7 +69,7 @@ class CreateProtocol(show.ShowOne):
class DeleteProtocol(command.Command):
- """Delete Federation Protocol tied to a Identity Provider"""
+ """Delete federation protocol"""
log = logging.getLogger(__name__ + '.DeleteProtocol')
@@ -74,12 +77,14 @@ class DeleteProtocol(command.Command):
parser = super(DeleteProtocol, self).get_parser(prog_name)
parser.add_argument(
'federation_protocol',
- metavar='<name>',
- help='Protocol (must be unique per Identity Provider')
+ metavar='<federation-protocol>',
+ help='Federation protocol to delete (name or ID)')
parser.add_argument(
'--identity-provider',
- metavar='<identity-provider>', required=True,
- help='Identity Provider the Protocol is tied to')
+ metavar='<identity-provider>',
+ required=True,
+ help='Identity provider that supports <federation-protocol> '
+ '(name or ID) (required)')
return parser
@@ -92,7 +97,7 @@ class DeleteProtocol(command.Command):
class ListProtocols(lister.Lister):
- """List Protocols tied to an Identity Provider"""
+ """List federation protocols"""
log = logging.getLogger(__name__ + '.ListProtocols')
@@ -100,8 +105,9 @@ class ListProtocols(lister.Lister):
parser = super(ListProtocols, self).get_parser(prog_name)
parser.add_argument(
'--identity-provider',
- metavar='<identity-provider>', required=True,
- help='Identity Provider the Protocol is tied to')
+ metavar='<identity-provider>',
+ required=True,
+ help='Identity provider to list (name or ID) (required)')
return parser
@@ -118,7 +124,7 @@ class ListProtocols(lister.Lister):
class SetProtocol(command.Command):
- """Set Protocol tied to an Identity Provider"""
+ """Set federation protocol properties"""
log = logging.getLogger(__name__ + '.SetProtocol')
@@ -127,21 +133,26 @@ class SetProtocol(command.Command):
parser.add_argument(
'federation_protocol',
metavar='<name>',
- help='Protocol (must be unique per Identity Provider')
+ help='Federation protocol to modify (name or ID)')
parser.add_argument(
'--identity-provider',
- metavar='<identity-provider>', required=True,
- help=('Identity Provider you want to add the Protocol to '
- '(must already exist)'))
+ metavar='<identity-provider>',
+ required=True,
+ help='Identity provider that supports <federation-protocol> '
+ '(name or ID) (required)')
parser.add_argument(
'--mapping',
- metavar='<mapping>', required=True,
- help='Mapping you want to be used (must already exist)')
+ metavar='<mapping>',
+ help='Mapping that is to be used (name or ID)')
return parser
def take_action(self, parsed_args):
identity_client = self.app.client_manager.identity
+ if not parsed_args.mapping:
+ self.app.log.error("No changes requested")
+ return
+
protocol = identity_client.federation.protocols.update(
parsed_args.identity_provider, parsed_args.federation_protocol,
parsed_args.mapping)
@@ -156,7 +167,7 @@ class SetProtocol(command.Command):
class ShowProtocol(show.ShowOne):
- """Show Protocol tied to an Identity Provider"""
+ """Display federation protocol details"""
log = logging.getLogger(__name__ + '.ShowProtocol')
@@ -164,13 +175,14 @@ class ShowProtocol(show.ShowOne):
parser = super(ShowProtocol, self).get_parser(prog_name)
parser.add_argument(
'federation_protocol',
- metavar='<name>',
- help='Protocol (must be unique per Identity Provider')
+ metavar='<federation-protocol>',
+ help='Federation protocol to display (name or ID)')
parser.add_argument(
'--identity-provider',
- metavar='<identity-provider>', required=True,
- help=('Identity Provider you want to add the Protocol to '
- '(must already exist)'))
+ metavar='<identity-provider>',
+ required=True,
+ help=('Identity provider that supports <federation-protocol> '
+ '(name or ID) (required)'))
return parser
def take_action(self, parsed_args):
diff --git a/openstackclient/identity/v3/identity_provider.py b/openstackclient/identity/v3/identity_provider.py
index 8a1b22d0..691446da 100644
--- a/openstackclient/identity/v3/identity_provider.py
+++ b/openstackclient/identity/v3/identity_provider.py
@@ -15,7 +15,6 @@
import logging
import six
-import sys
from cliff import command
from cliff import lister
@@ -33,22 +32,21 @@ class CreateIdentityProvider(show.ShowOne):
parser = super(CreateIdentityProvider, self).get_parser(prog_name)
parser.add_argument(
'identity_provider_id',
- metavar='<identity-provider-id>',
- help='New identity provider ID (must be unique)'
+ metavar='<name>',
+ help='New identity provider name (must be unique)'
)
parser.add_argument(
'--description',
metavar='<description>',
help='New identity provider description',
)
-
enable_identity_provider = parser.add_mutually_exclusive_group()
enable_identity_provider.add_argument(
'--enable',
dest='enabled',
action='store_true',
default=True,
- help='Enable identity provider',
+ help='Enable identity provider (default)',
)
enable_identity_provider.add_argument(
'--disable',
@@ -71,7 +69,7 @@ class CreateIdentityProvider(show.ShowOne):
class DeleteIdentityProvider(command.Command):
- """Delete an identity provider"""
+ """Delete identity provider"""
log = logging.getLogger(__name__ + '.DeleteIdentityProvider')
@@ -79,8 +77,8 @@ class DeleteIdentityProvider(command.Command):
parser = super(DeleteIdentityProvider, self).get_parser(prog_name)
parser.add_argument(
'identity_provider',
- metavar='<identity-provider-id>',
- help='Identity provider ID to delete',
+ metavar='<identity-provider>',
+ help='Identity provider to delete',
)
return parser
@@ -118,10 +116,9 @@ class SetIdentityProvider(command.Command):
parser = super(SetIdentityProvider, self).get_parser(prog_name)
parser.add_argument(
'identity_provider',
- metavar='<identity-provider-id>',
- help='Identity provider ID to change',
+ metavar='<identity-provider>',
+ help='Identity provider to modify',
)
-
enable_identity_provider = parser.add_mutually_exclusive_group()
enable_identity_provider.add_argument(
'--enable',
@@ -144,19 +141,17 @@ class SetIdentityProvider(command.Command):
elif parsed_args.disable is True:
enabled = False
else:
- sys.stdout.write("Identity Provider not updated, "
- "no arguments present")
+ self.log.error("No changes requested")
return (None, None)
identity_provider = federation_client.identity_providers.update(
parsed_args.identity_provider, enabled=enabled)
- info = {}
- info.update(identity_provider._info)
- return zip(*sorted(six.iteritems(info)))
+ identity_provider._info.pop('links', None)
+ return zip(*sorted(six.iteritems(identity_provider._info)))
class ShowIdentityProvider(show.ShowOne):
- """Show identity provider details"""
+ """Display identity provider details"""
log = logging.getLogger(__name__ + '.ShowIdentityProvider')
@@ -164,8 +159,8 @@ class ShowIdentityProvider(show.ShowOne):
parser = super(ShowIdentityProvider, self).get_parser(prog_name)
parser.add_argument(
'identity_provider',
- metavar='<identity-provider-id>',
- help='Identity provider ID to show',
+ metavar='<identity-provider>',
+ help='Identity provider to display',
)
return parser
diff --git a/openstackclient/identity/v3/mapping.py b/openstackclient/identity/v3/mapping.py
index c530a404..c79331ec 100644
--- a/openstackclient/identity/v3/mapping.py
+++ b/openstackclient/identity/v3/mapping.py
@@ -80,7 +80,7 @@ class _RulesReader(object):
class CreateMapping(show.ShowOne, _RulesReader):
- """Create new federation mapping"""
+ """Create new mapping"""
log = logging.getLogger(__name__ + '.CreateMapping')
@@ -89,12 +89,12 @@ class CreateMapping(show.ShowOne, _RulesReader):
parser.add_argument(
'mapping',
metavar='<name>',
- help='New mapping (must be unique)',
+ help='New mapping name (must be unique)',
)
parser.add_argument(
'--rules',
- metavar='<rules>', required=True,
- help='Filename with rules',
+ metavar='<filename>', required=True,
+ help='Filename that contains a set of mapping rules (required)',
)
return parser
@@ -112,7 +112,7 @@ class CreateMapping(show.ShowOne, _RulesReader):
class DeleteMapping(command.Command):
- """Delete federation mapping"""
+ """Delete mapping"""
log = logging.getLogger(__name__ + '.DeleteMapping')
@@ -120,7 +120,7 @@ class DeleteMapping(command.Command):
parser = super(DeleteMapping, self).get_parser(prog_name)
parser.add_argument(
'mapping',
- metavar='<name>',
+ metavar='<mapping>',
help='Mapping to delete',
)
return parser
@@ -134,7 +134,7 @@ class DeleteMapping(command.Command):
class ListMapping(lister.Lister):
- """List federation mappings"""
+ """List mappings"""
log = logging.getLogger(__name__ + '.ListMapping')
def take_action(self, parsed_args):
@@ -149,8 +149,8 @@ class ListMapping(lister.Lister):
return (columns, items)
-class SetMapping(show.ShowOne, _RulesReader):
- """Update federation mapping"""
+class SetMapping(command.Command, _RulesReader):
+ """Set mapping properties"""
log = logging.getLogger(__name__ + '.SetMapping')
@@ -159,12 +159,12 @@ class SetMapping(show.ShowOne, _RulesReader):
parser.add_argument(
'mapping',
metavar='<name>',
- help='Mapping to update.',
+ help='Mapping to modify',
)
parser.add_argument(
'--rules',
- metavar='<rules>', required=True,
- help='Filename with rules',
+ metavar='<filename>',
+ help='Filename that contains a new set of mapping rules',
)
return parser
@@ -172,19 +172,22 @@ class SetMapping(show.ShowOne, _RulesReader):
self.log.debug('take_action(%s)' % parsed_args)
identity_client = self.app.client_manager.identity
+ if not parsed_args.rules:
+ self.app.log.error("No changes requested")
+ return
+
rules = self._read_rules(parsed_args.rules)
mapping = identity_client.federation.mappings.update(
mapping=parsed_args.mapping,
rules=rules)
- info = {}
- info.update(mapping._info)
- return zip(*sorted(six.iteritems(info)))
+ mapping._info.pop('links', None)
+ return zip(*sorted(six.iteritems(mapping._info)))
class ShowMapping(show.ShowOne):
- """Show federation mapping details"""
+ """Display mapping details"""
log = logging.getLogger(__name__ + '.ShowMapping')
@@ -192,8 +195,8 @@ class ShowMapping(show.ShowOne):
parser = super(ShowMapping, self).get_parser(prog_name)
parser.add_argument(
'mapping',
- metavar='<name>',
- help='Mapping to show',
+ metavar='<mapping>',
+ help='Mapping to display',
)
return parser
diff --git a/openstackclient/identity/v3/policy.py b/openstackclient/identity/v3/policy.py
index 802880bf..82935423 100644
--- a/openstackclient/identity/v3/policy.py
+++ b/openstackclient/identity/v3/policy.py
@@ -27,7 +27,7 @@ from openstackclient.common import utils
class CreatePolicy(show.ShowOne):
- """Create policy command"""
+ """Create new policy"""
log = logging.getLogger(__name__ + '.CreatePolicy')
@@ -35,20 +35,21 @@ class CreatePolicy(show.ShowOne):
parser = super(CreatePolicy, self).get_parser(prog_name)
parser.add_argument(
'--type',
- metavar='<policy-type>',
+ metavar='<type>',
default="application/json",
- help='New MIME type of the policy blob - i.e.: application/json',
+ help='New MIME type of the policy rules file '
+ '(defaults to application/json)',
)
parser.add_argument(
- 'blob_file',
- metavar='<blob-file>',
- help='New policy rule set itself, as a serialized blob, in a file',
+ 'rules',
+ metavar='<filename>',
+ help='New serialized policy rules file',
)
return parser
def take_action(self, parsed_args):
self.log.debug('take_action(%s)', parsed_args)
- blob = utils.read_blob_file_contents(parsed_args.blob_file)
+ blob = utils.read_blob_file_contents(parsed_args.rules)
identity_client = self.app.client_manager.identity
policy = identity_client.policies.create(
@@ -56,11 +57,12 @@ class CreatePolicy(show.ShowOne):
)
policy._info.pop('links')
+ policy._info.update({'rules': policy._info.pop('blob')})
return zip(*sorted(six.iteritems(policy._info)))
class DeletePolicy(command.Command):
- """Delete policy command"""
+ """Delete policy"""
log = logging.getLogger(__name__ + '.DeletePolicy')
@@ -68,8 +70,8 @@ class DeletePolicy(command.Command):
parser = super(DeletePolicy, self).get_parser(prog_name)
parser.add_argument(
'policy',
- metavar='<policy-id>',
- help='ID of policy to delete',
+ metavar='<policy>',
+ help='Policy to delete',
)
return parser
@@ -81,28 +83,30 @@ class DeletePolicy(command.Command):
class ListPolicy(lister.Lister):
- """List policy command"""
+ """List policies"""
log = logging.getLogger(__name__ + '.ListPolicy')
def get_parser(self, prog_name):
parser = super(ListPolicy, self).get_parser(prog_name)
parser.add_argument(
- '--include-blob',
+ '--long',
action='store_true',
default=False,
- help='Additional fields are listed in output',
+ help='List additional fields in output',
)
return parser
def take_action(self, parsed_args):
self.log.debug('take_action(%s)', parsed_args)
- if parsed_args.include_blob:
+ if parsed_args.long:
columns = ('ID', 'Type', 'Blob')
+ column_headers = ('ID', 'Type', 'Rules')
else:
columns = ('ID', 'Type')
+ column_headers = columns
data = self.app.client_manager.identity.policies.list()
- return (columns,
+ return (column_headers,
(utils.get_item_properties(
s, columns,
formatters={},
@@ -110,7 +114,7 @@ class ListPolicy(lister.Lister):
class SetPolicy(command.Command):
- """Set policy command"""
+ """Set policy properties"""
log = logging.getLogger(__name__ + '.SetPolicy')
@@ -118,18 +122,18 @@ class SetPolicy(command.Command):
parser = super(SetPolicy, self).get_parser(prog_name)
parser.add_argument(
'policy',
- metavar='<policy-id>',
- help='ID of policy to change',
+ metavar='<policy>',
+ help='Policy to modify',
)
parser.add_argument(
'--type',
- metavar='<policy-type>',
- help='New MIME Type of the policy blob - i.e.: application/json',
+ metavar='<type>',
+ help='New MIME type of the policy rules file',
)
parser.add_argument(
- '--blob-file',
- metavar='<blob_file>',
- help='New policy rule set itself, as a serialized blob, in a file',
+ '--rules',
+ metavar='<filename>',
+ help='New serialized policy rules file',
)
return parser
@@ -138,8 +142,8 @@ class SetPolicy(command.Command):
identity_client = self.app.client_manager.identity
blob = None
- if parsed_args.blob_file:
- blob = utils.read_blob_file_contents(parsed_args.blob_file)
+ if parsed_args.rules:
+ blob = utils.read_blob_file_contents(parsed_args.rules)
kwargs = {}
if blob:
@@ -148,14 +152,14 @@ class SetPolicy(command.Command):
kwargs['type'] = parsed_args.type
if not kwargs:
- sys.stdout.write("Policy not updated, no arguments present \n")
+ sys.stdout.write('Policy not updated, no arguments present \n')
return
identity_client.policies.update(parsed_args.policy, **kwargs)
return
class ShowPolicy(show.ShowOne):
- """Show policy command"""
+ """Display policy details"""
log = logging.getLogger(__name__ + '.ShowPolicy')
@@ -163,8 +167,8 @@ class ShowPolicy(show.ShowOne):
parser = super(ShowPolicy, self).get_parser(prog_name)
parser.add_argument(
'policy',
- metavar='<policy-id>',
- help='ID of policy to display',
+ metavar='<policy>',
+ help='Policy to display',
)
return parser
@@ -175,4 +179,5 @@ class ShowPolicy(show.ShowOne):
parsed_args.policy)
policy._info.pop('links')
+ policy._info.update({'rules': policy._info.pop('blob')})
return zip(*sorted(six.iteritems(policy._info)))
diff --git a/openstackclient/identity/v3/project.py b/openstackclient/identity/v3/project.py
index 28eb4277..9a54e5cd 100644
--- a/openstackclient/identity/v3/project.py
+++ b/openstackclient/identity/v3/project.py
@@ -298,7 +298,7 @@ class SetProject(command.Command):
class ShowProject(show.ShowOne):
- """Show project command"""
+ """Display project details"""
log = logging.getLogger(__name__ + '.ShowProject')
@@ -307,7 +307,7 @@ class ShowProject(show.ShowOne):
parser.add_argument(
'project',
metavar='<project>',
- help='Name or ID of project to display',
+ help='Project to display (name or ID)',
)
parser.add_argument(
'--domain',
diff --git a/openstackclient/identity/v3/region.py b/openstackclient/identity/v3/region.py
index 5fb73913..5cb51fc5 100644
--- a/openstackclient/identity/v3/region.py
+++ b/openstackclient/identity/v3/region.py
@@ -138,7 +138,7 @@ class SetRegion(command.Command):
parser.add_argument(
'region',
metavar='<region-id>',
- help=_('Region ID to modify'),
+ help=_('Region to modify'),
)
parser.add_argument(
'--parent-region',
@@ -188,7 +188,7 @@ class ShowRegion(show.ShowOne):
parser.add_argument(
'region',
metavar='<region-id>',
- help=_('Region ID to display'),
+ help=_('Region to display'),
)
return parser
diff --git a/openstackclient/identity/v3/role.py b/openstackclient/identity/v3/role.py
index d680278e..03760709 100644
--- a/openstackclient/identity/v3/role.py
+++ b/openstackclient/identity/v3/role.py
@@ -467,7 +467,7 @@ class SetRole(command.Command):
class ShowRole(show.ShowOne):
- """Show single role"""
+ """Display role details"""
log = logging.getLogger(__name__ + '.ShowRole')
@@ -476,7 +476,7 @@ class ShowRole(show.ShowOne):
parser.add_argument(
'role',
metavar='<role>',
- help='Role to show (name or ID)',
+ help='Role to display (name or ID)',
)
return parser
diff --git a/openstackclient/identity/v3/service.py b/openstackclient/identity/v3/service.py
index f4c5d426..12629253 100644
--- a/openstackclient/identity/v3/service.py
+++ b/openstackclient/identity/v3/service.py
@@ -15,6 +15,7 @@
"""Identity v3 Service action implementations"""
+import argparse
import logging
import six
@@ -35,12 +36,12 @@ class CreateService(show.ShowOne):
parser = super(CreateService, self).get_parser(prog_name)
parser.add_argument(
'type',
- metavar='<service-type>',
+ metavar='<type>',
help='New service type (compute, image, identity, volume, etc)',
)
parser.add_argument(
'--name',
- metavar='<service-name>',
+ metavar='<name>',
help='New service name',
)
parser.add_argument(
@@ -52,12 +53,12 @@ class CreateService(show.ShowOne):
enable_group.add_argument(
'--enable',
action='store_true',
- help='Enable project',
+ help='Enable service (default)',
)
enable_group.add_argument(
'--disable',
action='store_true',
- help='Disable project',
+ help='Disable service',
)
return parser
@@ -90,7 +91,7 @@ class DeleteService(command.Command):
parser.add_argument(
'service',
metavar='<service>',
- help='Service to delete (name or ID)',
+ help='Service to delete (type or ID)',
)
return parser
@@ -109,6 +110,17 @@ class ListService(lister.Lister):
log = logging.getLogger(__name__ + '.ListService')
+ def get_parser(self, prog_name):
+ """The --long option is here for compatibility only."""
+ parser = super(ListService, self).get_parser(prog_name)
+ parser.add_argument(
+ '--long',
+ action='store_true',
+ default=False,
+ help=argparse.SUPPRESS,
+ )
+ return parser
+
def take_action(self, parsed_args):
self.log.debug('take_action(%s)', parsed_args)
@@ -131,11 +143,11 @@ class SetService(command.Command):
parser.add_argument(
'service',
metavar='<service>',
- help='Service to update (name or ID)',
+ help='Service to update (type, name or ID)',
)
parser.add_argument(
'--type',
- metavar='<service-type>',
+ metavar='<type>',
help='New service type (compute, image, identity, volume, etc)',
)
parser.add_argument(
@@ -152,12 +164,12 @@ class SetService(command.Command):
enable_group.add_argument(
'--enable',
action='store_true',
- help='Enable project',
+ help='Enable service',
)
enable_group.add_argument(
'--disable',
action='store_true',
- help='Disable project',
+ help='Disable service',
)
return parser
@@ -194,7 +206,7 @@ class SetService(command.Command):
class ShowService(show.ShowOne):
- """Show service details"""
+ """Display service details"""
log = logging.getLogger(__name__ + '.ShowService')
diff --git a/openstackclient/identity/v3/token.py b/openstackclient/identity/v3/token.py
index 5b09b69f..7000b62c 100644
--- a/openstackclient/identity/v3/token.py
+++ b/openstackclient/identity/v3/token.py
@@ -20,9 +20,12 @@ import six
from cliff import show
+from openstackclient.common import utils
+from openstackclient.identity import common
+
class AuthorizeRequestToken(show.ShowOne):
- """Authorize request token"""
+ """Authorize a request token"""
log = logging.getLogger(__name__ + '.AuthorizeRequestToken')
@@ -31,13 +34,16 @@ class AuthorizeRequestToken(show.ShowOne):
parser.add_argument(
'--request-key',
metavar='<request-key>',
- help='Request token key',
+ help='Request token to authorize (ID only) (required)',
required=True
)
parser.add_argument(
- '--role-ids',
- metavar='<role-ids>',
- help='Requested role IDs',
+ '--role',
+ metavar='<role>',
+ action='append',
+ default=[],
+ help='Roles to authorize (name or ID) '
+ '(repeat to set multiple values) (required)',
required=True
)
return parser
@@ -46,20 +52,24 @@ class AuthorizeRequestToken(show.ShowOne):
self.log.debug('take_action(%s)' % parsed_args)
identity_client = self.app.client_manager.identity
+ # NOTE(stevemar): We want a list of role ids
roles = []
- for r_id in parsed_args.role_ids.split():
- roles.append(r_id)
+ for role in parsed_args.role:
+ role_id = utils.find_resource(
+ identity_client.roles,
+ role,
+ ).id
+ roles.append(role_id)
verifier_pin = identity_client.oauth1.request_tokens.authorize(
parsed_args.request_key,
roles)
- info = {}
- info.update(verifier_pin._info)
- return zip(*sorted(six.iteritems(info)))
+
+ return zip(*sorted(six.iteritems(verifier_pin._info)))
class CreateAccessToken(show.ShowOne):
- """Create access token"""
+ """Create an access token"""
log = logging.getLogger(__name__ + '.CreateAccessToken')
@@ -68,31 +78,31 @@ class CreateAccessToken(show.ShowOne):
parser.add_argument(
'--consumer-key',
metavar='<consumer-key>',
- help='Consumer key',
+ help='Consumer key (required)',
required=True
)
parser.add_argument(
'--consumer-secret',
metavar='<consumer-secret>',
- help='Consumer secret',
+ help='Consumer secret (required)',
required=True
)
parser.add_argument(
'--request-key',
metavar='<request-key>',
- help='Request token key',
+ help='Request token to exchange for access token (required)',
required=True
)
parser.add_argument(
'--request-secret',
metavar='<request-secret>',
- help='Request token secret',
+ help='Secret associated with <request-key> (required)',
required=True
)
parser.add_argument(
'--verifier',
metavar='<verifier>',
- help='Verifier Pin',
+ help='Verifier associated with <request-key> (required)',
required=True
)
return parser
@@ -104,13 +114,11 @@ class CreateAccessToken(show.ShowOne):
parsed_args.consumer_key, parsed_args.consumer_secret,
parsed_args.request_key, parsed_args.request_secret,
parsed_args.verifier)
- info = {}
- info.update(access_token._info)
- return zip(*sorted(six.iteritems(info)))
+ return zip(*sorted(six.iteritems(access_token._info)))
class CreateRequestToken(show.ShowOne):
- """Create request token"""
+ """Create a request token"""
log = logging.getLogger(__name__ + '.CreateRequestToken')
@@ -119,33 +127,50 @@ class CreateRequestToken(show.ShowOne):
parser.add_argument(
'--consumer-key',
metavar='<consumer-key>',
- help='Consumer key',
+ help='Consumer key (required)',
required=True
)
parser.add_argument(
'--consumer-secret',
metavar='<consumer-secret>',
- help='Consumer secret',
+ help='Consumer secret (required)',
required=True
)
parser.add_argument(
- '--project-id',
- metavar='<project-id>',
- help='Requested project ID',
+ '--project',
+ metavar='<project>',
+ help='Project that consumer wants to access (name or ID)'
+ ' (required)',
required=True
)
+ parser.add_argument(
+ '--domain',
+ metavar='<domain>',
+ help='Domain owning <project> (name or ID)',
+ )
return parser
def take_action(self, parsed_args):
self.log.debug('take_action(%s)' % parsed_args)
- token_client = self.app.client_manager.identity.oauth1.request_tokens
+
+ identity_client = self.app.client_manager.identity
+
+ if parsed_args.domain:
+ domain = common.find_domain(identity_client, parsed_args.domain)
+ project = utils.find_resource(identity_client.projects,
+ parsed_args.project,
+ domain_id=domain.id)
+ else:
+ project = utils.find_resource(identity_client.projects,
+ parsed_args.project)
+
+ token_client = identity_client.oauth1.request_tokens
+
request_token = token_client.create(
parsed_args.consumer_key,
parsed_args.consumer_secret,
- parsed_args.project_id)
- info = {}
- info.update(request_token._info)
- return zip(*sorted(six.iteritems(info)))
+ project.id)
+ return zip(*sorted(six.iteritems(request_token._info)))
class IssueToken(show.ShowOne):
diff --git a/openstackclient/identity/v3/user.py b/openstackclient/identity/v3/user.py
index a60c8c83..7b847eed 100644
--- a/openstackclient/identity/v3/user.py
+++ b/openstackclient/identity/v3/user.py
@@ -188,11 +188,17 @@ class ListUser(lister.Lister):
metavar='<domain>',
help='Filter users by <domain> (name or ID)',
)
- parser.add_argument(
+ project_or_group = parser.add_mutually_exclusive_group()
+ project_or_group.add_argument(
'--group',
metavar='<group>',
help='Filter users by <group> membership (name or ID)',
)
+ project_or_group.add_argument(
+ '--project',
+ metavar='<project>',
+ help='Filter users by <project> (name or ID)',
+ )
parser.add_argument(
'--long',
action='store_true',
@@ -219,7 +225,44 @@ class ListUser(lister.Lister):
else:
group = None
- # List users
+ if parsed_args.project:
+ if domain is not None:
+ project = utils.find_resource(
+ identity_client.projects,
+ parsed_args.project,
+ domain_id=domain
+ ).id
+ else:
+ project = utils.find_resource(
+ identity_client.projects,
+ parsed_args.project,
+ ).id
+
+ assignments = identity_client.role_assignments.list(
+ project=project)
+
+ # NOTE(stevemar): If a user has more than one role on a project
+ # then they will have two entries in the returned data. Since we
+ # are looking for any role, let's just track unique user IDs.
+ user_ids = set()
+ for assignment in assignments:
+ if hasattr(assignment, 'user'):
+ user_ids.add(assignment.user['id'])
+
+ # NOTE(stevemar): Call find_resource once we have unique IDs, so
+ # it's fewer trips to the Identity API, then collect the data.
+ data = []
+ for user_id in user_ids:
+ user = utils.find_resource(identity_client.users, user_id)
+ data.append(user)
+
+ else:
+ data = identity_client.users.list(
+ domain=domain,
+ group=group,
+ )
+
+ # Column handling
if parsed_args.long:
columns = ['ID', 'Name', 'Default Project Id', 'Domain Id',
'Description', 'Email', 'Enabled']
@@ -228,11 +271,7 @@ class ListUser(lister.Lister):
column_headers[3] = 'Domain'
else:
columns = ['ID', 'Name']
- column_headers = copy.deepcopy(columns)
- data = identity_client.users.list(
- domain=domain,
- group=group,
- )
+ column_headers = columns
return (
column_headers,
@@ -383,7 +422,7 @@ class SetPasswordUser(command.Command):
class ShowUser(show.ShowOne):
- """Show user details"""
+ """Display user details"""
log = logging.getLogger(__name__ + '.ShowUser')