azext_edge/edge/providers/checks.py (76 lines of code) (raw):

# coding=utf-8 # ---------------------------------------------------------------------------------------------- # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. See License file in the project root for license information. # ---------------------------------------------------------------------------------------------- from typing import Any, Dict, List, Optional from azure.cli.core.azclierror import ArgumentUsageError from azext_edge.edge.providers.edge_api.dataflow import DataflowResourceKinds from rich.console import Console from ..common import OPCUA_SERVICE, ListableEnum, OpsServiceType from .check.base import check_pre_deployment, display_as_list from .check.common import COLOR_STR_FORMAT, ResourceOutputDetailLevel from .check.deviceregistry import check_deviceregistry_deployment from .check.mq import check_mq_deployment from .check.opcua import check_opcua_deployment from .edge_api.deviceregistry import DeviceRegistryResourceKinds from .edge_api.mq import MqResourceKinds from .check.akri import check_akri_deployment from .check.dataflow import check_dataflows_deployment from .check.summary import check_summary console = Console(width=100, highlight=False) def run_checks( detail_level: int = ResourceOutputDetailLevel.summary.value, ops_service: Optional[str] = None, pre_deployment: bool = True, post_deployment: bool = True, as_list: bool = False, resource_kinds: List[str] = None, resource_name: str = None, ) -> Dict[str, Any]: result = {} # check if the resource_kinds are valid for the requested service if resource_kinds: _validate_resource_kinds_under_service(ops_service, resource_kinds) with console.status(status="Analyzing cluster...", refresh_per_second=12.5): from time import sleep sleep(0.5) color = COLOR_STR_FORMAT.format(color="bright_blue", value="{text}") if as_list else "{text}" title_subject = ( f"{{{color.format(text=ops_service)}}} service deployment" if post_deployment else color.format(text="IoT Operations readiness") ) result["title"] = f"Evaluation for {title_subject}" if ops_service else "IoT Operations Summary" if pre_deployment: check_pre_deployment(result, as_list) if post_deployment: result["postDeployment"] = [] service_check_dict = { OpsServiceType.akri.value: check_akri_deployment, OpsServiceType.mq.value: check_mq_deployment, OpsServiceType.deviceregistry.value: check_deviceregistry_deployment, OPCUA_SERVICE: check_opcua_deployment, OpsServiceType.dataflow.value: check_dataflows_deployment, None: check_summary, } service_result = service_check_dict[ops_service]( detail_level=detail_level, resource_name=resource_name, as_list=as_list, resource_kinds=resource_kinds ) if isinstance(service_result, list): for obj in service_result: result["postDeployment"].append(obj) else: result["postDeployment"].append(service_result) if as_list: return display_as_list(console=console, result=result) return result def _validate_resource_kinds_under_service(ops_service: str, resource_kinds: List[str]) -> None: if ops_service in [OpsServiceType.akri.value, OPCUA_SERVICE]: raise ArgumentUsageError(f"--resources is not supported for service {ops_service}.") service_kinds_dict: Dict[str, ListableEnum] = { OpsServiceType.deviceregistry.value: DeviceRegistryResourceKinds, OpsServiceType.mq.value: MqResourceKinds, OpsServiceType.dataflow.value: DataflowResourceKinds, } valid_resource_kinds = service_kinds_dict[ops_service].list() if ops_service in service_kinds_dict else [] for resource_kind in resource_kinds: if resource_kind not in valid_resource_kinds: raise ArgumentUsageError( f"Resource kind {resource_kind} is not supported for service {ops_service}. " f"Allowed resource kinds for this service are {valid_resource_kinds}" )