diff options
Diffstat (limited to 'openstackclient/identity/v3')
| -rw-r--r-- | openstackclient/identity/v3/consumer.py | 22 | ||||
| -rw-r--r-- | openstackclient/identity/v3/domain.py | 2 | ||||
| -rw-r--r-- | openstackclient/identity/v3/endpoint.py | 71 | ||||
| -rw-r--r-- | openstackclient/identity/v3/federation_protocol.py | 66 | ||||
| -rw-r--r-- | openstackclient/identity/v3/identity_provider.py | 33 | ||||
| -rw-r--r-- | openstackclient/identity/v3/mapping.py | 39 | ||||
| -rw-r--r-- | openstackclient/identity/v3/policy.py | 63 | ||||
| -rw-r--r-- | openstackclient/identity/v3/project.py | 4 | ||||
| -rw-r--r-- | openstackclient/identity/v3/region.py | 4 | ||||
| -rw-r--r-- | openstackclient/identity/v3/role.py | 4 | ||||
| -rw-r--r-- | openstackclient/identity/v3/service.py | 32 | ||||
| -rw-r--r-- | openstackclient/identity/v3/token.py | 85 | ||||
| -rw-r--r-- | openstackclient/identity/v3/user.py | 55 |
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') |
