azext_iot/iothub/providers/discovery.py (83 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 azure.cli.core.commands.client_factory import get_subscription_id from azext_iot.common._azure import IOT_SERVICE_CS_TEMPLATE from azext_iot.common.base_discovery import BaseDiscovery from azext_iot.common.shared import DiscoveryResourceType, AuthenticationTypeDataplane from azext_iot.common.utility import trim_from_start from azext_iot.iothub.models.iothub_target import IotHubTarget from azext_iot._factory import iot_hub_service_factory from typing import Any, Dict from enum import Enum, EnumMeta logger = get_logger(__name__) PRIVILEDGED_ACCESS_RIGHTS_SET = set( ["RegistryWrite", "ServiceConnect", "DeviceConnect"] ) class IotHubDiscovery(BaseDiscovery): def __init__(self, cmd): super().__init__( cmd=cmd, necessary_rights_set=PRIVILEDGED_ACCESS_RIGHTS_SET, resource_type=DiscoveryResourceType.IoTHub.value ) def _initialize_client(self): """Initialize the client.""" if not self.client: if getattr(self.cmd, "cli_ctx", None): self.client = iot_hub_service_factory(self.cmd.cli_ctx).iot_hub_resource self.sub_id = get_subscription_id(self.cmd.cli_ctx) else: self.client = self.cmd def _make_kwargs(self, **kwargs) -> Dict[str, Any]: return kwargs @classmethod def get_target_by_cstring(cls, connection_string: str) -> Dict[str, str]: return IotHubTarget.from_connection_string(cstring=connection_string).as_dict() def _build_target_from_hostname(self, resource_hostname: str) -> Dict[str, str]: login = AuthenticationTypeDataplane.login.value target = {} target["cs"] = IOT_SERVICE_CS_TEMPLATE.format( resource_hostname, login, login, ) target["entity"] = resource_hostname target["name"] = resource_hostname.split(".")[0] target["policy"] = login target["primarykey"] = login target["secondarykey"] = login target["subscription"] = self.sub_id target["cmd"] = self.cmd return target def _build_target( self, resource, policy, key_type: str = None, **kwargs ) -> Dict[str, str]: # This is more or less a compatibility function which produces the # same result as _azure.get_iot_hub_connection_string() # In future iteration we will return a 'Target' object rather than dict # but that will be better served aligning with vNext pattern for Iot Hub include_events = kwargs.get("include_events", False) target = {} target["cs"] = IOT_SERVICE_CS_TEMPLATE.format( resource.properties.host_name, policy.key_name, policy.primary_key if key_type == "primary" else policy.secondary_key, ) target["entity"] = resource.properties.host_name target["name"] = resource.name target["policy"] = policy.key_name target["primarykey"] = policy.primary_key target["secondarykey"] = policy.secondary_key target["subscription"] = self.sub_id target["resourcegroup"] = resource.additional_properties.get("resourcegroup") target["location"] = resource.location target["sku_tier"] = resource.sku.tier.value if isinstance(resource.sku.tier, (Enum, EnumMeta)) else resource.sku.tier if include_events: events = {} events["endpoint"] = trim_from_start( resource.properties.event_hub_endpoints["events"].endpoint, "sb://" ).strip("/") events["partition_count"] = resource.properties.event_hub_endpoints[ "events" ].partition_count events["path"] = resource.properties.event_hub_endpoints["events"].path events["partition_ids"] = resource.properties.event_hub_endpoints[ "events" ].partition_ids target["events"] = events target["cmd"] = self.cmd return target