azext_iot/central/models/v2022_06_30_preview/template.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 azure.cli.core.azclierror import CLIInternalError
from azext_iot.central.models import BaseTemplate
class Template(BaseTemplate):
def __init__(self, template: dict):
super().__init__(template)
try:
self.id = template.get("@id")
self.deployment_manifest = template.get("deploymentManifest")
self.interfaces = self._extract_interfaces(template)
self.schema_names = self._extract_schema_names(self.interfaces)
self.components = self._extract_components(template)
if self.components:
self.component_schema_names = self._extract_schema_names(
self.components
)
self.modules = self._extract_modules(template)
except Exception:
raise CLIInternalError("Could not parse iot central device template.")
def get_schema(self, name, is_component=False, identifier="") -> dict:
entities = self.components if is_component else self.interfaces
if identifier:
# identifier specified, do a pointed lookup
entry = entities.get(identifier, {})
return entry.get(name)
# find first matching name in any component
for entry in entities.values():
schema = entry.get(name)
if schema:
return schema
# not found
return None
def _extract_root_interface_contents(self, dcm: dict) -> dict:
rootContents = dcm.get("contents", {})
contents = [
entity for entity in rootContents if entity.get("@type") != "Component"
]
return {"@id": dcm.get("@id", {}), "schema": {"contents": contents}}
def _extract_interfaces(self, template: dict) -> dict:
try:
interfaces = []
dcm = template.get("capabilityModel", {})
if dcm.get("contents"):
interfaces.append(self._extract_root_interface_contents(dcm))
if dcm.get("extends"):
interfaces.extend(dcm.get("extends"))
return {
interface["@id"]: self._extract_schemas(interface)
for interface in interfaces
}
except Exception:
details = "Unable to extract device schema from template '{}'.".format(
self.id
)
raise CLIInternalError(details)
def _extract_modules(self, template: dict) -> dict:
try:
modules = []
dcm = template.get("capabilityModel", {})
contents = dcm.get("contents", {})
for content in contents:
# Module
if 'EdgeModule' in content['@type'] and content.get("target"):
# For reusing some functions, add "capabilityModel" key here
template = {"capabilityModel": content.get("target")[0]}
id = content.get("@id")
interfaces = self._extract_interfaces(template)
schema_names = self._extract_schema_names(interfaces)
components = self._extract_components(template)
component_schema_names = []
if components:
component_schema_names = self._extract_schema_names(components)
modules.append({
'id': id,
'interfaces': interfaces,
'schema_names': schema_names,
'components': components,
'component_schema_names': component_schema_names
})
return modules
except Exception:
details = "Unable to extract device module schema from template '{}'.".format(
self.id
)
raise CLIInternalError(details)
def get_id_key(self):
return "@id"
def get_type_key(self):
return "@type"