azext_iot/deviceupdate/commands_account.py (156 lines of code) (raw):

# coding=utf-8 # -------------------------------------------------------------------------------------------- # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. See License.txt in the project root for license information. # -------------------------------------------------------------------------------------------- from knack.log import get_logger from azext_iot.common.utility import handle_service_exception from azext_iot.deviceupdate.common import ADUPublicNetworkAccessType, ADUAccountSKUType from azext_iot.deviceupdate.providers.base import ( DeviceUpdateMgmtModels, DeviceUpdateAccountManager, parse_account_rg, ARMPolling, AzureError, ) from typing import Optional logger = get_logger(__name__) # Accounts def create_account( cmd, name: str, resource_group_name: str, location: Optional[str] = None, tags: Optional[dict] = None, public_network_access: str = ADUPublicNetworkAccessType.ENABLED.value, assign_identity: Optional[list] = None, scopes: Optional[list] = None, role: str = "Contributor", sku: str = ADUAccountSKUType.STANDARD.value, ): account_manager = DeviceUpdateAccountManager(cmd=cmd) if not location: location = account_manager.get_rg_location(resource_group_name=resource_group_name) account_manager = DeviceUpdateAccountManager(cmd=cmd) identity = account_manager.assemble_account_auth(assign_identity) account = DeviceUpdateMgmtModels.Account( location=location, tags=tags, public_network_access=public_network_access, identity=identity, sku=sku ) def rbac_handler(lro: ARMPolling): if not scopes: return instance = lro.resource().as_dict() identity = instance.get("identity", {}) if identity: identity_type: str = identity.get("type") principal_id: str = identity.get("principal_id") if principal_id and scopes and identity_type and "SystemAssigned" in identity_type: for scope in scopes: logger.info( "Applying rbac assignment: Principal Id: {}, Scope: {}, Role: {}".format( principal_id, scope, role ) ) logger.info(account_manager.assign_msi_scope(scope=scope, principal_id=principal_id, role=role)) try: create_poller = account_manager.mgmt_client.accounts.begin_create( resource_group_name=resource_group_name, account_name=name, account=account ) create_poller.add_done_callback(rbac_handler) return create_poller except AzureError as e: handle_service_exception(e) def update_account(cmd, parameters: DeviceUpdateMgmtModels.Account): account_manager = DeviceUpdateAccountManager(cmd=cmd) # Supported update operations are PUT or PATCH based. CLI wise we are supporting only PUT. try: return account_manager.mgmt_client.accounts.begin_create( resource_group_name=parse_account_rg(parameters.id), account_name=parameters.name, account=parameters, ) except AzureError as e: handle_service_exception(e) def list_accounts(cmd, resource_group_name: Optional[str] = None): account_manager = DeviceUpdateAccountManager(cmd=cmd) try: if resource_group_name: return account_manager.mgmt_client.accounts.list_by_resource_group(resource_group_name=resource_group_name) return account_manager.mgmt_client.accounts.list_by_subscription() except AzureError as e: handle_service_exception(e) def show_account(cmd, name: str, resource_group_name: Optional[str] = None): account_manager = DeviceUpdateAccountManager(cmd=cmd) return account_manager.find_account(target_name=name, target_rg=resource_group_name).account def delete_account(cmd, name: str, resource_group_name: Optional[str] = None): account_manager = DeviceUpdateAccountManager(cmd=cmd) account_container = account_manager.find_account(target_name=name, target_rg=resource_group_name) try: return account_manager.mgmt_client.accounts.begin_delete( resource_group_name=account_container.resource_group, account_name=name ) except AzureError as e: handle_service_exception(e) def wait_on_account(cmd, name: str, resource_group_name: Optional[str] = None): return show_account(cmd=cmd, name=name, resource_group_name=resource_group_name) def show_account_private_connection(cmd, name: str, conn_name: str, resource_group_name: Optional[str] = None): account_manager = DeviceUpdateAccountManager(cmd=cmd) account_container = account_manager.find_account(target_name=name, target_rg=resource_group_name) try: return account_manager.mgmt_client.private_endpoint_connections.get( resource_group_name=account_container.resource_group, account_name=name, private_endpoint_connection_name=conn_name, ) except AzureError as e: handle_service_exception(e) def list_account_private_connections(cmd, name: str, resource_group_name: Optional[str] = None): account_manager = DeviceUpdateAccountManager(cmd=cmd) account_container = account_manager.find_account(target_name=name, target_rg=resource_group_name) try: return account_manager.mgmt_client.private_endpoint_connections.list_by_account( resource_group_name=account_container.resource_group, account_name=name ) except AzureError as e: handle_service_exception(e) def set_account_private_connection( cmd, name: str, conn_name: str, status: str, description: Optional[str] = None, resource_group_name: Optional[str] = None, ): account_manager = DeviceUpdateAccountManager(cmd=cmd) account_container = account_manager.find_account(target_name=name, target_rg=resource_group_name) try: return account_manager.mgmt_client.private_endpoint_connections.begin_create_or_update( resource_group_name=account_container.resource_group, account_name=name, private_endpoint_connection_name=conn_name, private_endpoint_connection=DeviceUpdateMgmtModels.PrivateEndpointConnection( private_link_service_connection_state=DeviceUpdateMgmtModels.PrivateLinkServiceConnectionState( status=status, description=description ) ), ) except AzureError as e: handle_service_exception(e) def delete_account_private_connection( cmd, name: str, conn_name: str, resource_group_name: Optional[str] = None, ): account_manager = DeviceUpdateAccountManager(cmd=cmd) account_container = account_manager.find_account(target_name=name, target_rg=resource_group_name) try: return account_manager.mgmt_client.private_endpoint_connections.begin_delete( resource_group_name=account_container.resource_group, account_name=name, private_endpoint_connection_name=conn_name, ) except AzureError as e: handle_service_exception(e) def list_account_private_links(cmd, name: str, resource_group_name: Optional[str] = None): account_manager = DeviceUpdateAccountManager(cmd=cmd) account_container = account_manager.find_account(target_name=name, target_rg=resource_group_name) try: return account_manager.mgmt_client.private_link_resources.list_by_account( resource_group_name=account_container.resource_group, account_name=name ) except AzureError as e: handle_service_exception(e)