Blacken openstackclient.identity
Black used with the '-l 79 -S' flags. A future change will ignore this commit in git-blame history by adding a 'git-blame-ignore-revs' file. Change-Id: I2eeade1ce6653be8e9179ecc40105182c5ff5f16 Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
This commit is contained in:
@@ -43,18 +43,15 @@ AUTH_VERSIONS = {
|
||||
def make_client(instance):
|
||||
"""Returns an identity service client."""
|
||||
identity_client = utils.get_client_class(
|
||||
API_NAME,
|
||||
instance._api_version[API_NAME],
|
||||
API_VERSIONS)
|
||||
API_NAME, instance._api_version[API_NAME], API_VERSIONS
|
||||
)
|
||||
LOG.debug('Instantiating identity client: %s', identity_client)
|
||||
|
||||
# Remember interface only if interface is set
|
||||
kwargs = utils.build_kwargs_dict('interface', instance.interface)
|
||||
|
||||
client = identity_client(
|
||||
session=instance.session,
|
||||
region_name=instance.region_name,
|
||||
**kwargs
|
||||
session=instance.session, region_name=instance.region_name, **kwargs
|
||||
)
|
||||
|
||||
return client
|
||||
@@ -66,8 +63,11 @@ def build_option_parser(parser):
|
||||
'--os-identity-api-version',
|
||||
metavar='<identity-api-version>',
|
||||
default=utils.env('OS_IDENTITY_API_VERSION'),
|
||||
help=_('Identity API version, default=%s '
|
||||
'(Env: OS_IDENTITY_API_VERSION)') % DEFAULT_API_VERSION,
|
||||
help=_(
|
||||
'Identity API version, default=%s '
|
||||
'(Env: OS_IDENTITY_API_VERSION)'
|
||||
)
|
||||
% DEFAULT_API_VERSION,
|
||||
)
|
||||
return parser
|
||||
|
||||
|
||||
@@ -33,7 +33,8 @@ def find_service_in_list(service_list, service_id):
|
||||
if service.id == service_id:
|
||||
return service
|
||||
raise exceptions.CommandError(
|
||||
"No service with a type, name or ID of '%s' exists." % service_id)
|
||||
"No service with a type, name or ID of '%s' exists." % service_id
|
||||
)
|
||||
|
||||
|
||||
def find_service(identity_client, name_type_or_id):
|
||||
@@ -52,8 +53,10 @@ def find_service(identity_client, name_type_or_id):
|
||||
except identity_exc.NotFound:
|
||||
pass
|
||||
except identity_exc.NoUniqueMatch:
|
||||
msg = _("Multiple service matches found for '%s', "
|
||||
"use an ID to be more specific.")
|
||||
msg = _(
|
||||
"Multiple service matches found for '%s', "
|
||||
"use an ID to be more specific."
|
||||
)
|
||||
raise exceptions.CommandError(msg % name_type_or_id)
|
||||
|
||||
try:
|
||||
@@ -63,8 +66,10 @@ def find_service(identity_client, name_type_or_id):
|
||||
msg = _("No service with a type, name or ID of '%s' exists.")
|
||||
raise exceptions.CommandError(msg % name_type_or_id)
|
||||
except identity_exc.NoUniqueMatch:
|
||||
msg = _("Multiple service matches found for '%s', "
|
||||
"use an ID to be more specific.")
|
||||
msg = _(
|
||||
"Multiple service matches found for '%s', "
|
||||
"use an ID to be more specific."
|
||||
)
|
||||
raise exceptions.CommandError(msg % name_type_or_id)
|
||||
|
||||
|
||||
@@ -141,42 +146,56 @@ def _get_domain_id_if_requested(identity_client, domain_name_or_id):
|
||||
|
||||
|
||||
def find_domain(identity_client, name_or_id):
|
||||
return _find_identity_resource(identity_client.domains, name_or_id,
|
||||
domains.Domain)
|
||||
return _find_identity_resource(
|
||||
identity_client.domains, name_or_id, domains.Domain
|
||||
)
|
||||
|
||||
|
||||
def find_group(identity_client, name_or_id, domain_name_or_id=None):
|
||||
domain_id = _get_domain_id_if_requested(identity_client, domain_name_or_id)
|
||||
if not domain_id:
|
||||
return _find_identity_resource(identity_client.groups, name_or_id,
|
||||
groups.Group)
|
||||
return _find_identity_resource(
|
||||
identity_client.groups, name_or_id, groups.Group
|
||||
)
|
||||
else:
|
||||
return _find_identity_resource(identity_client.groups, name_or_id,
|
||||
groups.Group, domain_id=domain_id)
|
||||
return _find_identity_resource(
|
||||
identity_client.groups,
|
||||
name_or_id,
|
||||
groups.Group,
|
||||
domain_id=domain_id,
|
||||
)
|
||||
|
||||
|
||||
def find_project(identity_client, name_or_id, domain_name_or_id=None):
|
||||
domain_id = _get_domain_id_if_requested(identity_client, domain_name_or_id)
|
||||
if not domain_id:
|
||||
return _find_identity_resource(identity_client.projects, name_or_id,
|
||||
projects.Project)
|
||||
return _find_identity_resource(
|
||||
identity_client.projects, name_or_id, projects.Project
|
||||
)
|
||||
else:
|
||||
return _find_identity_resource(identity_client.projects, name_or_id,
|
||||
projects.Project, domain_id=domain_id)
|
||||
return _find_identity_resource(
|
||||
identity_client.projects,
|
||||
name_or_id,
|
||||
projects.Project,
|
||||
domain_id=domain_id,
|
||||
)
|
||||
|
||||
|
||||
def find_user(identity_client, name_or_id, domain_name_or_id=None):
|
||||
domain_id = _get_domain_id_if_requested(identity_client, domain_name_or_id)
|
||||
if not domain_id:
|
||||
return _find_identity_resource(identity_client.users, name_or_id,
|
||||
users.User)
|
||||
return _find_identity_resource(
|
||||
identity_client.users, name_or_id, users.User
|
||||
)
|
||||
else:
|
||||
return _find_identity_resource(identity_client.users, name_or_id,
|
||||
users.User, domain_id=domain_id)
|
||||
return _find_identity_resource(
|
||||
identity_client.users, name_or_id, users.User, domain_id=domain_id
|
||||
)
|
||||
|
||||
|
||||
def _find_identity_resource(identity_client_manager, name_or_id,
|
||||
resource_type, **kwargs):
|
||||
def _find_identity_resource(
|
||||
identity_client_manager, name_or_id, resource_type, **kwargs
|
||||
):
|
||||
"""Find a specific identity resource.
|
||||
|
||||
Using keystoneclient's manager, attempt to find a specific resource by its
|
||||
@@ -203,8 +222,9 @@ def _find_identity_resource(identity_client_manager, name_or_id,
|
||||
"""
|
||||
|
||||
try:
|
||||
identity_resource = utils.find_resource(identity_client_manager,
|
||||
name_or_id, **kwargs)
|
||||
identity_resource = utils.find_resource(
|
||||
identity_client_manager, name_or_id, **kwargs
|
||||
)
|
||||
if identity_resource is not None:
|
||||
return identity_resource
|
||||
except (exceptions.Forbidden, identity_exc.Forbidden):
|
||||
@@ -226,9 +246,11 @@ def add_user_domain_option_to_parser(parser):
|
||||
parser.add_argument(
|
||||
'--user-domain',
|
||||
metavar='<user-domain>',
|
||||
help=_('Domain the user belongs to (name or ID). '
|
||||
'This can be used in case collisions between user names '
|
||||
'exist.'),
|
||||
help=_(
|
||||
'Domain the user belongs to (name or ID). '
|
||||
'This can be used in case collisions between user names '
|
||||
'exist.'
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
@@ -236,9 +258,11 @@ def add_group_domain_option_to_parser(parser):
|
||||
parser.add_argument(
|
||||
'--group-domain',
|
||||
metavar='<group-domain>',
|
||||
help=_('Domain the group belongs to (name or ID). '
|
||||
'This can be used in case collisions between group names '
|
||||
'exist.'),
|
||||
help=_(
|
||||
'Domain the group belongs to (name or ID). '
|
||||
'This can be used in case collisions between group names '
|
||||
'exist.'
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
@@ -246,9 +270,13 @@ def add_project_domain_option_to_parser(parser, enhance_help=lambda _h: _h):
|
||||
parser.add_argument(
|
||||
'--project-domain',
|
||||
metavar='<project-domain>',
|
||||
help=enhance_help(_('Domain the project belongs to (name or ID). This '
|
||||
'can be used in case collisions between project '
|
||||
'names exist.')),
|
||||
help=enhance_help(
|
||||
_(
|
||||
'Domain the project belongs to (name or ID). This '
|
||||
'can be used in case collisions between project '
|
||||
'names exist.'
|
||||
)
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
@@ -256,9 +284,11 @@ def add_role_domain_option_to_parser(parser):
|
||||
parser.add_argument(
|
||||
'--role-domain',
|
||||
metavar='<role-domain>',
|
||||
help=_('Domain the role belongs to (name or ID). '
|
||||
'This must be specified when the name of a domain specific '
|
||||
'role is used.'),
|
||||
help=_(
|
||||
'Domain the role belongs to (name or ID). '
|
||||
'This must be specified when the name of a domain specific '
|
||||
'role is used.'
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
@@ -267,8 +297,9 @@ def add_inherited_option_to_parser(parser):
|
||||
'--inherited',
|
||||
action='store_true',
|
||||
default=False,
|
||||
help=_('Specifies if the role grant is inheritable to the sub '
|
||||
'projects'),
|
||||
help=_(
|
||||
'Specifies if the role grant is inheritable to the sub ' 'projects'
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
@@ -277,8 +308,10 @@ def add_resource_option_to_parser(parser):
|
||||
enable_group.add_argument(
|
||||
'--immutable',
|
||||
action='store_true',
|
||||
help=_('Make resource immutable. An immutable project may not '
|
||||
'be deleted or modified except to remove the immutable flag'),
|
||||
help=_(
|
||||
'Make resource immutable. An immutable project may not '
|
||||
'be deleted or modified except to remove the immutable flag'
|
||||
),
|
||||
)
|
||||
enable_group.add_argument(
|
||||
'--no-immutable',
|
||||
|
||||
@@ -47,7 +47,6 @@ class ListCatalog(command.Lister):
|
||||
_description = _("List services in the service catalog")
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
|
||||
# Trigger auth if it has not happened yet
|
||||
auth_ref = self.app.client_manager.auth_ref
|
||||
if not auth_ref:
|
||||
@@ -57,13 +56,19 @@ class ListCatalog(command.Lister):
|
||||
|
||||
data = auth_ref.service_catalog.catalog
|
||||
columns = ('Name', 'Type', 'Endpoints')
|
||||
return (columns,
|
||||
(utils.get_dict_properties(
|
||||
s, columns,
|
||||
return (
|
||||
columns,
|
||||
(
|
||||
utils.get_dict_properties(
|
||||
s,
|
||||
columns,
|
||||
formatters={
|
||||
'Endpoints': EndpointsColumn,
|
||||
},
|
||||
) for s in data))
|
||||
)
|
||||
for s in data
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
class ShowCatalog(command.ShowOne):
|
||||
@@ -79,7 +84,6 @@ class ShowCatalog(command.ShowOne):
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
|
||||
# Trigger auth if it has not happened yet
|
||||
auth_ref = self.app.client_manager.auth_ref
|
||||
if not auth_ref:
|
||||
@@ -89,8 +93,10 @@ class ShowCatalog(command.ShowOne):
|
||||
|
||||
data = None
|
||||
for service in auth_ref.service_catalog.catalog:
|
||||
if (service.get('name') == parsed_args.service or
|
||||
service.get('type') == parsed_args.service):
|
||||
if (
|
||||
service.get('name') == parsed_args.service
|
||||
or service.get('type') == parsed_args.service
|
||||
):
|
||||
data = service.copy()
|
||||
data['endpoints'] = EndpointsColumn(data['endpoints'])
|
||||
if 'endpoints_links' in data:
|
||||
|
||||
@@ -77,9 +77,7 @@ class CreateEC2Creds(command.ShowOne):
|
||||
info.update(creds._info)
|
||||
|
||||
if 'tenant_id' in info:
|
||||
info.update(
|
||||
{'project_id': info.pop('tenant_id')}
|
||||
)
|
||||
info.update({'project_id': info.pop('tenant_id')})
|
||||
|
||||
return zip(*sorted(info.items()))
|
||||
|
||||
@@ -120,14 +118,19 @@ class DeleteEC2Creds(command.Command):
|
||||
identity_client.ec2.delete(user, access_key)
|
||||
except Exception as e:
|
||||
result += 1
|
||||
LOG.error(_("Failed to delete EC2 credentials with "
|
||||
"access key '%(access_key)s': %(e)s"),
|
||||
{'access_key': access_key, 'e': e})
|
||||
LOG.error(
|
||||
_(
|
||||
"Failed to delete EC2 credentials with "
|
||||
"access key '%(access_key)s': %(e)s"
|
||||
),
|
||||
{'access_key': access_key, 'e': e},
|
||||
)
|
||||
|
||||
if result > 0:
|
||||
total = len(parsed_args.access_keys)
|
||||
msg = (_("%(result)s of %(total)s EC2 keys failed "
|
||||
"to delete.") % {'result': result, 'total': total})
|
||||
msg = _(
|
||||
"%(result)s of %(total)s EC2 keys failed " "to delete."
|
||||
) % {'result': result, 'total': total}
|
||||
raise exceptions.CommandError(msg)
|
||||
|
||||
|
||||
@@ -159,11 +162,17 @@ class ListEC2Creds(command.Lister):
|
||||
column_headers = ('Access', 'Secret', 'Project ID', 'User ID')
|
||||
data = identity_client.ec2.list(user)
|
||||
|
||||
return (column_headers,
|
||||
(utils.get_item_properties(
|
||||
s, columns,
|
||||
return (
|
||||
column_headers,
|
||||
(
|
||||
utils.get_item_properties(
|
||||
s,
|
||||
columns,
|
||||
formatters={},
|
||||
) for s in data))
|
||||
)
|
||||
for s in data
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
class ShowEC2Creds(command.ShowOne):
|
||||
@@ -201,8 +210,6 @@ class ShowEC2Creds(command.ShowOne):
|
||||
info.update(creds._info)
|
||||
|
||||
if 'tenant_id' in info:
|
||||
info.update(
|
||||
{'project_id': info.pop('tenant_id')}
|
||||
)
|
||||
info.update({'project_id': info.pop('tenant_id')})
|
||||
|
||||
return zip(*sorted(info.items()))
|
||||
|
||||
@@ -69,7 +69,8 @@ class CreateEndpoint(command.ShowOne):
|
||||
service.id,
|
||||
parsed_args.publicurl,
|
||||
parsed_args.adminurl,
|
||||
parsed_args.internalurl,)
|
||||
parsed_args.internalurl,
|
||||
)
|
||||
|
||||
info = {}
|
||||
info.update(endpoint._info)
|
||||
@@ -100,14 +101,19 @@ class DeleteEndpoint(command.Command):
|
||||
identity_client.endpoints.delete(endpoint)
|
||||
except Exception as e:
|
||||
result += 1
|
||||
LOG.error(_("Failed to delete endpoint with "
|
||||
"ID '%(endpoint)s': %(e)s"),
|
||||
{'endpoint': endpoint, 'e': e})
|
||||
LOG.error(
|
||||
_(
|
||||
"Failed to delete endpoint with "
|
||||
"ID '%(endpoint)s': %(e)s"
|
||||
),
|
||||
{'endpoint': endpoint, 'e': e},
|
||||
)
|
||||
|
||||
if result > 0:
|
||||
total = len(parsed_args.endpoints)
|
||||
msg = (_("%(result)s of %(total)s endpoints failed "
|
||||
"to delete.") % {'result': result, 'total': total})
|
||||
msg = _(
|
||||
"%(result)s of %(total)s endpoints failed " "to delete."
|
||||
) % {'result': result, 'total': total}
|
||||
raise exceptions.CommandError(msg)
|
||||
|
||||
|
||||
@@ -127,8 +133,15 @@ class ListEndpoint(command.Lister):
|
||||
def take_action(self, parsed_args):
|
||||
identity_client = self.app.client_manager.identity
|
||||
if parsed_args.long:
|
||||
columns = ('ID', 'Region', 'Service Name', 'Service Type',
|
||||
'PublicURL', 'AdminURL', 'InternalURL')
|
||||
columns = (
|
||||
'ID',
|
||||
'Region',
|
||||
'Service Name',
|
||||
'Service Type',
|
||||
'PublicURL',
|
||||
'AdminURL',
|
||||
'InternalURL',
|
||||
)
|
||||
else:
|
||||
columns = ('ID', 'Region', 'Service Name', 'Service Type')
|
||||
data = identity_client.endpoints.list()
|
||||
@@ -137,11 +150,17 @@ class ListEndpoint(command.Lister):
|
||||
service = common.find_service(identity_client, ep.service_id)
|
||||
ep.service_name = service.name
|
||||
ep.service_type = service.type
|
||||
return (columns,
|
||||
(utils.get_item_properties(
|
||||
s, columns,
|
||||
return (
|
||||
columns,
|
||||
(
|
||||
utils.get_item_properties(
|
||||
s,
|
||||
columns,
|
||||
formatters={},
|
||||
) for s in data))
|
||||
)
|
||||
for s in data
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
class ShowEndpoint(command.ShowOne):
|
||||
@@ -152,8 +171,10 @@ class ShowEndpoint(command.ShowOne):
|
||||
parser.add_argument(
|
||||
'endpoint_or_service',
|
||||
metavar='<endpoint>',
|
||||
help=_('Endpoint to display (endpoint ID, service ID,'
|
||||
' service name, service type)'),
|
||||
help=_(
|
||||
'Endpoint to display (endpoint ID, service ID,'
|
||||
' service name, service type)'
|
||||
),
|
||||
)
|
||||
return parser
|
||||
|
||||
@@ -166,8 +187,9 @@ class ShowEndpoint(command.ShowOne):
|
||||
match = ep
|
||||
service = common.find_service(identity_client, ep.service_id)
|
||||
if match is None:
|
||||
service = common.find_service(identity_client,
|
||||
parsed_args.endpoint_or_service)
|
||||
service = common.find_service(
|
||||
identity_client, parsed_args.endpoint_or_service
|
||||
)
|
||||
for ep in data:
|
||||
if ep.service_id == service.id:
|
||||
match = ep
|
||||
|
||||
@@ -60,8 +60,10 @@ class CreateProject(command.ShowOne):
|
||||
'--property',
|
||||
metavar='<key=value>',
|
||||
action=parseractions.KeyValueAction,
|
||||
help=_('Add a property to <name> '
|
||||
'(repeat option to set multiple properties)'),
|
||||
help=_(
|
||||
'Add a property to <name> '
|
||||
'(repeat option to set multiple properties)'
|
||||
),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--or-show',
|
||||
@@ -128,14 +130,19 @@ class DeleteProject(command.Command):
|
||||
identity_client.tenants.delete(project_obj.id)
|
||||
except Exception as e:
|
||||
errors += 1
|
||||
LOG.error(_("Failed to delete project with "
|
||||
"name or ID '%(project)s': %(e)s"),
|
||||
{'project': project, 'e': e})
|
||||
LOG.error(
|
||||
_(
|
||||
"Failed to delete project with "
|
||||
"name or ID '%(project)s': %(e)s"
|
||||
),
|
||||
{'project': project, 'e': e},
|
||||
)
|
||||
|
||||
if errors > 0:
|
||||
total = len(parsed_args.projects)
|
||||
msg = (_("%(errors)s of %(total)s projects failed "
|
||||
"to delete.") % {'errors': errors, 'total': total})
|
||||
msg = _(
|
||||
"%(errors)s of %(total)s projects failed " "to delete."
|
||||
) % {'errors': errors, 'total': total}
|
||||
raise exceptions.CommandError(msg)
|
||||
|
||||
|
||||
@@ -153,9 +160,11 @@ class ListProject(command.Lister):
|
||||
parser.add_argument(
|
||||
'--sort',
|
||||
metavar='<key>[:<direction>]',
|
||||
help=_('Sort output by selected keys and directions (asc or desc) '
|
||||
'(default: asc), repeat this option to specify multiple '
|
||||
'keys and directions.'),
|
||||
help=_(
|
||||
'Sort output by selected keys and directions (asc or desc) '
|
||||
'(default: asc), repeat this option to specify multiple '
|
||||
'keys and directions.'
|
||||
),
|
||||
)
|
||||
return parser
|
||||
|
||||
@@ -167,11 +176,17 @@ class ListProject(command.Lister):
|
||||
data = self.app.client_manager.identity.tenants.list()
|
||||
if parsed_args.sort:
|
||||
data = utils.sort_items(data, parsed_args.sort)
|
||||
return (columns,
|
||||
(utils.get_item_properties(
|
||||
s, columns,
|
||||
return (
|
||||
columns,
|
||||
(
|
||||
utils.get_item_properties(
|
||||
s,
|
||||
columns,
|
||||
formatters={},
|
||||
) for s in data))
|
||||
)
|
||||
for s in data
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
class SetProject(command.Command):
|
||||
@@ -209,8 +224,10 @@ class SetProject(command.Command):
|
||||
'--property',
|
||||
metavar='<key=value>',
|
||||
action=parseractions.KeyValueAction,
|
||||
help=_('Set a project property '
|
||||
'(repeat option to set multiple properties)'),
|
||||
help=_(
|
||||
'Set a project property '
|
||||
'(repeat option to set multiple properties)'
|
||||
),
|
||||
)
|
||||
return parser
|
||||
|
||||
@@ -268,8 +285,8 @@ class ShowProject(command.ShowOne):
|
||||
except ks_exc.Forbidden:
|
||||
auth_ref = self.app.client_manager.auth_ref
|
||||
if (
|
||||
parsed_args.project == auth_ref.project_id or
|
||||
parsed_args.project == auth_ref.project_name
|
||||
parsed_args.project == auth_ref.project_id
|
||||
or parsed_args.project == auth_ref.project_name
|
||||
):
|
||||
# Ask for currently auth'ed project so return it
|
||||
info = {
|
||||
@@ -316,8 +333,10 @@ class UnsetProject(command.Command):
|
||||
metavar='<key>',
|
||||
action='append',
|
||||
default=[],
|
||||
help=_('Unset a project property '
|
||||
'(repeat option to unset multiple properties)'),
|
||||
help=_(
|
||||
'Unset a project property '
|
||||
'(repeat option to unset multiple properties)'
|
||||
),
|
||||
)
|
||||
return parser
|
||||
|
||||
|
||||
@@ -133,14 +133,20 @@ class DeleteRole(command.Command):
|
||||
identity_client.roles.delete(role_obj.id)
|
||||
except Exception as e:
|
||||
errors += 1
|
||||
LOG.error(_("Failed to delete role with "
|
||||
"name or ID '%(role)s': %(e)s"),
|
||||
{'role': role, 'e': e})
|
||||
LOG.error(
|
||||
_(
|
||||
"Failed to delete role with "
|
||||
"name or ID '%(role)s': %(e)s"
|
||||
),
|
||||
{'role': role, 'e': e},
|
||||
)
|
||||
|
||||
if errors > 0:
|
||||
total = len(parsed_args.roles)
|
||||
msg = (_("%(errors)s of %(total)s roles failed "
|
||||
"to delete.") % {'errors': errors, 'total': total})
|
||||
msg = _("%(errors)s of %(total)s roles failed " "to delete.") % {
|
||||
'errors': errors,
|
||||
'total': total,
|
||||
}
|
||||
raise exceptions.CommandError(msg)
|
||||
|
||||
|
||||
@@ -153,11 +159,17 @@ class ListRole(command.Lister):
|
||||
columns = ('ID', 'Name')
|
||||
data = identity_client.roles.list()
|
||||
|
||||
return (columns,
|
||||
(utils.get_item_properties(
|
||||
s, columns,
|
||||
return (
|
||||
columns,
|
||||
(
|
||||
utils.get_item_properties(
|
||||
s,
|
||||
columns,
|
||||
formatters={},
|
||||
) for s in data))
|
||||
)
|
||||
for s in data
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
class RemoveRole(command.Command):
|
||||
@@ -192,10 +204,7 @@ class RemoveRole(command.Command):
|
||||
parsed_args.project,
|
||||
)
|
||||
user = utils.find_resource(identity_client.users, parsed_args.user)
|
||||
identity_client.roles.remove_user_role(
|
||||
user.id,
|
||||
role.id,
|
||||
project.id)
|
||||
identity_client.roles.remove_user_role(user.id, role.id, project.id)
|
||||
|
||||
|
||||
class ShowRole(command.ShowOne):
|
||||
|
||||
@@ -51,7 +51,7 @@ class ListRoleAssignment(command.Lister):
|
||||
action="store_true",
|
||||
dest='authproject',
|
||||
help='Only list assignments for the project to which the '
|
||||
'authenticated user\'s token is scoped',
|
||||
'authenticated user\'s token is scoped',
|
||||
)
|
||||
return parser
|
||||
|
||||
@@ -70,8 +70,7 @@ class ListRoleAssignment(command.Lister):
|
||||
elif parsed_args.authuser:
|
||||
if auth_ref:
|
||||
user = utils.find_resource(
|
||||
identity_client.users,
|
||||
auth_ref.user_id
|
||||
identity_client.users, auth_ref.user_id
|
||||
)
|
||||
|
||||
project = None
|
||||
@@ -83,8 +82,7 @@ class ListRoleAssignment(command.Lister):
|
||||
elif parsed_args.authproject:
|
||||
if auth_ref:
|
||||
project = utils.find_resource(
|
||||
identity_client.projects,
|
||||
auth_ref.project_id
|
||||
identity_client.projects, auth_ref.project_id
|
||||
)
|
||||
|
||||
# If user or project is not specified, we would ideally list all
|
||||
@@ -107,8 +105,14 @@ class ListRoleAssignment(command.Lister):
|
||||
user_role.user = user.id
|
||||
user_role.project = project.id
|
||||
|
||||
return (columns,
|
||||
(utils.get_item_properties(
|
||||
s, columns,
|
||||
return (
|
||||
columns,
|
||||
(
|
||||
utils.get_item_properties(
|
||||
s,
|
||||
columns,
|
||||
formatters={},
|
||||
) for s in data))
|
||||
)
|
||||
for s in data
|
||||
),
|
||||
)
|
||||
|
||||
@@ -90,14 +90,19 @@ class DeleteService(command.Command):
|
||||
identity_client.services.delete(service.id)
|
||||
except Exception as e:
|
||||
result += 1
|
||||
LOG.error(_("Failed to delete service with "
|
||||
"name or ID '%(service)s': %(e)s"),
|
||||
{'service': service, 'e': e})
|
||||
LOG.error(
|
||||
_(
|
||||
"Failed to delete service with "
|
||||
"name or ID '%(service)s': %(e)s"
|
||||
),
|
||||
{'service': service, 'e': e},
|
||||
)
|
||||
|
||||
if result > 0:
|
||||
total = len(parsed_args.services)
|
||||
msg = (_("%(result)s of %(total)s services failed "
|
||||
"to delete.") % {'result': result, 'total': total})
|
||||
msg = _(
|
||||
"%(result)s of %(total)s services failed " "to delete."
|
||||
) % {'result': result, 'total': total}
|
||||
raise exceptions.CommandError(msg)
|
||||
|
||||
|
||||
@@ -115,7 +120,6 @@ class ListService(command.Lister):
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
|
||||
if parsed_args.long:
|
||||
columns = ('ID', 'Name', 'Type', 'Description')
|
||||
else:
|
||||
@@ -151,15 +155,17 @@ class ShowService(command.ShowOne):
|
||||
|
||||
if parsed_args.catalog:
|
||||
endpoints = auth_ref.service_catalog.get_endpoints(
|
||||
service_type=parsed_args.service)
|
||||
for (service, service_endpoints) in endpoints.items():
|
||||
service_type=parsed_args.service
|
||||
)
|
||||
for service, service_endpoints in endpoints.items():
|
||||
if service_endpoints:
|
||||
info = {"type": service}
|
||||
info.update(service_endpoints[0])
|
||||
return zip(*sorted(info.items()))
|
||||
|
||||
msg = _("No service catalog with a type, name or ID of '%s' "
|
||||
"exists.") % (parsed_args.service)
|
||||
msg = _(
|
||||
"No service catalog with a type, name or ID of '%s' " "exists."
|
||||
) % (parsed_args.service)
|
||||
raise exceptions.CommandError(msg)
|
||||
else:
|
||||
service = common.find_service(identity_client, parsed_args.service)
|
||||
|
||||
@@ -35,7 +35,8 @@ class IssueToken(command.ShowOne):
|
||||
auth_ref = self.app.client_manager.auth_ref
|
||||
if not auth_ref:
|
||||
raise exceptions.AuthorizationFailure(
|
||||
"Only an authorized user may issue a new token.")
|
||||
"Only an authorized user may issue a new token."
|
||||
)
|
||||
|
||||
data = {}
|
||||
if auth_ref.auth_token:
|
||||
|
||||
@@ -122,8 +122,12 @@ class CreateUser(command.ShowOne):
|
||||
parsed_args.password = utils.get_password(self.app.stdin)
|
||||
|
||||
if not parsed_args.password:
|
||||
LOG.warning(_("No password was supplied, authentication will fail "
|
||||
"when a user does not have a password."))
|
||||
LOG.warning(
|
||||
_(
|
||||
"No password was supplied, authentication will fail "
|
||||
"when a user does not have a password."
|
||||
)
|
||||
)
|
||||
|
||||
try:
|
||||
user = identity_client.users.create(
|
||||
@@ -147,9 +151,7 @@ class CreateUser(command.ShowOne):
|
||||
# the returned resource has 'tenantId'. Sigh.
|
||||
# We're using project_id now inside OSC so there.
|
||||
if 'tenantId' in user._info:
|
||||
user._info.update(
|
||||
{'project_id': user._info.pop('tenantId')}
|
||||
)
|
||||
user._info.update({'project_id': user._info.pop('tenantId')})
|
||||
|
||||
info = {}
|
||||
info.update(user._info)
|
||||
@@ -182,14 +184,20 @@ class DeleteUser(command.Command):
|
||||
identity_client.users.delete(user_obj.id)
|
||||
except Exception as e:
|
||||
errors += 1
|
||||
LOG.error(_("Failed to delete user with "
|
||||
"name or ID '%(user)s': %(e)s"),
|
||||
{'user': user, 'e': e})
|
||||
LOG.error(
|
||||
_(
|
||||
"Failed to delete user with "
|
||||
"name or ID '%(user)s': %(e)s"
|
||||
),
|
||||
{'user': user, 'e': e},
|
||||
)
|
||||
|
||||
if errors > 0:
|
||||
total = len(parsed_args.users)
|
||||
msg = (_("%(errors)s of %(total)s users failed "
|
||||
"to delete.") % {'errors': errors, 'total': total})
|
||||
msg = _("%(errors)s of %(total)s users failed " "to delete.") % {
|
||||
'errors': errors,
|
||||
'total': total,
|
||||
}
|
||||
raise exceptions.CommandError(msg)
|
||||
|
||||
|
||||
@@ -246,7 +254,8 @@ class ListUser(command.Lister):
|
||||
# Just forget it if there's any trouble
|
||||
pass
|
||||
formatters['tenantId'] = functools.partial(
|
||||
ProjectColumn, project_cache=project_cache)
|
||||
ProjectColumn, project_cache=project_cache
|
||||
)
|
||||
else:
|
||||
columns = column_headers = ('ID', 'Name')
|
||||
data = identity_client.users.list(tenant_id=project)
|
||||
@@ -267,12 +276,18 @@ class ListUser(command.Lister):
|
||||
d._info['tenantId'] = d._info.pop('tenant_id')
|
||||
d._add_details(d._info)
|
||||
|
||||
return (column_headers,
|
||||
(utils.get_item_properties(
|
||||
s, columns,
|
||||
return (
|
||||
column_headers,
|
||||
(
|
||||
utils.get_item_properties(
|
||||
s,
|
||||
columns,
|
||||
mixed_case_fields=('tenantId',),
|
||||
formatters=formatters,
|
||||
) for s in data))
|
||||
)
|
||||
for s in data
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
class SetUser(command.Command):
|
||||
@@ -331,8 +346,12 @@ class SetUser(command.Command):
|
||||
parsed_args.password = utils.get_password(self.app.stdin)
|
||||
|
||||
if '' == parsed_args.password:
|
||||
LOG.warning(_("No password was supplied, authentication will fail "
|
||||
"when a user does not have a password."))
|
||||
LOG.warning(
|
||||
_(
|
||||
"No password was supplied, authentication will fail "
|
||||
"when a user does not have a password."
|
||||
)
|
||||
)
|
||||
|
||||
user = utils.find_resource(
|
||||
identity_client.users,
|
||||
@@ -394,8 +413,8 @@ class ShowUser(command.ShowOne):
|
||||
except ks_exc.Forbidden:
|
||||
auth_ref = self.app.client_manager.auth_ref
|
||||
if (
|
||||
parsed_args.user == auth_ref.user_id or
|
||||
parsed_args.user == auth_ref.username
|
||||
parsed_args.user == auth_ref.user_id
|
||||
or parsed_args.user == auth_ref.username
|
||||
):
|
||||
# Ask for currently auth'ed project so return it
|
||||
info = {
|
||||
@@ -409,12 +428,8 @@ class ShowUser(command.ShowOne):
|
||||
raise
|
||||
|
||||
if 'tenantId' in info:
|
||||
info.update(
|
||||
{'project_id': info.pop('tenantId')}
|
||||
)
|
||||
info.update({'project_id': info.pop('tenantId')})
|
||||
if 'tenant_id' in info:
|
||||
info.update(
|
||||
{'project_id': info.pop('tenant_id')}
|
||||
)
|
||||
info.update({'project_id': info.pop('tenant_id')})
|
||||
|
||||
return zip(*sorted(info.items()))
|
||||
|
||||
@@ -48,18 +48,24 @@ class DeleteAccessRule(command.Command):
|
||||
for ac in parsed_args.access_rule:
|
||||
try:
|
||||
access_rule = utils.find_resource(
|
||||
identity_client.access_rules, ac)
|
||||
identity_client.access_rules, ac
|
||||
)
|
||||
identity_client.access_rules.delete(access_rule.id)
|
||||
except Exception as e:
|
||||
errors += 1
|
||||
LOG.error(_("Failed to delete access rule with "
|
||||
"ID '%(ac)s': %(e)s"),
|
||||
{'ac': ac, 'e': e})
|
||||
LOG.error(
|
||||
_(
|
||||
"Failed to delete access rule with "
|
||||
"ID '%(ac)s': %(e)s"
|
||||
),
|
||||
{'ac': ac, 'e': e},
|
||||
)
|
||||
|
||||
if errors > 0:
|
||||
total = len(parsed_args.access_rule)
|
||||
msg = (_("%(errors)s of %(total)s access rules failed "
|
||||
"to delete.") % {'errors': errors, 'total': total})
|
||||
msg = _(
|
||||
"%(errors)s of %(total)s access rules failed " "to delete."
|
||||
) % {'errors': errors, 'total': total}
|
||||
raise exceptions.CommandError(msg)
|
||||
|
||||
|
||||
@@ -79,20 +85,25 @@ class ListAccessRule(command.Lister):
|
||||
def take_action(self, parsed_args):
|
||||
identity_client = self.app.client_manager.identity
|
||||
if parsed_args.user:
|
||||
user_id = common.find_user(identity_client,
|
||||
parsed_args.user,
|
||||
parsed_args.user_domain).id
|
||||
user_id = common.find_user(
|
||||
identity_client, parsed_args.user, parsed_args.user_domain
|
||||
).id
|
||||
else:
|
||||
user_id = None
|
||||
|
||||
columns = ('ID', 'Service', 'Method', 'Path')
|
||||
data = identity_client.access_rules.list(
|
||||
user=user_id)
|
||||
return (columns,
|
||||
(utils.get_item_properties(
|
||||
s, columns,
|
||||
data = identity_client.access_rules.list(user=user_id)
|
||||
return (
|
||||
columns,
|
||||
(
|
||||
utils.get_item_properties(
|
||||
s,
|
||||
columns,
|
||||
formatters={},
|
||||
) for s in data))
|
||||
)
|
||||
for s in data
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
class ShowAccessRule(command.ShowOne):
|
||||
@@ -109,8 +120,9 @@ class ShowAccessRule(command.ShowOne):
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
identity_client = self.app.client_manager.identity
|
||||
access_rule = utils.find_resource(identity_client.access_rules,
|
||||
parsed_args.access_rule)
|
||||
access_rule = utils.find_resource(
|
||||
identity_client.access_rules, parsed_args.access_rule
|
||||
)
|
||||
|
||||
access_rule._info.pop('links', None)
|
||||
|
||||
|
||||
@@ -43,23 +43,29 @@ class CreateApplicationCredential(command.ShowOne):
|
||||
parser.add_argument(
|
||||
'--secret',
|
||||
metavar='<secret>',
|
||||
help=_('Secret to use for authentication (if not provided, one'
|
||||
' will be generated)'),
|
||||
help=_(
|
||||
'Secret to use for authentication (if not provided, one'
|
||||
' will be generated)'
|
||||
),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--role',
|
||||
metavar='<role>',
|
||||
action='append',
|
||||
default=[],
|
||||
help=_('Roles to authorize (name or ID) (repeat option to set'
|
||||
' multiple values)'),
|
||||
help=_(
|
||||
'Roles to authorize (name or ID) (repeat option to set'
|
||||
' multiple values)'
|
||||
),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--expiration',
|
||||
metavar='<expiration>',
|
||||
help=_('Sets an expiration date for the application credential,'
|
||||
' format of YYYY-mm-ddTHH:MM:SS (if not provided, the'
|
||||
' application credential will not expire)'),
|
||||
help=_(
|
||||
'Sets an expiration date for the application credential,'
|
||||
' format of YYYY-mm-ddTHH:MM:SS (if not provided, the'
|
||||
' application credential will not expire)'
|
||||
),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--description',
|
||||
@@ -69,27 +75,32 @@ class CreateApplicationCredential(command.ShowOne):
|
||||
parser.add_argument(
|
||||
'--unrestricted',
|
||||
action="store_true",
|
||||
help=_('Enable application credential to create and delete other'
|
||||
' application credentials and trusts (this is potentially'
|
||||
' dangerous behavior and is disabled by default)'),
|
||||
help=_(
|
||||
'Enable application credential to create and delete other'
|
||||
' application credentials and trusts (this is potentially'
|
||||
' dangerous behavior and is disabled by default)'
|
||||
),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--restricted',
|
||||
action="store_true",
|
||||
help=_('Prohibit application credential from creating and deleting'
|
||||
' other application credentials and trusts (this is the'
|
||||
' default behavior)'),
|
||||
help=_(
|
||||
'Prohibit application credential from creating and deleting'
|
||||
' other application credentials and trusts (this is the'
|
||||
' default behavior)'
|
||||
),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--access-rules',
|
||||
metavar='<access-rules>',
|
||||
help=_('Either a string or file path containing a JSON-formatted '
|
||||
'list of access rules, each containing a request method, '
|
||||
'path, and service, for example '
|
||||
'\'[{"method": "GET", '
|
||||
'"path": "/v2.1/servers", '
|
||||
'"service": "compute"}]\''),
|
||||
|
||||
help=_(
|
||||
'Either a string or file path containing a JSON-formatted '
|
||||
'list of access rules, each containing a request method, '
|
||||
'path, and service, for example '
|
||||
'\'[{"method": "GET", '
|
||||
'"path": "/v2.1/servers", '
|
||||
'"service": "compute"}]\''
|
||||
),
|
||||
)
|
||||
return parser
|
||||
|
||||
@@ -103,14 +114,16 @@ class CreateApplicationCredential(command.ShowOne):
|
||||
# which they are currently scoped with a subset of the role
|
||||
# assignments they have on that project. Don't bother trying to
|
||||
# look up roles via keystone, just introspect the token.
|
||||
role_id = common._get_token_resource(identity_client, "roles",
|
||||
role)
|
||||
role_id = common._get_token_resource(
|
||||
identity_client, "roles", role
|
||||
)
|
||||
role_ids.append(role_id)
|
||||
|
||||
expires_at = None
|
||||
if parsed_args.expiration:
|
||||
expires_at = datetime.datetime.strptime(parsed_args.expiration,
|
||||
'%Y-%m-%dT%H:%M:%S')
|
||||
expires_at = datetime.datetime.strptime(
|
||||
parsed_args.expiration, '%Y-%m-%dT%H:%M:%S'
|
||||
)
|
||||
|
||||
if parsed_args.restricted:
|
||||
unrestricted = False
|
||||
@@ -125,9 +138,11 @@ class CreateApplicationCredential(command.ShowOne):
|
||||
with open(parsed_args.access_rules) as f:
|
||||
access_rules = json.load(f)
|
||||
except IOError:
|
||||
raise exceptions.CommandError(
|
||||
_("Access rules is not valid JSON string or file does"
|
||||
" not exist."))
|
||||
msg = _(
|
||||
"Access rules is not valid JSON string or file does"
|
||||
" not exist."
|
||||
)
|
||||
raise exceptions.CommandError(msg)
|
||||
else:
|
||||
access_rules = None
|
||||
|
||||
@@ -172,18 +187,25 @@ class DeleteApplicationCredential(command.Command):
|
||||
for ac in parsed_args.application_credential:
|
||||
try:
|
||||
app_cred = utils.find_resource(
|
||||
identity_client.application_credentials, ac)
|
||||
identity_client.application_credentials, ac
|
||||
)
|
||||
identity_client.application_credentials.delete(app_cred.id)
|
||||
except Exception as e:
|
||||
errors += 1
|
||||
LOG.error(_("Failed to delete application credential with "
|
||||
"name or ID '%(ac)s': %(e)s"),
|
||||
{'ac': ac, 'e': e})
|
||||
LOG.error(
|
||||
_(
|
||||
"Failed to delete application credential with "
|
||||
"name or ID '%(ac)s': %(e)s"
|
||||
),
|
||||
{'ac': ac, 'e': e},
|
||||
)
|
||||
|
||||
if errors > 0:
|
||||
total = len(parsed_args.application_credential)
|
||||
msg = (_("%(errors)s of %(total)s application credentials failed "
|
||||
"to delete.") % {'errors': errors, 'total': total})
|
||||
msg = _(
|
||||
"%(errors)s of %(total)s application credentials failed "
|
||||
"to delete."
|
||||
) % {'errors': errors, 'total': total}
|
||||
raise exceptions.CommandError(msg)
|
||||
|
||||
|
||||
@@ -203,20 +225,25 @@ class ListApplicationCredential(command.Lister):
|
||||
def take_action(self, parsed_args):
|
||||
identity_client = self.app.client_manager.identity
|
||||
if parsed_args.user:
|
||||
user_id = common.find_user(identity_client,
|
||||
parsed_args.user,
|
||||
parsed_args.user_domain).id
|
||||
user_id = common.find_user(
|
||||
identity_client, parsed_args.user, parsed_args.user_domain
|
||||
).id
|
||||
else:
|
||||
user_id = None
|
||||
|
||||
columns = ('ID', 'Name', 'Project ID', 'Description', 'Expires At')
|
||||
data = identity_client.application_credentials.list(
|
||||
user=user_id)
|
||||
return (columns,
|
||||
(utils.get_item_properties(
|
||||
s, columns,
|
||||
data = identity_client.application_credentials.list(user=user_id)
|
||||
return (
|
||||
columns,
|
||||
(
|
||||
utils.get_item_properties(
|
||||
s,
|
||||
columns,
|
||||
formatters={},
|
||||
) for s in data))
|
||||
)
|
||||
for s in data
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
class ShowApplicationCredential(command.ShowOne):
|
||||
@@ -233,8 +260,10 @@ class ShowApplicationCredential(command.ShowOne):
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
identity_client = self.app.client_manager.identity
|
||||
app_cred = utils.find_resource(identity_client.application_credentials,
|
||||
parsed_args.application_credential)
|
||||
app_cred = utils.find_resource(
|
||||
identity_client.application_credentials,
|
||||
parsed_args.application_credential,
|
||||
)
|
||||
|
||||
app_cred._info.pop('links', None)
|
||||
|
||||
|
||||
@@ -42,7 +42,6 @@ class ListCatalog(command.Lister):
|
||||
_description = _("List services in the service catalog")
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
|
||||
# Trigger auth if it has not happened yet
|
||||
auth_ref = self.app.client_manager.auth_ref
|
||||
if not auth_ref:
|
||||
@@ -52,13 +51,19 @@ class ListCatalog(command.Lister):
|
||||
|
||||
data = auth_ref.service_catalog.catalog
|
||||
columns = ('Name', 'Type', 'Endpoints')
|
||||
return (columns,
|
||||
(utils.get_dict_properties(
|
||||
s, columns,
|
||||
return (
|
||||
columns,
|
||||
(
|
||||
utils.get_dict_properties(
|
||||
s,
|
||||
columns,
|
||||
formatters={
|
||||
'Endpoints': EndpointsColumn,
|
||||
},
|
||||
) for s in data))
|
||||
)
|
||||
for s in data
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
class ShowCatalog(command.ShowOne):
|
||||
@@ -74,7 +79,6 @@ class ShowCatalog(command.ShowOne):
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
|
||||
# Trigger auth if it has not happened yet
|
||||
auth_ref = self.app.client_manager.auth_ref
|
||||
if not auth_ref:
|
||||
@@ -84,8 +88,10 @@ class ShowCatalog(command.ShowOne):
|
||||
|
||||
data = None
|
||||
for service in auth_ref.service_catalog.catalog:
|
||||
if (service.get('name') == parsed_args.service or
|
||||
service.get('type') == parsed_args.service):
|
||||
if (
|
||||
service.get('name') == parsed_args.service
|
||||
or service.get('type') == parsed_args.service
|
||||
):
|
||||
data = dict(service)
|
||||
data['endpoints'] = EndpointsColumn(data['endpoints'])
|
||||
if 'links' in data:
|
||||
|
||||
@@ -67,17 +67,24 @@ class DeleteConsumer(command.Command):
|
||||
for i in parsed_args.consumer:
|
||||
try:
|
||||
consumer = utils.find_resource(
|
||||
identity_client.oauth1.consumers, i)
|
||||
identity_client.oauth1.consumers, i
|
||||
)
|
||||
identity_client.oauth1.consumers.delete(consumer.id)
|
||||
except Exception as e:
|
||||
result += 1
|
||||
LOG.error(_("Failed to delete consumer with name or "
|
||||
"ID '%(consumer)s': %(e)s"), {'consumer': i, 'e': e})
|
||||
LOG.error(
|
||||
_(
|
||||
"Failed to delete consumer with name or "
|
||||
"ID '%(consumer)s': %(e)s"
|
||||
),
|
||||
{'consumer': i, 'e': e},
|
||||
)
|
||||
|
||||
if result > 0:
|
||||
total = len(parsed_args.consumer)
|
||||
msg = (_("%(result)s of %(total)s consumers failed "
|
||||
"to delete.") % {'result': result, 'total': total})
|
||||
msg = _(
|
||||
"%(result)s of %(total)s consumers failed " "to delete."
|
||||
) % {'result': result, 'total': total}
|
||||
raise exceptions.CommandError(msg)
|
||||
|
||||
|
||||
@@ -87,11 +94,17 @@ class ListConsumer(command.Lister):
|
||||
def take_action(self, parsed_args):
|
||||
columns = ('ID', 'Description')
|
||||
data = self.app.client_manager.identity.oauth1.consumers.list()
|
||||
return (columns,
|
||||
(utils.get_item_properties(
|
||||
s, columns,
|
||||
return (
|
||||
columns,
|
||||
(
|
||||
utils.get_item_properties(
|
||||
s,
|
||||
columns,
|
||||
formatters={},
|
||||
) for s in data))
|
||||
)
|
||||
for s in data
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
class SetConsumer(command.Command):
|
||||
@@ -114,13 +127,15 @@ class SetConsumer(command.Command):
|
||||
def take_action(self, parsed_args):
|
||||
identity_client = self.app.client_manager.identity
|
||||
consumer = utils.find_resource(
|
||||
identity_client.oauth1.consumers, parsed_args.consumer)
|
||||
identity_client.oauth1.consumers, parsed_args.consumer
|
||||
)
|
||||
kwargs = {}
|
||||
if parsed_args.description:
|
||||
kwargs['description'] = parsed_args.description
|
||||
|
||||
consumer = identity_client.oauth1.consumers.update(
|
||||
consumer.id, **kwargs)
|
||||
consumer.id, **kwargs
|
||||
)
|
||||
|
||||
|
||||
class ShowConsumer(command.ShowOne):
|
||||
@@ -138,7 +153,8 @@ class ShowConsumer(command.ShowOne):
|
||||
def take_action(self, parsed_args):
|
||||
identity_client = self.app.client_manager.identity
|
||||
consumer = utils.find_resource(
|
||||
identity_client.oauth1.consumers, parsed_args.consumer)
|
||||
identity_client.oauth1.consumers, parsed_args.consumer
|
||||
)
|
||||
|
||||
consumer._info.pop('links', None)
|
||||
return zip(*sorted(consumer._info.items()))
|
||||
|
||||
@@ -52,25 +52,30 @@ class CreateCredential(command.ShowOne):
|
||||
parser.add_argument(
|
||||
'--project',
|
||||
metavar='<project>',
|
||||
help=_('Project which limits the scope of '
|
||||
'the credential (name or ID)'),
|
||||
help=_(
|
||||
'Project which limits the scope of '
|
||||
'the credential (name or ID)'
|
||||
),
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
identity_client = self.app.client_manager.identity
|
||||
user_id = utils.find_resource(identity_client.users,
|
||||
parsed_args.user).id
|
||||
user_id = utils.find_resource(
|
||||
identity_client.users, parsed_args.user
|
||||
).id
|
||||
if parsed_args.project:
|
||||
project = utils.find_resource(identity_client.projects,
|
||||
parsed_args.project).id
|
||||
project = utils.find_resource(
|
||||
identity_client.projects, parsed_args.project
|
||||
).id
|
||||
else:
|
||||
project = None
|
||||
credential = identity_client.credentials.create(
|
||||
user=user_id,
|
||||
type=parsed_args.type,
|
||||
blob=parsed_args.data,
|
||||
project=project)
|
||||
project=project,
|
||||
)
|
||||
|
||||
credential._info.pop('links')
|
||||
return zip(*sorted(credential._info.items()))
|
||||
@@ -97,14 +102,19 @@ class DeleteCredential(command.Command):
|
||||
identity_client.credentials.delete(i)
|
||||
except Exception as e:
|
||||
result += 1
|
||||
LOG.error(_("Failed to delete credentials with "
|
||||
"ID '%(credential)s': %(e)s"),
|
||||
{'credential': i, 'e': e})
|
||||
LOG.error(
|
||||
_(
|
||||
"Failed to delete credentials with "
|
||||
"ID '%(credential)s': %(e)s"
|
||||
),
|
||||
{'credential': i, 'e': e},
|
||||
)
|
||||
|
||||
if result > 0:
|
||||
total = len(parsed_args.credential)
|
||||
msg = (_("%(result)s of %(total)s credential failed "
|
||||
"to delete.") % {'result': result, 'total': total})
|
||||
msg = _(
|
||||
"%(result)s of %(total)s credential failed " "to delete."
|
||||
) % {'result': result, 'total': total}
|
||||
raise exceptions.CommandError(msg)
|
||||
|
||||
|
||||
@@ -144,11 +154,17 @@ class ListCredential(command.Lister):
|
||||
columns = ('ID', 'Type', 'User ID', 'Blob', 'Project ID')
|
||||
column_headers = ('ID', 'Type', 'User ID', 'Data', 'Project ID')
|
||||
data = self.app.client_manager.identity.credentials.list(**kwargs)
|
||||
return (column_headers,
|
||||
(utils.get_item_properties(
|
||||
s, columns,
|
||||
return (
|
||||
column_headers,
|
||||
(
|
||||
utils.get_item_properties(
|
||||
s,
|
||||
columns,
|
||||
formatters={},
|
||||
) for s in data))
|
||||
)
|
||||
for s in data
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
class SetCredential(command.Command):
|
||||
@@ -182,28 +198,34 @@ class SetCredential(command.Command):
|
||||
parser.add_argument(
|
||||
'--project',
|
||||
metavar='<project>',
|
||||
help=_('Project which limits the scope of '
|
||||
'the credential (name or ID)'),
|
||||
help=_(
|
||||
'Project which limits the scope of '
|
||||
'the credential (name or ID)'
|
||||
),
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
identity_client = self.app.client_manager.identity
|
||||
|
||||
user_id = utils.find_resource(identity_client.users,
|
||||
parsed_args.user).id
|
||||
user_id = utils.find_resource(
|
||||
identity_client.users, parsed_args.user
|
||||
).id
|
||||
|
||||
if parsed_args.project:
|
||||
project = utils.find_resource(identity_client.projects,
|
||||
parsed_args.project).id
|
||||
project = utils.find_resource(
|
||||
identity_client.projects, parsed_args.project
|
||||
).id
|
||||
else:
|
||||
project = None
|
||||
|
||||
identity_client.credentials.update(parsed_args.credential,
|
||||
user=user_id,
|
||||
type=parsed_args.type,
|
||||
blob=parsed_args.data,
|
||||
project=project)
|
||||
identity_client.credentials.update(
|
||||
parsed_args.credential,
|
||||
user=user_id,
|
||||
type=parsed_args.type,
|
||||
blob=parsed_args.data,
|
||||
project=project,
|
||||
)
|
||||
|
||||
|
||||
class ShowCredential(command.ShowOne):
|
||||
@@ -220,8 +242,9 @@ class ShowCredential(command.ShowOne):
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
identity_client = self.app.client_manager.identity
|
||||
credential = utils.find_resource(identity_client.credentials,
|
||||
parsed_args.credential)
|
||||
credential = utils.find_resource(
|
||||
identity_client.credentials, parsed_args.credential
|
||||
)
|
||||
|
||||
credential._info.pop('links')
|
||||
return zip(*sorted(credential._info.items()))
|
||||
|
||||
@@ -81,8 +81,9 @@ class CreateDomain(command.ShowOne):
|
||||
)
|
||||
except ks_exc.Conflict:
|
||||
if parsed_args.or_show:
|
||||
domain = utils.find_resource(identity_client.domains,
|
||||
parsed_args.name)
|
||||
domain = utils.find_resource(
|
||||
identity_client.domains, parsed_args.name
|
||||
)
|
||||
LOG.info(_('Returning existing domain %s'), domain.name)
|
||||
else:
|
||||
raise
|
||||
@@ -113,13 +114,20 @@ class DeleteDomain(command.Command):
|
||||
identity_client.domains.delete(domain.id)
|
||||
except Exception as e:
|
||||
result += 1
|
||||
LOG.error(_("Failed to delete domain with name or "
|
||||
"ID '%(domain)s': %(e)s"), {'domain': i, 'e': e})
|
||||
LOG.error(
|
||||
_(
|
||||
"Failed to delete domain with name or "
|
||||
"ID '%(domain)s': %(e)s"
|
||||
),
|
||||
{'domain': i, 'e': e},
|
||||
)
|
||||
|
||||
if result > 0:
|
||||
total = len(parsed_args.domain)
|
||||
msg = (_("%(result)s of %(total)s domains failed "
|
||||
"to delete.") % {'result': result, 'total': total})
|
||||
msg = _("%(result)s of %(total)s domains failed " "to delete.") % {
|
||||
'result': result,
|
||||
'total': total,
|
||||
}
|
||||
raise exceptions.CommandError(msg)
|
||||
|
||||
|
||||
@@ -150,11 +158,17 @@ class ListDomain(command.Lister):
|
||||
|
||||
columns = ('ID', 'Name', 'Enabled', 'Description')
|
||||
data = self.app.client_manager.identity.domains.list(**kwargs)
|
||||
return (columns,
|
||||
(utils.get_item_properties(
|
||||
s, columns,
|
||||
return (
|
||||
columns,
|
||||
(
|
||||
utils.get_item_properties(
|
||||
s,
|
||||
columns,
|
||||
formatters={},
|
||||
) for s in data))
|
||||
)
|
||||
for s in data
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
class SetDomain(command.Command):
|
||||
@@ -193,8 +207,9 @@ class SetDomain(command.Command):
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
identity_client = self.app.client_manager.identity
|
||||
domain = utils.find_resource(identity_client.domains,
|
||||
parsed_args.domain)
|
||||
domain = utils.find_resource(
|
||||
identity_client.domains, parsed_args.domain
|
||||
)
|
||||
kwargs = {}
|
||||
if parsed_args.name:
|
||||
kwargs['name'] = parsed_args.name
|
||||
@@ -228,11 +243,11 @@ class ShowDomain(command.ShowOne):
|
||||
def take_action(self, parsed_args):
|
||||
identity_client = self.app.client_manager.identity
|
||||
|
||||
domain_str = common._get_token_resource(identity_client, 'domain',
|
||||
parsed_args.domain)
|
||||
domain_str = common._get_token_resource(
|
||||
identity_client, 'domain', parsed_args.domain
|
||||
)
|
||||
|
||||
domain = utils.find_resource(identity_client.domains,
|
||||
domain_str)
|
||||
domain = utils.find_resource(identity_client.domains, domain_str)
|
||||
|
||||
domain._info.pop('links')
|
||||
return zip(*sorted(domain._info.items()))
|
||||
|
||||
@@ -36,17 +36,20 @@ def _determine_ec2_user(parsed_args, client_manager):
|
||||
|
||||
user_domain = None
|
||||
if parsed_args.user_domain:
|
||||
user_domain = common.find_domain(client_manager.identity,
|
||||
parsed_args.user_domain)
|
||||
user_domain = common.find_domain(
|
||||
client_manager.identity, parsed_args.user_domain
|
||||
)
|
||||
if parsed_args.user:
|
||||
if user_domain is not None:
|
||||
user = utils.find_resource(client_manager.identity.users,
|
||||
parsed_args.user,
|
||||
domain_id=user_domain.id).id
|
||||
else:
|
||||
user = utils.find_resource(
|
||||
client_manager.identity.users,
|
||||
parsed_args.user).id
|
||||
parsed_args.user,
|
||||
domain_id=user_domain.id,
|
||||
).id
|
||||
else:
|
||||
user = utils.find_resource(
|
||||
client_manager.identity.users, parsed_args.user
|
||||
).id
|
||||
else:
|
||||
# Get the user from the current auth
|
||||
user = client_manager.auth_ref.user_id
|
||||
@@ -61,14 +64,18 @@ class CreateEC2Creds(command.ShowOne):
|
||||
parser.add_argument(
|
||||
'--project',
|
||||
metavar='<project>',
|
||||
help=_('Create credentials in project '
|
||||
'(name or ID; default: current authenticated project)'),
|
||||
help=_(
|
||||
'Create credentials in project '
|
||||
'(name or ID; default: current authenticated project)'
|
||||
),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--user',
|
||||
metavar='<user>',
|
||||
help=_('Create credentials for user '
|
||||
'(name or ID; default: current authenticated user)'),
|
||||
help=_(
|
||||
'Create credentials for user '
|
||||
'(name or ID; default: current authenticated user)'
|
||||
),
|
||||
)
|
||||
common.add_user_domain_option_to_parser(parser)
|
||||
common.add_project_domain_option_to_parser(parser)
|
||||
@@ -81,18 +88,21 @@ class CreateEC2Creds(command.ShowOne):
|
||||
|
||||
project_domain = None
|
||||
if parsed_args.project_domain:
|
||||
project_domain = common.find_domain(identity_client,
|
||||
parsed_args.project_domain)
|
||||
project_domain = common.find_domain(
|
||||
identity_client, parsed_args.project_domain
|
||||
)
|
||||
|
||||
if parsed_args.project:
|
||||
if project_domain is not None:
|
||||
project = utils.find_resource(identity_client.projects,
|
||||
parsed_args.project,
|
||||
domain_id=project_domain.id).id
|
||||
else:
|
||||
project = utils.find_resource(
|
||||
identity_client.projects,
|
||||
parsed_args.project).id
|
||||
parsed_args.project,
|
||||
domain_id=project_domain.id,
|
||||
).id
|
||||
else:
|
||||
project = utils.find_resource(
|
||||
identity_client.projects, parsed_args.project
|
||||
).id
|
||||
else:
|
||||
# Get the project from the current auth
|
||||
project = self.app.client_manager.auth_ref.project_id
|
||||
@@ -103,9 +113,7 @@ class CreateEC2Creds(command.ShowOne):
|
||||
info.update(creds._info)
|
||||
|
||||
if 'tenant_id' in info:
|
||||
info.update(
|
||||
{'project_id': info.pop('tenant_id')}
|
||||
)
|
||||
info.update({'project_id': info.pop('tenant_id')})
|
||||
|
||||
return zip(*sorted(info.items()))
|
||||
|
||||
@@ -138,14 +146,19 @@ class DeleteEC2Creds(command.Command):
|
||||
client_manager.identity.ec2.delete(user, i)
|
||||
except Exception as e:
|
||||
result += 1
|
||||
LOG.error(_("Failed to delete EC2 credentials with "
|
||||
"access key '%(access_key)s': %(e)s"),
|
||||
{'access_key': i, 'e': e})
|
||||
LOG.error(
|
||||
_(
|
||||
"Failed to delete EC2 credentials with "
|
||||
"access key '%(access_key)s': %(e)s"
|
||||
),
|
||||
{'access_key': i, 'e': e},
|
||||
)
|
||||
|
||||
if result > 0:
|
||||
total = len(parsed_args.access_key)
|
||||
msg = (_("%(result)s of %(total)s EC2 keys failed "
|
||||
"to delete.") % {'result': result, 'total': total})
|
||||
msg = _(
|
||||
"%(result)s of %(total)s EC2 keys failed " "to delete."
|
||||
) % {'result': result, 'total': total}
|
||||
raise exceptions.CommandError(msg)
|
||||
|
||||
|
||||
@@ -170,11 +183,17 @@ class ListEC2Creds(command.Lister):
|
||||
column_headers = ('Access', 'Secret', 'Project ID', 'User ID')
|
||||
data = client_manager.identity.ec2.list(user)
|
||||
|
||||
return (column_headers,
|
||||
(utils.get_item_properties(
|
||||
s, columns,
|
||||
return (
|
||||
column_headers,
|
||||
(
|
||||
utils.get_item_properties(
|
||||
s,
|
||||
columns,
|
||||
formatters={},
|
||||
) for s in data))
|
||||
)
|
||||
for s in data
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
class ShowEC2Creds(command.ShowOne):
|
||||
@@ -204,8 +223,6 @@ class ShowEC2Creds(command.ShowOne):
|
||||
info.update(creds._info)
|
||||
|
||||
if 'tenant_id' in info:
|
||||
info.update(
|
||||
{'project_id': info.pop('tenant_id')}
|
||||
)
|
||||
info.update({'project_id': info.pop('tenant_id')})
|
||||
|
||||
return zip(*sorted(info.items()))
|
||||
|
||||
@@ -39,19 +39,20 @@ class AddProjectToEndpoint(command.Command):
|
||||
_description = _("Associate a project to an endpoint")
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(
|
||||
AddProjectToEndpoint, self).get_parser(prog_name)
|
||||
parser = super(AddProjectToEndpoint, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'endpoint',
|
||||
metavar='<endpoint>',
|
||||
help=_('Endpoint to associate with '
|
||||
'specified project (name or ID)'),
|
||||
help=_(
|
||||
'Endpoint to associate with ' 'specified project (name or ID)'
|
||||
),
|
||||
)
|
||||
parser.add_argument(
|
||||
'project',
|
||||
metavar='<project>',
|
||||
help=_('Project to associate with '
|
||||
'specified endpoint name or ID)'),
|
||||
help=_(
|
||||
'Project to associate with ' 'specified endpoint name or ID)'
|
||||
),
|
||||
)
|
||||
common.add_project_domain_option_to_parser(parser)
|
||||
return parser
|
||||
@@ -59,16 +60,15 @@ class AddProjectToEndpoint(command.Command):
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.identity
|
||||
|
||||
endpoint = utils.find_resource(client.endpoints,
|
||||
parsed_args.endpoint)
|
||||
endpoint = utils.find_resource(client.endpoints, parsed_args.endpoint)
|
||||
|
||||
project = common.find_project(client,
|
||||
parsed_args.project,
|
||||
parsed_args.project_domain)
|
||||
project = common.find_project(
|
||||
client, parsed_args.project, parsed_args.project_domain
|
||||
)
|
||||
|
||||
client.endpoint_filter.add_endpoint_to_project(
|
||||
project=project.id,
|
||||
endpoint=endpoint.id)
|
||||
project=project.id, endpoint=endpoint.id
|
||||
)
|
||||
|
||||
|
||||
class CreateEndpoint(command.ShowOne):
|
||||
@@ -122,7 +122,7 @@ class CreateEndpoint(command.ShowOne):
|
||||
url=parsed_args.url,
|
||||
interface=parsed_args.interface,
|
||||
region=parsed_args.region,
|
||||
enabled=parsed_args.enabled
|
||||
enabled=parsed_args.enabled,
|
||||
)
|
||||
|
||||
info = {}
|
||||
@@ -152,17 +152,24 @@ class DeleteEndpoint(command.Command):
|
||||
for i in parsed_args.endpoint:
|
||||
try:
|
||||
endpoint_id = utils.find_resource(
|
||||
identity_client.endpoints, i).id
|
||||
identity_client.endpoints, i
|
||||
).id
|
||||
identity_client.endpoints.delete(endpoint_id)
|
||||
except Exception as e:
|
||||
result += 1
|
||||
LOG.error(_("Failed to delete endpoint with "
|
||||
"ID '%(endpoint)s': %(e)s"), {'endpoint': i, 'e': e})
|
||||
LOG.error(
|
||||
_(
|
||||
"Failed to delete endpoint with "
|
||||
"ID '%(endpoint)s': %(e)s"
|
||||
),
|
||||
{'endpoint': i, 'e': e},
|
||||
)
|
||||
|
||||
if result > 0:
|
||||
total = len(parsed_args.endpoint)
|
||||
msg = (_("%(result)s of %(total)s endpoints failed "
|
||||
"to delete.") % {'result': result, 'total': total})
|
||||
msg = _(
|
||||
"%(result)s of %(total)s endpoints failed " "to delete."
|
||||
) % {'result': result, 'total': total}
|
||||
raise exceptions.CommandError(msg)
|
||||
|
||||
|
||||
@@ -206,27 +213,37 @@ class ListEndpoint(command.Lister):
|
||||
|
||||
endpoint = None
|
||||
if parsed_args.endpoint:
|
||||
endpoint = utils.find_resource(identity_client.endpoints,
|
||||
parsed_args.endpoint)
|
||||
endpoint = utils.find_resource(
|
||||
identity_client.endpoints, parsed_args.endpoint
|
||||
)
|
||||
project = None
|
||||
if parsed_args.project:
|
||||
project = common.find_project(identity_client,
|
||||
parsed_args.project,
|
||||
parsed_args.project_domain)
|
||||
project = common.find_project(
|
||||
identity_client,
|
||||
parsed_args.project,
|
||||
parsed_args.project_domain,
|
||||
)
|
||||
|
||||
if endpoint:
|
||||
columns = ('ID', 'Name')
|
||||
data = (
|
||||
identity_client.endpoint_filter
|
||||
.list_projects_for_endpoint(endpoint=endpoint.id)
|
||||
data = identity_client.endpoint_filter.list_projects_for_endpoint(
|
||||
endpoint=endpoint.id
|
||||
)
|
||||
else:
|
||||
columns = ('ID', 'Region', 'Service Name', 'Service Type',
|
||||
'Enabled', 'Interface', 'URL')
|
||||
columns = (
|
||||
'ID',
|
||||
'Region',
|
||||
'Service Name',
|
||||
'Service Type',
|
||||
'Enabled',
|
||||
'Interface',
|
||||
'URL',
|
||||
)
|
||||
kwargs = {}
|
||||
if parsed_args.service:
|
||||
service = common.find_service(identity_client,
|
||||
parsed_args.service)
|
||||
service = common.find_service(
|
||||
identity_client, parsed_args.service
|
||||
)
|
||||
kwargs['service'] = service.id
|
||||
if parsed_args.interface:
|
||||
kwargs['interface'] = parsed_args.interface
|
||||
@@ -235,8 +252,9 @@ class ListEndpoint(command.Lister):
|
||||
|
||||
if project:
|
||||
data = (
|
||||
identity_client.endpoint_filter
|
||||
.list_endpoints_for_project(project=project.id)
|
||||
identity_client.endpoint_filter.list_endpoints_for_project(
|
||||
project=project.id
|
||||
)
|
||||
)
|
||||
else:
|
||||
data = identity_client.endpoints.list(**kwargs)
|
||||
@@ -244,35 +262,43 @@ class ListEndpoint(command.Lister):
|
||||
service_list = identity_client.services.list()
|
||||
|
||||
for ep in data:
|
||||
service = common.find_service_in_list(service_list,
|
||||
ep.service_id)
|
||||
service = common.find_service_in_list(
|
||||
service_list, ep.service_id
|
||||
)
|
||||
ep.service_name = get_service_name(service)
|
||||
ep.service_type = service.type
|
||||
|
||||
return (columns,
|
||||
(utils.get_item_properties(
|
||||
s, columns,
|
||||
return (
|
||||
columns,
|
||||
(
|
||||
utils.get_item_properties(
|
||||
s,
|
||||
columns,
|
||||
formatters={},
|
||||
) for s in data))
|
||||
)
|
||||
for s in data
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
class RemoveProjectFromEndpoint(command.Command):
|
||||
_description = _("Dissociate a project from an endpoint")
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(
|
||||
RemoveProjectFromEndpoint, self).get_parser(prog_name)
|
||||
parser = super(RemoveProjectFromEndpoint, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'endpoint',
|
||||
metavar='<endpoint>',
|
||||
help=_('Endpoint to dissociate from '
|
||||
'specified project (name or ID)'),
|
||||
help=_(
|
||||
'Endpoint to dissociate from ' 'specified project (name or ID)'
|
||||
),
|
||||
)
|
||||
parser.add_argument(
|
||||
'project',
|
||||
metavar='<project>',
|
||||
help=_('Project to dissociate from '
|
||||
'specified endpoint name or ID)'),
|
||||
help=_(
|
||||
'Project to dissociate from ' 'specified endpoint name or ID)'
|
||||
),
|
||||
)
|
||||
common.add_project_domain_option_to_parser(parser)
|
||||
return parser
|
||||
@@ -280,16 +306,15 @@ class RemoveProjectFromEndpoint(command.Command):
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.identity
|
||||
|
||||
endpoint = utils.find_resource(client.endpoints,
|
||||
parsed_args.endpoint)
|
||||
endpoint = utils.find_resource(client.endpoints, parsed_args.endpoint)
|
||||
|
||||
project = common.find_project(client,
|
||||
parsed_args.project,
|
||||
parsed_args.project_domain)
|
||||
project = common.find_project(
|
||||
client, parsed_args.project, parsed_args.project_domain
|
||||
)
|
||||
|
||||
client.endpoint_filter.delete_endpoint_from_project(
|
||||
project=project.id,
|
||||
endpoint=endpoint.id)
|
||||
project=project.id, endpoint=endpoint.id
|
||||
)
|
||||
|
||||
|
||||
class SetEndpoint(command.Command):
|
||||
@@ -340,8 +365,9 @@ class SetEndpoint(command.Command):
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
identity_client = self.app.client_manager.identity
|
||||
endpoint = utils.find_resource(identity_client.endpoints,
|
||||
parsed_args.endpoint)
|
||||
endpoint = utils.find_resource(
|
||||
identity_client.endpoints, parsed_args.endpoint
|
||||
)
|
||||
|
||||
service_id = None
|
||||
if parsed_args.service:
|
||||
@@ -359,7 +385,7 @@ class SetEndpoint(command.Command):
|
||||
url=parsed_args.url,
|
||||
interface=parsed_args.interface,
|
||||
region=parsed_args.region,
|
||||
enabled=enabled
|
||||
enabled=enabled,
|
||||
)
|
||||
|
||||
|
||||
@@ -371,15 +397,18 @@ class ShowEndpoint(command.ShowOne):
|
||||
parser.add_argument(
|
||||
'endpoint',
|
||||
metavar='<endpoint>',
|
||||
help=_('Endpoint to display (endpoint ID, service ID,'
|
||||
' service name, service type)'),
|
||||
help=_(
|
||||
'Endpoint to display (endpoint ID, service ID,'
|
||||
' service name, service type)'
|
||||
),
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
identity_client = self.app.client_manager.identity
|
||||
endpoint = utils.find_resource(identity_client.endpoints,
|
||||
parsed_args.endpoint)
|
||||
endpoint = utils.find_resource(
|
||||
identity_client.endpoints, parsed_args.endpoint
|
||||
)
|
||||
|
||||
service = common.find_service(identity_client, endpoint.service_id)
|
||||
|
||||
|
||||
@@ -50,8 +50,10 @@ class _FiltersReader(object):
|
||||
try:
|
||||
rules = json.loads(blob)
|
||||
except ValueError as e:
|
||||
msg = _("An error occurred when reading filters from file "
|
||||
"%(path)s: %(error)s") % {"path": path, "error": e}
|
||||
msg = _(
|
||||
"An error occurred when reading filters from file "
|
||||
"%(path)s: %(error)s"
|
||||
) % {"path": path, "error": e}
|
||||
raise exceptions.CommandError(msg)
|
||||
else:
|
||||
return rules
|
||||
@@ -61,8 +63,7 @@ class AddProjectToEndpointGroup(command.Command):
|
||||
_description = _("Add a project to an endpoint group")
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(
|
||||
AddProjectToEndpointGroup, self).get_parser(prog_name)
|
||||
parser = super(AddProjectToEndpointGroup, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'endpointgroup',
|
||||
metavar='<endpoint-group>',
|
||||
@@ -79,16 +80,17 @@ class AddProjectToEndpointGroup(command.Command):
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.identity
|
||||
|
||||
endpointgroup = utils.find_resource(client.endpoint_groups,
|
||||
parsed_args.endpointgroup)
|
||||
endpointgroup = utils.find_resource(
|
||||
client.endpoint_groups, parsed_args.endpointgroup
|
||||
)
|
||||
|
||||
project = common.find_project(client,
|
||||
parsed_args.project,
|
||||
parsed_args.project_domain)
|
||||
project = common.find_project(
|
||||
client, parsed_args.project, parsed_args.project_domain
|
||||
)
|
||||
|
||||
client.endpoint_filter.add_endpoint_group_to_project(
|
||||
endpoint_group=endpointgroup.id,
|
||||
project=project.id)
|
||||
endpoint_group=endpointgroup.id, project=project.id
|
||||
)
|
||||
|
||||
|
||||
class CreateEndpointGroup(command.ShowOne, _FiltersReader):
|
||||
@@ -122,7 +124,7 @@ class CreateEndpointGroup(command.ShowOne, _FiltersReader):
|
||||
endpoint_group = identity_client.endpoint_groups.create(
|
||||
name=parsed_args.name,
|
||||
filters=filters,
|
||||
description=parsed_args.description
|
||||
description=parsed_args.description,
|
||||
)
|
||||
|
||||
info = {}
|
||||
@@ -150,18 +152,24 @@ class DeleteEndpointGroup(command.Command):
|
||||
for i in parsed_args.endpointgroup:
|
||||
try:
|
||||
endpoint_id = utils.find_resource(
|
||||
identity_client.endpoint_groups, i).id
|
||||
identity_client.endpoint_groups, i
|
||||
).id
|
||||
identity_client.endpoint_groups.delete(endpoint_id)
|
||||
except Exception as e:
|
||||
result += 1
|
||||
LOG.error(_("Failed to delete endpoint group with "
|
||||
"ID '%(endpointgroup)s': %(e)s"),
|
||||
{'endpointgroup': i, 'e': e})
|
||||
LOG.error(
|
||||
_(
|
||||
"Failed to delete endpoint group with "
|
||||
"ID '%(endpointgroup)s': %(e)s"
|
||||
),
|
||||
{'endpointgroup': i, 'e': e},
|
||||
)
|
||||
|
||||
if result > 0:
|
||||
total = len(parsed_args.endpointgroup)
|
||||
msg = (_("%(result)s of %(total)s endpointgroups failed "
|
||||
"to delete.") % {'result': result, 'total': total})
|
||||
msg = _(
|
||||
"%(result)s of %(total)s endpointgroups failed " "to delete."
|
||||
) % {'result': result, 'total': total}
|
||||
raise exceptions.CommandError(msg)
|
||||
|
||||
|
||||
@@ -193,40 +201,50 @@ class ListEndpointGroup(command.Lister):
|
||||
|
||||
endpointgroup = None
|
||||
if parsed_args.endpointgroup:
|
||||
endpointgroup = utils.find_resource(client.endpoint_groups,
|
||||
parsed_args.endpointgroup)
|
||||
endpointgroup = utils.find_resource(
|
||||
client.endpoint_groups, parsed_args.endpointgroup
|
||||
)
|
||||
project = None
|
||||
if parsed_args.project:
|
||||
project = common.find_project(client,
|
||||
parsed_args.project,
|
||||
parsed_args.domain)
|
||||
project = common.find_project(
|
||||
client, parsed_args.project, parsed_args.domain
|
||||
)
|
||||
|
||||
if endpointgroup:
|
||||
# List projects associated to the endpoint group
|
||||
columns = ('ID', 'Name', 'Description')
|
||||
data = client.endpoint_filter.list_projects_for_endpoint_group(
|
||||
endpoint_group=endpointgroup.id)
|
||||
endpoint_group=endpointgroup.id
|
||||
)
|
||||
elif project:
|
||||
columns = ('ID', 'Name', 'Description')
|
||||
data = client.endpoint_filter.list_endpoint_groups_for_project(
|
||||
project=project.id)
|
||||
project=project.id
|
||||
)
|
||||
else:
|
||||
columns = ('ID', 'Name', 'Description')
|
||||
data = client.endpoint_groups.list()
|
||||
|
||||
return (columns,
|
||||
(utils.get_item_properties(
|
||||
s, columns,
|
||||
return (
|
||||
columns,
|
||||
(
|
||||
utils.get_item_properties(
|
||||
s,
|
||||
columns,
|
||||
formatters={},
|
||||
) for s in data))
|
||||
)
|
||||
for s in data
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
class RemoveProjectFromEndpointGroup(command.Command):
|
||||
_description = _("Remove project from endpoint group")
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(
|
||||
RemoveProjectFromEndpointGroup, self).get_parser(prog_name)
|
||||
parser = super(RemoveProjectFromEndpointGroup, self).get_parser(
|
||||
prog_name
|
||||
)
|
||||
parser.add_argument(
|
||||
'endpointgroup',
|
||||
metavar='<endpoint-group>',
|
||||
@@ -243,16 +261,17 @@ class RemoveProjectFromEndpointGroup(command.Command):
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.identity
|
||||
|
||||
endpointgroup = utils.find_resource(client.endpoint_groups,
|
||||
parsed_args.endpointgroup)
|
||||
endpointgroup = utils.find_resource(
|
||||
client.endpoint_groups, parsed_args.endpointgroup
|
||||
)
|
||||
|
||||
project = common.find_project(client,
|
||||
parsed_args.project,
|
||||
parsed_args.project_domain)
|
||||
project = common.find_project(
|
||||
client, parsed_args.project, parsed_args.project_domain
|
||||
)
|
||||
|
||||
client.endpoint_filter.delete_endpoint_group_from_project(
|
||||
endpoint_group=endpointgroup.id,
|
||||
project=project.id)
|
||||
endpoint_group=endpointgroup.id, project=project.id
|
||||
)
|
||||
|
||||
|
||||
class SetEndpointGroup(command.Command, _FiltersReader):
|
||||
@@ -285,8 +304,9 @@ class SetEndpointGroup(command.Command, _FiltersReader):
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
identity_client = self.app.client_manager.identity
|
||||
endpointgroup = utils.find_resource(identity_client.endpoint_groups,
|
||||
parsed_args.endpointgroup)
|
||||
endpointgroup = utils.find_resource(
|
||||
identity_client.endpoint_groups, parsed_args.endpointgroup
|
||||
)
|
||||
|
||||
filters = None
|
||||
if parsed_args.filters:
|
||||
@@ -296,7 +316,7 @@ class SetEndpointGroup(command.Command, _FiltersReader):
|
||||
endpointgroup.id,
|
||||
name=parsed_args.name,
|
||||
filters=filters,
|
||||
description=parsed_args.description
|
||||
description=parsed_args.description,
|
||||
)
|
||||
|
||||
|
||||
@@ -314,8 +334,9 @@ class ShowEndpointGroup(command.ShowOne):
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
identity_client = self.app.client_manager.identity
|
||||
endpoint_group = utils.find_resource(identity_client.endpoint_groups,
|
||||
parsed_args.endpointgroup)
|
||||
endpoint_group = utils.find_resource(
|
||||
identity_client.endpoint_groups, parsed_args.endpointgroup
|
||||
)
|
||||
|
||||
info = {}
|
||||
endpoint_group._info.pop('links')
|
||||
|
||||
@@ -34,15 +34,19 @@ class CreateProtocol(command.ShowOne):
|
||||
parser.add_argument(
|
||||
'federation_protocol',
|
||||
metavar='<name>',
|
||||
help=_('New federation protocol name (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>',
|
||||
required=True,
|
||||
help=_('Identity provider that will support the new federation '
|
||||
' protocol (name or ID) (required)'),
|
||||
help=_(
|
||||
'Identity provider that will support the new federation '
|
||||
' protocol (name or ID) (required)'
|
||||
),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--mapping',
|
||||
@@ -58,7 +62,8 @@ class CreateProtocol(command.ShowOne):
|
||||
protocol = identity_client.federation.protocols.create(
|
||||
protocol_id=parsed_args.federation_protocol,
|
||||
identity_provider=parsed_args.identity_provider,
|
||||
mapping=parsed_args.mapping)
|
||||
mapping=parsed_args.mapping,
|
||||
)
|
||||
info = dict(protocol._info)
|
||||
# NOTE(marek-denis): Identity provider is not included in a response
|
||||
# from Keystone, however it should be listed to the user. Add it
|
||||
@@ -85,8 +90,10 @@ class DeleteProtocol(command.Command):
|
||||
'--identity-provider',
|
||||
metavar='<identity-provider>',
|
||||
required=True,
|
||||
help=_('Identity provider that supports <federation-protocol> '
|
||||
'(name or ID) (required)'),
|
||||
help=_(
|
||||
'Identity provider that supports <federation-protocol> '
|
||||
'(name or ID) (required)'
|
||||
),
|
||||
)
|
||||
|
||||
return parser
|
||||
@@ -97,17 +104,24 @@ class DeleteProtocol(command.Command):
|
||||
for i in parsed_args.federation_protocol:
|
||||
try:
|
||||
identity_client.federation.protocols.delete(
|
||||
parsed_args.identity_provider, i)
|
||||
parsed_args.identity_provider, i
|
||||
)
|
||||
except Exception as e:
|
||||
result += 1
|
||||
LOG.error(_("Failed to delete federation protocol "
|
||||
"with name or ID '%(protocol)s': %(e)s"),
|
||||
{'protocol': i, 'e': e})
|
||||
LOG.error(
|
||||
_(
|
||||
"Failed to delete federation protocol "
|
||||
"with name or ID '%(protocol)s': %(e)s"
|
||||
),
|
||||
{'protocol': i, 'e': e},
|
||||
)
|
||||
|
||||
if result > 0:
|
||||
total = len(parsed_args.federation_protocol)
|
||||
msg = (_("%(result)s of %(total)s federation protocols failed"
|
||||
" to delete.") % {'result': result, 'total': total})
|
||||
msg = _(
|
||||
"%(result)s of %(total)s federation protocols failed"
|
||||
" to delete."
|
||||
) % {'result': result, 'total': total}
|
||||
raise exceptions.CommandError(msg)
|
||||
|
||||
|
||||
@@ -129,11 +143,14 @@ class ListProtocols(command.Lister):
|
||||
identity_client = self.app.client_manager.identity
|
||||
|
||||
protocols = identity_client.federation.protocols.list(
|
||||
parsed_args.identity_provider)
|
||||
parsed_args.identity_provider
|
||||
)
|
||||
columns = ('id', 'mapping')
|
||||
response_attributes = ('id', 'mapping_id')
|
||||
items = [utils.get_item_properties(s, response_attributes)
|
||||
for s in protocols]
|
||||
items = [
|
||||
utils.get_item_properties(s, response_attributes)
|
||||
for s in protocols
|
||||
]
|
||||
return (columns, items)
|
||||
|
||||
|
||||
@@ -151,8 +168,10 @@ class SetProtocol(command.Command):
|
||||
'--identity-provider',
|
||||
metavar='<identity-provider>',
|
||||
required=True,
|
||||
help=_('Identity provider that supports <federation-protocol> '
|
||||
'(name or ID) (required)'),
|
||||
help=_(
|
||||
'Identity provider that supports <federation-protocol> '
|
||||
'(name or ID) (required)'
|
||||
),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--mapping',
|
||||
@@ -165,8 +184,10 @@ class SetProtocol(command.Command):
|
||||
identity_client = self.app.client_manager.identity
|
||||
|
||||
protocol = identity_client.federation.protocols.update(
|
||||
parsed_args.identity_provider, parsed_args.federation_protocol,
|
||||
parsed_args.mapping)
|
||||
parsed_args.identity_provider,
|
||||
parsed_args.federation_protocol,
|
||||
parsed_args.mapping,
|
||||
)
|
||||
info = dict(protocol._info)
|
||||
# NOTE(marek-denis): Identity provider is not included in a response
|
||||
# from Keystone, however it should be listed to the user. Add it
|
||||
@@ -191,8 +212,10 @@ class ShowProtocol(command.ShowOne):
|
||||
'--identity-provider',
|
||||
metavar='<identity-provider>',
|
||||
required=True,
|
||||
help=_('Identity provider that supports <federation-protocol> '
|
||||
'(name or ID) (required)'),
|
||||
help=_(
|
||||
'Identity provider that supports <federation-protocol> '
|
||||
'(name or ID) (required)'
|
||||
),
|
||||
)
|
||||
return parser
|
||||
|
||||
@@ -200,7 +223,8 @@ class ShowProtocol(command.ShowOne):
|
||||
identity_client = self.app.client_manager.identity
|
||||
|
||||
protocol = identity_client.federation.protocols.get(
|
||||
parsed_args.identity_provider, parsed_args.federation_protocol)
|
||||
parsed_args.identity_provider, parsed_args.federation_protocol
|
||||
)
|
||||
info = dict(protocol._info)
|
||||
info['mapping'] = info.pop('mapping_id')
|
||||
info.pop('links', None)
|
||||
|
||||
@@ -43,8 +43,10 @@ class AddUserToGroup(command.Command):
|
||||
'user',
|
||||
metavar='<user>',
|
||||
nargs='+',
|
||||
help=_('User(s) to add to <group> (name or ID) '
|
||||
'(repeat option to add multiple users)'),
|
||||
help=_(
|
||||
'User(s) to add to <group> (name or ID) '
|
||||
'(repeat option to add multiple users)'
|
||||
),
|
||||
)
|
||||
common.add_group_domain_option_to_parser(parser)
|
||||
common.add_user_domain_option_to_parser(parser)
|
||||
@@ -53,16 +55,16 @@ class AddUserToGroup(command.Command):
|
||||
def take_action(self, parsed_args):
|
||||
identity_client = self.app.client_manager.identity
|
||||
|
||||
group_id = common.find_group(identity_client,
|
||||
parsed_args.group,
|
||||
parsed_args.group_domain).id
|
||||
group_id = common.find_group(
|
||||
identity_client, parsed_args.group, parsed_args.group_domain
|
||||
).id
|
||||
|
||||
result = 0
|
||||
for i in parsed_args.user:
|
||||
try:
|
||||
user_id = common.find_user(identity_client,
|
||||
i,
|
||||
parsed_args.user_domain).id
|
||||
user_id = common.find_user(
|
||||
identity_client, i, parsed_args.user_domain
|
||||
).id
|
||||
identity_client.users.add_to_group(user_id, group_id)
|
||||
except Exception as e:
|
||||
result += 1
|
||||
@@ -74,8 +76,12 @@ class AddUserToGroup(command.Command):
|
||||
LOG.error(msg)
|
||||
if result > 0:
|
||||
total = len(parsed_args.user)
|
||||
msg = (_("%(result)s of %(total)s users not added to group "
|
||||
"%(group)s.")) % {
|
||||
msg = (
|
||||
_(
|
||||
"%(result)s of %(total)s users not added to group "
|
||||
"%(group)s."
|
||||
)
|
||||
) % {
|
||||
'result': result,
|
||||
'total': total,
|
||||
'group': parsed_args.group,
|
||||
@@ -105,12 +111,12 @@ class CheckUserInGroup(command.Command):
|
||||
def take_action(self, parsed_args):
|
||||
identity_client = self.app.client_manager.identity
|
||||
|
||||
user_id = common.find_user(identity_client,
|
||||
parsed_args.user,
|
||||
parsed_args.user_domain).id
|
||||
group_id = common.find_group(identity_client,
|
||||
parsed_args.group,
|
||||
parsed_args.group_domain).id
|
||||
user_id = common.find_user(
|
||||
identity_client, parsed_args.user, parsed_args.user_domain
|
||||
).id
|
||||
group_id = common.find_group(
|
||||
identity_client, parsed_args.group, parsed_args.group_domain
|
||||
).id
|
||||
|
||||
try:
|
||||
identity_client.users.check_in_group(user_id, group_id)
|
||||
@@ -163,19 +169,19 @@ class CreateGroup(command.ShowOne):
|
||||
|
||||
domain = None
|
||||
if parsed_args.domain:
|
||||
domain = common.find_domain(identity_client,
|
||||
parsed_args.domain).id
|
||||
domain = common.find_domain(identity_client, parsed_args.domain).id
|
||||
|
||||
try:
|
||||
group = identity_client.groups.create(
|
||||
name=parsed_args.name,
|
||||
domain=domain,
|
||||
description=parsed_args.description)
|
||||
description=parsed_args.description,
|
||||
)
|
||||
except ks_exc.Conflict:
|
||||
if parsed_args.or_show:
|
||||
group = utils.find_resource(identity_client.groups,
|
||||
parsed_args.name,
|
||||
domain_id=domain)
|
||||
group = utils.find_resource(
|
||||
identity_client.groups, parsed_args.name, domain_id=domain
|
||||
)
|
||||
LOG.info(_('Returning existing group %s'), group.name)
|
||||
else:
|
||||
raise
|
||||
@@ -208,20 +214,26 @@ class DeleteGroup(command.Command):
|
||||
errors = 0
|
||||
for group in parsed_args.groups:
|
||||
try:
|
||||
group_obj = common.find_group(identity_client,
|
||||
group,
|
||||
parsed_args.domain)
|
||||
group_obj = common.find_group(
|
||||
identity_client, group, parsed_args.domain
|
||||
)
|
||||
identity_client.groups.delete(group_obj.id)
|
||||
except Exception as e:
|
||||
errors += 1
|
||||
LOG.error(_("Failed to delete group with "
|
||||
"name or ID '%(group)s': %(e)s"),
|
||||
{'group': group, 'e': e})
|
||||
LOG.error(
|
||||
_(
|
||||
"Failed to delete group with "
|
||||
"name or ID '%(group)s': %(e)s"
|
||||
),
|
||||
{'group': group, 'e': e},
|
||||
)
|
||||
|
||||
if errors > 0:
|
||||
total = len(parsed_args.groups)
|
||||
msg = (_("%(errors)s of %(total)s groups failed "
|
||||
"to delete.") % {'errors': errors, 'total': total})
|
||||
msg = _("%(errors)s of %(total)s groups failed " "to delete.") % {
|
||||
'errors': errors,
|
||||
'total': total,
|
||||
}
|
||||
raise exceptions.CommandError(msg)
|
||||
|
||||
|
||||
@@ -254,8 +266,7 @@ class ListGroup(command.Lister):
|
||||
|
||||
domain = None
|
||||
if parsed_args.domain:
|
||||
domain = common.find_domain(identity_client,
|
||||
parsed_args.domain).id
|
||||
domain = common.find_domain(identity_client, parsed_args.domain).id
|
||||
|
||||
if parsed_args.user:
|
||||
user = common.find_user(
|
||||
@@ -278,10 +289,14 @@ class ListGroup(command.Lister):
|
||||
|
||||
return (
|
||||
columns,
|
||||
(utils.get_item_properties(
|
||||
s, columns,
|
||||
formatters={},
|
||||
) for s in data)
|
||||
(
|
||||
utils.get_item_properties(
|
||||
s,
|
||||
columns,
|
||||
formatters={},
|
||||
)
|
||||
for s in data
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
@@ -299,8 +314,10 @@ class RemoveUserFromGroup(command.Command):
|
||||
'user',
|
||||
metavar='<user>',
|
||||
nargs='+',
|
||||
help=_('User(s) to remove from <group> (name or ID) '
|
||||
'(repeat option to remove multiple users)'),
|
||||
help=_(
|
||||
'User(s) to remove from <group> (name or ID) '
|
||||
'(repeat option to remove multiple users)'
|
||||
),
|
||||
)
|
||||
common.add_group_domain_option_to_parser(parser)
|
||||
common.add_user_domain_option_to_parser(parser)
|
||||
@@ -309,16 +326,16 @@ class RemoveUserFromGroup(command.Command):
|
||||
def take_action(self, parsed_args):
|
||||
identity_client = self.app.client_manager.identity
|
||||
|
||||
group_id = common.find_group(identity_client,
|
||||
parsed_args.group,
|
||||
parsed_args.group_domain).id
|
||||
group_id = common.find_group(
|
||||
identity_client, parsed_args.group, parsed_args.group_domain
|
||||
).id
|
||||
|
||||
result = 0
|
||||
for i in parsed_args.user:
|
||||
try:
|
||||
user_id = common.find_user(identity_client,
|
||||
i,
|
||||
parsed_args.user_domain).id
|
||||
user_id = common.find_user(
|
||||
identity_client, i, parsed_args.user_domain
|
||||
).id
|
||||
identity_client.users.remove_from_group(user_id, group_id)
|
||||
except Exception as e:
|
||||
result += 1
|
||||
@@ -330,8 +347,12 @@ class RemoveUserFromGroup(command.Command):
|
||||
LOG.error(msg)
|
||||
if result > 0:
|
||||
total = len(parsed_args.user)
|
||||
msg = (_("%(result)s of %(total)s users not removed from group "
|
||||
"%(group)s.")) % {
|
||||
msg = (
|
||||
_(
|
||||
"%(result)s of %(total)s users not removed from group "
|
||||
"%(group)s."
|
||||
)
|
||||
) % {
|
||||
'result': result,
|
||||
'total': total,
|
||||
'group': parsed_args.group,
|
||||
@@ -368,8 +389,9 @@ class SetGroup(command.Command):
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
identity_client = self.app.client_manager.identity
|
||||
group = common.find_group(identity_client, parsed_args.group,
|
||||
parsed_args.domain)
|
||||
group = common.find_group(
|
||||
identity_client, parsed_args.group, parsed_args.domain
|
||||
)
|
||||
kwargs = {}
|
||||
if parsed_args.name:
|
||||
kwargs['name'] = parsed_args.name
|
||||
@@ -399,9 +421,11 @@ class ShowGroup(command.ShowOne):
|
||||
def take_action(self, parsed_args):
|
||||
identity_client = self.app.client_manager.identity
|
||||
|
||||
group = common.find_group(identity_client,
|
||||
parsed_args.group,
|
||||
domain_name_or_id=parsed_args.domain)
|
||||
group = common.find_group(
|
||||
identity_client,
|
||||
parsed_args.group,
|
||||
domain_name_or_id=parsed_args.domain,
|
||||
)
|
||||
|
||||
group._info.pop('links')
|
||||
return zip(*sorted(group._info.items()))
|
||||
|
||||
@@ -42,14 +42,18 @@ class CreateIdentityProvider(command.ShowOne):
|
||||
'--remote-id',
|
||||
metavar='<remote-id>',
|
||||
action='append',
|
||||
help=_('Remote IDs to associate with the Identity Provider '
|
||||
'(repeat option to provide multiple values)'),
|
||||
help=_(
|
||||
'Remote IDs to associate with the Identity Provider '
|
||||
'(repeat option to provide multiple values)'
|
||||
),
|
||||
)
|
||||
identity_remote_id_provider.add_argument(
|
||||
'--remote-id-file',
|
||||
metavar='<file-name>',
|
||||
help=_('Name of a file that contains many remote IDs to associate '
|
||||
'with the identity provider, one per line'),
|
||||
help=_(
|
||||
'Name of a file that contains many remote IDs to associate '
|
||||
'with the identity provider, one per line'
|
||||
),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--description',
|
||||
@@ -59,19 +63,23 @@ class CreateIdentityProvider(command.ShowOne):
|
||||
parser.add_argument(
|
||||
'--domain',
|
||||
metavar='<domain>',
|
||||
help=_('Domain to associate with the identity provider. If not '
|
||||
'specified, a domain will be created automatically. '
|
||||
'(Name or ID)'),
|
||||
help=_(
|
||||
'Domain to associate with the identity provider. If not '
|
||||
'specified, a domain will be created automatically. '
|
||||
'(Name or ID)'
|
||||
),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--authorization-ttl',
|
||||
metavar='<authorization-ttl>',
|
||||
type=int,
|
||||
help=_('Time to keep the role assignments for users '
|
||||
'authenticating via this identity provider. '
|
||||
'When not provided, global default configured in the '
|
||||
'Identity service will be used. '
|
||||
'Available since Identity API version 3.14 (Ussuri).'),
|
||||
help=_(
|
||||
'Time to keep the role assignments for users '
|
||||
'authenticating via this identity provider. '
|
||||
'When not provided, global default configured in the '
|
||||
'Identity service will be used. '
|
||||
'Available since Identity API version 3.14 (Ussuri).'
|
||||
),
|
||||
)
|
||||
enable_identity_provider = parser.add_mutually_exclusive_group()
|
||||
enable_identity_provider.add_argument(
|
||||
@@ -93,25 +101,29 @@ class CreateIdentityProvider(command.ShowOne):
|
||||
identity_client = self.app.client_manager.identity
|
||||
if parsed_args.remote_id_file:
|
||||
file_content = utils.read_blob_file_contents(
|
||||
parsed_args.remote_id_file)
|
||||
parsed_args.remote_id_file
|
||||
)
|
||||
remote_ids = file_content.splitlines()
|
||||
remote_ids = list(map(str.strip, remote_ids))
|
||||
else:
|
||||
remote_ids = (parsed_args.remote_id
|
||||
if parsed_args.remote_id else None)
|
||||
remote_ids = (
|
||||
parsed_args.remote_id if parsed_args.remote_id else None
|
||||
)
|
||||
|
||||
domain_id = None
|
||||
if parsed_args.domain:
|
||||
domain_id = common.find_domain(identity_client,
|
||||
parsed_args.domain).id
|
||||
domain_id = common.find_domain(
|
||||
identity_client, parsed_args.domain
|
||||
).id
|
||||
|
||||
# TODO(pas-ha) actually check for 3.14 microversion
|
||||
kwargs = {}
|
||||
auth_ttl = parsed_args.authorization_ttl
|
||||
if auth_ttl is not None:
|
||||
if auth_ttl < 0:
|
||||
msg = (_("%(param)s must be positive integer or zero."
|
||||
) % {"param": "authorization-ttl"})
|
||||
msg = _("%(param)s must be positive integer or zero.") % {
|
||||
"param": "authorization-ttl"
|
||||
}
|
||||
raise exceptions.CommandError(msg)
|
||||
kwargs['authorization_ttl'] = auth_ttl
|
||||
|
||||
@@ -121,7 +133,8 @@ class CreateIdentityProvider(command.ShowOne):
|
||||
description=parsed_args.description,
|
||||
domain_id=domain_id,
|
||||
enabled=parsed_args.enabled,
|
||||
**kwargs)
|
||||
**kwargs
|
||||
)
|
||||
|
||||
idp._info.pop('links', None)
|
||||
remote_ids = format_columns.ListColumn(idp._info.pop('remote_ids', []))
|
||||
@@ -150,14 +163,20 @@ class DeleteIdentityProvider(command.Command):
|
||||
identity_client.federation.identity_providers.delete(i)
|
||||
except Exception as e:
|
||||
result += 1
|
||||
LOG.error(_("Failed to delete identity providers with "
|
||||
"name or ID '%(provider)s': %(e)s"),
|
||||
{'provider': i, 'e': e})
|
||||
LOG.error(
|
||||
_(
|
||||
"Failed to delete identity providers with "
|
||||
"name or ID '%(provider)s': %(e)s"
|
||||
),
|
||||
{'provider': i, 'e': e},
|
||||
)
|
||||
|
||||
if result > 0:
|
||||
total = len(parsed_args.identity_provider)
|
||||
msg = (_("%(result)s of %(total)s identity providers failed"
|
||||
" to delete.") % {'result': result, 'total': total})
|
||||
msg = _(
|
||||
"%(result)s of %(total)s identity providers failed"
|
||||
" to delete."
|
||||
) % {'result': result, 'total': total}
|
||||
raise exceptions.CommandError(msg)
|
||||
|
||||
|
||||
@@ -190,11 +209,17 @@ class ListIdentityProvider(command.Lister):
|
||||
kwargs['enabled'] = True
|
||||
|
||||
data = identity_client.federation.identity_providers.list(**kwargs)
|
||||
return (columns,
|
||||
(utils.get_item_properties(
|
||||
s, columns,
|
||||
return (
|
||||
columns,
|
||||
(
|
||||
utils.get_item_properties(
|
||||
s,
|
||||
columns,
|
||||
formatters={},
|
||||
) for s in data))
|
||||
)
|
||||
for s in data
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
class SetIdentityProvider(command.Command):
|
||||
@@ -217,22 +242,28 @@ class SetIdentityProvider(command.Command):
|
||||
'--remote-id',
|
||||
metavar='<remote-id>',
|
||||
action='append',
|
||||
help=_('Remote IDs to associate with the Identity Provider '
|
||||
'(repeat option to provide multiple values)'),
|
||||
help=_(
|
||||
'Remote IDs to associate with the Identity Provider '
|
||||
'(repeat option to provide multiple values)'
|
||||
),
|
||||
)
|
||||
identity_remote_id_provider.add_argument(
|
||||
'--remote-id-file',
|
||||
metavar='<file-name>',
|
||||
help=_('Name of a file that contains many remote IDs to associate '
|
||||
'with the identity provider, one per line'),
|
||||
help=_(
|
||||
'Name of a file that contains many remote IDs to associate '
|
||||
'with the identity provider, one per line'
|
||||
),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--authorization-ttl',
|
||||
metavar='<authorization-ttl>',
|
||||
type=int,
|
||||
help=_('Time to keep the role assignments for users '
|
||||
'authenticating via this identity provider. '
|
||||
'Available since Identity API version 3.14 (Ussuri).'),
|
||||
help=_(
|
||||
'Time to keep the role assignments for users '
|
||||
'authenticating via this identity provider. '
|
||||
'Available since Identity API version 3.14 (Ussuri).'
|
||||
),
|
||||
)
|
||||
enable_identity_provider = parser.add_mutually_exclusive_group()
|
||||
enable_identity_provider.add_argument(
|
||||
@@ -253,7 +284,8 @@ class SetIdentityProvider(command.Command):
|
||||
# Always set remote_ids if either is passed in
|
||||
if parsed_args.remote_id_file:
|
||||
file_content = utils.read_blob_file_contents(
|
||||
parsed_args.remote_id_file)
|
||||
parsed_args.remote_id_file
|
||||
)
|
||||
remote_ids = file_content.splitlines()
|
||||
remote_ids = list(map(str.strip, remote_ids))
|
||||
elif parsed_args.remote_id:
|
||||
@@ -279,14 +311,14 @@ class SetIdentityProvider(command.Command):
|
||||
auth_ttl = parsed_args.authorization_ttl
|
||||
if auth_ttl is not None:
|
||||
if auth_ttl < 0:
|
||||
msg = (_("%(param)s must be positive integer or zero."
|
||||
) % {"param": "authorization-ttl"})
|
||||
msg = _("%(param)s must be positive integer or zero.") % {
|
||||
"param": "authorization-ttl"
|
||||
}
|
||||
raise exceptions.CommandError(msg)
|
||||
kwargs['authorization_ttl'] = auth_ttl
|
||||
|
||||
federation_client.identity_providers.update(
|
||||
parsed_args.identity_provider,
|
||||
**kwargs
|
||||
parsed_args.identity_provider, **kwargs
|
||||
)
|
||||
|
||||
|
||||
@@ -307,7 +339,8 @@ class ShowIdentityProvider(command.ShowOne):
|
||||
idp = utils.find_resource(
|
||||
identity_client.federation.identity_providers,
|
||||
parsed_args.identity_provider,
|
||||
id=parsed_args.identity_provider)
|
||||
id=parsed_args.identity_provider,
|
||||
)
|
||||
|
||||
idp._info.pop('links', None)
|
||||
remote_ids = format_columns.ListColumn(idp._info.pop('remote_ids', []))
|
||||
|
||||
@@ -48,7 +48,6 @@ def _get_role_ids(identity_client, parsed_args):
|
||||
|
||||
|
||||
class CreateImpliedRole(command.ShowOne):
|
||||
|
||||
_description = _("Creates an association between prior and implied roles")
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
@@ -69,16 +68,16 @@ class CreateImpliedRole(command.ShowOne):
|
||||
def take_action(self, parsed_args):
|
||||
identity_client = self.app.client_manager.identity
|
||||
(prior_role_id, implied_role_id) = _get_role_ids(
|
||||
identity_client, parsed_args)
|
||||
identity_client, parsed_args
|
||||
)
|
||||
response = identity_client.inference_rules.create(
|
||||
prior_role_id, implied_role_id)
|
||||
prior_role_id, implied_role_id
|
||||
)
|
||||
response._info.pop('links', None)
|
||||
return zip(*sorted([(k, v['id'])
|
||||
for k, v in response._info.items()]))
|
||||
return zip(*sorted([(k, v['id']) for k, v in response._info.items()]))
|
||||
|
||||
|
||||
class DeleteImpliedRole(command.Command):
|
||||
|
||||
_description = _("Deletes an association between prior and implied roles")
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
@@ -99,16 +98,19 @@ class DeleteImpliedRole(command.Command):
|
||||
def take_action(self, parsed_args):
|
||||
identity_client = self.app.client_manager.identity
|
||||
(prior_role_id, implied_role_id) = _get_role_ids(
|
||||
identity_client, parsed_args)
|
||||
identity_client.inference_rules.delete(
|
||||
prior_role_id, implied_role_id)
|
||||
identity_client, parsed_args
|
||||
)
|
||||
identity_client.inference_rules.delete(prior_role_id, implied_role_id)
|
||||
|
||||
|
||||
class ListImpliedRole(command.Lister):
|
||||
|
||||
_description = _("List implied roles")
|
||||
_COLUMNS = ['Prior Role ID', 'Prior Role Name',
|
||||
'Implied Role ID', 'Implied Role Name']
|
||||
_COLUMNS = [
|
||||
'Prior Role ID',
|
||||
'Prior Role Name',
|
||||
'Implied Role ID',
|
||||
'Implied Role Name',
|
||||
]
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ListImpliedRole, self).get_parser(prog_name)
|
||||
@@ -118,10 +120,12 @@ class ListImpliedRole(command.Lister):
|
||||
def _list_implied(response):
|
||||
for rule in response:
|
||||
for implies in rule.implies:
|
||||
yield (rule.prior_role['id'],
|
||||
rule.prior_role['name'],
|
||||
implies['id'],
|
||||
implies['name'])
|
||||
yield (
|
||||
rule.prior_role['id'],
|
||||
rule.prior_role['name'],
|
||||
implies['id'],
|
||||
implies['name'],
|
||||
)
|
||||
|
||||
identity_client = self.app.client_manager.identity
|
||||
response = identity_client.inference_rules.list_inference_roles()
|
||||
|
||||
@@ -97,7 +97,7 @@ class CreateLimit(command.ShowOne):
|
||||
parsed_args.resource_name,
|
||||
parsed_args.resource_limit,
|
||||
description=parsed_args.description,
|
||||
region=region
|
||||
region=region,
|
||||
)
|
||||
|
||||
limit._info.pop('links', None)
|
||||
@@ -168,12 +168,17 @@ class ListLimit(command.Lister):
|
||||
service=service,
|
||||
resource_name=parsed_args.resource_name,
|
||||
region=region,
|
||||
project=project
|
||||
project=project,
|
||||
)
|
||||
|
||||
columns = (
|
||||
'ID', 'Project ID', 'Service ID', 'Resource Name',
|
||||
'Resource Limit', 'Description', 'Region ID'
|
||||
'ID',
|
||||
'Project ID',
|
||||
'Service ID',
|
||||
'Resource Name',
|
||||
'Resource Limit',
|
||||
'Description',
|
||||
'Region ID',
|
||||
)
|
||||
return (
|
||||
columns,
|
||||
@@ -230,7 +235,7 @@ class SetLimit(command.ShowOne):
|
||||
limit = identity_client.limits.update(
|
||||
parsed_args.limit_id,
|
||||
description=parsed_args.description,
|
||||
resource_limit=parsed_args.resource_limit
|
||||
resource_limit=parsed_args.resource_limit,
|
||||
)
|
||||
|
||||
limit._info.pop('links', None)
|
||||
@@ -260,12 +265,15 @@ class DeleteLimit(command.Command):
|
||||
identity_client.limits.delete(limit_id)
|
||||
except Exception as e:
|
||||
errors += 1
|
||||
LOG.error(_("Failed to delete limit with ID "
|
||||
"'%(id)s': %(e)s"),
|
||||
{'id': limit_id, 'e': e})
|
||||
LOG.error(
|
||||
_("Failed to delete limit with ID " "'%(id)s': %(e)s"),
|
||||
{'id': limit_id, 'e': e},
|
||||
)
|
||||
|
||||
if errors > 0:
|
||||
total = len(parsed_args.limit_id)
|
||||
msg = (_("%(errors)s of %(total)s limits failed to "
|
||||
"delete.") % {'errors': errors, 'total': total})
|
||||
msg = _("%(errors)s of %(total)s limits failed to " "delete.") % {
|
||||
'errors': errors,
|
||||
'total': total,
|
||||
}
|
||||
raise exceptions.CommandError(msg)
|
||||
|
||||
@@ -73,8 +73,10 @@ class _RulesReader(object):
|
||||
try:
|
||||
rules = json.loads(blob)
|
||||
except ValueError as e:
|
||||
msg = _("An error occurred when reading rules from file "
|
||||
"%(path)s: %(error)s") % {"path": path, "error": e}
|
||||
msg = _(
|
||||
"An error occurred when reading rules from file "
|
||||
"%(path)s: %(error)s"
|
||||
) % {"path": path, "error": e}
|
||||
raise exceptions.CommandError(msg)
|
||||
else:
|
||||
return rules
|
||||
@@ -92,7 +94,8 @@ class CreateMapping(command.ShowOne, _RulesReader):
|
||||
)
|
||||
parser.add_argument(
|
||||
'--rules',
|
||||
metavar='<filename>', required=True,
|
||||
metavar='<filename>',
|
||||
required=True,
|
||||
help=_('Filename that contains a set of mapping rules (required)'),
|
||||
)
|
||||
return parser
|
||||
@@ -102,8 +105,8 @@ class CreateMapping(command.ShowOne, _RulesReader):
|
||||
|
||||
rules = self._read_rules(parsed_args.rules)
|
||||
mapping = identity_client.federation.mappings.create(
|
||||
mapping_id=parsed_args.mapping,
|
||||
rules=rules)
|
||||
mapping_id=parsed_args.mapping, rules=rules
|
||||
)
|
||||
|
||||
mapping._info.pop('links', None)
|
||||
return zip(*sorted(mapping._info.items()))
|
||||
@@ -130,13 +133,19 @@ class DeleteMapping(command.Command):
|
||||
identity_client.federation.mappings.delete(i)
|
||||
except Exception as e:
|
||||
result += 1
|
||||
LOG.error(_("Failed to delete mapping with name or "
|
||||
"ID '%(mapping)s': %(e)s"), {'mapping': i, 'e': e})
|
||||
LOG.error(
|
||||
_(
|
||||
"Failed to delete mapping with name or "
|
||||
"ID '%(mapping)s': %(e)s"
|
||||
),
|
||||
{'mapping': i, 'e': e},
|
||||
)
|
||||
|
||||
if result > 0:
|
||||
total = len(parsed_args.mapping)
|
||||
msg = (_("%(result)s of %(total)s mappings failed "
|
||||
"to delete.") % {'result': result, 'total': total})
|
||||
msg = _(
|
||||
"%(result)s of %(total)s mappings failed " "to delete."
|
||||
) % {'result': result, 'total': total}
|
||||
raise exceptions.CommandError(msg)
|
||||
|
||||
|
||||
@@ -177,8 +186,8 @@ class SetMapping(command.Command, _RulesReader):
|
||||
rules = self._read_rules(parsed_args.rules)
|
||||
|
||||
mapping = identity_client.federation.mappings.update(
|
||||
mapping=parsed_args.mapping,
|
||||
rules=rules)
|
||||
mapping=parsed_args.mapping, rules=rules
|
||||
)
|
||||
|
||||
mapping._info.pop('links', None)
|
||||
|
||||
|
||||
@@ -36,8 +36,10 @@ class CreatePolicy(command.ShowOne):
|
||||
'--type',
|
||||
metavar='<type>',
|
||||
default="application/json",
|
||||
help=_('New MIME type of the policy rules file '
|
||||
'(defaults to application/json)'),
|
||||
help=_(
|
||||
'New MIME type of the policy rules file '
|
||||
'(defaults to application/json)'
|
||||
),
|
||||
)
|
||||
parser.add_argument(
|
||||
'rules',
|
||||
@@ -80,13 +82,20 @@ class DeletePolicy(command.Command):
|
||||
identity_client.policies.delete(i)
|
||||
except Exception as e:
|
||||
result += 1
|
||||
LOG.error(_("Failed to delete policy with name or "
|
||||
"ID '%(policy)s': %(e)s"), {'policy': i, 'e': e})
|
||||
LOG.error(
|
||||
_(
|
||||
"Failed to delete policy with name or "
|
||||
"ID '%(policy)s': %(e)s"
|
||||
),
|
||||
{'policy': i, 'e': e},
|
||||
)
|
||||
|
||||
if result > 0:
|
||||
total = len(parsed_args.policy)
|
||||
msg = (_("%(result)s of %(total)s policys failed "
|
||||
"to delete.") % {'result': result, 'total': total})
|
||||
msg = _("%(result)s of %(total)s policys failed " "to delete.") % {
|
||||
'result': result,
|
||||
'total': total,
|
||||
}
|
||||
raise exceptions.CommandError(msg)
|
||||
|
||||
|
||||
@@ -111,11 +120,17 @@ class ListPolicy(command.Lister):
|
||||
columns = ('ID', 'Type')
|
||||
column_headers = columns
|
||||
data = self.app.client_manager.identity.policies.list()
|
||||
return (column_headers,
|
||||
(utils.get_item_properties(
|
||||
s, columns,
|
||||
return (
|
||||
column_headers,
|
||||
(
|
||||
utils.get_item_properties(
|
||||
s,
|
||||
columns,
|
||||
formatters={},
|
||||
) for s in data))
|
||||
)
|
||||
for s in data
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
class SetPolicy(command.Command):
|
||||
@@ -170,8 +185,9 @@ class ShowPolicy(command.ShowOne):
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
identity_client = self.app.client_manager.identity
|
||||
policy = utils.find_resource(identity_client.policies,
|
||||
parsed_args.policy)
|
||||
policy = utils.find_resource(
|
||||
identity_client.policies, parsed_args.policy
|
||||
)
|
||||
|
||||
policy._info.pop('links')
|
||||
policy._info.update({'rules': policy._info.pop('blob')})
|
||||
|
||||
@@ -70,8 +70,10 @@ class CreateProject(command.ShowOne):
|
||||
'--property',
|
||||
metavar='<key=value>',
|
||||
action=parseractions.KeyValueAction,
|
||||
help=_('Add a property to <name> '
|
||||
'(repeat option to set multiple properties)'),
|
||||
help=_(
|
||||
'Add a property to <name> '
|
||||
'(repeat option to set multiple properties)'
|
||||
),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--or-show',
|
||||
@@ -87,8 +89,7 @@ class CreateProject(command.ShowOne):
|
||||
|
||||
domain = None
|
||||
if parsed_args.domain:
|
||||
domain = common.find_domain(identity_client,
|
||||
parsed_args.domain).id
|
||||
domain = common.find_domain(identity_client, parsed_args.domain).id
|
||||
|
||||
parent = None
|
||||
if parsed_args.parent:
|
||||
@@ -128,9 +129,11 @@ class CreateProject(command.ShowOne):
|
||||
)
|
||||
except ks_exc.Conflict:
|
||||
if parsed_args.or_show:
|
||||
project = utils.find_resource(identity_client.projects,
|
||||
parsed_args.name,
|
||||
domain_id=domain)
|
||||
project = utils.find_resource(
|
||||
identity_client.projects,
|
||||
parsed_args.name,
|
||||
domain_id=domain,
|
||||
)
|
||||
LOG.info(_('Returning existing project %s'), project.name)
|
||||
else:
|
||||
raise
|
||||
@@ -167,23 +170,29 @@ class DeleteProject(command.Command):
|
||||
for project in parsed_args.projects:
|
||||
try:
|
||||
if domain is not None:
|
||||
project_obj = utils.find_resource(identity_client.projects,
|
||||
project,
|
||||
domain_id=domain.id)
|
||||
project_obj = utils.find_resource(
|
||||
identity_client.projects, project, domain_id=domain.id
|
||||
)
|
||||
else:
|
||||
project_obj = utils.find_resource(identity_client.projects,
|
||||
project)
|
||||
project_obj = utils.find_resource(
|
||||
identity_client.projects, project
|
||||
)
|
||||
identity_client.projects.delete(project_obj.id)
|
||||
except Exception as e:
|
||||
errors += 1
|
||||
LOG.error(_("Failed to delete project with "
|
||||
"name or ID '%(project)s': %(e)s"),
|
||||
{'project': project, 'e': e})
|
||||
LOG.error(
|
||||
_(
|
||||
"Failed to delete project with "
|
||||
"name or ID '%(project)s': %(e)s"
|
||||
),
|
||||
{'project': project, 'e': e},
|
||||
)
|
||||
|
||||
if errors > 0:
|
||||
total = len(parsed_args.projects)
|
||||
msg = (_("%(errors)s of %(total)s projects failed "
|
||||
"to delete.") % {'errors': errors, 'total': total})
|
||||
msg = _(
|
||||
"%(errors)s of %(total)s projects failed " "to delete."
|
||||
) % {'errors': errors, 'total': total}
|
||||
raise exceptions.CommandError(msg)
|
||||
|
||||
|
||||
@@ -210,8 +219,10 @@ class ListProject(command.Lister):
|
||||
parser.add_argument(
|
||||
'--my-projects',
|
||||
action='store_true',
|
||||
help=_('List projects for the authenticated user. '
|
||||
'Supersedes other filters.'),
|
||||
help=_(
|
||||
'List projects for the authenticated user. '
|
||||
'Supersedes other filters.'
|
||||
),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--long',
|
||||
@@ -222,9 +233,11 @@ class ListProject(command.Lister):
|
||||
parser.add_argument(
|
||||
'--sort',
|
||||
metavar='<key>[:<direction>]',
|
||||
help=_('Sort output by selected keys and directions (asc or desc) '
|
||||
'(default: asc), repeat this option to specify multiple '
|
||||
'keys and directions.'),
|
||||
help=_(
|
||||
'Sort output by selected keys and directions (asc or desc) '
|
||||
'(default: asc), repeat this option to specify multiple '
|
||||
'keys and directions.'
|
||||
),
|
||||
)
|
||||
tag.add_tag_filtering_option_to_parser(parser, _('projects'))
|
||||
return parser
|
||||
@@ -239,23 +252,28 @@ class ListProject(command.Lister):
|
||||
|
||||
domain_id = None
|
||||
if parsed_args.domain:
|
||||
domain_id = common.find_domain(identity_client,
|
||||
parsed_args.domain).id
|
||||
domain_id = common.find_domain(
|
||||
identity_client, parsed_args.domain
|
||||
).id
|
||||
kwargs['domain'] = domain_id
|
||||
|
||||
if parsed_args.parent:
|
||||
parent_id = common.find_project(identity_client,
|
||||
parsed_args.parent).id
|
||||
parent_id = common.find_project(
|
||||
identity_client, parsed_args.parent
|
||||
).id
|
||||
kwargs['parent'] = parent_id
|
||||
|
||||
if parsed_args.user:
|
||||
if parsed_args.domain:
|
||||
user_id = utils.find_resource(identity_client.users,
|
||||
parsed_args.user,
|
||||
domain_id=domain_id).id
|
||||
user_id = utils.find_resource(
|
||||
identity_client.users,
|
||||
parsed_args.user,
|
||||
domain_id=domain_id,
|
||||
).id
|
||||
else:
|
||||
user_id = utils.find_resource(identity_client.users,
|
||||
parsed_args.user).id
|
||||
user_id = utils.find_resource(
|
||||
identity_client.users, parsed_args.user
|
||||
).id
|
||||
|
||||
kwargs['user'] = user_id
|
||||
|
||||
@@ -272,19 +290,24 @@ class ListProject(command.Lister):
|
||||
# wanting their own project list.
|
||||
if not kwargs:
|
||||
user = self.app.client_manager.auth_ref.user_id
|
||||
data = identity_client.projects.list(
|
||||
user=user)
|
||||
data = identity_client.projects.list(user=user)
|
||||
else:
|
||||
raise
|
||||
|
||||
if parsed_args.sort:
|
||||
data = utils.sort_items(data, parsed_args.sort)
|
||||
|
||||
return (columns,
|
||||
(utils.get_item_properties(
|
||||
s, columns,
|
||||
return (
|
||||
columns,
|
||||
(
|
||||
utils.get_item_properties(
|
||||
s,
|
||||
columns,
|
||||
formatters={},
|
||||
) for s in data))
|
||||
)
|
||||
for s in data
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
class SetProject(command.Command):
|
||||
@@ -327,8 +350,10 @@ class SetProject(command.Command):
|
||||
'--property',
|
||||
metavar='<key=value>',
|
||||
action=parseractions.KeyValueAction,
|
||||
help=_('Set a property on <project> '
|
||||
'(repeat option to set multiple properties)'),
|
||||
help=_(
|
||||
'Set a property on <project> '
|
||||
'(repeat option to set multiple properties)'
|
||||
),
|
||||
)
|
||||
common.add_resource_option_to_parser(parser)
|
||||
tag.add_tag_option_to_parser_for_set(parser, _('project'))
|
||||
@@ -337,9 +362,9 @@ class SetProject(command.Command):
|
||||
def take_action(self, parsed_args):
|
||||
identity_client = self.app.client_manager.identity
|
||||
|
||||
project = common.find_project(identity_client,
|
||||
parsed_args.project,
|
||||
parsed_args.domain)
|
||||
project = common.find_project(
|
||||
identity_client, parsed_args.project, parsed_args.domain
|
||||
)
|
||||
|
||||
kwargs = {}
|
||||
if parsed_args.name:
|
||||
@@ -392,20 +417,19 @@ class ShowProject(command.ShowOne):
|
||||
def take_action(self, parsed_args):
|
||||
identity_client = self.app.client_manager.identity
|
||||
|
||||
project_str = common._get_token_resource(identity_client, 'project',
|
||||
parsed_args.project,
|
||||
parsed_args.domain)
|
||||
project_str = common._get_token_resource(
|
||||
identity_client, 'project', parsed_args.project, parsed_args.domain
|
||||
)
|
||||
|
||||
if parsed_args.domain:
|
||||
domain = common.find_domain(identity_client, parsed_args.domain)
|
||||
project = utils.find_resource(
|
||||
identity_client.projects,
|
||||
project_str,
|
||||
domain_id=domain.id)
|
||||
identity_client.projects, project_str, domain_id=domain.id
|
||||
)
|
||||
else:
|
||||
project = utils.find_resource(
|
||||
identity_client.projects,
|
||||
project_str)
|
||||
identity_client.projects, project_str
|
||||
)
|
||||
|
||||
if parsed_args.parents or parsed_args.children:
|
||||
# NOTE(RuiChen): utils.find_resource() can't pass kwargs,
|
||||
@@ -414,7 +438,8 @@ class ShowProject(command.ShowOne):
|
||||
project = identity_client.projects.get(
|
||||
project.id,
|
||||
parents_as_ids=parsed_args.parents,
|
||||
subtree_as_ids=parsed_args.children)
|
||||
subtree_as_ids=parsed_args.children,
|
||||
)
|
||||
|
||||
project._info.pop('links')
|
||||
return zip(*sorted(project._info.items()))
|
||||
|
||||
@@ -85,13 +85,20 @@ class DeleteRegion(command.Command):
|
||||
identity_client.regions.delete(i)
|
||||
except Exception as e:
|
||||
result += 1
|
||||
LOG.error(_("Failed to delete region with "
|
||||
"ID '%(region)s': %(e)s"), {'region': i, 'e': e})
|
||||
LOG.error(
|
||||
_(
|
||||
"Failed to delete region with "
|
||||
"ID '%(region)s': %(e)s"
|
||||
),
|
||||
{'region': i, 'e': e},
|
||||
)
|
||||
|
||||
if result > 0:
|
||||
total = len(parsed_args.region)
|
||||
msg = (_("%(result)s of %(total)s regions failed "
|
||||
"to delete.") % {'result': result, 'total': total})
|
||||
msg = _("%(result)s of %(total)s regions failed " "to delete.") % {
|
||||
'result': result,
|
||||
'total': total,
|
||||
}
|
||||
raise exceptions.CommandError(msg)
|
||||
|
||||
|
||||
@@ -118,11 +125,17 @@ class ListRegion(command.Lister):
|
||||
columns = ('ID', 'Parent Region Id', 'Description')
|
||||
|
||||
data = identity_client.regions.list(**kwargs)
|
||||
return (columns_headers,
|
||||
(utils.get_item_properties(
|
||||
s, columns,
|
||||
return (
|
||||
columns_headers,
|
||||
(
|
||||
utils.get_item_properties(
|
||||
s,
|
||||
columns,
|
||||
formatters={},
|
||||
) for s in data))
|
||||
)
|
||||
for s in data
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
class SetRegion(command.Command):
|
||||
@@ -174,8 +187,9 @@ class ShowRegion(command.ShowOne):
|
||||
def take_action(self, parsed_args):
|
||||
identity_client = self.app.client_manager.identity
|
||||
|
||||
region = utils.find_resource(identity_client.regions,
|
||||
parsed_args.region)
|
||||
region = utils.find_resource(
|
||||
identity_client.regions, parsed_args.region
|
||||
)
|
||||
|
||||
region._info['region'] = region._info.pop('id')
|
||||
region._info['parent_region'] = region._info.pop('parent_region_id')
|
||||
|
||||
@@ -87,7 +87,7 @@ class CreateRegisteredLimit(command.ShowOne):
|
||||
parsed_args.resource_name,
|
||||
parsed_args.default_limit,
|
||||
description=parsed_args.description,
|
||||
region=region
|
||||
region=region,
|
||||
)
|
||||
|
||||
registered_limit._info.pop('links', None)
|
||||
@@ -117,15 +117,22 @@ class DeleteRegisteredLimit(command.Command):
|
||||
except Exception as e:
|
||||
errors += 1
|
||||
from pprint import pprint
|
||||
|
||||
pprint(type(e))
|
||||
LOG.error(_("Failed to delete registered limit with ID "
|
||||
"'%(id)s': %(e)s"),
|
||||
{'id': registered_limit_id, 'e': e})
|
||||
LOG.error(
|
||||
_(
|
||||
"Failed to delete registered limit with ID "
|
||||
"'%(id)s': %(e)s"
|
||||
),
|
||||
{'id': registered_limit_id, 'e': e},
|
||||
)
|
||||
|
||||
if errors > 0:
|
||||
total = len(parsed_args.registered_limit_id)
|
||||
msg = (_("%(errors)s of %(total)s registered limits failed to "
|
||||
"delete.") % {'errors': errors, 'total': total})
|
||||
msg = _(
|
||||
"%(errors)s of %(total)s registered limits failed to "
|
||||
"delete."
|
||||
) % {'errors': errors, 'total': total}
|
||||
raise exceptions.CommandError(msg)
|
||||
|
||||
|
||||
@@ -179,12 +186,16 @@ class ListRegisteredLimit(command.Lister):
|
||||
registered_limits = identity_client.registered_limits.list(
|
||||
service=service,
|
||||
resource_name=parsed_args.resource_name,
|
||||
region=region
|
||||
region=region,
|
||||
)
|
||||
|
||||
columns = (
|
||||
'ID', 'Service ID', 'Resource Name', 'Default Limit',
|
||||
'Description', 'Region ID'
|
||||
'ID',
|
||||
'Service ID',
|
||||
'Resource Name',
|
||||
'Default Limit',
|
||||
'Description',
|
||||
'Region ID',
|
||||
)
|
||||
return (
|
||||
columns,
|
||||
@@ -205,18 +216,22 @@ class SetRegisteredLimit(command.ShowOne):
|
||||
parser.add_argument(
|
||||
'--service',
|
||||
metavar='<service>',
|
||||
help=_('Service to be updated responsible for the resource to '
|
||||
'limit. Either --service, --resource-name or --region must '
|
||||
'be different than existing value otherwise it will be '
|
||||
'duplicate entry')
|
||||
help=_(
|
||||
'Service to be updated responsible for the resource to '
|
||||
'limit. Either --service, --resource-name or --region must '
|
||||
'be different than existing value otherwise it will be '
|
||||
'duplicate entry'
|
||||
),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--resource-name',
|
||||
metavar='<resource-name>',
|
||||
help=_('Resource to be updated responsible for the resource to '
|
||||
'limit. Either --service, --resource-name or --region must '
|
||||
'be different than existing value otherwise it will be '
|
||||
'duplicate entry'),
|
||||
help=_(
|
||||
'Resource to be updated responsible for the resource to '
|
||||
'limit. Either --service, --resource-name or --region must '
|
||||
'be different than existing value otherwise it will be '
|
||||
'duplicate entry'
|
||||
),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--default-limit',
|
||||
@@ -232,10 +247,12 @@ class SetRegisteredLimit(command.ShowOne):
|
||||
parser.add_argument(
|
||||
'--region',
|
||||
metavar='<region>',
|
||||
help=_('Region for the registered limit to affect. Either '
|
||||
'--service, --resource-name or --region must be '
|
||||
'different than existing value otherwise it will be '
|
||||
'duplicate entry'),
|
||||
help=_(
|
||||
'Region for the registered limit to affect. Either '
|
||||
'--service, --resource-name or --region must be '
|
||||
'different than existing value otherwise it will be '
|
||||
'duplicate entry'
|
||||
),
|
||||
)
|
||||
return parser
|
||||
|
||||
@@ -270,7 +287,7 @@ class SetRegisteredLimit(command.ShowOne):
|
||||
resource_name=parsed_args.resource_name,
|
||||
default_limit=parsed_args.default_limit,
|
||||
description=parsed_args.description,
|
||||
region=region
|
||||
region=region,
|
||||
)
|
||||
|
||||
registered_limit._info.pop('links', None)
|
||||
|
||||
@@ -63,16 +63,15 @@ def _add_identity_and_resource_options_to_parser(parser):
|
||||
common.add_inherited_option_to_parser(parser)
|
||||
|
||||
|
||||
def _process_identity_and_resource_options(parsed_args,
|
||||
identity_client_manager,
|
||||
validate_actor_existence=True):
|
||||
|
||||
def _process_identity_and_resource_options(
|
||||
parsed_args, identity_client_manager, validate_actor_existence=True
|
||||
):
|
||||
def _find_user():
|
||||
try:
|
||||
return common.find_user(
|
||||
identity_client_manager,
|
||||
parsed_args.user,
|
||||
parsed_args.user_domain
|
||||
parsed_args.user_domain,
|
||||
).id
|
||||
except exceptions.CommandError:
|
||||
if not validate_actor_existence:
|
||||
@@ -84,7 +83,7 @@ def _process_identity_and_resource_options(parsed_args,
|
||||
return common.find_group(
|
||||
identity_client_manager,
|
||||
parsed_args.group,
|
||||
parsed_args.group_domain
|
||||
parsed_args.group_domain,
|
||||
).id
|
||||
except exceptions.CommandError:
|
||||
if not validate_actor_existence:
|
||||
@@ -129,8 +128,10 @@ def _process_identity_and_resource_options(parsed_args,
|
||||
|
||||
|
||||
class AddRole(command.Command):
|
||||
_description = _("Adds a role assignment to a user or group on the "
|
||||
"system, a domain, or a project")
|
||||
_description = _(
|
||||
"Adds a role assignment to a user or group on the "
|
||||
"system, a domain, or a project"
|
||||
)
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(AddRole, self).get_parser(prog_name)
|
||||
@@ -146,24 +147,30 @@ class AddRole(command.Command):
|
||||
def take_action(self, parsed_args):
|
||||
identity_client = self.app.client_manager.identity
|
||||
|
||||
if (not parsed_args.user and not parsed_args.domain and
|
||||
not parsed_args.group and not parsed_args.project):
|
||||
msg = _("Role not added, incorrect set of arguments "
|
||||
"provided. See openstack --help for more details")
|
||||
if (
|
||||
not parsed_args.user
|
||||
and not parsed_args.domain
|
||||
and not parsed_args.group
|
||||
and not parsed_args.project
|
||||
):
|
||||
msg = _(
|
||||
"Role not added, incorrect set of arguments "
|
||||
"provided. See openstack --help for more details"
|
||||
)
|
||||
raise exceptions.CommandError(msg)
|
||||
|
||||
domain_id = None
|
||||
if parsed_args.role_domain:
|
||||
domain_id = common.find_domain(identity_client,
|
||||
parsed_args.role_domain).id
|
||||
domain_id = common.find_domain(
|
||||
identity_client, parsed_args.role_domain
|
||||
).id
|
||||
role = utils.find_resource(
|
||||
identity_client.roles,
|
||||
parsed_args.role,
|
||||
domain_id=domain_id
|
||||
identity_client.roles, parsed_args.role, domain_id=domain_id
|
||||
)
|
||||
|
||||
kwargs = _process_identity_and_resource_options(
|
||||
parsed_args, self.app.client_manager.identity)
|
||||
parsed_args, self.app.client_manager.identity
|
||||
)
|
||||
|
||||
identity_client.roles.grant(role.id, **kwargs)
|
||||
|
||||
@@ -201,21 +208,27 @@ class CreateRole(command.ShowOne):
|
||||
|
||||
domain_id = None
|
||||
if parsed_args.domain:
|
||||
domain_id = common.find_domain(identity_client,
|
||||
parsed_args.domain).id
|
||||
domain_id = common.find_domain(
|
||||
identity_client, parsed_args.domain
|
||||
).id
|
||||
|
||||
options = common.get_immutable_options(parsed_args)
|
||||
|
||||
try:
|
||||
role = identity_client.roles.create(
|
||||
name=parsed_args.name, domain=domain_id,
|
||||
description=parsed_args.description, options=options)
|
||||
name=parsed_args.name,
|
||||
domain=domain_id,
|
||||
description=parsed_args.description,
|
||||
options=options,
|
||||
)
|
||||
|
||||
except ks_exc.Conflict:
|
||||
if parsed_args.or_show:
|
||||
role = utils.find_resource(identity_client.roles,
|
||||
parsed_args.name,
|
||||
domain_id=domain_id)
|
||||
role = utils.find_resource(
|
||||
identity_client.roles,
|
||||
parsed_args.name,
|
||||
domain_id=domain_id,
|
||||
)
|
||||
LOG.info(_('Returning existing role %s'), role.name)
|
||||
else:
|
||||
raise
|
||||
@@ -247,27 +260,32 @@ class DeleteRole(command.Command):
|
||||
|
||||
domain_id = None
|
||||
if parsed_args.domain:
|
||||
domain_id = common.find_domain(identity_client,
|
||||
parsed_args.domain).id
|
||||
domain_id = common.find_domain(
|
||||
identity_client, parsed_args.domain
|
||||
).id
|
||||
errors = 0
|
||||
for role in parsed_args.roles:
|
||||
try:
|
||||
role_obj = utils.find_resource(
|
||||
identity_client.roles,
|
||||
role,
|
||||
domain_id=domain_id
|
||||
identity_client.roles, role, domain_id=domain_id
|
||||
)
|
||||
identity_client.roles.delete(role_obj.id)
|
||||
except Exception as e:
|
||||
errors += 1
|
||||
LOG.error(_("Failed to delete role with "
|
||||
"name or ID '%(role)s': %(e)s"),
|
||||
{'role': role, 'e': e})
|
||||
LOG.error(
|
||||
_(
|
||||
"Failed to delete role with "
|
||||
"name or ID '%(role)s': %(e)s"
|
||||
),
|
||||
{'role': role, 'e': e},
|
||||
)
|
||||
|
||||
if errors > 0:
|
||||
total = len(parsed_args.roles)
|
||||
msg = (_("%(errors)s of %(total)s roles failed "
|
||||
"to delete.") % {'errors': errors, 'total': total})
|
||||
msg = _("%(errors)s of %(total)s roles failed " "to delete.") % {
|
||||
'errors': errors,
|
||||
'total': total,
|
||||
}
|
||||
raise exceptions.CommandError(msg)
|
||||
|
||||
|
||||
@@ -299,16 +317,23 @@ class ListRole(command.Lister):
|
||||
columns = ('ID', 'Name')
|
||||
data = identity_client.roles.list()
|
||||
|
||||
return (columns,
|
||||
(utils.get_item_properties(
|
||||
s, columns,
|
||||
return (
|
||||
columns,
|
||||
(
|
||||
utils.get_item_properties(
|
||||
s,
|
||||
columns,
|
||||
formatters={},
|
||||
) for s in data))
|
||||
)
|
||||
for s in data
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
class RemoveRole(command.Command):
|
||||
_description = _("Removes a role assignment from system/domain/project : "
|
||||
"user/group")
|
||||
_description = _(
|
||||
"Removes a role assignment from system/domain/project : " "user/group"
|
||||
)
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(RemoveRole, self).get_parser(prog_name)
|
||||
@@ -325,25 +350,31 @@ class RemoveRole(command.Command):
|
||||
def take_action(self, parsed_args):
|
||||
identity_client = self.app.client_manager.identity
|
||||
|
||||
if (not parsed_args.user and not parsed_args.domain and
|
||||
not parsed_args.group and not parsed_args.project):
|
||||
msg = _("Incorrect set of arguments provided. "
|
||||
"See openstack --help for more details")
|
||||
if (
|
||||
not parsed_args.user
|
||||
and not parsed_args.domain
|
||||
and not parsed_args.group
|
||||
and not parsed_args.project
|
||||
):
|
||||
msg = _(
|
||||
"Incorrect set of arguments provided. "
|
||||
"See openstack --help for more details"
|
||||
)
|
||||
raise exceptions.CommandError(msg)
|
||||
|
||||
domain_id = None
|
||||
if parsed_args.role_domain:
|
||||
domain_id = common.find_domain(identity_client,
|
||||
parsed_args.role_domain).id
|
||||
domain_id = common.find_domain(
|
||||
identity_client, parsed_args.role_domain
|
||||
).id
|
||||
role = utils.find_resource(
|
||||
identity_client.roles,
|
||||
parsed_args.role,
|
||||
domain_id=domain_id
|
||||
identity_client.roles, parsed_args.role, domain_id=domain_id
|
||||
)
|
||||
|
||||
kwargs = _process_identity_and_resource_options(
|
||||
parsed_args, self.app.client_manager.identity,
|
||||
validate_actor_existence=False
|
||||
parsed_args,
|
||||
self.app.client_manager.identity,
|
||||
validate_actor_existence=False,
|
||||
)
|
||||
identity_client.roles.revoke(role.id, **kwargs)
|
||||
|
||||
@@ -381,17 +412,21 @@ class SetRole(command.Command):
|
||||
|
||||
domain_id = None
|
||||
if parsed_args.domain:
|
||||
domain_id = common.find_domain(identity_client,
|
||||
parsed_args.domain).id
|
||||
domain_id = common.find_domain(
|
||||
identity_client, parsed_args.domain
|
||||
).id
|
||||
|
||||
options = common.get_immutable_options(parsed_args)
|
||||
role = utils.find_resource(identity_client.roles,
|
||||
parsed_args.role,
|
||||
domain_id=domain_id)
|
||||
role = utils.find_resource(
|
||||
identity_client.roles, parsed_args.role, domain_id=domain_id
|
||||
)
|
||||
|
||||
identity_client.roles.update(role.id, name=parsed_args.name,
|
||||
description=parsed_args.description,
|
||||
options=options)
|
||||
identity_client.roles.update(
|
||||
role.id,
|
||||
name=parsed_args.name,
|
||||
description=parsed_args.description,
|
||||
options=options,
|
||||
)
|
||||
|
||||
|
||||
class ShowRole(command.ShowOne):
|
||||
@@ -416,12 +451,13 @@ class ShowRole(command.ShowOne):
|
||||
|
||||
domain_id = None
|
||||
if parsed_args.domain:
|
||||
domain_id = common.find_domain(identity_client,
|
||||
parsed_args.domain).id
|
||||
domain_id = common.find_domain(
|
||||
identity_client, parsed_args.domain
|
||||
).id
|
||||
|
||||
role = utils.find_resource(identity_client.roles,
|
||||
parsed_args.role,
|
||||
domain_id=domain_id)
|
||||
role = utils.find_resource(
|
||||
identity_client.roles, parsed_args.role, domain_id=domain_id
|
||||
)
|
||||
|
||||
role._info.pop('links')
|
||||
return zip(*sorted(role._info.items()))
|
||||
|
||||
@@ -84,14 +84,20 @@ class ListRoleAssignment(command.Lister):
|
||||
action="store_true",
|
||||
dest='authproject',
|
||||
help='Only list assignments for the project to which the '
|
||||
'authenticated user\'s token is scoped',
|
||||
'authenticated user\'s token is scoped',
|
||||
)
|
||||
return parser
|
||||
|
||||
def _as_tuple(self, assignment):
|
||||
return (assignment.role, assignment.user, assignment.group,
|
||||
assignment.project, assignment.domain, assignment.system,
|
||||
assignment.inherited)
|
||||
return (
|
||||
assignment.role,
|
||||
assignment.user,
|
||||
assignment.group,
|
||||
assignment.project,
|
||||
assignment.domain,
|
||||
assignment.system,
|
||||
assignment.inherited,
|
||||
)
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
identity_client = self.app.client_manager.identity
|
||||
@@ -100,13 +106,14 @@ class ListRoleAssignment(command.Lister):
|
||||
role = None
|
||||
role_domain_id = None
|
||||
if parsed_args.role_domain:
|
||||
role_domain_id = common.find_domain(identity_client,
|
||||
parsed_args.role_domain).id
|
||||
role_domain_id = common.find_domain(
|
||||
identity_client, parsed_args.role_domain
|
||||
).id
|
||||
if parsed_args.role:
|
||||
role = utils.find_resource(
|
||||
identity_client.roles,
|
||||
parsed_args.role,
|
||||
domain_id=role_domain_id
|
||||
domain_id=role_domain_id,
|
||||
)
|
||||
|
||||
user = None
|
||||
@@ -118,10 +125,7 @@ class ListRoleAssignment(command.Lister):
|
||||
)
|
||||
elif parsed_args.authuser:
|
||||
if auth_ref:
|
||||
user = common.find_user(
|
||||
identity_client,
|
||||
auth_ref.user_id
|
||||
)
|
||||
user = common.find_user(identity_client, auth_ref.user_id)
|
||||
|
||||
system = None
|
||||
if parsed_args.system:
|
||||
@@ -138,15 +142,15 @@ class ListRoleAssignment(command.Lister):
|
||||
if parsed_args.project:
|
||||
project = common.find_project(
|
||||
identity_client,
|
||||
common._get_token_resource(identity_client, 'project',
|
||||
parsed_args.project),
|
||||
common._get_token_resource(
|
||||
identity_client, 'project', parsed_args.project
|
||||
),
|
||||
parsed_args.project_domain,
|
||||
)
|
||||
elif parsed_args.authproject:
|
||||
if auth_ref:
|
||||
project = common.find_project(
|
||||
identity_client,
|
||||
auth_ref.project_id
|
||||
identity_client, auth_ref.project_id
|
||||
)
|
||||
|
||||
group = None
|
||||
@@ -160,7 +164,13 @@ class ListRoleAssignment(command.Lister):
|
||||
include_names = True if parsed_args.names else False
|
||||
effective = True if parsed_args.effective else False
|
||||
columns = (
|
||||
'Role', 'User', 'Group', 'Project', 'Domain', 'System', 'Inherited'
|
||||
'Role',
|
||||
'User',
|
||||
'Group',
|
||||
'Project',
|
||||
'Domain',
|
||||
'System',
|
||||
'Inherited',
|
||||
)
|
||||
|
||||
inherited_to = 'projects' if parsed_args.inherited else None
|
||||
@@ -173,7 +183,8 @@ class ListRoleAssignment(command.Lister):
|
||||
role=role,
|
||||
effective=effective,
|
||||
os_inherit_extension_inherited_to=inherited_to,
|
||||
include_names=include_names)
|
||||
include_names=include_names,
|
||||
)
|
||||
|
||||
data_parsed = []
|
||||
for assignment in data:
|
||||
@@ -181,8 +192,12 @@ class ListRoleAssignment(command.Lister):
|
||||
scope = assignment.scope
|
||||
if 'project' in scope:
|
||||
if include_names:
|
||||
prj = '@'.join([scope['project']['name'],
|
||||
scope['project']['domain']['name']])
|
||||
prj = '@'.join(
|
||||
[
|
||||
scope['project']['name'],
|
||||
scope['project']['domain']['name'],
|
||||
]
|
||||
)
|
||||
setattr(assignment, 'project', prj)
|
||||
else:
|
||||
setattr(assignment, 'project', scope['project']['id'])
|
||||
@@ -215,16 +230,24 @@ class ListRoleAssignment(command.Lister):
|
||||
|
||||
if hasattr(assignment, 'user'):
|
||||
if include_names:
|
||||
usr = '@'.join([assignment.user['name'],
|
||||
assignment.user['domain']['name']])
|
||||
usr = '@'.join(
|
||||
[
|
||||
assignment.user['name'],
|
||||
assignment.user['domain']['name'],
|
||||
]
|
||||
)
|
||||
setattr(assignment, 'user', usr)
|
||||
else:
|
||||
setattr(assignment, 'user', assignment.user['id'])
|
||||
assignment.group = ''
|
||||
elif hasattr(assignment, 'group'):
|
||||
if include_names:
|
||||
grp = '@'.join([assignment.group['name'],
|
||||
assignment.group['domain']['name']])
|
||||
grp = '@'.join(
|
||||
[
|
||||
assignment.group['name'],
|
||||
assignment.group['domain']['name'],
|
||||
]
|
||||
)
|
||||
setattr(assignment, 'group', grp)
|
||||
else:
|
||||
setattr(assignment, 'group', assignment.group['id'])
|
||||
|
||||
@@ -101,14 +101,19 @@ class DeleteService(command.Command):
|
||||
identity_client.services.delete(service.id)
|
||||
except Exception as e:
|
||||
result += 1
|
||||
LOG.error(_("Failed to delete consumer with type, "
|
||||
"name or ID '%(service)s': %(e)s"),
|
||||
{'service': i, 'e': e})
|
||||
LOG.error(
|
||||
_(
|
||||
"Failed to delete consumer with type, "
|
||||
"name or ID '%(service)s': %(e)s"
|
||||
),
|
||||
{'service': i, 'e': e},
|
||||
)
|
||||
|
||||
if result > 0:
|
||||
total = len(parsed_args.service)
|
||||
msg = (_("%(result)s of %(total)s services failed "
|
||||
"to delete.") % {'result': result, 'total': total})
|
||||
msg = _(
|
||||
"%(result)s of %(total)s services failed " "to delete."
|
||||
) % {'result': result, 'total': total}
|
||||
raise exceptions.CommandError(msg)
|
||||
|
||||
|
||||
@@ -126,7 +131,6 @@ class ListService(command.Lister):
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
|
||||
if parsed_args.long:
|
||||
columns = ('ID', 'Name', 'Type', 'Description', 'Enabled')
|
||||
else:
|
||||
@@ -179,8 +183,7 @@ class SetService(command.Command):
|
||||
def take_action(self, parsed_args):
|
||||
identity_client = self.app.client_manager.identity
|
||||
|
||||
service = common.find_service(identity_client,
|
||||
parsed_args.service)
|
||||
service = common.find_service(identity_client, parsed_args.service)
|
||||
kwargs = {}
|
||||
if parsed_args.type:
|
||||
kwargs['type'] = parsed_args.type
|
||||
@@ -193,10 +196,7 @@ class SetService(command.Command):
|
||||
if parsed_args.disable:
|
||||
kwargs['enabled'] = False
|
||||
|
||||
identity_client.services.update(
|
||||
service.id,
|
||||
**kwargs
|
||||
)
|
||||
identity_client.services.update(service.id, **kwargs)
|
||||
|
||||
|
||||
class ShowService(command.ShowOne):
|
||||
|
||||
@@ -39,8 +39,10 @@ class CreateServiceProvider(command.ShowOne):
|
||||
'--auth-url',
|
||||
metavar='<auth-url>',
|
||||
required=True,
|
||||
help=_('Authentication URL of remote federated service provider '
|
||||
'(required)'),
|
||||
help=_(
|
||||
'Authentication URL of remote federated service provider '
|
||||
'(required)'
|
||||
),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--description',
|
||||
@@ -51,8 +53,10 @@ class CreateServiceProvider(command.ShowOne):
|
||||
'--service-provider-url',
|
||||
metavar='<sp-url>',
|
||||
required=True,
|
||||
help=_('A service URL where SAML assertions are being sent '
|
||||
'(required)'),
|
||||
help=_(
|
||||
'A service URL where SAML assertions are being sent '
|
||||
'(required)'
|
||||
),
|
||||
)
|
||||
|
||||
enable_service_provider = parser.add_mutually_exclusive_group()
|
||||
@@ -79,7 +83,8 @@ class CreateServiceProvider(command.ShowOne):
|
||||
auth_url=parsed_args.auth_url,
|
||||
description=parsed_args.description,
|
||||
enabled=parsed_args.enabled,
|
||||
sp_url=parsed_args.service_provider_url)
|
||||
sp_url=parsed_args.service_provider_url,
|
||||
)
|
||||
|
||||
sp._info.pop('links', None)
|
||||
return zip(*sorted(sp._info.items()))
|
||||
@@ -106,14 +111,20 @@ class DeleteServiceProvider(command.Command):
|
||||
service_client.federation.service_providers.delete(i)
|
||||
except Exception as e:
|
||||
result += 1
|
||||
LOG.error(_("Failed to delete service provider with "
|
||||
"name or ID '%(provider)s': %(e)s"),
|
||||
{'provider': i, 'e': e})
|
||||
LOG.error(
|
||||
_(
|
||||
"Failed to delete service provider with "
|
||||
"name or ID '%(provider)s': %(e)s"
|
||||
),
|
||||
{'provider': i, 'e': e},
|
||||
)
|
||||
|
||||
if result > 0:
|
||||
total = len(parsed_args.service_provider)
|
||||
msg = (_("%(result)s of %(total)s service providers failed"
|
||||
" to delete.") % {'result': result, 'total': total})
|
||||
msg = _(
|
||||
"%(result)s of %(total)s service providers failed"
|
||||
" to delete."
|
||||
) % {'result': result, 'total': total}
|
||||
raise exceptions.CommandError(msg)
|
||||
|
||||
|
||||
@@ -125,11 +136,17 @@ class ListServiceProvider(command.Lister):
|
||||
data = service_client.federation.service_providers.list()
|
||||
|
||||
column_headers = ('ID', 'Enabled', 'Description', 'Auth URL')
|
||||
return (column_headers,
|
||||
(utils.get_item_properties(
|
||||
s, column_headers,
|
||||
return (
|
||||
column_headers,
|
||||
(
|
||||
utils.get_item_properties(
|
||||
s,
|
||||
column_headers,
|
||||
formatters={},
|
||||
) for s in data))
|
||||
)
|
||||
for s in data
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
class SetServiceProvider(command.Command):
|
||||
@@ -145,8 +162,10 @@ class SetServiceProvider(command.Command):
|
||||
parser.add_argument(
|
||||
'--auth-url',
|
||||
metavar='<auth-url>',
|
||||
help=_('New Authentication URL of remote '
|
||||
'federated service provider'),
|
||||
help=_(
|
||||
'New Authentication URL of remote '
|
||||
'federated service provider'
|
||||
),
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
@@ -207,7 +226,8 @@ class ShowServiceProvider(command.ShowOne):
|
||||
service_provider = utils.find_resource(
|
||||
service_client.federation.service_providers,
|
||||
parsed_args.service_provider,
|
||||
id=parsed_args.service_provider)
|
||||
id=parsed_args.service_provider,
|
||||
)
|
||||
|
||||
service_provider._info.pop('links', None)
|
||||
return zip(*sorted(service_provider._info.items()))
|
||||
|
||||
@@ -16,7 +16,6 @@ from openstackclient.i18n import _
|
||||
|
||||
|
||||
class _CommaListAction(argparse.Action):
|
||||
|
||||
def __call__(self, parser, namespace, values, option_string=None):
|
||||
setattr(namespace, self.dest, values.split(','))
|
||||
|
||||
@@ -26,29 +25,41 @@ def add_tag_filtering_option_to_parser(parser, collection_name):
|
||||
'--tags',
|
||||
metavar='<tag>[,<tag>,...]',
|
||||
action=_CommaListAction,
|
||||
help=_('List %s which have all given tag(s) '
|
||||
'(Comma-separated list of tags)') % collection_name
|
||||
help=_(
|
||||
'List %s which have all given tag(s) '
|
||||
'(Comma-separated list of tags)'
|
||||
)
|
||||
% collection_name,
|
||||
)
|
||||
parser.add_argument(
|
||||
'--tags-any',
|
||||
metavar='<tag>[,<tag>,...]',
|
||||
action=_CommaListAction,
|
||||
help=_('List %s which have any given tag(s) '
|
||||
'(Comma-separated list of tags)') % collection_name
|
||||
help=_(
|
||||
'List %s which have any given tag(s) '
|
||||
'(Comma-separated list of tags)'
|
||||
)
|
||||
% collection_name,
|
||||
)
|
||||
parser.add_argument(
|
||||
'--not-tags',
|
||||
metavar='<tag>[,<tag>,...]',
|
||||
action=_CommaListAction,
|
||||
help=_('Exclude %s which have all given tag(s) '
|
||||
'(Comma-separated list of tags)') % collection_name
|
||||
help=_(
|
||||
'Exclude %s which have all given tag(s) '
|
||||
'(Comma-separated list of tags)'
|
||||
)
|
||||
% collection_name,
|
||||
)
|
||||
parser.add_argument(
|
||||
'--not-tags-any',
|
||||
metavar='<tag>[,<tag>,...]',
|
||||
action=_CommaListAction,
|
||||
help=_('Exclude %s which have any given tag(s) '
|
||||
'(Comma-separated list of tags)') % collection_name
|
||||
help=_(
|
||||
'Exclude %s which have any given tag(s) '
|
||||
'(Comma-separated list of tags)'
|
||||
)
|
||||
% collection_name,
|
||||
)
|
||||
|
||||
|
||||
@@ -71,8 +82,10 @@ def add_tag_option_to_parser_for_create(parser, resource_name):
|
||||
dest='tags',
|
||||
metavar='<tag>',
|
||||
default=[],
|
||||
help=_('Tag to be added to the %s '
|
||||
'(repeat option to set multiple tags)') % resource_name
|
||||
help=_(
|
||||
'Tag to be added to the %s ' '(repeat option to set multiple tags)'
|
||||
)
|
||||
% resource_name,
|
||||
)
|
||||
|
||||
|
||||
@@ -83,22 +96,30 @@ def add_tag_option_to_parser_for_set(parser, resource_name):
|
||||
dest='tags',
|
||||
metavar='<tag>',
|
||||
default=[],
|
||||
help=_('Tag to be added to the %s '
|
||||
'(repeat option to set multiple tags)') % resource_name
|
||||
help=_(
|
||||
'Tag to be added to the %s ' '(repeat option to set multiple tags)'
|
||||
)
|
||||
% resource_name,
|
||||
)
|
||||
parser.add_argument(
|
||||
'--clear-tags',
|
||||
action='store_true',
|
||||
help=_('Clear tags associated with the %s. Specify '
|
||||
'both --tag and --clear-tags to overwrite '
|
||||
'current tags') % resource_name
|
||||
help=_(
|
||||
'Clear tags associated with the %s. Specify '
|
||||
'both --tag and --clear-tags to overwrite '
|
||||
'current tags'
|
||||
)
|
||||
% resource_name,
|
||||
)
|
||||
parser.add_argument(
|
||||
'--remove-tag',
|
||||
metavar='<tag>',
|
||||
default=[],
|
||||
help=_('Tag to be deleted from the %s '
|
||||
'(repeat option to delete multiple tags)') % resource_name
|
||||
help=_(
|
||||
'Tag to be deleted from the %s '
|
||||
'(repeat option to delete multiple tags)'
|
||||
)
|
||||
% resource_name,
|
||||
)
|
||||
|
||||
|
||||
@@ -112,5 +133,4 @@ def update_tags_in_args(parsed_args, obj, args):
|
||||
args['tags'] = list(set(obj.tags))
|
||||
return
|
||||
if parsed_args.tags:
|
||||
args['tags'] = list(set(obj.tags).union(
|
||||
set(parsed_args.tags)))
|
||||
args['tags'] = list(set(obj.tags).union(set(parsed_args.tags)))
|
||||
|
||||
@@ -40,8 +40,10 @@ class AuthorizeRequestToken(command.ShowOne):
|
||||
action='append',
|
||||
default=[],
|
||||
required=True,
|
||||
help=_('Roles to authorize (name or ID) '
|
||||
'(repeat option to set multiple values) (required)'),
|
||||
help=_(
|
||||
'Roles to authorize (name or ID) '
|
||||
'(repeat option to set multiple values) (required)'
|
||||
),
|
||||
)
|
||||
return parser
|
||||
|
||||
@@ -58,8 +60,8 @@ class AuthorizeRequestToken(command.ShowOne):
|
||||
roles.append(role_id)
|
||||
|
||||
verifier_pin = identity_client.oauth1.request_tokens.authorize(
|
||||
parsed_args.request_key,
|
||||
roles)
|
||||
parsed_args.request_key, roles
|
||||
)
|
||||
|
||||
return zip(*sorted(verifier_pin._info.items()))
|
||||
|
||||
@@ -73,40 +75,43 @@ class CreateAccessToken(command.ShowOne):
|
||||
'--consumer-key',
|
||||
metavar='<consumer-key>',
|
||||
help=_('Consumer key (required)'),
|
||||
required=True
|
||||
required=True,
|
||||
)
|
||||
parser.add_argument(
|
||||
'--consumer-secret',
|
||||
metavar='<consumer-secret>',
|
||||
help=_('Consumer secret (required)'),
|
||||
required=True
|
||||
required=True,
|
||||
)
|
||||
parser.add_argument(
|
||||
'--request-key',
|
||||
metavar='<request-key>',
|
||||
help=_('Request token to exchange for access token (required)'),
|
||||
required=True
|
||||
required=True,
|
||||
)
|
||||
parser.add_argument(
|
||||
'--request-secret',
|
||||
metavar='<request-secret>',
|
||||
help=_('Secret associated with <request-key> (required)'),
|
||||
required=True
|
||||
required=True,
|
||||
)
|
||||
parser.add_argument(
|
||||
'--verifier',
|
||||
metavar='<verifier>',
|
||||
help=_('Verifier associated with <request-key> (required)'),
|
||||
required=True
|
||||
required=True,
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
token_client = self.app.client_manager.identity.oauth1.access_tokens
|
||||
access_token = token_client.create(
|
||||
parsed_args.consumer_key, parsed_args.consumer_secret,
|
||||
parsed_args.request_key, parsed_args.request_secret,
|
||||
parsed_args.verifier)
|
||||
parsed_args.consumer_key,
|
||||
parsed_args.consumer_secret,
|
||||
parsed_args.request_key,
|
||||
parsed_args.request_secret,
|
||||
parsed_args.verifier,
|
||||
)
|
||||
return zip(*sorted(access_token._info.items()))
|
||||
|
||||
|
||||
@@ -119,20 +124,22 @@ class CreateRequestToken(command.ShowOne):
|
||||
'--consumer-key',
|
||||
metavar='<consumer-key>',
|
||||
help=_('Consumer key (required)'),
|
||||
required=True
|
||||
required=True,
|
||||
)
|
||||
parser.add_argument(
|
||||
'--consumer-secret',
|
||||
metavar='<consumer-secret>',
|
||||
help=_('Consumer secret (required)'),
|
||||
required=True
|
||||
required=True,
|
||||
)
|
||||
parser.add_argument(
|
||||
'--project',
|
||||
metavar='<project>',
|
||||
help=_('Project that consumer wants to access (name or ID)'
|
||||
' (required)'),
|
||||
required=True
|
||||
help=_(
|
||||
'Project that consumer wants to access (name or ID)'
|
||||
' (required)'
|
||||
),
|
||||
required=True,
|
||||
)
|
||||
parser.add_argument(
|
||||
'--domain',
|
||||
@@ -146,19 +153,21 @@ class CreateRequestToken(command.ShowOne):
|
||||
|
||||
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)
|
||||
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)
|
||||
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,
|
||||
project.id)
|
||||
parsed_args.consumer_key, parsed_args.consumer_secret, project.id
|
||||
)
|
||||
return zip(*sorted(request_token._info.items()))
|
||||
|
||||
|
||||
@@ -176,7 +185,8 @@ class IssueToken(command.ShowOne):
|
||||
auth_ref = self.app.client_manager.auth_ref
|
||||
if not auth_ref:
|
||||
raise exceptions.AuthorizationFailure(
|
||||
_("Only an authorized user may issue a new token."))
|
||||
_("Only an authorized user may issue a new token.")
|
||||
)
|
||||
|
||||
data = {}
|
||||
if auth_ref.auth_token:
|
||||
|
||||
@@ -54,23 +54,29 @@ class CreateTrust(command.ShowOne):
|
||||
metavar='<role>',
|
||||
action='append',
|
||||
default=[],
|
||||
help=_('Roles to authorize (name or ID) '
|
||||
'(repeat option to set multiple values, required)'),
|
||||
required=True
|
||||
help=_(
|
||||
'Roles to authorize (name or ID) '
|
||||
'(repeat option to set multiple values, required)'
|
||||
),
|
||||
required=True,
|
||||
)
|
||||
parser.add_argument(
|
||||
'--impersonate',
|
||||
dest='impersonate',
|
||||
action='store_true',
|
||||
default=False,
|
||||
help=_('Tokens generated from the trust will represent <trustor>'
|
||||
' (defaults to False)'),
|
||||
help=_(
|
||||
'Tokens generated from the trust will represent <trustor>'
|
||||
' (defaults to False)'
|
||||
),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--expiration',
|
||||
metavar='<expiration>',
|
||||
help=_('Sets an expiration date for the trust'
|
||||
' (format of YYYY-mm-ddTHH:MM:SS)'),
|
||||
help=_(
|
||||
'Sets an expiration date for the trust'
|
||||
' (format of YYYY-mm-ddTHH:MM:SS)'
|
||||
),
|
||||
)
|
||||
common.add_project_domain_option_to_parser(parser)
|
||||
parser.add_argument(
|
||||
@@ -93,15 +99,15 @@ class CreateTrust(command.ShowOne):
|
||||
# trustee, project and role are optional, but that makes the trust
|
||||
# pointless, and trusts are immutable, so let's enforce it at the
|
||||
# client level.
|
||||
trustor_id = common.find_user(identity_client,
|
||||
parsed_args.trustor,
|
||||
parsed_args.trustor_domain).id
|
||||
trustee_id = common.find_user(identity_client,
|
||||
parsed_args.trustee,
|
||||
parsed_args.trustee_domain).id
|
||||
project_id = common.find_project(identity_client,
|
||||
parsed_args.project,
|
||||
parsed_args.project_domain).id
|
||||
trustor_id = common.find_user(
|
||||
identity_client, parsed_args.trustor, parsed_args.trustor_domain
|
||||
).id
|
||||
trustee_id = common.find_user(
|
||||
identity_client, parsed_args.trustee, parsed_args.trustee_domain
|
||||
).id
|
||||
project_id = common.find_project(
|
||||
identity_client, parsed_args.project, parsed_args.project_domain
|
||||
).id
|
||||
|
||||
role_ids = []
|
||||
for role in parsed_args.role:
|
||||
@@ -116,11 +122,13 @@ class CreateTrust(command.ShowOne):
|
||||
|
||||
expires_at = None
|
||||
if parsed_args.expiration:
|
||||
expires_at = datetime.datetime.strptime(parsed_args.expiration,
|
||||
'%Y-%m-%dT%H:%M:%S')
|
||||
expires_at = datetime.datetime.strptime(
|
||||
parsed_args.expiration, '%Y-%m-%dT%H:%M:%S'
|
||||
)
|
||||
|
||||
trust = identity_client.trusts.create(
|
||||
trustee_id, trustor_id,
|
||||
trustee_id,
|
||||
trustor_id,
|
||||
impersonation=parsed_args.impersonate,
|
||||
project=project_id,
|
||||
role_ids=role_ids,
|
||||
@@ -157,19 +165,24 @@ class DeleteTrust(command.Command):
|
||||
errors = 0
|
||||
for trust in parsed_args.trust:
|
||||
try:
|
||||
trust_obj = utils.find_resource(identity_client.trusts,
|
||||
trust)
|
||||
trust_obj = utils.find_resource(identity_client.trusts, trust)
|
||||
identity_client.trusts.delete(trust_obj.id)
|
||||
except Exception as e:
|
||||
errors += 1
|
||||
LOG.error(_("Failed to delete trust with "
|
||||
"name or ID '%(trust)s': %(e)s"),
|
||||
{'trust': trust, 'e': e})
|
||||
LOG.error(
|
||||
_(
|
||||
"Failed to delete trust with "
|
||||
"name or ID '%(trust)s': %(e)s"
|
||||
),
|
||||
{'trust': trust, 'e': e},
|
||||
)
|
||||
|
||||
if errors > 0:
|
||||
total = len(parsed_args.trust)
|
||||
msg = (_("%(errors)s of %(total)s trusts failed "
|
||||
"to delete.") % {'errors': errors, 'total': total})
|
||||
msg = _("%(errors)s of %(total)s trusts failed " "to delete.") % {
|
||||
'errors': errors,
|
||||
'total': total,
|
||||
}
|
||||
raise exceptions.CommandError(msg)
|
||||
|
||||
|
||||
@@ -210,12 +223,14 @@ class ListTrust(command.Lister):
|
||||
identity_client = self.app.client_manager.identity
|
||||
auth_ref = self.app.client_manager.auth_ref
|
||||
|
||||
if parsed_args.authuser and any([
|
||||
parsed_args.trustor,
|
||||
parsed_args.trustor_domain,
|
||||
parsed_args.trustee,
|
||||
parsed_args.trustee_domain,
|
||||
]):
|
||||
if parsed_args.authuser and any(
|
||||
[
|
||||
parsed_args.trustor,
|
||||
parsed_args.trustor_domain,
|
||||
parsed_args.trustee,
|
||||
parsed_args.trustee_domain,
|
||||
]
|
||||
):
|
||||
msg = _("--authuser cannot be used with --trustee or --trustor")
|
||||
raise exceptions.CommandError(msg)
|
||||
|
||||
@@ -229,10 +244,7 @@ class ListTrust(command.Lister):
|
||||
|
||||
if parsed_args.authuser:
|
||||
if auth_ref:
|
||||
user = common.find_user(
|
||||
identity_client,
|
||||
auth_ref.user_id
|
||||
)
|
||||
user = common.find_user(identity_client, auth_ref.user_id)
|
||||
# We need two calls here as we want trusts with
|
||||
# either the trustor or the trustee set to current user
|
||||
# using a single call would give us trusts with both
|
||||
@@ -262,14 +274,26 @@ class ListTrust(command.Lister):
|
||||
trustee_user=trustee,
|
||||
)
|
||||
|
||||
columns = ('ID', 'Expires At', 'Impersonation', 'Project ID',
|
||||
'Trustee User ID', 'Trustor User ID')
|
||||
columns = (
|
||||
'ID',
|
||||
'Expires At',
|
||||
'Impersonation',
|
||||
'Project ID',
|
||||
'Trustee User ID',
|
||||
'Trustor User ID',
|
||||
)
|
||||
|
||||
return (columns,
|
||||
(utils.get_item_properties(
|
||||
s, columns,
|
||||
return (
|
||||
columns,
|
||||
(
|
||||
utils.get_item_properties(
|
||||
s,
|
||||
columns,
|
||||
formatters={},
|
||||
) for s in data))
|
||||
)
|
||||
for s in data
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
class ShowTrust(command.ShowOne):
|
||||
@@ -286,8 +310,7 @@ class ShowTrust(command.ShowOne):
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
identity_client = self.app.client_manager.identity
|
||||
trust = utils.find_resource(identity_client.trusts,
|
||||
parsed_args.trust)
|
||||
trust = utils.find_resource(identity_client.trusts, parsed_args.trust)
|
||||
|
||||
trust._info.pop('roles_links', None)
|
||||
trust._info.pop('links', None)
|
||||
|
||||
@@ -30,11 +30,17 @@ class ListAccessibleDomains(command.Lister):
|
||||
columns = ('ID', 'Enabled', 'Name', 'Description')
|
||||
identity_client = self.app.client_manager.identity
|
||||
data = identity_client.federation.domains.list()
|
||||
return (columns,
|
||||
(utils.get_item_properties(
|
||||
s, columns,
|
||||
return (
|
||||
columns,
|
||||
(
|
||||
utils.get_item_properties(
|
||||
s,
|
||||
columns,
|
||||
formatters={},
|
||||
) for s in data))
|
||||
)
|
||||
for s in data
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
class ListAccessibleProjects(command.Lister):
|
||||
@@ -44,8 +50,14 @@ class ListAccessibleProjects(command.Lister):
|
||||
columns = ('ID', 'Domain ID', 'Enabled', 'Name')
|
||||
identity_client = self.app.client_manager.identity
|
||||
data = identity_client.federation.projects.list()
|
||||
return (columns,
|
||||
(utils.get_item_properties(
|
||||
s, columns,
|
||||
return (
|
||||
columns,
|
||||
(
|
||||
utils.get_item_properties(
|
||||
s,
|
||||
columns,
|
||||
formatters={},
|
||||
) for s in data))
|
||||
)
|
||||
for s in data
|
||||
),
|
||||
)
|
||||
|
||||
@@ -53,8 +53,9 @@ def _get_options_for_user(identity_client, parsed_args):
|
||||
if parsed_args.disable_multi_factor_auth:
|
||||
options['multi_factor_auth_enabled'] = False
|
||||
if parsed_args.multi_factor_auth_rule:
|
||||
auth_rules = [rule.split(",") for rule in
|
||||
parsed_args.multi_factor_auth_rule]
|
||||
auth_rules = [
|
||||
rule.split(",") for rule in parsed_args.multi_factor_auth_rule
|
||||
]
|
||||
if auth_rules:
|
||||
options['multi_factor_auth_rules'] = auth_rules
|
||||
return options
|
||||
@@ -66,54 +67,70 @@ def _add_user_options(parser):
|
||||
parser.add_argument(
|
||||
'--ignore-lockout-failure-attempts',
|
||||
action="store_true",
|
||||
help=_('Opt into ignoring the number of times a user has '
|
||||
'authenticated and locking out the user as a result'),
|
||||
help=_(
|
||||
'Opt into ignoring the number of times a user has '
|
||||
'authenticated and locking out the user as a result'
|
||||
),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--no-ignore-lockout-failure-attempts',
|
||||
action="store_true",
|
||||
help=_('Opt out of ignoring the number of times a user has '
|
||||
'authenticated and locking out the user as a result'),
|
||||
help=_(
|
||||
'Opt out of ignoring the number of times a user has '
|
||||
'authenticated and locking out the user as a result'
|
||||
),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--ignore-password-expiry',
|
||||
action="store_true",
|
||||
help=_('Opt into allowing user to continue using passwords that '
|
||||
'may be expired'),
|
||||
help=_(
|
||||
'Opt into allowing user to continue using passwords that '
|
||||
'may be expired'
|
||||
),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--no-ignore-password-expiry',
|
||||
action="store_true",
|
||||
help=_('Opt out of allowing user to continue using passwords '
|
||||
'that may be expired'),
|
||||
help=_(
|
||||
'Opt out of allowing user to continue using passwords '
|
||||
'that may be expired'
|
||||
),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--ignore-change-password-upon-first-use',
|
||||
action="store_true",
|
||||
help=_('Control if a user should be forced to change their password '
|
||||
'immediately after they log into keystone for the first time. '
|
||||
'Opt into ignoring the user to change their password during '
|
||||
'first time login in keystone'),
|
||||
help=_(
|
||||
'Control if a user should be forced to change their password '
|
||||
'immediately after they log into keystone for the first time. '
|
||||
'Opt into ignoring the user to change their password during '
|
||||
'first time login in keystone'
|
||||
),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--no-ignore-change-password-upon-first-use',
|
||||
action="store_true",
|
||||
help=_('Control if a user should be forced to change their password '
|
||||
'immediately after they log into keystone for the first time. '
|
||||
'Opt out of ignoring the user to change their password during '
|
||||
'first time login in keystone'),
|
||||
help=_(
|
||||
'Control if a user should be forced to change their password '
|
||||
'immediately after they log into keystone for the first time. '
|
||||
'Opt out of ignoring the user to change their password during '
|
||||
'first time login in keystone'
|
||||
),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--enable-lock-password',
|
||||
action="store_true",
|
||||
help=_('Disables the ability for a user to change its password '
|
||||
'through self-service APIs'),
|
||||
help=_(
|
||||
'Disables the ability for a user to change its password '
|
||||
'through self-service APIs'
|
||||
),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--disable-lock-password',
|
||||
action="store_true",
|
||||
help=_('Enables the ability for a user to change its password '
|
||||
'through self-service APIs'),
|
||||
help=_(
|
||||
'Enables the ability for a user to change its password '
|
||||
'through self-service APIs'
|
||||
),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--enable-multi-factor-auth',
|
||||
@@ -130,11 +147,13 @@ def _add_user_options(parser):
|
||||
metavar='<rule>',
|
||||
action="append",
|
||||
default=[],
|
||||
help=_('Set multi-factor auth rules. For example, to set a rule '
|
||||
'requiring the "password" and "totp" auth methods to be '
|
||||
'provided, use: "--multi-factor-auth-rule password,totp". '
|
||||
'May be provided multiple times to set different rule '
|
||||
'combinations.')
|
||||
help=_(
|
||||
'Set multi-factor auth rules. For example, to set a rule '
|
||||
'requiring the "password" and "totp" auth methods to be '
|
||||
'provided, use: "--multi-factor-auth-rule password,totp". '
|
||||
'May be provided multiple times to set different rule '
|
||||
'combinations.'
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
@@ -205,14 +224,17 @@ class CreateUser(command.ShowOne):
|
||||
|
||||
project_id = None
|
||||
if parsed_args.project:
|
||||
project_id = common.find_project(identity_client,
|
||||
parsed_args.project,
|
||||
parsed_args.project_domain).id
|
||||
project_id = common.find_project(
|
||||
identity_client,
|
||||
parsed_args.project,
|
||||
parsed_args.project_domain,
|
||||
).id
|
||||
|
||||
domain_id = None
|
||||
if parsed_args.domain:
|
||||
domain_id = common.find_domain(identity_client,
|
||||
parsed_args.domain).id
|
||||
domain_id = common.find_domain(
|
||||
identity_client, parsed_args.domain
|
||||
).id
|
||||
|
||||
enabled = True
|
||||
if parsed_args.disable:
|
||||
@@ -221,8 +243,12 @@ class CreateUser(command.ShowOne):
|
||||
parsed_args.password = utils.get_password(self.app.stdin)
|
||||
|
||||
if not parsed_args.password:
|
||||
LOG.warning(_("No password was supplied, authentication will fail "
|
||||
"when a user does not have a password."))
|
||||
LOG.warning(
|
||||
_(
|
||||
"No password was supplied, authentication will fail "
|
||||
"when a user does not have a password."
|
||||
)
|
||||
)
|
||||
options = _get_options_for_user(identity_client, parsed_args)
|
||||
|
||||
try:
|
||||
@@ -238,9 +264,11 @@ class CreateUser(command.ShowOne):
|
||||
)
|
||||
except ks_exc.Conflict:
|
||||
if parsed_args.or_show:
|
||||
user = utils.find_resource(identity_client.users,
|
||||
parsed_args.name,
|
||||
domain_id=domain_id)
|
||||
user = utils.find_resource(
|
||||
identity_client.users,
|
||||
parsed_args.name,
|
||||
domain_id=domain_id,
|
||||
)
|
||||
LOG.info(_('Returning existing user %s'), user.name)
|
||||
else:
|
||||
raise
|
||||
@@ -277,23 +305,28 @@ class DeleteUser(command.Command):
|
||||
for user in parsed_args.users:
|
||||
try:
|
||||
if domain is not None:
|
||||
user_obj = utils.find_resource(identity_client.users,
|
||||
user,
|
||||
domain_id=domain.id)
|
||||
user_obj = utils.find_resource(
|
||||
identity_client.users, user, domain_id=domain.id
|
||||
)
|
||||
else:
|
||||
user_obj = utils.find_resource(identity_client.users,
|
||||
user)
|
||||
user_obj = utils.find_resource(identity_client.users, user)
|
||||
identity_client.users.delete(user_obj.id)
|
||||
except Exception as e:
|
||||
errors += 1
|
||||
LOG.error(_("Failed to delete user with "
|
||||
"name or ID '%(user)s': %(e)s"),
|
||||
{'user': user, 'e': e})
|
||||
LOG.error(
|
||||
_(
|
||||
"Failed to delete user with "
|
||||
"name or ID '%(user)s': %(e)s"
|
||||
),
|
||||
{'user': user, 'e': e},
|
||||
)
|
||||
|
||||
if errors > 0:
|
||||
total = len(parsed_args.users)
|
||||
msg = (_("%(errors)s of %(total)s users failed "
|
||||
"to delete.") % {'errors': errors, 'total': total})
|
||||
msg = _("%(errors)s of %(total)s users failed " "to delete.") % {
|
||||
'errors': errors,
|
||||
'total': total,
|
||||
}
|
||||
raise exceptions.CommandError(msg)
|
||||
|
||||
|
||||
@@ -331,21 +364,20 @@ class ListUser(command.Lister):
|
||||
|
||||
domain = None
|
||||
if parsed_args.domain:
|
||||
domain = common.find_domain(identity_client,
|
||||
parsed_args.domain).id
|
||||
domain = common.find_domain(identity_client, parsed_args.domain).id
|
||||
|
||||
group = None
|
||||
if parsed_args.group:
|
||||
group = common.find_group(identity_client,
|
||||
parsed_args.group,
|
||||
parsed_args.domain).id
|
||||
group = common.find_group(
|
||||
identity_client, parsed_args.group, parsed_args.domain
|
||||
).id
|
||||
|
||||
if parsed_args.project:
|
||||
if domain is not None:
|
||||
project = utils.find_resource(
|
||||
identity_client.projects,
|
||||
parsed_args.project,
|
||||
domain_id=domain
|
||||
domain_id=domain,
|
||||
).id
|
||||
else:
|
||||
project = utils.find_resource(
|
||||
@@ -354,7 +386,8 @@ class ListUser(command.Lister):
|
||||
).id
|
||||
|
||||
assignments = identity_client.role_assignments.list(
|
||||
project=project)
|
||||
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
|
||||
@@ -379,8 +412,15 @@ class ListUser(command.Lister):
|
||||
|
||||
# Column handling
|
||||
if parsed_args.long:
|
||||
columns = ['ID', 'Name', 'Default Project Id', 'Domain Id',
|
||||
'Description', 'Email', 'Enabled']
|
||||
columns = [
|
||||
'ID',
|
||||
'Name',
|
||||
'Default Project Id',
|
||||
'Domain Id',
|
||||
'Description',
|
||||
'Email',
|
||||
'Enabled',
|
||||
]
|
||||
column_headers = copy.deepcopy(columns)
|
||||
column_headers[2] = 'Project'
|
||||
column_headers[3] = 'Domain'
|
||||
@@ -390,10 +430,14 @@ class ListUser(command.Lister):
|
||||
|
||||
return (
|
||||
column_headers,
|
||||
(utils.get_item_properties(
|
||||
s, columns,
|
||||
formatters={},
|
||||
) for s in data)
|
||||
(
|
||||
utils.get_item_properties(
|
||||
s,
|
||||
columns,
|
||||
formatters={},
|
||||
)
|
||||
for s in data
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
@@ -415,8 +459,10 @@ class SetUser(command.Command):
|
||||
parser.add_argument(
|
||||
'--domain',
|
||||
metavar='<domain>',
|
||||
help=_('Domain the user belongs to (name or ID). This can be '
|
||||
'used in case collisions between user names exist.'),
|
||||
help=_(
|
||||
'Domain the user belongs to (name or ID). This can be '
|
||||
'used in case collisions between user names exist.'
|
||||
),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--project',
|
||||
@@ -467,17 +513,21 @@ class SetUser(command.Command):
|
||||
parsed_args.password = utils.get_password(self.app.stdin)
|
||||
|
||||
if '' == parsed_args.password:
|
||||
LOG.warning(_("No password was supplied, authentication will fail "
|
||||
"when a user does not have a password."))
|
||||
LOG.warning(
|
||||
_(
|
||||
"No password was supplied, authentication will fail "
|
||||
"when a user does not have a password."
|
||||
)
|
||||
)
|
||||
|
||||
user_str = common._get_token_resource(identity_client, 'user',
|
||||
parsed_args.user,
|
||||
parsed_args.domain)
|
||||
user_str = common._get_token_resource(
|
||||
identity_client, 'user', parsed_args.user, parsed_args.domain
|
||||
)
|
||||
if parsed_args.domain:
|
||||
domain = common.find_domain(identity_client, parsed_args.domain)
|
||||
user = utils.find_resource(identity_client.users,
|
||||
user_str,
|
||||
domain_id=domain.id)
|
||||
user = utils.find_resource(
|
||||
identity_client.users, user_str, domain_id=domain.id
|
||||
)
|
||||
else:
|
||||
user = utils.find_resource(
|
||||
identity_client.users,
|
||||
@@ -494,9 +544,11 @@ class SetUser(command.Command):
|
||||
if parsed_args.description:
|
||||
kwargs['description'] = parsed_args.description
|
||||
if parsed_args.project:
|
||||
project_id = common.find_project(identity_client,
|
||||
parsed_args.project,
|
||||
parsed_args.project_domain).id
|
||||
project_id = common.find_project(
|
||||
identity_client,
|
||||
parsed_args.project,
|
||||
parsed_args.project_domain,
|
||||
).id
|
||||
kwargs['default_project'] = project_id
|
||||
kwargs['enabled'] = user.enabled
|
||||
if parsed_args.enable:
|
||||
@@ -556,16 +608,22 @@ class SetPasswordUser(command.Command):
|
||||
current_password = parsed_args.original_password
|
||||
if current_password is None:
|
||||
current_password = utils.get_password(
|
||||
self.app.stdin, prompt="Current Password:", confirm=False)
|
||||
self.app.stdin, prompt="Current Password:", confirm=False
|
||||
)
|
||||
|
||||
password = parsed_args.password
|
||||
if password is None:
|
||||
password = utils.get_password(
|
||||
self.app.stdin, prompt="New Password:")
|
||||
self.app.stdin, prompt="New Password:"
|
||||
)
|
||||
|
||||
if '' == password:
|
||||
LOG.warning(_("No password was supplied, authentication will fail "
|
||||
"when a user does not have a password."))
|
||||
LOG.warning(
|
||||
_(
|
||||
"No password was supplied, authentication will fail "
|
||||
"when a user does not have a password."
|
||||
)
|
||||
)
|
||||
|
||||
identity_client.users.update_password(current_password, password)
|
||||
|
||||
@@ -590,17 +648,16 @@ class ShowUser(command.ShowOne):
|
||||
def take_action(self, parsed_args):
|
||||
identity_client = self.app.client_manager.identity
|
||||
|
||||
user_str = common._get_token_resource(identity_client, 'user',
|
||||
parsed_args.user,
|
||||
parsed_args.domain)
|
||||
user_str = common._get_token_resource(
|
||||
identity_client, 'user', parsed_args.user, parsed_args.domain
|
||||
)
|
||||
if parsed_args.domain:
|
||||
domain = common.find_domain(identity_client, parsed_args.domain)
|
||||
user = utils.find_resource(identity_client.users,
|
||||
user_str,
|
||||
domain_id=domain.id)
|
||||
user = utils.find_resource(
|
||||
identity_client.users, user_str, domain_id=domain.id
|
||||
)
|
||||
else:
|
||||
user = utils.find_resource(identity_client.users,
|
||||
user_str)
|
||||
user = utils.find_resource(identity_client.users, user_str)
|
||||
|
||||
user._info.pop('links')
|
||||
return zip(*sorted(user._info.items()))
|
||||
|
||||
@@ -23,21 +23,37 @@ BASIC_LIST_HEADERS = ['ID', 'Name']
|
||||
|
||||
|
||||
class IdentityTests(base.TestCase):
|
||||
"""Functional tests for Identity commands. """
|
||||
"""Functional tests for Identity commands."""
|
||||
|
||||
USER_FIELDS = ['email', 'enabled', 'id', 'name', 'project_id', 'username']
|
||||
PROJECT_FIELDS = ['enabled', 'id', 'name', 'description']
|
||||
TOKEN_FIELDS = ['expires', 'id', 'project_id', 'user_id']
|
||||
ROLE_FIELDS = ['id', 'name', 'domain_id']
|
||||
SERVICE_FIELDS = ['id', 'enabled', 'name', 'type', 'description']
|
||||
ENDPOINT_FIELDS = ['id', 'region', 'service_id', 'service_name',
|
||||
'service_type', 'publicurl',
|
||||
'adminurl', 'internalurl']
|
||||
ENDPOINT_FIELDS = [
|
||||
'id',
|
||||
'region',
|
||||
'service_id',
|
||||
'service_name',
|
||||
'service_type',
|
||||
'publicurl',
|
||||
'adminurl',
|
||||
'internalurl',
|
||||
]
|
||||
|
||||
EC2_CREDENTIALS_FIELDS = ['access', 'project_id', 'secret',
|
||||
'trust_id', 'user_id']
|
||||
EC2_CREDENTIALS_LIST_HEADERS = ['Access', 'Secret',
|
||||
'Project ID', 'User ID']
|
||||
EC2_CREDENTIALS_FIELDS = [
|
||||
'access',
|
||||
'project_id',
|
||||
'secret',
|
||||
'trust_id',
|
||||
'user_id',
|
||||
]
|
||||
EC2_CREDENTIALS_LIST_HEADERS = [
|
||||
'Access',
|
||||
'Secret',
|
||||
'Project ID',
|
||||
'User ID',
|
||||
]
|
||||
CATALOG_LIST_HEADERS = ['Name', 'Type', 'Endpoints']
|
||||
ENDPOINT_LIST_HEADERS = ['ID', 'Region', 'Service Name', 'Service Type']
|
||||
|
||||
@@ -53,7 +69,8 @@ class IdentityTests(base.TestCase):
|
||||
'project create '
|
||||
'--description %(description)s '
|
||||
'--enable '
|
||||
'%(name)s' % {
|
||||
'%(name)s'
|
||||
% {
|
||||
'description': cls.project_description,
|
||||
'name': cls.project_name,
|
||||
}
|
||||
@@ -70,7 +87,8 @@ class IdentityTests(base.TestCase):
|
||||
try:
|
||||
cls.openstack(
|
||||
'--os-identity-api-version 2 '
|
||||
'project delete %s' % cls.project_name)
|
||||
'project delete %s' % cls.project_name
|
||||
)
|
||||
finally:
|
||||
super(IdentityTests, cls).tearDownClass()
|
||||
|
||||
@@ -78,7 +96,8 @@ class IdentityTests(base.TestCase):
|
||||
super(IdentityTests, self).setUp()
|
||||
# prepare v2 env
|
||||
ver_fixture = fixtures.EnvironmentVariable(
|
||||
'OS_IDENTITY_API_VERSION', '2.0')
|
||||
'OS_IDENTITY_API_VERSION', '2.0'
|
||||
)
|
||||
self.useFixture(ver_fixture)
|
||||
auth_url = os.environ.get('OS_AUTH_URL')
|
||||
if auth_url:
|
||||
@@ -93,13 +112,14 @@ class IdentityTests(base.TestCase):
|
||||
raw_output = self.openstack(
|
||||
'project create '
|
||||
'--description %(description)s '
|
||||
'--enable %(name)s' % {'description': project_description,
|
||||
'name': project_name})
|
||||
'--enable %(name)s'
|
||||
% {'description': project_description, 'name': project_name}
|
||||
)
|
||||
project = self.parse_show_as_object(raw_output)
|
||||
if add_clean_up:
|
||||
self.addCleanup(
|
||||
self.openstack,
|
||||
'project delete %s' % project['id'])
|
||||
self.openstack, 'project delete %s' % project['id']
|
||||
)
|
||||
items = self.parse_show(raw_output)
|
||||
self.assert_show_fields(items, self.PROJECT_FIELDS)
|
||||
return project_name
|
||||
@@ -114,14 +134,19 @@ class IdentityTests(base.TestCase):
|
||||
'--password %(password)s '
|
||||
'--email %(email)s '
|
||||
'--enable '
|
||||
'%(name)s' % {'project': self.project_name,
|
||||
'email': email,
|
||||
'password': password,
|
||||
'name': username})
|
||||
'%(name)s'
|
||||
% {
|
||||
'project': self.project_name,
|
||||
'email': email,
|
||||
'password': password,
|
||||
'name': username,
|
||||
}
|
||||
)
|
||||
if add_clean_up:
|
||||
self.addCleanup(
|
||||
self.openstack,
|
||||
'user delete %s' % self.parse_show_as_object(raw_output)['id'])
|
||||
'user delete %s' % self.parse_show_as_object(raw_output)['id'],
|
||||
)
|
||||
items = self.parse_show(raw_output)
|
||||
self.assert_show_fields(items, self.USER_FIELDS)
|
||||
return username
|
||||
@@ -131,9 +156,7 @@ class IdentityTests(base.TestCase):
|
||||
raw_output = self.openstack('role create %s' % role_name)
|
||||
role = self.parse_show_as_object(raw_output)
|
||||
if add_clean_up:
|
||||
self.addCleanup(
|
||||
self.openstack,
|
||||
'role delete %s' % role['id'])
|
||||
self.addCleanup(self.openstack, 'role delete %s' % role['id'])
|
||||
items = self.parse_show(raw_output)
|
||||
self.assert_show_fields(items, self.ROLE_FIELDS)
|
||||
self.assertEqual(role_name, role['name'])
|
||||
@@ -145,8 +168,8 @@ class IdentityTests(base.TestCase):
|
||||
access_key = ec2_credentials['access']
|
||||
if add_clean_up:
|
||||
self.addCleanup(
|
||||
self.openstack,
|
||||
'ec2 credentials delete %s' % access_key)
|
||||
self.openstack, 'ec2 credentials delete %s' % access_key
|
||||
)
|
||||
items = self.parse_show(raw_output)
|
||||
self.assert_show_fields(items, self.EC2_CREDENTIALS_FIELDS)
|
||||
return access_key
|
||||
@@ -155,8 +178,7 @@ class IdentityTests(base.TestCase):
|
||||
raw_output = self.openstack('token issue')
|
||||
token = self.parse_show_as_object(raw_output)
|
||||
if add_clean_up:
|
||||
self.addCleanup(self.openstack,
|
||||
'token revoke %s' % token['id'])
|
||||
self.addCleanup(self.openstack, 'token revoke %s' % token['id'])
|
||||
items = self.parse_show(raw_output)
|
||||
self.assert_show_fields(items, self.TOKEN_FIELDS)
|
||||
return token['id']
|
||||
@@ -169,13 +191,18 @@ class IdentityTests(base.TestCase):
|
||||
'service create '
|
||||
'--name %(name)s '
|
||||
'--description %(description)s '
|
||||
'%(type)s' % {'name': service_name,
|
||||
'description': description,
|
||||
'type': type_name})
|
||||
'%(type)s'
|
||||
% {
|
||||
'name': service_name,
|
||||
'description': description,
|
||||
'type': type_name,
|
||||
}
|
||||
)
|
||||
if add_clean_up:
|
||||
service = self.parse_show_as_object(raw_output)
|
||||
self.addCleanup(self.openstack,
|
||||
'service delete %s' % service['id'])
|
||||
self.addCleanup(
|
||||
self.openstack, 'service delete %s' % service['id']
|
||||
)
|
||||
items = self.parse_show(raw_output)
|
||||
self.assert_show_fields(items, self.SERVICE_FIELDS)
|
||||
return service_name
|
||||
@@ -192,16 +219,20 @@ class IdentityTests(base.TestCase):
|
||||
'--adminurl %(adminurl)s '
|
||||
'--internalurl %(internalurl)s '
|
||||
'--region %(region)s '
|
||||
'%(service)s' % {'publicurl': public_url,
|
||||
'adminurl': admin_url,
|
||||
'internalurl': internal_url,
|
||||
'region': region_id,
|
||||
'service': service_name})
|
||||
'%(service)s'
|
||||
% {
|
||||
'publicurl': public_url,
|
||||
'adminurl': admin_url,
|
||||
'internalurl': internal_url,
|
||||
'region': region_id,
|
||||
'service': service_name,
|
||||
}
|
||||
)
|
||||
endpoint = self.parse_show_as_object(raw_output)
|
||||
if add_clean_up:
|
||||
self.addCleanup(
|
||||
self.openstack,
|
||||
'endpoint delete %s' % endpoint['id'])
|
||||
self.openstack, 'endpoint delete %s' % endpoint['id']
|
||||
)
|
||||
items = self.parse_show(raw_output)
|
||||
self.assert_show_fields(items, self.ENDPOINT_FIELDS)
|
||||
return endpoint['id']
|
||||
|
||||
@@ -14,7 +14,6 @@ from openstackclient.tests.functional.identity.v2 import common
|
||||
|
||||
|
||||
class CatalogTests(common.IdentityTests):
|
||||
|
||||
def test_catalog_list(self):
|
||||
raw_output = self.openstack('catalog list')
|
||||
items = self.parse_listing(raw_output)
|
||||
|
||||
@@ -14,7 +14,6 @@ from openstackclient.tests.functional.identity.v2 import common
|
||||
|
||||
|
||||
class EC2CredentialsTests(common.IdentityTests):
|
||||
|
||||
def test_ec2_credentials_create(self):
|
||||
self._create_dummy_ec2_credentials()
|
||||
|
||||
|
||||
@@ -14,21 +14,20 @@ from openstackclient.tests.functional.identity.v2 import common
|
||||
|
||||
|
||||
class EndpointTests(common.IdentityTests):
|
||||
|
||||
def test_endpoint_create(self):
|
||||
self._create_dummy_endpoint()
|
||||
|
||||
def test_endpoint_delete(self):
|
||||
endpoint_id = self._create_dummy_endpoint(add_clean_up=False)
|
||||
raw_output = self.openstack(
|
||||
'endpoint delete %s' % endpoint_id)
|
||||
raw_output = self.openstack('endpoint delete %s' % endpoint_id)
|
||||
self.assertEqual(0, len(raw_output))
|
||||
|
||||
def test_endpoint_multi_delete(self):
|
||||
endpoint_id_1 = self._create_dummy_endpoint(add_clean_up=False)
|
||||
endpoint_id_2 = self._create_dummy_endpoint(add_clean_up=False)
|
||||
raw_output = self.openstack(
|
||||
'endpoint delete ' + endpoint_id_1 + ' ' + endpoint_id_2)
|
||||
'endpoint delete ' + endpoint_id_1 + ' ' + endpoint_id_2
|
||||
)
|
||||
self.assertEqual(0, len(raw_output))
|
||||
|
||||
def test_endpoint_list(self):
|
||||
|
||||
@@ -16,7 +16,6 @@ from openstackclient.tests.functional.identity.v2 import common
|
||||
|
||||
|
||||
class ProjectTests(common.IdentityTests):
|
||||
|
||||
def test_project_create(self):
|
||||
project_name = data_utils.rand_name('TestProject')
|
||||
description = data_utils.rand_name('description')
|
||||
@@ -26,12 +25,9 @@ class ProjectTests(common.IdentityTests):
|
||||
'--enable '
|
||||
'--property k1=v1 '
|
||||
'--property k2=v2 '
|
||||
'%(name)s' % {'description': description,
|
||||
'name': project_name})
|
||||
self.addCleanup(
|
||||
self.openstack,
|
||||
'project delete %s' % project_name
|
||||
'%(name)s' % {'description': description, 'name': project_name}
|
||||
)
|
||||
self.addCleanup(self.openstack, 'project delete %s' % project_name)
|
||||
items = self.parse_show(raw_output)
|
||||
show_fields = list(self.PROJECT_FIELDS)
|
||||
show_fields.extend(['k1', 'k2'])
|
||||
@@ -42,8 +38,7 @@ class ProjectTests(common.IdentityTests):
|
||||
|
||||
def test_project_delete(self):
|
||||
project_name = self._create_dummy_project(add_clean_up=False)
|
||||
raw_output = self.openstack(
|
||||
'project delete %s' % project_name)
|
||||
raw_output = self.openstack('project delete %s' % project_name)
|
||||
self.assertEqual(0, len(raw_output))
|
||||
|
||||
def test_project_list(self):
|
||||
@@ -59,13 +54,11 @@ class ProjectTests(common.IdentityTests):
|
||||
'--name %(new_name)s '
|
||||
'--disable '
|
||||
'--property k0=v0 '
|
||||
'%(name)s' % {'new_name': new_project_name,
|
||||
'name': project_name})
|
||||
'%(name)s' % {'new_name': new_project_name, 'name': project_name}
|
||||
)
|
||||
self.assertEqual(0, len(raw_output))
|
||||
# check project details
|
||||
raw_output = self.openstack(
|
||||
'project show %s' % new_project_name
|
||||
)
|
||||
raw_output = self.openstack('project show %s' % new_project_name)
|
||||
items = self.parse_show(raw_output)
|
||||
fields = list(self.PROJECT_FIELDS)
|
||||
fields.extend(['properties'])
|
||||
@@ -77,9 +70,7 @@ class ProjectTests(common.IdentityTests):
|
||||
|
||||
def test_project_show(self):
|
||||
project_name = self._create_dummy_project()
|
||||
raw_output = self.openstack(
|
||||
'project show %s' % project_name
|
||||
)
|
||||
raw_output = self.openstack('project show %s' % project_name)
|
||||
items = self.parse_show(raw_output)
|
||||
fields = list(self.PROJECT_FIELDS)
|
||||
fields.extend(['properties'])
|
||||
|
||||
@@ -14,7 +14,6 @@ from openstackclient.tests.functional.identity.v2 import common
|
||||
|
||||
|
||||
class RoleTests(common.IdentityTests):
|
||||
|
||||
def test_role_create(self):
|
||||
self._create_dummy_role()
|
||||
|
||||
@@ -42,17 +41,25 @@ class RoleTests(common.IdentityTests):
|
||||
'role add '
|
||||
'--project %(project)s '
|
||||
'--user %(user)s '
|
||||
'%(role)s' % {'project': self.project_name,
|
||||
'user': username,
|
||||
'role': role_name})
|
||||
'%(role)s'
|
||||
% {
|
||||
'project': self.project_name,
|
||||
'user': username,
|
||||
'role': role_name,
|
||||
}
|
||||
)
|
||||
self.addCleanup(
|
||||
self.openstack,
|
||||
'role remove '
|
||||
'--project %(project)s '
|
||||
'--user %(user)s '
|
||||
'%(role)s' % {'project': self.project_name,
|
||||
'user': username,
|
||||
'role': role_name})
|
||||
'%(role)s'
|
||||
% {
|
||||
'project': self.project_name,
|
||||
'user': username,
|
||||
'role': role_name,
|
||||
},
|
||||
)
|
||||
items = self.parse_show(raw_output)
|
||||
self.assert_show_fields(items, self.ROLE_FIELDS)
|
||||
|
||||
@@ -63,16 +70,24 @@ class RoleTests(common.IdentityTests):
|
||||
'role add '
|
||||
'--project %(project)s '
|
||||
'--user %(user)s '
|
||||
'%(role)s' % {'project': self.project_name,
|
||||
'user': username,
|
||||
'role': role_name})
|
||||
'%(role)s'
|
||||
% {
|
||||
'project': self.project_name,
|
||||
'user': username,
|
||||
'role': role_name,
|
||||
}
|
||||
)
|
||||
del_raw_output = self.openstack(
|
||||
'role remove '
|
||||
'--project %(project)s '
|
||||
'--user %(user)s '
|
||||
'%(role)s' % {'project': self.project_name,
|
||||
'user': username,
|
||||
'role': role_name})
|
||||
'%(role)s'
|
||||
% {
|
||||
'project': self.project_name,
|
||||
'user': username,
|
||||
'role': role_name,
|
||||
}
|
||||
)
|
||||
items = self.parse_show(add_raw_output)
|
||||
self.assert_show_fields(items, self.ROLE_FIELDS)
|
||||
self.assertEqual(0, len(del_raw_output))
|
||||
|
||||
@@ -14,7 +14,6 @@ from openstackclient.tests.functional.identity.v2 import common
|
||||
|
||||
|
||||
class ServiceTests(common.IdentityTests):
|
||||
|
||||
def test_service_create(self):
|
||||
self._create_dummy_service()
|
||||
|
||||
@@ -27,7 +26,8 @@ class ServiceTests(common.IdentityTests):
|
||||
service_name_1 = self._create_dummy_service(add_clean_up=False)
|
||||
service_name_2 = self._create_dummy_service(add_clean_up=False)
|
||||
raw_output = self.openstack(
|
||||
'service delete ' + service_name_1 + ' ' + service_name_2)
|
||||
'service delete ' + service_name_1 + ' ' + service_name_2
|
||||
)
|
||||
self.assertEqual(0, len(raw_output))
|
||||
|
||||
def test_service_list(self):
|
||||
@@ -38,7 +38,6 @@ class ServiceTests(common.IdentityTests):
|
||||
|
||||
def test_service_show(self):
|
||||
service_name = self._create_dummy_service()
|
||||
raw_output = self.openstack(
|
||||
'service show %s' % service_name)
|
||||
raw_output = self.openstack('service show %s' % service_name)
|
||||
items = self.parse_show(raw_output)
|
||||
self.assert_show_fields(items, self.SERVICE_FIELDS)
|
||||
|
||||
@@ -14,7 +14,6 @@ from openstackclient.tests.functional.identity.v2 import common
|
||||
|
||||
|
||||
class TokenTests(common.IdentityTests):
|
||||
|
||||
def test_token_issue(self):
|
||||
self._create_dummy_token()
|
||||
|
||||
|
||||
@@ -17,7 +17,6 @@ from openstackclient.tests.functional.identity.v2 import common
|
||||
|
||||
|
||||
class UserTests(common.IdentityTests):
|
||||
|
||||
def test_user_create(self):
|
||||
self._create_dummy_user()
|
||||
|
||||
@@ -37,12 +36,13 @@ class UserTests(common.IdentityTests):
|
||||
user = self.parse_show_as_object(raw_output)
|
||||
new_username = data_utils.rand_name('NewTestUser')
|
||||
new_email = data_utils.rand_name() + '@example.com'
|
||||
raw_output = self.openstack('user set '
|
||||
'--email %(email)s '
|
||||
'--name %(new_name)s '
|
||||
'%(id)s' % {'email': new_email,
|
||||
'new_name': new_username,
|
||||
'id': user['id']})
|
||||
raw_output = self.openstack(
|
||||
'user set '
|
||||
'--email %(email)s '
|
||||
'--name %(new_name)s '
|
||||
'%(id)s'
|
||||
% {'email': new_email, 'new_name': new_username, 'id': user['id']}
|
||||
)
|
||||
self.assertEqual(0, len(raw_output))
|
||||
raw_output = self.openstack('user show %s' % new_username)
|
||||
new_user = self.parse_show_as_object(raw_output)
|
||||
@@ -56,5 +56,6 @@ class UserTests(common.IdentityTests):
|
||||
self.assert_show_fields(items, self.USER_FIELDS)
|
||||
|
||||
def test_bad_user_command(self):
|
||||
self.assertRaises(exceptions.CommandFailed,
|
||||
self.openstack, 'user unlist')
|
||||
self.assertRaises(
|
||||
exceptions.CommandFailed, self.openstack, 'user unlist'
|
||||
)
|
||||
|
||||
@@ -23,47 +23,121 @@ SYSTEM_CLOUD = os.environ.get('OS_SYSTEM_CLOUD', 'devstack-system-admin')
|
||||
|
||||
|
||||
class IdentityTests(base.TestCase):
|
||||
"""Functional tests for Identity commands. """
|
||||
"""Functional tests for Identity commands."""
|
||||
|
||||
DOMAIN_FIELDS = ['description', 'enabled', 'id', 'name']
|
||||
GROUP_FIELDS = ['description', 'domain_id', 'id', 'name']
|
||||
TOKEN_FIELDS = ['expires', 'id', 'project_id', 'user_id']
|
||||
USER_FIELDS = ['email', 'enabled', 'id', 'name', 'name',
|
||||
'domain_id', 'default_project_id', 'description',
|
||||
'password_expires_at']
|
||||
PROJECT_FIELDS = ['description', 'id', 'domain_id', 'is_domain',
|
||||
'enabled', 'name', 'parent_id']
|
||||
USER_FIELDS = [
|
||||
'email',
|
||||
'enabled',
|
||||
'id',
|
||||
'name',
|
||||
'name',
|
||||
'domain_id',
|
||||
'default_project_id',
|
||||
'description',
|
||||
'password_expires_at',
|
||||
]
|
||||
PROJECT_FIELDS = [
|
||||
'description',
|
||||
'id',
|
||||
'domain_id',
|
||||
'is_domain',
|
||||
'enabled',
|
||||
'name',
|
||||
'parent_id',
|
||||
]
|
||||
ROLE_FIELDS = ['id', 'name', 'domain_id', 'description']
|
||||
SERVICE_FIELDS = ['id', 'enabled', 'name', 'type', 'description']
|
||||
REGION_FIELDS = ['description', 'enabled', 'parent_region', 'region']
|
||||
ENDPOINT_FIELDS = ['id', 'region', 'region_id', 'service_id',
|
||||
'service_name', 'service_type', 'enabled',
|
||||
'interface', 'url']
|
||||
ENDPOINT_FIELDS = [
|
||||
'id',
|
||||
'region',
|
||||
'region_id',
|
||||
'service_id',
|
||||
'service_name',
|
||||
'service_type',
|
||||
'enabled',
|
||||
'interface',
|
||||
'url',
|
||||
]
|
||||
|
||||
REGION_LIST_HEADERS = ['Region', 'Parent Region', 'Description']
|
||||
ENDPOINT_LIST_HEADERS = ['ID', 'Region', 'Service Name', 'Service Type',
|
||||
'Enabled', 'Interface', 'URL']
|
||||
ENDPOINT_LIST_HEADERS = [
|
||||
'ID',
|
||||
'Region',
|
||||
'Service Name',
|
||||
'Service Type',
|
||||
'Enabled',
|
||||
'Interface',
|
||||
'URL',
|
||||
]
|
||||
ENDPOINT_LIST_PROJECT_HEADERS = ['ID', 'Name']
|
||||
|
||||
IDENTITY_PROVIDER_FIELDS = ['description', 'enabled', 'id', 'remote_ids',
|
||||
'domain_id']
|
||||
IDENTITY_PROVIDER_FIELDS = [
|
||||
'description',
|
||||
'enabled',
|
||||
'id',
|
||||
'remote_ids',
|
||||
'domain_id',
|
||||
]
|
||||
IDENTITY_PROVIDER_LIST_HEADERS = ['ID', 'Enabled', 'Description']
|
||||
|
||||
SERVICE_PROVIDER_FIELDS = ['auth_url', 'description', 'enabled',
|
||||
'id', 'relay_state_prefix', 'sp_url']
|
||||
SERVICE_PROVIDER_LIST_HEADERS = ['ID', 'Enabled', 'Description',
|
||||
'Auth URL']
|
||||
IMPLIED_ROLE_LIST_HEADERS = ['Prior Role ID', 'Prior Role Name',
|
||||
'Implied Role ID', 'Implied Role Name']
|
||||
REGISTERED_LIMIT_FIELDS = ['id', 'service_id', 'resource_name',
|
||||
'default_limit', 'description', 'region_id']
|
||||
REGISTERED_LIMIT_LIST_HEADERS = ['ID', 'Service ID', 'Resource Name',
|
||||
'Default Limit', 'Description',
|
||||
'Region ID']
|
||||
LIMIT_FIELDS = ['id', 'project_id', 'service_id', 'resource_name',
|
||||
'resource_limit', 'description', 'region_id']
|
||||
LIMIT_LIST_HEADERS = ['ID', 'Project ID', 'Service ID', 'Resource Name',
|
||||
'Resource Limit', 'Description', 'Region ID']
|
||||
SERVICE_PROVIDER_FIELDS = [
|
||||
'auth_url',
|
||||
'description',
|
||||
'enabled',
|
||||
'id',
|
||||
'relay_state_prefix',
|
||||
'sp_url',
|
||||
]
|
||||
SERVICE_PROVIDER_LIST_HEADERS = [
|
||||
'ID',
|
||||
'Enabled',
|
||||
'Description',
|
||||
'Auth URL',
|
||||
]
|
||||
IMPLIED_ROLE_LIST_HEADERS = [
|
||||
'Prior Role ID',
|
||||
'Prior Role Name',
|
||||
'Implied Role ID',
|
||||
'Implied Role Name',
|
||||
]
|
||||
REGISTERED_LIMIT_FIELDS = [
|
||||
'id',
|
||||
'service_id',
|
||||
'resource_name',
|
||||
'default_limit',
|
||||
'description',
|
||||
'region_id',
|
||||
]
|
||||
REGISTERED_LIMIT_LIST_HEADERS = [
|
||||
'ID',
|
||||
'Service ID',
|
||||
'Resource Name',
|
||||
'Default Limit',
|
||||
'Description',
|
||||
'Region ID',
|
||||
]
|
||||
LIMIT_FIELDS = [
|
||||
'id',
|
||||
'project_id',
|
||||
'service_id',
|
||||
'resource_name',
|
||||
'resource_limit',
|
||||
'description',
|
||||
'region_id',
|
||||
]
|
||||
LIMIT_LIST_HEADERS = [
|
||||
'ID',
|
||||
'Project ID',
|
||||
'Service ID',
|
||||
'Resource Name',
|
||||
'Resource Limit',
|
||||
'Description',
|
||||
'Region ID',
|
||||
]
|
||||
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
@@ -76,8 +150,9 @@ class IdentityTests(base.TestCase):
|
||||
'domain create '
|
||||
'--description %(description)s '
|
||||
'--enable '
|
||||
'%(name)s' % {'description': cls.domain_description,
|
||||
'name': cls.domain_name})
|
||||
'%(name)s'
|
||||
% {'description': cls.domain_description, 'name': cls.domain_name}
|
||||
)
|
||||
|
||||
# create dummy project
|
||||
cls.project_name = data_utils.rand_name('TestProject')
|
||||
@@ -88,21 +163,31 @@ class IdentityTests(base.TestCase):
|
||||
'--domain %(domain)s '
|
||||
'--description %(description)s '
|
||||
'--enable '
|
||||
'%(name)s' % {'domain': cls.domain_name,
|
||||
'description': cls.project_description,
|
||||
'name': cls.project_name})
|
||||
'%(name)s'
|
||||
% {
|
||||
'domain': cls.domain_name,
|
||||
'description': cls.project_description,
|
||||
'name': cls.project_name,
|
||||
}
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def tearDownClass(cls):
|
||||
try:
|
||||
# delete dummy project
|
||||
cls.openstack('--os-identity-api-version 3 '
|
||||
'project delete %s' % cls.project_name)
|
||||
cls.openstack(
|
||||
'--os-identity-api-version 3 '
|
||||
'project delete %s' % cls.project_name
|
||||
)
|
||||
# disable and delete dummy domain
|
||||
cls.openstack('--os-identity-api-version 3 '
|
||||
'domain set --disable %s' % cls.domain_name)
|
||||
cls.openstack('--os-identity-api-version 3 '
|
||||
'domain delete %s' % cls.domain_name)
|
||||
cls.openstack(
|
||||
'--os-identity-api-version 3 '
|
||||
'domain set --disable %s' % cls.domain_name
|
||||
)
|
||||
cls.openstack(
|
||||
'--os-identity-api-version 3 '
|
||||
'domain delete %s' % cls.domain_name
|
||||
)
|
||||
finally:
|
||||
super(IdentityTests, cls).tearDownClass()
|
||||
|
||||
@@ -110,7 +195,8 @@ class IdentityTests(base.TestCase):
|
||||
super(IdentityTests, self).setUp()
|
||||
# prepare v3 env
|
||||
ver_fixture = fixtures.EnvironmentVariable(
|
||||
'OS_IDENTITY_API_VERSION', '3')
|
||||
'OS_IDENTITY_API_VERSION', '3'
|
||||
)
|
||||
self.useFixture(ver_fixture)
|
||||
auth_url = os.environ.get('OS_AUTH_URL')
|
||||
if auth_url:
|
||||
@@ -133,17 +219,22 @@ class IdentityTests(base.TestCase):
|
||||
'--email %(email)s '
|
||||
'--description %(description)s '
|
||||
'--enable '
|
||||
'%(name)s' % {'domain': self.domain_name,
|
||||
'project': self.project_name,
|
||||
'project_domain': self.domain_name,
|
||||
'email': email,
|
||||
'password': password,
|
||||
'description': description,
|
||||
'name': username})
|
||||
'%(name)s'
|
||||
% {
|
||||
'domain': self.domain_name,
|
||||
'project': self.project_name,
|
||||
'project_domain': self.domain_name,
|
||||
'email': email,
|
||||
'password': password,
|
||||
'description': description,
|
||||
'name': username,
|
||||
}
|
||||
)
|
||||
if add_clean_up:
|
||||
self.addCleanup(
|
||||
self.openstack,
|
||||
'user delete %s' % self.parse_show_as_object(raw_output)['id'])
|
||||
'user delete %s' % self.parse_show_as_object(raw_output)['id'],
|
||||
)
|
||||
items = self.parse_show(raw_output)
|
||||
self.assert_show_fields(items, self.USER_FIELDS)
|
||||
return username
|
||||
@@ -153,9 +244,7 @@ class IdentityTests(base.TestCase):
|
||||
raw_output = self.openstack('role create %s' % role_name)
|
||||
role = self.parse_show_as_object(raw_output)
|
||||
if add_clean_up:
|
||||
self.addCleanup(
|
||||
self.openstack,
|
||||
'role delete %s' % role['id'])
|
||||
self.addCleanup(self.openstack, 'role delete %s' % role['id'])
|
||||
items = self.parse_show(raw_output)
|
||||
self.assert_show_fields(items, self.ROLE_FIELDS)
|
||||
self.assertEqual(role_name, role['name'])
|
||||
@@ -167,8 +256,8 @@ class IdentityTests(base.TestCase):
|
||||
self.openstack(
|
||||
'implied role create '
|
||||
'--implied-role %(implied_role)s '
|
||||
'%(role)s' % {'implied_role': implied_role_name,
|
||||
'role': role_name})
|
||||
'%(role)s' % {'implied_role': implied_role_name, 'role': role_name}
|
||||
)
|
||||
|
||||
return implied_role_name, role_name
|
||||
|
||||
@@ -179,16 +268,20 @@ class IdentityTests(base.TestCase):
|
||||
'group create '
|
||||
'--domain %(domain)s '
|
||||
'--description %(description)s '
|
||||
'%(name)s' % {'domain': self.domain_name,
|
||||
'description': description,
|
||||
'name': group_name})
|
||||
'%(name)s'
|
||||
% {
|
||||
'domain': self.domain_name,
|
||||
'description': description,
|
||||
'name': group_name,
|
||||
}
|
||||
)
|
||||
if add_clean_up:
|
||||
self.addCleanup(
|
||||
self.openstack,
|
||||
'group delete '
|
||||
'--domain %(domain)s '
|
||||
'%(name)s' % {'domain': self.domain_name,
|
||||
'name': group_name})
|
||||
'%(name)s' % {'domain': self.domain_name, 'name': group_name},
|
||||
)
|
||||
items = self.parse_show(raw_output)
|
||||
self.assert_show_fields(items, self.GROUP_FIELDS)
|
||||
return group_name
|
||||
@@ -199,16 +292,13 @@ class IdentityTests(base.TestCase):
|
||||
self.openstack(
|
||||
'domain create '
|
||||
'--description %(description)s '
|
||||
'--enable %(name)s' % {'description': domain_description,
|
||||
'name': domain_name})
|
||||
'--enable %(name)s'
|
||||
% {'description': domain_description, 'name': domain_name}
|
||||
)
|
||||
if add_clean_up:
|
||||
self.addCleanup(self.openstack, 'domain delete %s' % domain_name)
|
||||
self.addCleanup(
|
||||
self.openstack,
|
||||
'domain delete %s' % domain_name
|
||||
)
|
||||
self.addCleanup(
|
||||
self.openstack,
|
||||
'domain set --disable %s' % domain_name
|
||||
self.openstack, 'domain set --disable %s' % domain_name
|
||||
)
|
||||
return domain_name
|
||||
|
||||
@@ -219,16 +309,21 @@ class IdentityTests(base.TestCase):
|
||||
'project create '
|
||||
'--domain %(domain)s '
|
||||
'--description %(description)s '
|
||||
'--enable %(name)s' % {'domain': self.domain_name,
|
||||
'description': project_description,
|
||||
'name': project_name})
|
||||
'--enable %(name)s'
|
||||
% {
|
||||
'domain': self.domain_name,
|
||||
'description': project_description,
|
||||
'name': project_name,
|
||||
}
|
||||
)
|
||||
if add_clean_up:
|
||||
self.addCleanup(
|
||||
self.openstack,
|
||||
'project delete '
|
||||
'--domain %(domain)s '
|
||||
'%(name)s' % {'domain': self.domain_name,
|
||||
'name': project_name})
|
||||
'%(name)s'
|
||||
% {'domain': self.domain_name, 'name': project_name},
|
||||
)
|
||||
return project_name
|
||||
|
||||
def _create_dummy_region(self, parent_region=None, add_clean_up=True):
|
||||
@@ -241,12 +336,15 @@ class IdentityTests(base.TestCase):
|
||||
'region create '
|
||||
'%(parent_region_arg)s '
|
||||
'--description %(description)s '
|
||||
'%(id)s' % {'parent_region_arg': parent_region_arg,
|
||||
'description': description,
|
||||
'id': region_id})
|
||||
'%(id)s'
|
||||
% {
|
||||
'parent_region_arg': parent_region_arg,
|
||||
'description': description,
|
||||
'id': region_id,
|
||||
}
|
||||
)
|
||||
if add_clean_up:
|
||||
self.addCleanup(self.openstack,
|
||||
'region delete %s' % region_id)
|
||||
self.addCleanup(self.openstack, 'region delete %s' % region_id)
|
||||
items = self.parse_show(raw_output)
|
||||
self.assert_show_fields(items, self.REGION_FIELDS)
|
||||
return region_id
|
||||
@@ -260,13 +358,18 @@ class IdentityTests(base.TestCase):
|
||||
'--name %(name)s '
|
||||
'--description %(description)s '
|
||||
'--enable '
|
||||
'%(type)s' % {'name': service_name,
|
||||
'description': description,
|
||||
'type': type_name})
|
||||
'%(type)s'
|
||||
% {
|
||||
'name': service_name,
|
||||
'description': description,
|
||||
'type': type_name,
|
||||
}
|
||||
)
|
||||
if add_clean_up:
|
||||
service = self.parse_show_as_object(raw_output)
|
||||
self.addCleanup(self.openstack,
|
||||
'service delete %s' % service['id'])
|
||||
self.addCleanup(
|
||||
self.openstack, 'service delete %s' % service['id']
|
||||
)
|
||||
items = self.parse_show(raw_output)
|
||||
self.assert_show_fields(items, self.SERVICE_FIELDS)
|
||||
return service_name
|
||||
@@ -281,15 +384,19 @@ class IdentityTests(base.TestCase):
|
||||
'--enable '
|
||||
'%(service)s '
|
||||
'%(interface)s '
|
||||
'%(url)s' % {'region': region_id,
|
||||
'service': service_name,
|
||||
'interface': interface,
|
||||
'url': endpoint_url})
|
||||
'%(url)s'
|
||||
% {
|
||||
'region': region_id,
|
||||
'service': service_name,
|
||||
'interface': interface,
|
||||
'url': endpoint_url,
|
||||
}
|
||||
)
|
||||
endpoint = self.parse_show_as_object(raw_output)
|
||||
if add_clean_up:
|
||||
self.addCleanup(
|
||||
self.openstack,
|
||||
'endpoint delete %s' % endpoint['id'])
|
||||
self.openstack, 'endpoint delete %s' % endpoint['id']
|
||||
)
|
||||
items = self.parse_show(raw_output)
|
||||
self.assert_show_fields(items, self.ENDPOINT_FIELDS)
|
||||
return endpoint['id']
|
||||
@@ -301,12 +408,14 @@ class IdentityTests(base.TestCase):
|
||||
'identity provider create '
|
||||
' %(name)s '
|
||||
'--description %(description)s '
|
||||
'--enable ' % {'name': identity_provider,
|
||||
'description': description})
|
||||
'--enable '
|
||||
% {'name': identity_provider, 'description': description}
|
||||
)
|
||||
if add_clean_up:
|
||||
self.addCleanup(
|
||||
self.openstack,
|
||||
'identity provider delete %s' % identity_provider)
|
||||
'identity provider delete %s' % identity_provider,
|
||||
)
|
||||
items = self.parse_show(raw_output)
|
||||
self.assert_show_fields(items, self.IDENTITY_PROVIDER_FIELDS)
|
||||
return identity_provider
|
||||
@@ -320,12 +429,13 @@ class IdentityTests(base.TestCase):
|
||||
'--description %(description)s '
|
||||
'--auth-url https://sp.example.com:35357 '
|
||||
'--service-provider-url https://sp.example.com:5000 '
|
||||
'--enable ' % {'name': service_provider,
|
||||
'description': description})
|
||||
'--enable '
|
||||
% {'name': service_provider, 'description': description}
|
||||
)
|
||||
if add_clean_up:
|
||||
self.addCleanup(
|
||||
self.openstack,
|
||||
'service provider delete %s' % service_provider)
|
||||
self.openstack, 'service provider delete %s' % service_provider
|
||||
)
|
||||
items = self.parse_show(raw_output)
|
||||
self.assert_show_fields(items, self.SERVICE_PROVIDER_FIELDS)
|
||||
return service_provider
|
||||
@@ -336,14 +446,14 @@ class IdentityTests(base.TestCase):
|
||||
params = {
|
||||
'service_name': service_name,
|
||||
'default_limit': 10,
|
||||
'resource_name': resource_name
|
||||
'resource_name': resource_name,
|
||||
}
|
||||
raw_output = self.openstack(
|
||||
'registered limit create'
|
||||
' --service %(service_name)s'
|
||||
' --default-limit %(default_limit)s'
|
||||
' %(resource_name)s' % params,
|
||||
cloud=SYSTEM_CLOUD
|
||||
cloud=SYSTEM_CLOUD,
|
||||
)
|
||||
items = self.parse_show(raw_output)
|
||||
registered_limit_id = self._extract_value_from_items('id', items)
|
||||
@@ -352,7 +462,7 @@ class IdentityTests(base.TestCase):
|
||||
self.addCleanup(
|
||||
self.openstack,
|
||||
'registered limit delete %s' % registered_limit_id,
|
||||
cloud=SYSTEM_CLOUD
|
||||
cloud=SYSTEM_CLOUD,
|
||||
)
|
||||
|
||||
self.assert_show_fields(items, self.REGISTERED_LIMIT_FIELDS)
|
||||
@@ -369,7 +479,7 @@ class IdentityTests(base.TestCase):
|
||||
|
||||
raw_output = self.openstack(
|
||||
'registered limit show %s' % registered_limit_id,
|
||||
cloud=SYSTEM_CLOUD
|
||||
cloud=SYSTEM_CLOUD,
|
||||
)
|
||||
items = self.parse_show(raw_output)
|
||||
resource_name = self._extract_value_from_items('resource_name', items)
|
||||
@@ -385,7 +495,7 @@ class IdentityTests(base.TestCase):
|
||||
'project_id': project_id,
|
||||
'service_id': service_id,
|
||||
'resource_name': resource_name,
|
||||
'resource_limit': resource_limit
|
||||
'resource_limit': resource_limit,
|
||||
}
|
||||
|
||||
raw_output = self.openstack(
|
||||
@@ -394,15 +504,16 @@ class IdentityTests(base.TestCase):
|
||||
' --service %(service_id)s'
|
||||
' --resource-limit %(resource_limit)s'
|
||||
' %(resource_name)s' % params,
|
||||
cloud=SYSTEM_CLOUD
|
||||
cloud=SYSTEM_CLOUD,
|
||||
)
|
||||
items = self.parse_show(raw_output)
|
||||
limit_id = self._extract_value_from_items('id', items)
|
||||
|
||||
if add_clean_up:
|
||||
self.addCleanup(
|
||||
self.openstack, 'limit delete %s' % limit_id,
|
||||
cloud=SYSTEM_CLOUD
|
||||
self.openstack,
|
||||
'limit delete %s' % limit_id,
|
||||
cloud=SYSTEM_CLOUD,
|
||||
)
|
||||
|
||||
self.assert_show_fields(items, self.LIMIT_FIELDS)
|
||||
|
||||
@@ -20,124 +20,164 @@ from openstackclient.tests.functional.identity.v3 import common
|
||||
|
||||
|
||||
class ApplicationCredentialTests(common.IdentityTests):
|
||||
|
||||
APPLICATION_CREDENTIAL_FIELDS = ['id', 'name', 'project_id',
|
||||
'description', 'roles', 'expires_at',
|
||||
'unrestricted']
|
||||
APPLICATION_CREDENTIAL_LIST_HEADERS = ['ID', 'Name', 'Project ID',
|
||||
'Description', 'Expires At']
|
||||
APPLICATION_CREDENTIAL_FIELDS = [
|
||||
'id',
|
||||
'name',
|
||||
'project_id',
|
||||
'description',
|
||||
'roles',
|
||||
'expires_at',
|
||||
'unrestricted',
|
||||
]
|
||||
APPLICATION_CREDENTIAL_LIST_HEADERS = [
|
||||
'ID',
|
||||
'Name',
|
||||
'Project ID',
|
||||
'Description',
|
||||
'Expires At',
|
||||
]
|
||||
|
||||
def test_application_credential_create(self):
|
||||
name = data_utils.rand_name('name')
|
||||
raw_output = self.openstack('application credential create %(name)s'
|
||||
% {'name': name})
|
||||
raw_output = self.openstack(
|
||||
'application credential create %(name)s' % {'name': name}
|
||||
)
|
||||
self.addCleanup(
|
||||
self.openstack,
|
||||
'application credential delete %(name)s' % {'name': name})
|
||||
'application credential delete %(name)s' % {'name': name},
|
||||
)
|
||||
items = self.parse_show(raw_output)
|
||||
self.assert_show_fields(items, self.APPLICATION_CREDENTIAL_FIELDS)
|
||||
|
||||
def _create_role_assignments(self):
|
||||
try:
|
||||
user = self.openstack('configuration show -f value'
|
||||
' -c auth.username')
|
||||
user = self.openstack(
|
||||
'configuration show -f value' ' -c auth.username'
|
||||
)
|
||||
except Exception:
|
||||
user = self.openstack('configuration show -f value'
|
||||
' -c auth.user_id')
|
||||
user = self.openstack(
|
||||
'configuration show -f value' ' -c auth.user_id'
|
||||
)
|
||||
try:
|
||||
user_domain = self.openstack('configuration show -f value'
|
||||
' -c auth.user_domain_name')
|
||||
user_domain = self.openstack(
|
||||
'configuration show -f value' ' -c auth.user_domain_name'
|
||||
)
|
||||
except Exception:
|
||||
user_domain = self.openstack('configuration show -f value'
|
||||
' -c auth.user_domain_id')
|
||||
user_domain = self.openstack(
|
||||
'configuration show -f value' ' -c auth.user_domain_id'
|
||||
)
|
||||
try:
|
||||
project = self.openstack('configuration show -f value'
|
||||
' -c auth.project_name')
|
||||
project = self.openstack(
|
||||
'configuration show -f value' ' -c auth.project_name'
|
||||
)
|
||||
except Exception:
|
||||
project = self.openstack('configuration show -f value'
|
||||
' -c auth.project_id')
|
||||
project = self.openstack(
|
||||
'configuration show -f value' ' -c auth.project_id'
|
||||
)
|
||||
try:
|
||||
project_domain = self.openstack('configuration show -f value'
|
||||
' -c auth.project_domain_name')
|
||||
project_domain = self.openstack(
|
||||
'configuration show -f value' ' -c auth.project_domain_name'
|
||||
)
|
||||
except Exception:
|
||||
project_domain = self.openstack('configuration show -f value'
|
||||
' -c auth.project_domain_id')
|
||||
project_domain = self.openstack(
|
||||
'configuration show -f value' ' -c auth.project_domain_id'
|
||||
)
|
||||
role1 = self._create_dummy_role()
|
||||
role2 = self._create_dummy_role()
|
||||
for role in role1, role2:
|
||||
self.openstack('role add'
|
||||
' --user %(user)s'
|
||||
' --user-domain %(user_domain)s'
|
||||
' --project %(project)s'
|
||||
' --project-domain %(project_domain)s'
|
||||
' %(role)s'
|
||||
% {'user': user,
|
||||
'user_domain': user_domain,
|
||||
'project': project,
|
||||
'project_domain': project_domain,
|
||||
'role': role})
|
||||
self.addCleanup(self.openstack,
|
||||
'role remove'
|
||||
' --user %(user)s'
|
||||
' --user-domain %(user_domain)s'
|
||||
' --project %(project)s'
|
||||
' --project-domain %(project_domain)s'
|
||||
' %(role)s'
|
||||
% {'user': user,
|
||||
'user_domain': user_domain,
|
||||
'project': project,
|
||||
'project_domain': project_domain,
|
||||
'role': role})
|
||||
self.openstack(
|
||||
'role add'
|
||||
' --user %(user)s'
|
||||
' --user-domain %(user_domain)s'
|
||||
' --project %(project)s'
|
||||
' --project-domain %(project_domain)s'
|
||||
' %(role)s'
|
||||
% {
|
||||
'user': user,
|
||||
'user_domain': user_domain,
|
||||
'project': project,
|
||||
'project_domain': project_domain,
|
||||
'role': role,
|
||||
}
|
||||
)
|
||||
self.addCleanup(
|
||||
self.openstack,
|
||||
'role remove'
|
||||
' --user %(user)s'
|
||||
' --user-domain %(user_domain)s'
|
||||
' --project %(project)s'
|
||||
' --project-domain %(project_domain)s'
|
||||
' %(role)s'
|
||||
% {
|
||||
'user': user,
|
||||
'user_domain': user_domain,
|
||||
'project': project,
|
||||
'project_domain': project_domain,
|
||||
'role': role,
|
||||
},
|
||||
)
|
||||
return role1, role2
|
||||
|
||||
def test_application_credential_create_with_options(self):
|
||||
name = data_utils.rand_name('name')
|
||||
secret = data_utils.rand_name('secret')
|
||||
description = data_utils.rand_name('description')
|
||||
tomorrow = (datetime.datetime.utcnow() +
|
||||
datetime.timedelta(days=1)).strftime('%Y-%m-%dT%H:%M:%S%z')
|
||||
tomorrow = (
|
||||
datetime.datetime.utcnow() + datetime.timedelta(days=1)
|
||||
).strftime('%Y-%m-%dT%H:%M:%S%z')
|
||||
role1, role2 = self._create_role_assignments()
|
||||
raw_output = self.openstack('application credential create %(name)s'
|
||||
' --secret %(secret)s'
|
||||
' --description %(description)s'
|
||||
' --expiration %(tomorrow)s'
|
||||
' --role %(role1)s'
|
||||
' --role %(role2)s'
|
||||
' --unrestricted'
|
||||
% {'name': name,
|
||||
'secret': secret,
|
||||
'description': description,
|
||||
'tomorrow': tomorrow,
|
||||
'role1': role1,
|
||||
'role2': role2})
|
||||
raw_output = self.openstack(
|
||||
'application credential create %(name)s'
|
||||
' --secret %(secret)s'
|
||||
' --description %(description)s'
|
||||
' --expiration %(tomorrow)s'
|
||||
' --role %(role1)s'
|
||||
' --role %(role2)s'
|
||||
' --unrestricted'
|
||||
% {
|
||||
'name': name,
|
||||
'secret': secret,
|
||||
'description': description,
|
||||
'tomorrow': tomorrow,
|
||||
'role1': role1,
|
||||
'role2': role2,
|
||||
}
|
||||
)
|
||||
self.addCleanup(
|
||||
self.openstack,
|
||||
'application credential delete %(name)s' % {'name': name})
|
||||
'application credential delete %(name)s' % {'name': name},
|
||||
)
|
||||
items = self.parse_show(raw_output)
|
||||
self.assert_show_fields(items, self.APPLICATION_CREDENTIAL_FIELDS)
|
||||
|
||||
def test_application_credential_delete(self):
|
||||
name = data_utils.rand_name('name')
|
||||
self.openstack('application credential create %(name)s'
|
||||
% {'name': name})
|
||||
raw_output = self.openstack('application credential delete '
|
||||
'%(name)s' % {'name': name})
|
||||
self.openstack(
|
||||
'application credential create %(name)s' % {'name': name}
|
||||
)
|
||||
raw_output = self.openstack(
|
||||
'application credential delete ' '%(name)s' % {'name': name}
|
||||
)
|
||||
self.assertEqual(0, len(raw_output))
|
||||
|
||||
def test_application_credential_list(self):
|
||||
raw_output = self.openstack('application credential list')
|
||||
items = self.parse_listing(raw_output)
|
||||
self.assert_table_structure(
|
||||
items, self.APPLICATION_CREDENTIAL_LIST_HEADERS)
|
||||
items, self.APPLICATION_CREDENTIAL_LIST_HEADERS
|
||||
)
|
||||
|
||||
def test_application_credential_show(self):
|
||||
name = data_utils.rand_name('name')
|
||||
raw_output = self.openstack('application credential create %(name)s'
|
||||
% {'name': name})
|
||||
raw_output = self.openstack(
|
||||
'application credential create %(name)s' % {'name': name}
|
||||
)
|
||||
self.addCleanup(
|
||||
self.openstack,
|
||||
'application credential delete %(name)s' % {'name': name})
|
||||
raw_output = self.openstack('application credential show '
|
||||
'%(name)s' % {'name': name})
|
||||
'application credential delete %(name)s' % {'name': name},
|
||||
)
|
||||
raw_output = self.openstack(
|
||||
'application credential show ' '%(name)s' % {'name': name}
|
||||
)
|
||||
items = self.parse_show(raw_output)
|
||||
self.assert_show_fields(items, self.APPLICATION_CREDENTIAL_FIELDS)
|
||||
|
||||
@@ -14,7 +14,6 @@ from openstackclient.tests.functional.identity.v3 import common
|
||||
|
||||
|
||||
class CatalogTests(common.IdentityTests):
|
||||
|
||||
def test_catalog_list(self):
|
||||
raw_output = self.openstack('catalog list')
|
||||
items = self.parse_listing(raw_output)
|
||||
|
||||
@@ -17,15 +17,14 @@ from openstackclient.tests.functional.identity.v3 import common
|
||||
|
||||
|
||||
class DomainTests(common.IdentityTests):
|
||||
|
||||
def test_domain_create(self):
|
||||
domain_name = data_utils.rand_name('TestDomain')
|
||||
raw_output = self.openstack('domain create %s' % domain_name)
|
||||
# disable domain first before deleting it
|
||||
self.addCleanup(self.openstack,
|
||||
'domain delete %s' % domain_name)
|
||||
self.addCleanup(self.openstack,
|
||||
'domain set --disable %s' % domain_name)
|
||||
self.addCleanup(self.openstack, 'domain delete %s' % domain_name)
|
||||
self.addCleanup(
|
||||
self.openstack, 'domain set --disable %s' % domain_name
|
||||
)
|
||||
items = self.parse_show(raw_output)
|
||||
self.assert_show_fields(items, self.DOMAIN_FIELDS)
|
||||
|
||||
@@ -52,15 +51,18 @@ class DomainTests(common.IdentityTests):
|
||||
raw_output = self.openstack('domain set --disable %s' % domain_2)
|
||||
self.assertEqual(0, len(raw_output))
|
||||
raw_output = self.openstack(
|
||||
'domain delete %s %s' % (domain_1, domain_2))
|
||||
'domain delete %s %s' % (domain_1, domain_2)
|
||||
)
|
||||
self.assertEqual(0, len(raw_output))
|
||||
|
||||
def test_domain_delete_failure(self):
|
||||
domain_name = self._create_dummy_domain()
|
||||
# cannot delete enabled domain
|
||||
self.assertRaises(exceptions.CommandFailed,
|
||||
self.openstack,
|
||||
'domain delete %s' % domain_name)
|
||||
self.assertRaises(
|
||||
exceptions.CommandFailed,
|
||||
self.openstack,
|
||||
'domain delete %s' % domain_name,
|
||||
)
|
||||
|
||||
def test_domain_show(self):
|
||||
domain_name = self._create_dummy_domain()
|
||||
|
||||
@@ -16,7 +16,6 @@ from openstackclient.tests.functional.identity.v3 import common
|
||||
|
||||
|
||||
class EndpointTests(common.IdentityTests):
|
||||
|
||||
def test_endpoint_create(self):
|
||||
self._create_dummy_endpoint(interface='public')
|
||||
self._create_dummy_endpoint(interface='admin')
|
||||
@@ -24,15 +23,15 @@ class EndpointTests(common.IdentityTests):
|
||||
|
||||
def test_endpoint_delete(self):
|
||||
endpoint_id = self._create_dummy_endpoint(add_clean_up=False)
|
||||
raw_output = self.openstack(
|
||||
'endpoint delete %s' % endpoint_id)
|
||||
raw_output = self.openstack('endpoint delete %s' % endpoint_id)
|
||||
self.assertEqual(0, len(raw_output))
|
||||
|
||||
def test_endpoint_multi_delete(self):
|
||||
endpoint_1 = self._create_dummy_endpoint(add_clean_up=False)
|
||||
endpoint_2 = self._create_dummy_endpoint(add_clean_up=False)
|
||||
raw_output = self.openstack(
|
||||
'endpoint delete %s %s' % (endpoint_1, endpoint_2))
|
||||
'endpoint delete %s %s' % (endpoint_1, endpoint_2)
|
||||
)
|
||||
self.assertEqual(0, len(raw_output))
|
||||
|
||||
def test_endpoint_list(self):
|
||||
@@ -48,19 +47,18 @@ class EndpointTests(common.IdentityTests):
|
||||
raw_output = self.openstack(
|
||||
'endpoint add project '
|
||||
'%(endpoint_id)s '
|
||||
'%(project_id)s' % {
|
||||
'project_id': project_id,
|
||||
'endpoint_id | ||||