Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 17 additions & 3 deletions src/azure-cli/azure/cli/command_modules/keyvault/_validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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()
Loading