identity: Use plural dest for append opts

Change-Id: I73a263a309e022b7606ced43a814a1d1914bc751
Signed-off-by: Stephen Finucane <stephenfin@redhat.com>
This commit is contained in:
Stephen Finucane
2025-12-15 10:45:17 +00:00
parent 43ffea5c4d
commit 8dbb7126c6
13 changed files with 49 additions and 41 deletions

View File

@@ -59,6 +59,7 @@ class CreateProject(command.ShowOne):
parser.add_argument( parser.add_argument(
'--property', '--property',
metavar='<key=value>', metavar='<key=value>',
dest='properties',
action=parseractions.KeyValueAction, action=parseractions.KeyValueAction,
help=_( help=_(
'Add a property to <name> ' 'Add a property to <name> '
@@ -79,8 +80,8 @@ class CreateProject(command.ShowOne):
if parsed_args.disable: if parsed_args.disable:
enabled = False enabled = False
kwargs = {} kwargs = {}
if parsed_args.property: if parsed_args.properties:
kwargs = parsed_args.property.copy() kwargs.update(parsed_args.properties)
try: try:
project = identity_client.tenants.create( project = identity_client.tenants.create(
@@ -230,6 +231,7 @@ class SetProject(command.Command):
parser.add_argument( parser.add_argument(
'--property', '--property',
metavar='<key=value>', metavar='<key=value>',
dest='properties',
action=parseractions.KeyValueAction, action=parseractions.KeyValueAction,
help=_( help=_(
'Set a project property ' 'Set a project property '
@@ -255,8 +257,8 @@ class SetProject(command.Command):
kwargs['enabled'] = True kwargs['enabled'] = True
if parsed_args.disable: if parsed_args.disable:
kwargs['enabled'] = False kwargs['enabled'] = False
if parsed_args.property: if parsed_args.properties:
kwargs.update(parsed_args.property) kwargs.update(parsed_args.properties)
if 'id' in kwargs: if 'id' in kwargs:
del kwargs['id'] del kwargs['id']
if 'name' in kwargs: if 'name' in kwargs:
@@ -338,6 +340,7 @@ class UnsetProject(command.Command):
parser.add_argument( parser.add_argument(
'--property', '--property',
metavar='<key>', metavar='<key>',
dest='properties',
action='append', action='append',
default=[], default=[],
help=_( help=_(
@@ -354,7 +357,7 @@ class UnsetProject(command.Command):
parsed_args.project, parsed_args.project,
) )
kwargs = project._info kwargs = project._info
for key in parsed_args.property: for key in parsed_args.properties:
if key in kwargs: if key in kwargs:
kwargs[key] = None kwargs[key] = None
identity_client.tenants.update(project.id, **kwargs) identity_client.tenants.update(project.id, **kwargs)

View File

@@ -149,6 +149,7 @@ class CreateApplicationCredential(command.ShowOne):
parser.add_argument( parser.add_argument(
'--role', '--role',
metavar='<role>', metavar='<role>',
dest='roles',
action='append', action='append',
default=[], default=[],
help=_( help=_(
@@ -208,7 +209,7 @@ class CreateApplicationCredential(command.ShowOne):
user_id = conn.config.get_auth().get_user_id(conn.identity) user_id = conn.config.get_auth().get_user_id(conn.identity)
role_ids = [] role_ids = []
for role in parsed_args.role: for role in parsed_args.roles:
if is_uuid_like(role): if is_uuid_like(role):
role_ids.append({'id': role}) role_ids.append({'id': role})
else: else:

View File

@@ -41,6 +41,7 @@ class CreateIdentityProvider(command.ShowOne):
identity_remote_id_provider.add_argument( identity_remote_id_provider.add_argument(
'--remote-id', '--remote-id',
metavar='<remote-id>', metavar='<remote-id>',
dest='remote_ids',
action='append', action='append',
help=_( help=_(
'Remote IDs to associate with the Identity Provider ' 'Remote IDs to associate with the Identity Provider '
@@ -99,16 +100,15 @@ class CreateIdentityProvider(command.ShowOne):
def take_action(self, parsed_args): def take_action(self, parsed_args):
identity_client = self.app.client_manager.identity identity_client = self.app.client_manager.identity
remote_ids: list[str] | None = None
if parsed_args.remote_id_file: if parsed_args.remote_id_file:
file_content = utils.read_blob_file_contents( file_content = utils.read_blob_file_contents(
parsed_args.remote_id_file parsed_args.remote_id_file
) )
remote_ids = file_content.splitlines() remote_ids = file_content.splitlines()
remote_ids = list(map(str.strip, remote_ids)) remote_ids = list(map(str.strip, remote_ids))
else: elif parsed_args.remote_ids:
remote_ids = ( remote_ids = parsed_args.remote_ids
parsed_args.remote_id if parsed_args.remote_id else None
)
domain_id = None domain_id = None
if parsed_args.domain: if parsed_args.domain:
@@ -240,6 +240,7 @@ class SetIdentityProvider(command.Command):
identity_remote_id_provider.add_argument( identity_remote_id_provider.add_argument(
'--remote-id', '--remote-id',
metavar='<remote-id>', metavar='<remote-id>',
dest='remote_ids',
action='append', action='append',
help=_( help=_(
'Remote IDs to associate with the Identity Provider ' 'Remote IDs to associate with the Identity Provider '
@@ -287,8 +288,8 @@ class SetIdentityProvider(command.Command):
) )
remote_ids = file_content.splitlines() remote_ids = file_content.splitlines()
remote_ids = list(map(str.strip, remote_ids)) remote_ids = list(map(str.strip, remote_ids))
elif parsed_args.remote_id: elif parsed_args.remote_ids:
remote_ids = parsed_args.remote_id remote_ids = parsed_args.remote_ids
# Setup keyword args for the client # Setup keyword args for the client
kwargs = {} kwargs = {}
@@ -298,7 +299,7 @@ class SetIdentityProvider(command.Command):
kwargs['enabled'] = True kwargs['enabled'] = True
if parsed_args.disable: if parsed_args.disable:
kwargs['enabled'] = False kwargs['enabled'] = False
if parsed_args.remote_id_file or parsed_args.remote_id: if parsed_args.remote_id_file or parsed_args.remote_ids:
kwargs['remote_ids'] = remote_ids kwargs['remote_ids'] = remote_ids
# TODO(pas-ha) actually check for 3.14 microversion # TODO(pas-ha) actually check for 3.14 microversion

View File

@@ -73,8 +73,8 @@ class CreateProject(command.ShowOne):
parser.add_argument( parser.add_argument(
'--property', '--property',
metavar='<key=value>', metavar='<key=value>',
action=parseractions.KeyValueAction,
dest='properties', dest='properties',
action=parseractions.KeyValueAction,
help=_( help=_(
'Add a property to <name> ' 'Add a property to <name> '
'(repeat option to set multiple properties)' '(repeat option to set multiple properties)'

View File

@@ -114,6 +114,7 @@ def add_tag_option_to_parser_for_set(parser, resource_name):
parser.add_argument( parser.add_argument(
'--remove-tag', '--remove-tag',
action='append', action='append',
dest='remove_tags',
metavar='<tag>', metavar='<tag>',
default=[], default=[],
help=_( help=_(
@@ -128,8 +129,8 @@ def update_tags_in_args(parsed_args, obj, args):
if parsed_args.clear_tags: if parsed_args.clear_tags:
args['tags'] = [] args['tags'] = []
obj.tags = [] obj.tags = []
if parsed_args.remove_tag: if parsed_args.remove_tags:
args['tags'] = sorted(set(obj.tags) - set(parsed_args.remove_tag)) args['tags'] = sorted(set(obj.tags) - set(parsed_args.remove_tags))
return return
if parsed_args.tags: if parsed_args.tags:
args['tags'] = sorted(set(obj.tags).union(set(parsed_args.tags))) args['tags'] = sorted(set(obj.tags).union(set(parsed_args.tags)))

View File

@@ -37,6 +37,7 @@ class AuthorizeRequestToken(command.ShowOne):
parser.add_argument( parser.add_argument(
'--role', '--role',
metavar='<role>', metavar='<role>',
dest='roles',
action='append', action='append',
default=[], default=[],
required=True, required=True,
@@ -52,7 +53,7 @@ class AuthorizeRequestToken(command.ShowOne):
# NOTE(stevemar): We want a list of role ids # NOTE(stevemar): We want a list of role ids
roles = [] roles = []
for role in parsed_args.role: for role in parsed_args.roles:
role_id = utils.find_resource( role_id = utils.find_resource(
identity_client.roles, identity_client.roles,
role, role,

View File

@@ -82,9 +82,9 @@ def _get_options_for_user(identity_client, parsed_args):
options['multi_factor_auth_enabled'] = True options['multi_factor_auth_enabled'] = True
if parsed_args.disable_multi_factor_auth: if parsed_args.disable_multi_factor_auth:
options['multi_factor_auth_enabled'] = False options['multi_factor_auth_enabled'] = False
if parsed_args.multi_factor_auth_rule: if parsed_args.multi_factor_auth_rules:
auth_rules = [ auth_rules = [
rule.split(",") for rule in parsed_args.multi_factor_auth_rule rule.split(",") for rule in parsed_args.multi_factor_auth_rules
] ]
if auth_rules: if auth_rules:
options['multi_factor_auth_rules'] = auth_rules options['multi_factor_auth_rules'] = auth_rules
@@ -175,7 +175,8 @@ def _add_user_options(parser):
parser.add_argument( parser.add_argument(
'--multi-factor-auth-rule', '--multi-factor-auth-rule',
metavar='<rule>', metavar='<rule>',
action="append", dest='multi_factor_auth_rules',
action='append',
default=[], default=[],
help=_( help=_(
'Set multi-factor auth rules. For example, to set a rule ' 'Set multi-factor auth rules. For example, to set a rule '

View File

@@ -195,7 +195,7 @@ class TestProjectCreate(TestProject):
self.fake_project.name, self.fake_project.name,
] ]
verifylist = [ verifylist = [
('property', {'fee': 'fi', 'fo': 'fum'}), ('properties', {'fee': 'fi', 'fo': 'fum'}),
('name', self.fake_project.name), ('name', self.fake_project.name),
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -464,7 +464,7 @@ class TestProjectSet(TestProject):
('description', None), ('description', None),
('enable', False), ('enable', False),
('disable', False), ('disable', False),
('property', None), ('properties', None),
] ]
self.projects_mock.get.side_effect = exceptions.NotFound(None) self.projects_mock.get.side_effect = exceptions.NotFound(None)
self.projects_mock.find.side_effect = exceptions.NotFound(None) self.projects_mock.find.side_effect = exceptions.NotFound(None)
@@ -588,7 +588,7 @@ class TestProjectSet(TestProject):
self.fake_project.name, self.fake_project.name,
] ]
verifylist = [ verifylist = [
('property', {'fee': 'fi', 'fo': 'fum'}), ('properties', {'fee': 'fi', 'fo': 'fum'}),
('project', self.fake_project.name), ('project', self.fake_project.name),
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -683,7 +683,7 @@ class TestProjectUnset(TestProject):
self.fake_proj.name, self.fake_proj.name,
] ]
verifylist = [ verifylist = [
('property', ['fee', 'fo']), ('properties', ['fee', 'fo']),
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)

View File

@@ -120,7 +120,7 @@ class TestApplicationCredentialCreate(identity_fakes.TestIdentityv3):
verifylist = [ verifylist = [
('name', self.application_credential.name), ('name', self.application_credential.name),
('secret', 'moresecuresecret'), ('secret', 'moresecuresecret'),
('role', [self.roles.id]), ('roles', [self.roles.id]),
('expiration', '2024-01-01T00:00:00'), ('expiration', '2024-01-01T00:00:00'),
('description', 'credential for testing'), ('description', 'credential for testing'),
] ]

View File

@@ -127,7 +127,7 @@ class TestIdentityProviderCreate(TestIdentityProvider):
] ]
verifylist = [ verifylist = [
('identity_provider_id', identity_fakes.idp_id), ('identity_provider_id', identity_fakes.idp_id),
('remote_id', identity_fakes.idp_remote_ids[:1]), ('remote_ids', identity_fakes.idp_remote_ids[:1]),
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args) columns, data = self.cmd.take_action(parsed_args)
@@ -157,7 +157,7 @@ class TestIdentityProviderCreate(TestIdentityProvider):
] ]
verifylist = [ verifylist = [
('identity_provider_id', identity_fakes.idp_id), ('identity_provider_id', identity_fakes.idp_id),
('remote_id', identity_fakes.idp_remote_ids), ('remote_ids', identity_fakes.idp_remote_ids),
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args) columns, data = self.cmd.take_action(parsed_args)
@@ -561,7 +561,7 @@ class TestIdentityProviderSet(TestIdentityProvider):
('description', new_description), ('description', new_description),
('enable', False), ('enable', False),
('disable', False), ('disable', False),
('remote_id', None), ('remote_ids', None),
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.cmd.take_action(parsed_args) self.cmd.take_action(parsed_args)
@@ -597,7 +597,7 @@ class TestIdentityProviderSet(TestIdentityProvider):
('description', None), ('description', None),
('enable', False), ('enable', False),
('disable', True), ('disable', True),
('remote_id', identity_fakes.idp_remote_ids), ('remote_ids', identity_fakes.idp_remote_ids),
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -637,7 +637,7 @@ class TestIdentityProviderSet(TestIdentityProvider):
('description', None), ('description', None),
('enable', True), ('enable', True),
('disable', False), ('disable', False),
('remote_id', identity_fakes.idp_remote_ids), ('remote_ids', identity_fakes.idp_remote_ids),
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -675,7 +675,7 @@ class TestIdentityProviderSet(TestIdentityProvider):
('description', None), ('description', None),
('enable', True), ('enable', True),
('disable', False), ('disable', False),
('remote_id', [self.new_remote_id]), ('remote_ids', [self.new_remote_id]),
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -756,7 +756,7 @@ class TestIdentityProviderSet(TestIdentityProvider):
('identity_provider', identity_fakes.idp_id), ('identity_provider', identity_fakes.idp_id),
('enable', False), ('enable', False),
('disable', False), ('disable', False),
('remote_id', None), ('remote_ids', None),
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -776,7 +776,7 @@ class TestIdentityProviderSet(TestIdentityProvider):
('identity_provider', identity_fakes.idp_id), ('identity_provider', identity_fakes.idp_id),
('enable', False), ('enable', False),
('disable', False), ('disable', False),
('remote_id', None), ('remote_ids', None),
('authorization_ttl', 60), ('authorization_ttl', 60),
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -800,7 +800,7 @@ class TestIdentityProviderSet(TestIdentityProvider):
('identity_provider', identity_fakes.idp_id), ('identity_provider', identity_fakes.idp_id),
('enable', False), ('enable', False),
('disable', False), ('disable', False),
('remote_id', None), ('remote_ids', None),
('authorization_ttl', 0), ('authorization_ttl', 0),
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -816,7 +816,7 @@ class TestIdentityProviderSet(TestIdentityProvider):
('identity_provider', identity_fakes.idp_id), ('identity_provider', identity_fakes.idp_id),
('enable', False), ('enable', False),
('disable', False), ('disable', False),
('remote_id', None), ('remote_ids', None),
('authorization_ttl', -1), ('authorization_ttl', -1),
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)

View File

@@ -109,7 +109,7 @@ class TestRequestTokenAuthorize(TestOAuth1):
] ]
verifylist = [ verifylist = [
('request_key', identity_fakes.request_token_id), ('request_key', identity_fakes.request_token_id),
('role', [identity_fakes.role_name]), ('roles', [identity_fakes.role_name]),
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args) columns, data = self.cmd.take_action(parsed_args)

View File

@@ -1142,7 +1142,7 @@ class TestProjectSet(TestProject):
verifylist = [ verifylist = [
('enabled', None), ('enabled', None),
('project', self.project.name), ('project', self.project.name),
('remove_tag', ['tag1', 'tag2']), ('remove_tags', ['tag1', 'tag2']),
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)

View File

@@ -730,7 +730,7 @@ class TestUserCreate(identity_fakes.TestIdentityv3):
] ]
verifylist = [ verifylist = [
( (
'multi_factor_auth_rule', 'multi_factor_auth_rules',
[identity_fakes.mfa_opt1, identity_fakes.mfa_opt2], [identity_fakes.mfa_opt1, identity_fakes.mfa_opt2],
), ),
('enable', False), ('enable', False),
@@ -769,7 +769,7 @@ class TestUserCreate(identity_fakes.TestIdentityv3):
verifylist = [ verifylist = [
('ignore_password_expiry', True), ('ignore_password_expiry', True),
('disable_multi_factor_auth', True), ('disable_multi_factor_auth', True),
('multi_factor_auth_rule', [identity_fakes.mfa_opt1]), ('multi_factor_auth_rules', [identity_fakes.mfa_opt1]),
('enable', False), ('enable', False),
('disable', False), ('disable', False),
('name', self.user.name), ('name', self.user.name),
@@ -1667,7 +1667,7 @@ class TestUserSet(identity_fakes.TestIdentityv3):
('name', None), ('name', None),
('password', None), ('password', None),
('email', None), ('email', None),
('multi_factor_auth_rule', [identity_fakes.mfa_opt1]), ('multi_factor_auth_rules', [identity_fakes.mfa_opt1]),
('project', None), ('project', None),
('enable', False), ('enable', False),
('disable', False), ('disable', False),
@@ -1701,7 +1701,7 @@ class TestUserSet(identity_fakes.TestIdentityv3):
('email', None), ('email', None),
('ignore_password_expiry', True), ('ignore_password_expiry', True),
('enable_multi_factor_auth', True), ('enable_multi_factor_auth', True),
('multi_factor_auth_rule', [identity_fakes.mfa_opt1]), ('multi_factor_auth_rules', [identity_fakes.mfa_opt1]),
('project', None), ('project', None),
('enable', False), ('enable', False),
('disable', False), ('disable', False),