azext_edge/edge/common.py (180 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. # ---------------------------------------------------------------------------------------------- """ shared: Define shared data types(enums) and constant strings. """ from enum import Enum class ListableEnum(Enum): @classmethod def list(cls): return [c.value for c in cls] class CheckTaskStatus(Enum): """ Status of a check task. """ success = "success" warning = "warning" error = "error" skipped = "skipped" @property def color(self) -> str: color_map = { CheckTaskStatus.success: "green", CheckTaskStatus.warning: "yellow", CheckTaskStatus.error: "red", CheckTaskStatus.skipped: "bright white", } return color_map[self] @property def emoji(self) -> str: emoji_map = { CheckTaskStatus.success: "heavy_check_mark", CheckTaskStatus.warning: "warning", CheckTaskStatus.error: "stop_sign", CheckTaskStatus.skipped: "hammer", } return f":{emoji_map[self]}:" @classmethod def map_to_colored_emoji(cls, value) -> str: return f"[{cls[value].color}]{cls[value].emoji}[/{cls[value].color}]" class ResourceState(Enum): """ K8s resource state. """ starting = "starting" running = "running" recovering = "recovering" succeeded = "succeeded" failed = "failed" waiting = "waiting" warning = "warning" ok = "ok" warn = "warn" error = "error" n_a = "n/a" @classmethod def map_to_color(cls, value) -> str: return cls.map_to_status(value).color @classmethod def map_to_status(cls, value) -> CheckTaskStatus: value = value.lower() status_map = { cls.starting.value: CheckTaskStatus.warning, cls.recovering.value: CheckTaskStatus.warning, cls.warn.value: CheckTaskStatus.warning, cls.n_a.value: CheckTaskStatus.warning, cls.failed.value: CheckTaskStatus.error, cls.error.value: CheckTaskStatus.error, cls.waiting.value: CheckTaskStatus.warning, cls.warning.value: CheckTaskStatus.warning, } return status_map.get(value, CheckTaskStatus.success) class PodState(Enum): """ K8s pod state. """ pending = "pending" running = "running" succeeded = "succeeded" failed = "failed" unknown = "unknown" @classmethod def map_to_status(cls, value) -> CheckTaskStatus: value = value.lower() status_map = { cls.pending.value: CheckTaskStatus.warning, cls.unknown.value: CheckTaskStatus.warning, cls.failed.value: CheckTaskStatus.error, } return status_map.get(value, CheckTaskStatus.success) class ProvisioningState(Enum): """ Resource provisioning state. """ succeeded = "Succeeded" failed = "Failed" updating = "Updating" canceled = "Canceled" provisioning = "Provisioning" deleting = "Deleting" accepted = "Accepted" class OpsServiceType(ListableEnum): """ IoT Operations service type. """ mq = "broker" connectors = "connectors" akri = "akri" deviceregistry = "deviceregistry" billing = "billing" dataflow = "dataflow" schemaregistry = "schemaregistry" arccontainerstorage = "acs" secretstore = "secretstore" azuremonitor = "azuremonitor" certmanager = "certmanager" meso = "meso" @classmethod def list_check_services(cls): return [ # TODO: check replace opcua with "connectors"? OPCUA_SERVICE, cls.mq.value, cls.akri.value, cls.deviceregistry.value, cls.dataflow.value, ] class ResourceProviderMapping(ListableEnum): """ Resource Provider mappings for graph queries. """ deviceregistry = "Microsoft.DeviceRegistry" extended_location = "Microsoft.ExtendedLocation" kubernetes = "Microsoft.Kubernetes" kubernetes_configuration = "Microsoft.KubernetesConfiguration" class ResourceTypeMapping(Enum): """ Resource type mappings for graph queries. """ asset = "assets" asset_endpoint_profile = "assetEndpointProfiles" custom_location = "customLocations" connected_cluster = "connectedClusters" cluster_extensions = "extensions" @property def full_resource_path(self): return f"{self.provider}/{self.value}" @property def provider(self): mapping = { ResourceTypeMapping.asset: ResourceProviderMapping.deviceregistry.value, ResourceTypeMapping.asset_endpoint_profile: ResourceProviderMapping.deviceregistry.value, ResourceTypeMapping.custom_location: ResourceProviderMapping.extended_location.value, ResourceTypeMapping.connected_cluster: ResourceProviderMapping.kubernetes.value, ResourceTypeMapping.cluster_extensions: ResourceProviderMapping.kubernetes_configuration.value, } return mapping[self] class AEPAuthModes(Enum): """ Authentication modes for asset endpoints """ anonymous = "Anonymous" certificate = "Certificate" userpass = "UsernamePassword" class AEPTypes(ListableEnum): """Asset Endpoint Profile (connector) Types""" opcua = "Microsoft.OpcUa" onvif = "Microsoft.Onvif" class TopicRetain(Enum): """Set the retain flag for messages published to an MQTT broker.""" keep = "Keep" never = "Never" class SecurityModes(Enum): """Security modes for OPCUA connector.""" none = "none" sign = "sign" sign_and_encrypt = "signAndEncrypt" class SecurityPolicies(Enum): """Security policies for the OPCUA connector.""" # TODO: add in user friendly input mapping none = "none" basic128 = "Basic128Rsa15" basic256 = "Basic256" basic256sha256 = "Basic256Sha256" aes128 = "Aes128_Sha256_RsaOaep" aes256 = "Aes256_Sha256_RsaPss" class K8sSecretType(Enum): """ Supported k8s secret types. """ opaque = "Opaque" tls = "kubernetes.io/tls" class FileType(ListableEnum): """ Supported file types/extensions for bulk asset operations. """ json = "json" csv = "csv" yaml = "yaml" class BundleResourceKind(Enum): clusterrole = "ClusterRole" clusterrolebinding = "ClusterRoleBinding" deployment = "Deployment" statefulset = "Statefulset" service = "Service" replicaset = "Replicaset" daemonset = "Daemonset" pvc = "PersistentVolumeClaim" job = "Job" cronjob = "CronJob" configmap = "ConfigMap" # Broker runtime attributes AIO_BROKER_RESOURCE_PREFIX = "aio-broker-" AIO_BROKER_DIAGNOSTICS_SERVICE = "aio-broker-diagnostics-service" METRICS_SERVICE_API_PORT = 9600 PROTOBUF_SERVICE_API_PORT = 9800 # Broker constants DEFAULT_BROKER = "default" DEFAULT_BROKER_LISTENER = "default" DEFAULT_BROKER_AUTHN = "default" # Dataflow constants DEFAULT_DATAFLOW_PROFILE = "default" DEFAULT_DATAFLOW_ENDPOINT = "default" # Init Env Control INIT_NO_PREFLIGHT_ENV_KEY = "AIO_CLI_INIT_PREFLIGHT_DISABLED" # OPC UA check constant OPCUA_SERVICE = "opcua"