azext_edge/edge/providers/check/summary.py (98 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 List, NamedTuple from rich.padding import Padding from rich.table import Table from rich.console import NewLine from ...common import OPCUA_SERVICE, CheckTaskStatus, OpsServiceType from ...providers.edge_api import DATAFLOW_API_V1, DEVICEREGISTRY_API_V1, MQ_ACTIVE_API from .akri import check_akri_deployment from .base import CheckManager from .base.display import colorize_string from .common import ResourceOutputDetailLevel from .dataflow import PADDING, check_dataflows_deployment from .deviceregistry import check_deviceregistry_deployment from .mq import check_mq_deployment from .opcua import check_opcua_deployment class ServiceCheck(NamedTuple): svc: str title: str target: str check_func: callable def check_summary( resource_name: str, resource_kinds: List[str], detail_level=ResourceOutputDetailLevel.summary.value, as_list: bool = False, ) -> dict: # define checks service_checks: List[ServiceCheck] = [ ServiceCheck( svc=OpsServiceType.akri.value, title="Akri", target="Akri", check_func=check_akri_deployment, ), ServiceCheck( svc=OpsServiceType.mq.value, title="Broker", target=MQ_ACTIVE_API.as_str(), check_func=check_mq_deployment, ), ServiceCheck( svc=OpsServiceType.deviceregistry.value, title="DeviceRegistry", target=DEVICEREGISTRY_API_V1.as_str(), check_func=check_deviceregistry_deployment, ), ServiceCheck( svc=OPCUA_SERVICE, title="OPCUA", target="OPCUA", check_func=check_opcua_deployment, ), ServiceCheck( svc=OpsServiceType.dataflow.value, title="Dataflow", target=DATAFLOW_API_V1.as_str(), check_func=check_dataflows_deployment, ), ] check_manager = CheckManager(check_name="evalAIOSummary", check_desc="Service summary checks") for check in service_checks: # run checks for service result = check.check_func( detail_level=ResourceOutputDetailLevel.summary.value, resource_name=resource_name, as_list=as_list, resource_kinds=resource_kinds, ) # add service check results to check manager target = check.target check_manager.add_target(target_name=target) check_manager.add_display( target_name=target, display=Padding( check.title, (0, 0, 0, PADDING), ), ) # create grid for service check results grid = Table.grid(padding=(0, 0, 0, 2)) add_footer = False # parse check results for obj in result: status = obj.get("status") status_obj = CheckTaskStatus(status) if status_obj == CheckTaskStatus.error or status_obj == CheckTaskStatus.warning: add_footer = True emoji = status_obj.emoji color = status_obj.color description = obj.get("description") check_manager.add_target_eval( target_name=target, status=status, value={obj.get("name", "checkResult"): status}, ) # add row to grid grid.add_row(colorize_string(value=emoji, color=color), description) # display grid check_manager.add_display(target_name=target, display=Padding(grid, (0, 0, 0, PADDING))) # service check suggestion footer if add_footer: footer = ":magnifying_glass_tilted_left:" + colorize_string( f" See details by running: az iot ops check --svc {check.svc}" ) check_manager.add_display(target_name=target, display=NewLine()) check_manager.add_display(target_name=target, display=Padding(footer, (0, 0, 0, PADDING))) return check_manager.as_dict(as_list=as_list)