diff --git a/src/azure-cli/azure/cli/command_modules/profile/__init__.py b/src/azure-cli/azure/cli/command_modules/profile/__init__.py index 8b0e3020529..a86af29f29c 100644 --- a/src/azure-cli/azure/cli/command_modules/profile/__init__.py +++ b/src/azure-cli/azure/cli/command_modules/profile/__init__.py @@ -50,6 +50,9 @@ def load_arguments(self, command): help='User password or service principal secret. Will prompt if not given.') c.argument('tenant', options_list=['--tenant', '-t'], validator=validate_tenant, help='The Microsoft Entra tenant, must be provided when using a service principal.') + c.argument('subscription', + help='The subscription ID that will be used as the default. ' + 'Specifying this argument will bypass the interactive subscription selector.') c.argument('scopes', options_list=['--scope'], nargs='+', help='Used in the /authorize request. It can cover only one static resource.') c.argument('allow_no_subscriptions', action='store_true', diff --git a/src/azure-cli/azure/cli/command_modules/profile/custom.py b/src/azure-cli/azure/cli/command_modules/profile/custom.py index d804bb1f3d3..b278d83dae9 100644 --- a/src/azure-cli/azure/cli/command_modules/profile/custom.py +++ b/src/azure-cli/azure/cli/command_modules/profile/custom.py @@ -121,7 +121,9 @@ def account_clear(cmd): # pylint: disable=too-many-branches, too-many-locals -def login(cmd, username=None, password=None, tenant=None, scopes=None, allow_no_subscriptions=False, +def login(cmd, username=None, password=None, + tenant=None, subscription=None, + scopes=None, allow_no_subscriptions=False, claims_challenge=None, # Device code flow use_device_code=False, @@ -187,7 +189,8 @@ def login(cmd, username=None, password=None, tenant=None, scopes=None, allow_no_ from azure.cli.core.telemetry import set_login_experience_v2 set_login_experience_v2(login_experience_v2) - select_subscription = interactive and sys.stdin.isatty() and sys.stdout.isatty() and login_experience_v2 + select_subscription = (not subscription and + interactive and sys.stdin.isatty() and sys.stdout.isatty() and login_experience_v2) subscriptions = profile.login( interactive, @@ -215,6 +218,9 @@ def login(cmd, username=None, password=None, tenant=None, scopes=None, allow_no_ logger.warning(LOGIN_OUTPUT_WARNING) return + if subscription: + profile.set_active_subscription(subscription) + all_subscriptions = list(subscriptions) for sub in all_subscriptions: sub['cloudName'] = sub.pop('environmentName', None) diff --git a/src/azure-cli/azure/cli/command_modules/profile/tests/latest/test_profile_custom.py b/src/azure-cli/azure/cli/command_modules/profile/tests/latest/test_profile_custom.py index 74547381ccf..b45eb8a3991 100644 --- a/src/azure-cli/azure/cli/command_modules/profile/tests/latest/test_profile_custom.py +++ b/src/azure-cli/azure/cli/command_modules/profile/tests/latest/test_profile_custom.py @@ -11,7 +11,7 @@ from azure.cli.core.mock import DummyCli from knack.util import CLIError - +from azure.cli.testsdk.scenario_tests.const import MOCKED_TENANT_ID, MOCKED_SUBSCRIPTION_ID class ProfileCommandTest(unittest.TestCase): @mock.patch('azure.cli.core.api.load_subscriptions', autospec=True) @@ -107,6 +107,27 @@ def login_with_managed_identity_mock(*args, **kwargs): # assert self.assertTrue(invoked) + @mock.patch('sys.stdin.isatty', return_value=True) + @mock.patch('sys.stdout.isatty', return_value=True) + @mock.patch('azure.cli.command_modules.profile._subscription_selector.SubscriptionSelector') + @mock.patch('azure.cli.core._profile.Profile.set_active_subscription') + @mock.patch('azure.cli.core._profile.Profile.login') + def test_login_with_subscription(self, login_mock, set_active_subscription_mock, subscription_selector_mock, *_): + cmd = mock.MagicMock() + login_mock.return_value = [{ + 'environmentName': 'AzureCloud', + 'homeTenantId': MOCKED_TENANT_ID, + 'id': MOCKED_SUBSCRIPTION_ID, + 'isDefault': False, + 'managedByTenants': [], + 'name': 'test subscription name', + 'state': 'Enabled', + 'tenantId': MOCKED_TENANT_ID, + 'user': {'name': 'test@microsoft.com', 'type': 'user'}}] + login(cmd, subscription=MOCKED_SUBSCRIPTION_ID) + subscription_selector_mock.assert_not_called() + set_active_subscription_mock.assert_called_with(MOCKED_SUBSCRIPTION_ID) + def test_login_validate_tenant(self): from azure.cli.command_modules.profile._validators import validate_tenant