azext_iot/deviceupdate/commands_deployment.py (210 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.providers.base import ( DeviceUpdateDataModels, DeviceUpdateDataManager, AzureError, ) from azure.cli.core.azclierror import ArgumentUsageError from typing import Optional logger = get_logger(__name__) # @digimaun - combine op? def list_devices_for_deployment( cmd, name: str, instance_name: str, device_group_id: str, device_class_id: str, deployment_id: str, filter: Optional[str] = None, resource_group_name: Optional[str] = None, ): data_manager = DeviceUpdateDataManager( cmd=cmd, account_name=name, instance_name=instance_name, resource_group=resource_group_name ) return data_manager.data_client.device_management.list_device_states_for_device_class_subgroup_deployment( group_id=device_group_id, device_class_id=device_class_id, deployment_id=deployment_id, filter=filter ) def create_deployment( cmd, name: str, instance_name: str, device_group_id: str, deployment_id: str, update_name: str, update_provider: str, update_version: str, start_date_time: Optional[str] = None, rollback_update_name: Optional[str] = None, rollback_update_provider: Optional[str] = None, rollback_update_version: Optional[str] = None, devices_failed_percentage: Optional[str] = None, devices_failed_count: Optional[str] = None, resource_group_name: Optional[str] = None, ): if any( [ devices_failed_percentage, devices_failed_count, rollback_update_name, rollback_update_provider, rollback_update_version, ] ) and not all( [ devices_failed_percentage, devices_failed_count, rollback_update_name, rollback_update_provider, rollback_update_version, ] ): raise ArgumentUsageError( "To create deployment with a cloud initiated rollback policy all rollback policy arg group values must be provided." ) data_manager = DeviceUpdateDataManager( cmd=cmd, account_name=name, instance_name=instance_name, resource_group=resource_group_name ) update_info = DeviceUpdateDataModels.UpdateInfo( update_id=DeviceUpdateDataModels.UpdateId(provider=update_provider, name=update_name, version=update_version) ) rollback_policy = ( None if not devices_failed_percentage else DeviceUpdateDataModels.CloudInitiatedRollbackPolicy( update=DeviceUpdateDataModels.UpdateInfo( update_id=DeviceUpdateDataModels.UpdateId( provider=rollback_update_provider, name=rollback_update_name, version=rollback_update_version ) ), failure=DeviceUpdateDataModels.CloudInitiatedRollbackPolicyFailure( devices_failed_percentage=devices_failed_percentage, devices_failed_count=devices_failed_count ), ) ) if not start_date_time: from datetime import datetime, timezone start_date_time = datetime.now(tz=timezone.utc) deployment = DeviceUpdateDataModels.Deployment( deployment_id=deployment_id, start_date_time=start_date_time, group_id=device_group_id, update=update_info, rollback_policy=rollback_policy, ) try: return data_manager.data_client.device_management.create_or_update_deployment( group_id=device_group_id, deployment_id=deployment_id, deployment=deployment ) except AzureError as e: handle_service_exception(e) def list_deployments( cmd, name: str, instance_name: str, device_group_id: str, device_class_id: Optional[str] = None, order_by: Optional[str] = None, resource_group_name: Optional[str] = None, ): data_manager = DeviceUpdateDataManager( cmd=cmd, account_name=name, instance_name=instance_name, resource_group=resource_group_name ) try: if device_class_id: return data_manager.data_client.device_management.list_deployments_for_device_class_subgroup( group_id=device_group_id, device_class_id=device_class_id, order_by=order_by ) return data_manager.data_client.device_management.list_deployments_for_group( group_id=device_group_id, order_by=order_by ) except AzureError as e: handle_service_exception(e) def show_deployment( cmd, name: str, instance_name: str, device_group_id: str, deployment_id: str, device_class_id: Optional[str] = None, status: Optional[bool] = None, resource_group_name: Optional[str] = None, ): data_manager = DeviceUpdateDataManager( cmd=cmd, account_name=name, instance_name=instance_name, resource_group=resource_group_name ) try: if status: if device_class_id: return data_manager.data_client.device_management.get_device_class_subgroup_deployment_status( group_id=device_group_id, device_class_id=device_class_id, deployment_id=deployment_id ) return data_manager.data_client.device_management.get_deployment_status( group_id=device_group_id, deployment_id=deployment_id ) if device_class_id: return data_manager.data_client.device_management.get_deployment_for_device_class_subgroup( group_id=device_group_id, device_class_id=device_class_id, deployment_id=deployment_id ) return data_manager.data_client.device_management.get_deployment( group_id=device_group_id, deployment_id=deployment_id ) except AzureError as e: handle_service_exception(e) def delete_deployment( cmd, name: str, instance_name: str, device_group_id: str, deployment_id: str, device_class_id: Optional[str] = None, resource_group_name: Optional[str] = None, ): data_manager = DeviceUpdateDataManager( cmd=cmd, account_name=name, instance_name=instance_name, resource_group=resource_group_name ) try: if device_class_id: return data_manager.data_client.device_management.delete_deployment_for_device_class_subgroup( group_id=device_group_id, device_class_id=device_class_id, deployment_id=deployment_id ) return data_manager.data_client.device_management.delete_deployment( group_id=device_group_id, deployment_id=deployment_id ) except AzureError as e: handle_service_exception(e) def cancel_deployment_for_class( cmd, name: str, instance_name: str, device_group_id: str, device_class_id: str, deployment_id: str, resource_group_name: Optional[str] = None, ): data_manager = DeviceUpdateDataManager( cmd=cmd, account_name=name, instance_name=instance_name, resource_group=resource_group_name ) try: return data_manager.data_client.device_management.stop_deployment( group_id=device_group_id, device_class_id=device_class_id, deployment_id=deployment_id ) except AzureError as e: handle_service_exception(e) def retry_deployment_for_class( cmd, name: str, instance_name: str, device_group_id: str, device_class_id: str, deployment_id: str, resource_group_name: Optional[str] = None, ): data_manager = DeviceUpdateDataManager( cmd=cmd, account_name=name, instance_name=instance_name, resource_group=resource_group_name ) try: return data_manager.data_client.device_management.retry_deployment( group_id=device_group_id, device_class_id=device_class_id, deployment_id=deployment_id ) except AzureError as e: handle_service_exception(e)