diff --git a/.travis.yml b/.travis.yml index adbf848c3ed..43c7d2eb1bb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,6 +5,7 @@ python: - "3.5" install: - pip install azure==2.0.0a1 + - pip install mock==1.3.0 script: - export PYTHONPATH=$PATHONPATH:./src - python -m unittest discover -s src/azure/cli/tests \ No newline at end of file diff --git a/azure-cli.pyproj b/azure-cli.pyproj index 5c2690500bb..0fa304524fa 100644 --- a/azure-cli.pyproj +++ b/azure-cli.pyproj @@ -25,15 +25,23 @@ - Code + + Code + + + Code + + + Code + diff --git a/src/azure/cli/_debug.py b/src/azure/cli/_debug.py new file mode 100644 index 00000000000..845ec253cd9 --- /dev/null +++ b/src/azure/cli/_debug.py @@ -0,0 +1,12 @@ +import os +from ._logging import logger + +DISABLE_VERIFY_VARIABLE_NAME = "AZURE_CLI_DISABLE_CONNECTION_VERIFICATION" + +def allow_debug_connection(client): + if should_disable_connection_verify(): + logger.warn("Connection verification disabled by environment variable %s", DISABLE_VERIFY_VARIABLE_NAME) + client.config.connection.verify = False + +def should_disable_connection_verify(): + return bool(os.environ.get(DISABLE_VERIFY_VARIABLE_NAME)) diff --git a/src/azure/cli/commands/_command_creation.py b/src/azure/cli/commands/_command_creation.py new file mode 100644 index 00000000000..daacf0aeb2c --- /dev/null +++ b/src/azure/cli/commands/_command_creation.py @@ -0,0 +1,10 @@ +from .._profile import Profile +import azure.cli._debug as _debug +import azure.cli as cli + +def get_service_client(client_type, config_type): + profile = Profile() + client = client_type(config_type(*profile.get_login_credentials())) + _debug.allow_debug_connection(client) + client.config.add_user_agent("AZURECLI_{}".format(cli.__version__)) + return client diff --git a/src/azure/cli/commands/login.py b/src/azure/cli/commands/login.py index 92f7eadd690..09e30b57a51 100644 --- a/src/azure/cli/commands/login.py +++ b/src/azure/cli/commands/login.py @@ -6,6 +6,7 @@ from .._profile import Profile from ..commands import command, description, option +from .._debug import should_disable_connection_verify CLIENT_ID = '04b07795-8ddb-461a-bbee-02f9e1bf7b46' @@ -21,7 +22,7 @@ def login(args, unexpected): import getpass password = getpass.getpass(_('Password: ')) - credentials = UserPassCredentials(username, password, client_id=CLIENT_ID) + credentials = UserPassCredentials(username, password, client_id=CLIENT_ID, verify=not should_disable_connection_verify()) client = SubscriptionClient(SubscriptionClientConfiguration(credentials)) subscriptions = client.subscriptions.list() diff --git a/src/azure/cli/commands/storage.py b/src/azure/cli/commands/storage.py index 92621938fb7..15fde8488db 100644 --- a/src/azure/cli/commands/storage.py +++ b/src/azure/cli/commands/storage.py @@ -2,7 +2,7 @@ from ..main import SESSION from ..commands import command, description, option -from .._profile import Profile +from ._command_creation import get_service_client @command('storage account list') @description(_('List storage accounts')) @@ -13,10 +13,7 @@ def list_accounts(args, unexpected): from azure.mgmt.storage.models import StorageAccount from msrestazure.azure_active_directory import UserPassCredentials - profile = Profile() - smc = StorageManagementClient(StorageManagementClientConfiguration( - *profile.get_login_credentials() - )) + smc = get_service_client(StorageManagementClient, StorageManagementClientConfiguration) group = args.get('resource-group') if group: @@ -32,7 +29,7 @@ def list_accounts(args, unexpected): def checkname(args, unexpected): from azure.mgmt.storage import StorageManagementClient, StorageManagementClientConfiguration - smc = StorageManagementClient(StorageManagementClientConfiguration()) + smc = get_service_client(StorageManagementClient, StorageManagementClientConfiguration) logger.warn(smc.storage_accounts.check_name_availability(args.account_name)) diff --git a/src/azure/cli/tests/test_connection_verify.py b/src/azure/cli/tests/test_connection_verify.py new file mode 100644 index 00000000000..7a6b1c6613b --- /dev/null +++ b/src/azure/cli/tests/test_connection_verify.py @@ -0,0 +1,39 @@ +import os +import unittest +try: + from unittest.mock import MagicMock +except ImportError: + from mock import MagicMock + +from azure.cli._argparse import ArgumentParser, IncorrectUsageError +from azure.cli._logging import logger +import logging +import azure.cli._debug as _debug + + +class Test_argparse(unittest.TestCase): + @classmethod + def setUpClass(cls): + # Ensure initialization has occurred correctly + import azure.cli.main + logging.basicConfig(level=logging.DEBUG) + + @classmethod + def tearDownClass(cls): + logging.shutdown() + + def test_verify_client_connection(self): + os.environ[_debug.DISABLE_VERIFY_VARIABLE_NAME] = "" + self.assertFalse(_debug.should_disable_connection_verify()) + + os.environ[_debug.DISABLE_VERIFY_VARIABLE_NAME] = "1" + self.assertTrue(_debug.should_disable_connection_verify()) + + clientMock = MagicMock() + clientMock.config.connection.verify = True + _debug.allow_debug_connection(clientMock) + self.assertFalse(clientMock.config.connection.verify) + + +if __name__ == '__main__': + unittest.main()