in src/azure-cli/azure/cli/command_modules/storage/_validators.py [0:0]
def validate_client_parameters(cmd, namespace):
""" Retrieves storage connection parameters from environment variables and parses out connection string into
account name and key """
n = namespace
if hasattr(n, 'auth_mode'):
auth_mode = n.auth_mode or get_config_value(cmd, 'storage', 'auth_mode', None)
del n.auth_mode
if not n.account_name:
if hasattr(n, 'account_url') and not n.account_url:
n.account_name = get_config_value(cmd, 'storage', 'account', None)
n.account_url = get_config_value(cmd, 'storage', 'account_url', None)
else:
n.account_name = get_config_value(cmd, 'storage', 'account', None)
if auth_mode == 'login':
prefix = cmd.command_kwargs['resource_type'].value[0]
# is_storagv2() is used to distinguish if the command is in track2 SDK
# If yes, we will use get_login_credentials() as token credential
if is_storagev2(prefix):
from azure.cli.core._profile import Profile
profile = Profile(cli_ctx=cmd.cli_ctx)
n.token_credential, _, _ = profile.get_login_credentials(subscription_id=n._subscription)
# Otherwise, we will assume it is in track1 and keep previous token updater
else:
n.token_credential = _create_token_credential(cmd.cli_ctx)
if hasattr(n, 'token_credential') and n.token_credential:
# give warning if there are account key args being ignored
account_key_args = [n.account_key and "--account-key", n.sas_token and "--sas-token",
n.connection_string and "--connection-string"]
account_key_args = [arg for arg in account_key_args if arg]
if account_key_args:
logger.warning('In "login" auth mode, the following arguments are ignored: %s',
' ,'.join(account_key_args))
return
# When there is no input for credential, we will read environment variable
if not n.connection_string and not n.account_key and not n.sas_token:
n.connection_string = get_config_value(cmd, 'storage', 'connection_string', None)
# if connection string supplied or in environment variables, extract account key and name
if n.connection_string:
conn_dict = validate_key_value_pairs(n.connection_string)
n.account_name = conn_dict.get('AccountName')
n.account_key = conn_dict.get('AccountKey')
n.sas_token = conn_dict.get('SharedAccessSignature')
# otherwise, simply try to retrieve the remaining variables from environment variables
if not n.account_name:
if hasattr(n, 'account_url') and not n.account_url:
n.account_name = get_config_value(cmd, 'storage', 'account', None)
n.account_url = get_config_value(cmd, 'storage', 'account_url', None)
else:
n.account_name = get_config_value(cmd, 'storage', 'account', None)
if not n.account_key and not n.sas_token:
n.account_key = get_config_value(cmd, 'storage', 'key', None)
if not n.sas_token:
n.sas_token = get_config_value(cmd, 'storage', 'sas_token', None)
# strip the '?' from sas token. the portal and command line are returns sas token in different
# forms
if n.sas_token:
n.sas_token = n.sas_token.lstrip('?')
# account name with secondary
if n.account_name and n.account_name.endswith('-secondary'):
n.location_mode = 'secondary'
n.account_name = n.account_name[:-10]
# if account name is specified but no key, attempt to query
if n.account_name and not n.account_key and not n.sas_token:
message = """
There are no credentials provided in your command and environment, we will query for account key for your storage account.
It is recommended to provide --connection-string, --account-key or --sas-token in your command as credentials.
"""
if 'auth_mode' in cmd.arguments:
message += """
You also can add `--auth-mode login` in your command to use Azure Active Directory (Azure AD) for authorization if your login account is assigned required RBAC roles.
For more information about RBAC roles in storage, visit https://learn.microsoft.com/azure/storage/common/storage-auth-aad-rbac-cli.
"""
logger.warning('%s\nIn addition, setting the corresponding environment variables can avoid inputting '
'credentials in your command. Please use --help to get more information about environment '
'variable usage.', message)
try:
n.account_key = _query_account_key(cmd.cli_ctx, n.account_name)
except Exception as ex: # pylint: disable=broad-except
logger.warning("\nSkip querying account key due to failure: %s", ex)
if hasattr(n, 'account_url') and n.account_url and not n.account_key and not n.sas_token:
message = """
There are no credentials provided in your command and environment.
Please provide --connection-string, --account-key or --sas-token in your command as credentials.
"""
if 'auth_mode' in cmd.arguments:
message += """
You also can add `--auth-mode login` in your command to use Azure Active Directory (Azure AD) for authorization if your login account is assigned required RBAC roles.
For more information about RBAC roles in storage, visit https://learn.microsoft.com/azure/storage/common/storage-auth-aad-rbac-cli."
"""
from azure.cli.core.azclierror import InvalidArgumentValueError
raise InvalidArgumentValueError(message)