diff --git a/src/azure-cli-core/azure/cli/core/_profile.py b/src/azure-cli-core/azure/cli/core/_profile.py index ddb80d4e2e9..cb9b67a3ad6 100644 --- a/src/azure-cli-core/azure/cli/core/_profile.py +++ b/src/azure-cli-core/azure/cli/core/_profile.py @@ -267,21 +267,9 @@ def _normalize_properties(self, user, subscriptions, is_service_principal, cert_ _TENANT_ID: s.tenant_id, _ENVIRONMENT_NAME: self.cli_ctx.cloud.name } - # For subscription account from Subscriptions - List 2019-06-01 and later. + if subscription_dict[_SUBSCRIPTION_NAME] != _TENANT_LEVEL_ACCOUNT_NAME: - if hasattr(s, 'home_tenant_id'): - subscription_dict[_HOME_TENANT_ID] = s.home_tenant_id - if hasattr(s, 'managed_by_tenants'): - if s.managed_by_tenants is None: - # managedByTenants is missing from the response. This is a known service issue: - # https://github.com/Azure/azure-rest-api-specs/issues/9567 - # pylint: disable=line-too-long - raise CLIError("Invalid profile is used for cloud '{cloud_name}'. " - "To configure the cloud profile, run `az cloud set --name {cloud_name} --profile (e.g. 2019-03-01-hybrid)`. " - "For more information about using Azure CLI with Azure Stack, see " - "https://docs.microsoft.com/azure-stack/user/azure-stack-version-profiles-azurecli2" - .format(cloud_name=self.cli_ctx.cloud.name)) - subscription_dict[_MANAGED_BY_TENANTS] = [{_TENANT_ID: t.tenant_id} for t in s.managed_by_tenants] + _transform_subscription_for_multiapi(s, subscription_dict) consolidated.append(subscription_dict) @@ -1376,3 +1364,19 @@ def _get_authorization_code(resource, authority_url): if results.get('no_browser'): raise RuntimeError() return results + + +def _transform_subscription_for_multiapi(s, s_dict): + """ + Transforms properties from Subscriptions - List 2019-06-01 and later to the subscription dict. + + :param s: subscription object + :param s_dict: subscription dict + """ + if hasattr(s, 'home_tenant_id'): + s_dict[_HOME_TENANT_ID] = s.home_tenant_id + if hasattr(s, 'managed_by_tenants'): + if s.managed_by_tenants is None: + s_dict[_MANAGED_BY_TENANTS] = None + else: + s_dict[_MANAGED_BY_TENANTS] = [{_TENANT_ID: t.tenant_id} for t in s.managed_by_tenants] diff --git a/src/azure-cli-core/azure/cli/core/tests/test_profile.py b/src/azure-cli-core/azure/cli/core/tests/test_profile.py index 71605d36321..1ff0e4cbb95 100644 --- a/src/azure-cli-core/azure/cli/core/tests/test_profile.py +++ b/src/azure-cli-core/azure/cli/core/tests/test_profile.py @@ -16,7 +16,8 @@ from adal import AdalError from azure.cli.core._profile import (Profile, CredsCache, SubscriptionFinder, - ServicePrincipalAuth, _AUTH_CTX_FACTORY, _USE_VENDORED_SUBSCRIPTION_SDK) + ServicePrincipalAuth, _AUTH_CTX_FACTORY, _USE_VENDORED_SUBSCRIPTION_SDK, + _transform_subscription_for_multiapi) if _USE_VENDORED_SUBSCRIPTION_SDK: from azure.cli.core.vendored_sdks.subscriptions.models import \ (SubscriptionState, Subscription, SubscriptionPolicies, SpendingLimit, ManagedByTenant) @@ -2039,5 +2040,54 @@ def token(self, value): self._token = value +class TestUtil(unittest.TestCase): + + def test_transform_subscription_for_multiapi(self): + + class SimpleSubscription: + pass + + class SimpleManagedByTenant: + pass + + tenant_id = "00000001-0000-0000-0000-000000000000" + + # No 2019-06-01 property is set. + s = SimpleSubscription() + d = {} + _transform_subscription_for_multiapi(s, d) + assert d == {} + + # home_tenant_id is set. + s = SimpleSubscription() + s.home_tenant_id = tenant_id + d = {} + _transform_subscription_for_multiapi(s, d) + assert d == {'homeTenantId': '00000001-0000-0000-0000-000000000000'} + + # managed_by_tenants is set, but is None. It is still preserved. + s = SimpleSubscription() + s.managed_by_tenants = None + d = {} + _transform_subscription_for_multiapi(s, d) + assert d == {'managedByTenants': None} + + # managed_by_tenants is set, but is []. It is still preserved. + s = SimpleSubscription() + s.managed_by_tenants = [] + d = {} + _transform_subscription_for_multiapi(s, d) + assert d == {'managedByTenants': []} + + # managed_by_tenants is set, and has valid items. It is preserved. + s = SimpleSubscription() + t = SimpleManagedByTenant() + t.tenant_id = tenant_id + s.managed_by_tenants = [t] + d = {} + _transform_subscription_for_multiapi(s, d) + assert d == {'managedByTenants': [{"tenantId": tenant_id}]} + + if __name__ == '__main__': unittest.main()