diff --git a/src/azure-cli/azure/cli/command_modules/keyvault/_validators.py b/src/azure-cli/azure/cli/command_modules/keyvault/_validators.py index 668b83ae9a0..87fd84d4bda 100644 --- a/src/azure-cli/azure/cli/command_modules/keyvault/_validators.py +++ b/src/azure-cli/azure/cli/command_modules/keyvault/_validators.py @@ -131,14 +131,28 @@ def process_hsm_name(ns): ns.hsm_name = ns.identifier +def _get_vault_name_options(ns): + """Get the option string of the vault name argument registered for the current command, + as it can be either --vault-name or --name/-n.""" + default_options = '--vault-name' + cmd = getattr(ns, 'cmd', None) + arguments = getattr(cmd, 'arguments', None) or {} + argument = arguments.get('vault_name', None) + options_list = argument.options_list if argument else None + if not options_list: + return default_options + return '/'.join([str(option) for option in options_list]) + + def validate_vault_name_and_hsm_name(ns): vault_name = getattr(ns, 'vault_name', None) hsm_name = getattr(ns, 'hsm_name', None) + vault_name_options = _get_vault_name_options(ns) if vault_name and hsm_name: - raise CLIError('--vault-name and --hsm-name are mutually exclusive.') + raise CLIError('{} and --hsm-name are mutually exclusive.'.format(vault_name_options)) if not vault_name and not hsm_name: - raise CLIError('Please specify --vault-name or --hsm-name.') + raise CLIError('Please specify {} or --hsm-name.'.format(vault_name_options)) # PARAMETER NAMESPACE VALIDATORS @@ -426,7 +440,7 @@ def validate_deleted_vault_or_hsm_name(cmd, ns): hsm_name = getattr(ns, 'hsm_name', None) if not vault_name and not hsm_name: - raise CLIError('Please specify --vault-name or --hsm-name.') + raise CLIError('Please specify {} or --hsm-name.'.format(_get_vault_name_options(ns))) if vault_name: resource_name = vault_name diff --git a/src/azure-cli/azure/cli/command_modules/keyvault/tests/latest/test_validators.py b/src/azure-cli/azure/cli/command_modules/keyvault/tests/latest/test_validators.py new file mode 100644 index 00000000000..9d354c75740 --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/keyvault/tests/latest/test_validators.py @@ -0,0 +1,60 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# -------------------------------------------------------------------------------------------- + +import unittest + +from knack.arguments import CLICommandArgument +from knack.util import CLIError + +from azure.cli.command_modules.keyvault._validators import ( + validate_deleted_vault_or_hsm_name, + validate_vault_name_and_hsm_name, +) + + +class _Command: + def __init__(self, vault_name_options): + self.arguments = { + 'vault_name': CLICommandArgument('vault_name', options_list=vault_name_options) + } + + +class _Namespace: + def __init__(self, vault_name_options=None, vault_name=None, hsm_name=None): + if vault_name_options: + self.cmd = _Command(vault_name_options) + self.vault_name = vault_name + self.hsm_name = hsm_name + + +class KeyVaultValidatorsTest(unittest.TestCase): + def test_validate_vault_name_and_hsm_name(self): + # the error message should match the option registered for the command + with self.assertRaisesRegex(CLIError, r'Please specify --name/-n or --hsm-name\.'): + validate_vault_name_and_hsm_name(_Namespace(vault_name_options=['--name', '-n'])) + + with self.assertRaisesRegex(CLIError, r'--name/-n and --hsm-name are mutually exclusive\.'): + validate_vault_name_and_hsm_name( + _Namespace(vault_name_options=['--name', '-n'], vault_name='vault', hsm_name='hsm')) + + with self.assertRaisesRegex(CLIError, r'Please specify --vault-name or --hsm-name\.'): + validate_vault_name_and_hsm_name(_Namespace(vault_name_options=['--vault-name'])) + + # fall back to --vault-name when the vault name argument can't be resolved + with self.assertRaisesRegex(CLIError, r'Please specify --vault-name or --hsm-name\.'): + validate_vault_name_and_hsm_name(_Namespace()) + + # no exception when just one of them is specified + validate_vault_name_and_hsm_name(_Namespace(vault_name_options=['--name', '-n'], vault_name='vault')) + validate_vault_name_and_hsm_name(_Namespace(vault_name_options=['--name', '-n'], hsm_name='hsm')) + + def test_validate_deleted_vault_or_hsm_name(self): + ns = _Namespace(vault_name_options=['--name', '-n']) + with self.assertRaisesRegex(CLIError, r'Please specify --name/-n or --hsm-name\.'): + validate_deleted_vault_or_hsm_name(ns.cmd, ns) + + +if __name__ == '__main__': + unittest.main()