codecov-io: # [Codecov](https://codecov.io/gh/Azure/azure-cli/pull/3164?src=pr&el=h1) Report
> Merging [#3164](https://codecov.io/gh/Azure/azure-cli/pull/3164?src=pr&el=desc) into [master](https://codecov.io/gh/Azure/azure-cli/commit/0c5e91ca52cf0ed5f9284968dd3272275020ce89?src=pr&el=desc) will **increase** coverage by `<.01%`.
> The diff coverage is `92.59%`.

[![Impacted file tree graph](https://codecov.io/gh/Azure/azure-cli/pull/3164/graphs/tree.svg?width=650&height=150&src=pr&token=2pog0TKvF8)](https://codecov.io/gh/Azure/azure-cli/pull/3164?src=pr&el=tree)

```diff
@@            Coverage Diff             @@
##           master    #3164      +/-   ##
==========================================
+ Coverage   71.11%   71.12%   +<.01%     
==========================================
  Files         362      362              
  Lines       23914    23929      +15     
  Branches     3653     3658       +5     
==========================================
+ Hits        17006    17019      +13     
  Misses       5812     5812              
- Partials     1096     1098       +2
```


| [Impacted Files](https://codecov.io/gh/Azure/azure-cli/pull/3164?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [src/azure-cli-core/azure/cli/core/\_profile.py](https://codecov.io/gh/Azure/azure-cli/pull/3164?src=pr&el=tree#diff-c3JjL2F6dXJlLWNsaS1jb3JlL2F6dXJlL2NsaS9jb3JlL19wcm9maWxlLnB5) | `87.64% <92.59%> (-0.04%)` | :arrow_down: |

------

[Continue to review full report at Codecov](https://codecov.io/gh/Azure/azure-cli/pull/3164?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/Azure/azure-cli/pull/3164?src=pr&el=footer). Last update [0c5e91c...d097884](https://codecov.io/gh/Azure/azure-cli/pull/3164?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).

diff --git a/src/azure-cli-core/HISTORY.rst b/src/azure-cli-core/HISTORY.rst
index 0db20c494..49f585169 100644
--- a/src/azure-cli-core/HISTORY.rst
+++ b/src/azure-cli-core/HISTORY.rst
@@ -6,6 +6,7 @@ Release History
 ^^^^^^^^^^^^^^^^^^
 * core: capture exceptions caused by unregistered provider and auto-register it   
 * login: avoid the bad exception when the user account has no subscription and no tenants
+* perf: persist adal token cache in memory till process exits (#2603)
 
 2.0.4 (2017-04-28)
 ^^^^^^^^^^^^^^^^^^
diff --git a/src/azure-cli-core/azure/cli/core/_profile.py b/src/azure-cli-core/azure/cli/core/_profile.py
index b5a6c77a6..4cae579da 100644
--- a/src/azure-cli-core/azure/cli/core/_profile.py
+++ b/src/azure-cli-core/azure/cli/core/_profile.py
@@ -93,11 +93,20 @@ class CredentialType(Enum):  # pylint: disable=too-few-public-methods
     rbac = CLOUD.endpoints.active_directory_graph_resource_id
 
 
+_GLOBAL_CREDS_CACHE = None
+
+
 class Profile(object):
-    def __init__(self, storage=None, auth_ctx_factory=None):
+    def __init__(self, storage=None, auth_ctx_factory=None, use_global_creds_cache=True):
         self._storage = storage or ACCOUNT
         self.auth_ctx_factory = auth_ctx_factory or _AUTH_CTX_FACTORY
-        self._creds_cache = CredsCache(self.auth_ctx_factory)
+        if use_global_creds_cache:
+            global _GLOBAL_CREDS_CACHE  # pylint: disable=global-statement
+            if _GLOBAL_CREDS_CACHE is None:
+                _GLOBAL_CREDS_CACHE = CredsCache(self.auth_ctx_factory, async_persist=True)
+            self._creds_cache = _GLOBAL_CREDS_CACHE
+        else:
+            self._creds_cache = CredsCache(self.auth_ctx_factory, async_persist=False)
         self._management_resource_uri = CLOUD.endpoints.management
         self._ad_resource_uri = CLOUD.endpoints.active_directory_resource_id
 
@@ -470,29 +479,39 @@ class CredsCache(object):
     also be handled
     '''
 
-    def __init__(self, auth_ctx_factory=None):
+    def __init__(self, auth_ctx_factory=None, async_persist=True):
         # AZURE_ACCESS_TOKEN_FILE is used by Cloud Console and not meant to be user configured
         self._token_file = (os.environ.get('AZURE_ACCESS_TOKEN_FILE', None) or
                             os.path.join(get_config_dir(), 'accessTokens.json'))
         self._service_principal_creds = []
         self._auth_ctx_factory = auth_ctx_factory or _AUTH_CTX_FACTORY
         self._adal_token_cache_attr = None
+        self._should_flush_to_disk = False
+        self._async_persist = async_persist
+        if async_persist:
+            import atexit
+            atexit.register(self.flush_to_disk)
 
     def persist_cached_creds(self):
-        with os.fdopen(os.open(self._token_file, os.O_RDWR | os.O_CREAT | os.O_TRUNC, 0o600),
-                       'w+') as cred_file:
-            items = self.adal_token_cache.read_items()
-            all_creds = [entry for _, entry in items]
+        self._should_flush_to_disk = True
+        if not self._async_persist:
+            self.flush_to_disk()
+        self.adal_token_cache.has_state_changed = False
 
-            # trim away useless fields (needed for cred sharing with xplat)
-            for i in all_creds:
-                for key in TOKEN_FIELDS_EXCLUDED_FROM_PERSISTENCE:
-                    i.pop(key, None)
+    def flush_to_disk(self):
+        if self._should_flush_to_disk:
+            with os.fdopen(os.open(self._token_file, os.O_RDWR | os.O_CREAT | os.O_TRUNC, 0o600),
+                           'w+') as cred_file:
+                items = self.adal_token_cache.read_items()
+                all_creds = [entry for _, entry in items]
 
-            all_creds.extend(self._service_principal_creds)
-            cred_file.write(json.dumps(all_creds))
+                # trim away useless fields (needed for cred sharing with xplat)
+                for i in all_creds:
+                    for key in TOKEN_FIELDS_EXCLUDED_FROM_PERSISTENCE:
+                        i.pop(key, None)
 
-        self.adal_token_cache.has_state_changed = False
+                all_creds.extend(self._service_principal_creds)
+                cred_file.write(json.dumps(all_creds))
 
     def retrieve_token_for_user(self, username, tenant, resource):
         authority = get_authority_url(tenant)

auth: cache adal token cache in memory
The goal is to use a single copy of token cache across the same process, rather dump it after getting a token. Building up a token cache is non trivial involving reading and writing the ~/.azure/accesstoken.json. For some commands which involves 1000+ rest call, like datalake, the perf hit is not trivial.
diff --git a/src/azure-cli-core/tests/test_profile.py b/src/azure-cli-core/tests/test_profile.py
index 6f25f61de..ea3648494 100644
--- a/src/azure-cli-core/tests/test_profile.py
+++ b/src/azure-cli-core/tests/test_profile.py
@@ -76,7 +76,7 @@ class Test_Profile(unittest.TestCase):  # pylint: disable=too-many-public-method
 
     def test_update_add_two_different_subscriptions(self):
         storage_mock = {'subscriptions': None}
-        profile = Profile(storage_mock)
+        profile = Profile(storage_mock, use_global_creds_cache=False)
 
         # add the first and verify
         consolidated = Profile._normalize_properties(self.user1,
@@ -127,7 +127,7 @@ class Test_Profile(unittest.TestCase):  # pylint: disable=too-many-public-method
 
     def test_update_with_same_subscription_added_twice(self):
         storage_mock = {'subscriptions': None}
-        profile = Profile(storage_mock)
+        profile = Profile(storage_mock, use_global_creds_cache=False)
 
         # add one twice and verify we will have one but with new token
         consolidated = Profile._normalize_properties(self.user1,
@@ -149,7 +149,7 @@ class Test_Profile(unittest.TestCase):  # pylint: disable=too-many-public-method
 
     def test_set_active_subscription(self):
         storage_mock = {'subscriptions': None}
-        profile = Profile(storage_mock)
+        profile = Profile(storage_mock, use_global_creds_cache=False)
 
         consolidated = Profile._normalize_properties(self.user1,
                                                      [self.subscription1],
@@ -169,7 +169,7 @@ class Test_Profile(unittest.TestCase):  # pylint: disable=too-many-public-method
 
     def test_default_active_subscription_to_non_disabled_one(self):
         storage_mock = {'subscriptions': None}
-        profile = Profile(storage_mock)
+        profile = Profile(storage_mock, use_global_creds_cache=False)
 
         subscriptions = profile._normalize_properties(
             self.user2, [self.subscription2, self.subscription1], False)
@@ -182,7 +182,7 @@ class Test_Profile(unittest.TestCase):  # pylint: disable=too-many-public-method
 
     def test_get_subscription(self):
         storage_mock = {'subscriptions': None}
-        profile = Profile(storage_mock)
+        profile = Profile(storage_mock, use_global_creds_cache=False)
 
         consolidated = Profile._normalize_properties(self.user1,
                                                      [self.subscription1],
@@ -200,7 +200,7 @@ class Test_Profile(unittest.TestCase):  # pylint: disable=too-many-public-method
 
     def test_get_expanded_subscription_info(self):
         storage_mock = {'subscriptions': None}
-        profile = Profile(storage_mock)
+        profile = Profile(storage_mock, use_global_creds_cache=False)
 
         consolidated = Profile._normalize_properties(self.user1,
                                                      [self.subscription1],
@@ -236,7 +236,7 @@ class Test_Profile(unittest.TestCase):  # pylint: disable=too-many-public-method
                                     lambda _: mock_arm_client)
 
         storage_mock = {'subscriptions': []}
-        profile = Profile(storage_mock)
+        profile = Profile(storage_mock, use_global_creds_cache=False)
         profile._management_resource_uri = 'https://management.core.windows.net/'
         profile.find_subscriptions_on_login(False,
                                             '1234',
@@ -264,7 +264,7 @@ class Test_Profile(unittest.TestCase):  # pylint: disable=too-many-public-method
                                     lambda _: mock_arm_client)
 
         storage_mock = {'subscriptions': []}
-        profile = Profile(storage_mock)
+        profile = Profile(storage_mock, use_global_creds_cache=False)
         profile._management_resource_uri = 'https://management.core.windows.net/'
 
         # action
@@ -288,7 +288,7 @@ class Test_Profile(unittest.TestCase):  # pylint: disable=too-many-public-method
         finder = mock.MagicMock()
         finder.find_through_interactive_flow.return_value = []
         storage_mock = {'subscriptions': []}
-        profile = Profile(storage_mock)
+        profile = Profile(storage_mock, use_global_creds_cache=False)
 
         # action
         result = profile.find_subscriptions_on_login(True,
@@ -308,7 +308,7 @@ class Test_Profile(unittest.TestCase):  # pylint: disable=too-many-public-method
         mock_read_cred_file.return_value = [Test_Profile.token_entry1]
 
         storage_mock = {'subscriptions': None}
-        profile = Profile(storage_mock)
+        profile = Profile(storage_mock, use_global_creds_cache=False)
         consolidated = Profile._normalize_properties(self.user1,
                                                      [self.subscription1],
                                                      False)
@@ -322,7 +322,7 @@ class Test_Profile(unittest.TestCase):  # pylint: disable=too-many-public-method
     @mock.patch('azure.cli.core._profile._load_tokens_from_file', return_value=None)
     def test_create_token_cache(self, mock_read_file):
         mock_read_file.return_value = []
-        profile = Profile()
+        profile = Profile(use_global_creds_cache=False)
         cache = profile._creds_cache.adal_token_cache
         self.assertFalse(cache.read_items())
         self.assertTrue(mock_read_file.called)
@@ -330,7 +330,7 @@ class Test_Profile(unittest.TestCase):  # pylint: disable=too-many-public-method
     @mock.patch('azure.cli.core._profile._load_tokens_from_file', autospec=True)
     def test_load_cached_tokens(self, mock_read_file):
         mock_read_file.return_value = [Test_Profile.token_entry1]
-        profile = Profile()
+        profile = Profile(use_global_creds_cache=False)
         cache = profile._creds_cache.adal_token_cache
         matched = cache.find({
             "_authority": "https://login.microsoftonline.com/common",
@@ -348,7 +348,7 @@ class Test_Profile(unittest.TestCase):  # pylint: disable=too-many-public-method
         mock_get_token.return_value = (some_token_type, Test_Profile.raw_token1)
         # setup
         storage_mock = {'subscriptions': None}
-        profile = Profile(storage_mock)
+        profile = Profile(storage_mock, use_global_creds_cache=False)
         consolidated = Profile._normalize_properties(self.user1,
                                                      [self.subscription1],
                                                      False)
@@ -375,7 +375,7 @@ class Test_Profile(unittest.TestCase):  # pylint: disable=too-many-public-method
         mock_get_token.return_value = (some_token_type, Test_Profile.raw_token1)
         # setup
         storage_mock = {'subscriptions': None}
-        profile = Profile(storage_mock)
+        profile = Profile(storage_mock, use_global_creds_cache=False)
         consolidated = Profile._normalize_properties(self.user1, [self.subscription1],
                                                      False)
         profile._set_subscriptions(consolidated)
@@ -395,7 +395,7 @@ class Test_Profile(unittest.TestCase):  # pylint: disable=too-many-public-method
         mock_read_cred_file.return_value = [Test_Profile.token_entry1]
 
         storage_mock = {'subscriptions': None}
-        profile = Profile(storage_mock)
+        profile = Profile(storage_mock, use_global_creds_cache=False)
         consolidated = Profile._normalize_properties(self.user1,
                                                      [self.subscription1],
                                                      False)
@@ -413,7 +413,7 @@ class Test_Profile(unittest.TestCase):  # pylint: disable=too-many-public-method
     def test_logout_all(self, mock_delete_cred_file):
         # setup
         storage_mock = {'subscriptions': None}
-        profile = Profile(storage_mock)
+        profile = Profile(storage_mock, use_global_creds_cache=False)
         consolidated = Profile._normalize_properties(self.user1,
                                                      [self.subscription1],
                                                      False)
@@ -584,7 +584,7 @@ class Test_Profile(unittest.TestCase):  # pylint: disable=too-many-public-method
         mock_read_file.return_value = [self.token_entry1, test_sp]
 
         # action
-        creds_cache = CredsCache()
+        creds_cache = CredsCache(async_persist=False)
 
         # assert
         token_entries = [entry for _, entry in creds_cache.load_adal_token_cache().read_items()]
@@ -601,7 +601,7 @@ class Test_Profile(unittest.TestCase):  # pylint: disable=too-many-public-method
         mock_read_file.return_value = [test_sp]
 
         # action
-        creds_cache = CredsCache()
+        creds_cache = CredsCache(async_persist=False)
         creds_cache.load_adal_token_cache()
 
         # assert
@@ -623,7 +623,7 @@ class Test_Profile(unittest.TestCase):  # pylint: disable=too-many-public-method
         }
         mock_open_for_write.return_value = FileHandleStub()
         mock_read_file.return_value = [self.token_entry1, test_sp]
-        creds_cache = CredsCache()
+        creds_cache = CredsCache(async_persist=False)
 
         # action
         creds_cache.save_service_principal_cred(test_sp2)
@@ -645,7 +645,7 @@ class Test_Profile(unittest.TestCase):  # pylint: disable=too-many-public-method
         }
         mock_open_for_write.return_value = FileHandleStub()
         mock_read_file.return_value = [test_sp]
-        creds_cache = CredsCache()
+        creds_cache = CredsCache(async_persist=False)
 
         # action
         creds_cache.save_service_principal_cred(test_sp)
@@ -664,7 +664,7 @@ class Test_Profile(unittest.TestCase):  # pylint: disable=too-many-public-method
         }
         mock_open_for_write.return_value = FileHandleStub()
         mock_read_file.return_value = [self.token_entry1, test_sp]
-        creds_cache = CredsCache()
+        creds_cache = CredsCache(async_persist=False)
 
         # action #1, logout a user
         creds_cache.remove_cached_creds(self.user1)
@@ -704,7 +704,7 @@ class Test_Profile(unittest.TestCase):  # pylint: disable=too-many-public-method
         mock_adal_auth_context.acquire_token.side_effect = acquire_token_side_effect
         mock_open_for_write.return_value = FileHandleStub()
         mock_read_file.return_value = [self.token_entry1]
-        creds_cache = CredsCache(auth_ctx_factory=get_auth_context)
+        creds_cache = CredsCache(auth_ctx_factory=get_auth_context, async_persist=False)
 
         # action
         mgmt_resource = 'https://management.core.windows.net/'

python scripts/dev_setup.py
parse_log_pytest
requirements.txt
pytest
apt-get update apt-get install -y gcc
3.5
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
adal==0.4.3
applicationinsights==0.10.0
argcomplete==1.8.0
astroid==1.4.9
attrs==22.2.0
autopep8==1.2.4
azure-batch==2.0.1
-e git+https://github.com/Azure/azure-cli.git@0c5e91ca52cf0ed5f9284968dd3272275020ce89#egg=azure_cli&subdirectory=src/azure-cli
-e git+https://github.com/Azure/azure-cli.git@0c5e91ca52cf0ed5f9284968dd3272275020ce89#egg=azure_cli_acr&subdirectory=src/command_modules/azure-cli-acr
-e git+https://github.com/Azure/azure-cli.git@0c5e91ca52cf0ed5f9284968dd3272275020ce89#egg=azure_cli_acs&subdirectory=src/command_modules/azure-cli-acs
-e git+https://github.com/Azure/azure-cli.git@0c5e91ca52cf0ed5f9284968dd3272275020ce89#egg=azure_cli_appservice&subdirectory=src/command_modules/azure-cli-appservice
-e git+https://github.com/Azure/azure-cli.git@0c5e91ca52cf0ed5f9284968dd3272275020ce89#egg=azure_cli_batch&subdirectory=src/command_modules/azure-cli-batch
-e git+https://github.com/Azure/azure-cli.git@0c5e91ca52cf0ed5f9284968dd3272275020ce89#egg=azure_cli_cloud&subdirectory=src/command_modules/azure-cli-cloud
-e git+https://github.com/Azure/azure-cli.git@0c5e91ca52cf0ed5f9284968dd3272275020ce89#egg=azure_cli_cognitiveservices&subdirectory=src/command_modules/azure-cli-cognitiveservices
azure-cli-command-modules-nspkg==2.0.3
-e git+https://github.com/Azure/azure-cli.git@0c5e91ca52cf0ed5f9284968dd3272275020ce89#egg=azure_cli_component&subdirectory=src/command_modules/azure-cli-component
-e git+https://github.com/Azure/azure-cli.git@0c5e91ca52cf0ed5f9284968dd3272275020ce89#egg=azure_cli_configure&subdirectory=src/command_modules/azure-cli-configure
azure-cli-container==0.3.18
-e git+https://github.com/Azure/azure-cli.git@0c5e91ca52cf0ed5f9284968dd3272275020ce89#egg=azure_cli_core&subdirectory=src/azure-cli-core
-e git+https://github.com/Azure/azure-cli.git@0c5e91ca52cf0ed5f9284968dd3272275020ce89#egg=azure_cli_dla&subdirectory=src/command_modules/azure-cli-dla
-e git+https://github.com/Azure/azure-cli.git@0c5e91ca52cf0ed5f9284968dd3272275020ce89#egg=azure_cli_dls&subdirectory=src/command_modules/azure-cli-dls
-e git+https://github.com/Azure/azure-cli.git@0c5e91ca52cf0ed5f9284968dd3272275020ce89#egg=azure_cli_documentdb&subdirectory=src/command_modules/azure-cli-documentdb
-e git+https://github.com/Azure/azure-cli.git@0c5e91ca52cf0ed5f9284968dd3272275020ce89#egg=azure_cli_feedback&subdirectory=src/command_modules/azure-cli-feedback
-e git+https://github.com/Azure/azure-cli.git@0c5e91ca52cf0ed5f9284968dd3272275020ce89#egg=azure_cli_find&subdirectory=src/command_modules/azure-cli-find
-e git+https://github.com/Azure/azure-cli.git@0c5e91ca52cf0ed5f9284968dd3272275020ce89#egg=azure_cli_iot&subdirectory=src/command_modules/azure-cli-iot
-e git+https://github.com/Azure/azure-cli.git@0c5e91ca52cf0ed5f9284968dd3272275020ce89#egg=azure_cli_keyvault&subdirectory=src/command_modules/azure-cli-keyvault
-e git+https://github.com/Azure/azure-cli.git@0c5e91ca52cf0ed5f9284968dd3272275020ce89#egg=azure_cli_lab&subdirectory=src/command_modules/azure-cli-lab
-e git+https://github.com/Azure/azure-cli.git@0c5e91ca52cf0ed5f9284968dd3272275020ce89#egg=azure_cli_monitor&subdirectory=src/command_modules/azure-cli-monitor
-e git+https://github.com/Azure/azure-cli.git@0c5e91ca52cf0ed5f9284968dd3272275020ce89#egg=azure_cli_network&subdirectory=src/command_modules/azure-cli-network
-e git+https://github.com/Azure/azure-cli.git@0c5e91ca52cf0ed5f9284968dd3272275020ce89#egg=azure_cli_nspkg&subdirectory=src/azure-cli-nspkg
-e git+https://github.com/Azure/azure-cli.git@0c5e91ca52cf0ed5f9284968dd3272275020ce89#egg=azure_cli_profile&subdirectory=src/command_modules/azure-cli-profile
-e git+https://github.com/Azure/azure-cli.git@0c5e91ca52cf0ed5f9284968dd3272275020ce89#egg=azure_cli_redis&subdirectory=src/command_modules/azure-cli-redis
-e git+https://github.com/Azure/azure-cli.git@0c5e91ca52cf0ed5f9284968dd3272275020ce89#egg=azure_cli_resource&subdirectory=src/command_modules/azure-cli-resource
-e git+https://github.com/Azure/azure-cli.git@0c5e91ca52cf0ed5f9284968dd3272275020ce89#egg=azure_cli_role&subdirectory=src/command_modules/azure-cli-role
-e git+https://github.com/Azure/azure-cli.git@0c5e91ca52cf0ed5f9284968dd3272275020ce89#egg=azure_cli_shell&subdirectory=src/command_modules/azure-cli-shell
-e git+https://github.com/Azure/azure-cli.git@0c5e91ca52cf0ed5f9284968dd3272275020ce89#egg=azure_cli_sql&subdirectory=src/command_modules/azure-cli-sql
-e git+https://github.com/Azure/azure-cli.git@0c5e91ca52cf0ed5f9284968dd3272275020ce89#egg=azure_cli_storage&subdirectory=src/command_modules/azure-cli-storage
-e git+https://github.com/Azure/azure-cli.git@0c5e91ca52cf0ed5f9284968dd3272275020ce89#egg=azure_cli_taskhelp&subdirectory=src/command_modules/azure-cli-taskhelp
-e git+https://github.com/Azure/azure-cli.git@0c5e91ca52cf0ed5f9284968dd3272275020ce89#egg=azure_cli_testsdk&subdirectory=src/azure-cli-testsdk
-e git+https://github.com/Azure/azure-cli.git@0c5e91ca52cf0ed5f9284968dd3272275020ce89#egg=azure_cli_utility_automation&subdirectory=scripts
-e git+https://github.com/Azure/azure-cli.git@0c5e91ca52cf0ed5f9284968dd3272275020ce89#egg=azure_cli_vm&subdirectory=src/command_modules/azure-cli-vm
azure-common==1.1.28
azure-core==1.24.2
azure-datalake-store==0.0.8
azure-graphrbac==0.30.0rc6
azure-keyvault==0.2.0
azure-mgmt-authorization==0.30.0rc6
azure-mgmt-batch==3.0.1
azure-mgmt-cognitiveservices==1.0.0
azure-mgmt-compute==1.0.0rc1
azure-mgmt-containerinstance==1.4.0
azure-mgmt-containerregistry==0.2.1
azure-mgmt-datalake-analytics==0.1.4
azure-mgmt-datalake-nspkg==3.0.1
azure-mgmt-datalake-store==0.1.4
azure-mgmt-devtestlabs==2.0.0
azure-mgmt-dns==1.0.1
azure-mgmt-documentdb==0.1.3
azure-mgmt-iothub==0.2.2
azure-mgmt-keyvault==0.31.0
azure-mgmt-loganalytics==0.2.0
azure-mgmt-monitor==0.2.1
azure-mgmt-network==3.0.0
azure-mgmt-nspkg==3.0.2
azure-mgmt-redis==1.0.0
azure-mgmt-resource==1.0.0rc1
azure-mgmt-sql==0.4.0
azure-mgmt-storage==1.0.0rc1
azure-mgmt-trafficmanager==0.30.0
azure-mgmt-web==0.32.0
azure-monitor==0.3.0
azure-multiapi-storage==0.1.0
azure-nspkg==1.0.0
certifi==2021.5.30
cffi==1.15.1
colorama==0.3.7
coverage==4.2
cryptography==40.0.2
flake8==3.2.1
futures==3.1.1
importlib-metadata==4.8.3
iniconfig==1.1.1
isodate==0.7.0
jeepney==0.7.1
jmespath==0.10.0
keyring==23.4.1
lazy-object-proxy==1.7.1
mccabe==0.5.3
mock==1.3.0
msrest==0.4.29
msrestazure==0.4.34
nose==1.3.7
oauthlib==3.2.2
packaging==21.3
paramiko==2.0.2
pbr==6.1.1
pep8==1.7.1
pluggy==1.0.0
prompt-toolkit==3.0.36
py==1.11.0
pyasn1==0.5.1
pycodestyle==2.2.0
pycparser==2.21
pydocumentdb==2.3.5
pyflakes==1.3.0
Pygments==2.1.3
PyJWT==2.4.0
pylint==1.5.4
pyOpenSSL==16.2.0
pyparsing==3.1.4
pytest==7.0.1
python-dateutil==2.9.0.post0
PyYAML==3.11
requests==2.9.1
requests-oauthlib==2.0.0
scp==0.15.0
SecretStorage==3.3.3
six==1.10.0
sshtunnel==0.4.0
tabulate==0.7.5
tomli==1.2.3
typing-extensions==4.1.1
urllib3==1.16
vcrpy==1.10.3
vsts-cd-manager==1.0.2
wcwidth==0.2.13
websocket-client==1.3.1
Whoosh==2.7.4
wrapt==1.16.0
xmltodict==0.14.2
zipp==3.6.0

name: azure-cli
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - adal==0.4.3
      - applicationinsights==0.10.0
      - argcomplete==1.8.0
      - astroid==1.4.9
      - attrs==22.2.0
      - autopep8==1.2.4
      - azure-batch==2.0.1
      - azure-cli-command-modules-nspkg==2.0.3
      - azure-cli-container==0.3.18
      - azure-common==1.1.28
      - azure-core==1.24.2
      - azure-datalake-store==0.0.8
      - azure-graphrbac==0.30.0rc6
      - azure-keyvault==0.2.0
      - azure-mgmt-authorization==0.30.0rc6
      - azure-mgmt-batch==3.0.1
      - azure-mgmt-cognitiveservices==1.0.0
      - azure-mgmt-compute==1.0.0rc1
      - azure-mgmt-containerinstance==1.4.0
      - azure-mgmt-containerregistry==0.2.1
      - azure-mgmt-datalake-analytics==0.1.4
      - azure-mgmt-datalake-nspkg==3.0.1
      - azure-mgmt-datalake-store==0.1.4
      - azure-mgmt-devtestlabs==2.0.0
      - azure-mgmt-dns==1.0.1
      - azure-mgmt-documentdb==0.1.3
      - azure-mgmt-iothub==0.2.2
      - azure-mgmt-keyvault==0.31.0
      - azure-mgmt-loganalytics==0.2.0
      - azure-mgmt-monitor==0.2.1
      - azure-mgmt-network==3.0.0
      - azure-mgmt-nspkg==3.0.2
      - azure-mgmt-redis==1.0.0
      - azure-mgmt-resource==1.0.0rc1
      - azure-mgmt-sql==0.4.0
      - azure-mgmt-storage==1.0.0rc1
      - azure-mgmt-trafficmanager==0.30.0
      - azure-mgmt-web==0.32.0
      - azure-monitor==0.3.0
      - azure-multiapi-storage==0.1.0
      - azure-nspkg==1.0.0
      - cffi==1.15.1
      - colorama==0.3.7
      - coverage==4.2
      - cryptography==40.0.2
      - flake8==3.2.1
      - futures==3.1.1
      - importlib-metadata==4.8.3
      - iniconfig==1.1.1
      - isodate==0.7.0
      - jeepney==0.7.1
      - jmespath==0.10.0
      - keyring==23.4.1
      - lazy-object-proxy==1.7.1
      - mccabe==0.5.3
      - mock==1.3.0
      - msrest==0.4.29
      - msrestazure==0.4.34
      - nose==1.3.7
      - oauthlib==3.2.2
      - packaging==21.3
      - paramiko==2.0.2
      - pbr==6.1.1
      - pep8==1.7.1
      - pip==9.0.1
      - pluggy==1.0.0
      - prompt-toolkit==3.0.36
      - py==1.11.0
      - pyasn1==0.5.1
      - pycodestyle==2.2.0
      - pycparser==2.21
      - pydocumentdb==2.3.5
      - pyflakes==1.3.0
      - pygments==2.1.3
      - pyjwt==2.4.0
      - pylint==1.5.4
      - pyopenssl==16.2.0
      - pyparsing==3.1.4
      - pytest==7.0.1
      - python-dateutil==2.9.0.post0
      - pyyaml==3.11
      - requests==2.9.1
      - requests-oauthlib==2.0.0
      - scp==0.15.0
      - secretstorage==3.3.3
      - setuptools==30.4.0
      - six==1.10.0
      - sshtunnel==0.4.0
      - tabulate==0.7.5
      - tomli==1.2.3
      - typing-extensions==4.1.1
      - urllib3==1.16
      - vcrpy==1.10.3
      - vsts-cd-manager==1.0.2
      - wcwidth==0.2.13
      - websocket-client==1.3.1
      - whoosh==2.7.4
      - wrapt==1.16.0
      - xmltodict==0.14.2
      - zipp==3.6.0
prefix: /opt/conda/envs/azure-cli

src/azure-cli-core/tests/test_profile.py::Test_Profile::test_create_account_without_subscriptions src/azure-cli-core/tests/test_profile.py::Test_Profile::test_create_account_without_subscriptions_without_tenant src/azure-cli-core/tests/test_profile.py::Test_Profile::test_create_token_cache src/azure-cli-core/tests/test_profile.py::Test_Profile::test_credscache_add_new_sp_creds src/azure-cli-core/tests/test_profile.py::Test_Profile::test_credscache_add_preexisting_sp_creds src/azure-cli-core/tests/test_profile.py::Test_Profile::test_credscache_load_tokens_and_sp_creds_with_cert src/azure-cli-core/tests/test_profile.py::Test_Profile::test_credscache_load_tokens_and_sp_creds_with_secret src/azure-cli-core/tests/test_profile.py::Test_Profile::test_credscache_new_token_added_by_adal src/azure-cli-core/tests/test_profile.py::Test_Profile::test_credscache_remove_creds src/azure-cli-core/tests/test_profile.py::Test_Profile::test_default_active_subscription_to_non_disabled_one src/azure-cli-core/tests/test_profile.py::Test_Profile::test_get_current_account_user src/azure-cli-core/tests/test_profile.py::Test_Profile::test_get_expanded_subscription_info src/azure-cli-core/tests/test_profile.py::Test_Profile::test_get_expanded_subscription_info_for_logged_in_service_principal src/azure-cli-core/tests/test_profile.py::Test_Profile::test_get_login_credentials src/azure-cli-core/tests/test_profile.py::Test_Profile::test_get_login_credentials_for_graph_client src/azure-cli-core/tests/test_profile.py::Test_Profile::test_get_subscription src/azure-cli-core/tests/test_profile.py::Test_Profile::test_load_cached_tokens src/azure-cli-core/tests/test_profile.py::Test_Profile::test_logout src/azure-cli-core/tests/test_profile.py::Test_Profile::test_logout_all src/azure-cli-core/tests/test_profile.py::Test_Profile::test_set_active_subscription src/azure-cli-core/tests/test_profile.py::Test_Profile::test_update_add_two_different_subscriptions src/azure-cli-core/tests/test_profile.py::Test_Profile::test_update_with_same_subscription_added_twice
src/azure-cli-core/tests/test_profile.py::Test_Profile::test_find_subscriptions_from_service_principal_using_cert src/azure-cli-core/tests/test_profile.py::Test_Profile::test_service_principal_auth_client_cert
src/azure-cli-core/tests/test_profile.py::Test_Profile::test_find_subscriptions_from_particular_tenent src/azure-cli-core/tests/test_profile.py::Test_Profile::test_find_subscriptions_from_service_principal_id src/azure-cli-core/tests/test_profile.py::Test_Profile::test_find_subscriptions_interactive_from_particular_tenent src/azure-cli-core/tests/test_profile.py::Test_Profile::test_find_subscriptions_through_interactive_flow src/azure-cli-core/tests/test_profile.py::Test_Profile::test_find_subscriptions_thru_username_password src/azure-cli-core/tests/test_profile.py::Test_Profile::test_find_subscriptions_thru_username_password_with_account_disabled src/azure-cli-core/tests/test_profile.py::Test_Profile::test_normalize src/azure-cli-core/tests/test_profile.py::Test_Profile::test_service_principal_auth_client_secret
src/azure-cli-core/HISTORY.rst src/azure-cli-core/azure/cli/core/_profile.py
src/azure-cli-core/HISTORY.rst src/azure-cli-core/azure/cli/core/_profile.py