azext_iot/monitor/parsers/issue.py (72 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 typing import List
from azext_iot.monitor.utility import unicode_decode
from knack.log import get_logger
from azext_iot.monitor.models.enum import Severity
logger = get_logger(__name__)
class Issue:
def __init__(self, severity: Severity, details: str, message, device_id=""):
self.severity = severity
self.details = details
self.device_id = device_id
self.message = None
if message:
message_body = next(message.get_data())
self.message = unicode_decode(data=message_body, default="Failed to represent content in unicode format.")
if not self.device_id:
self.device_id = "Unknown"
def log(self):
to_log = "[{}] [DeviceId: {}] {}\n".format(
self.severity.name.upper(), self.device_id, self.details
)
self._log(to_log)
def _log(self, to_log: str):
if self.severity == Severity.info:
logger.info(to_log)
if self.severity == Severity.warning:
logger.warning(to_log)
if self.severity == Severity.error:
logger.error(to_log)
def json_repr(self):
json_repr = vars(self)
json_repr["severity"] = self.severity.name
return json_repr
class CentralIssue(Issue):
def __init__(
self, severity: Severity, details: str, message, device_id="", template_id=""
):
super(CentralIssue, self).__init__(severity, details, message, device_id)
self.template_id = template_id
if not self.template_id:
self.template_id = "Unknown"
def log(self):
to_log = "[{}] [DeviceId: {}] [TemplateId: {}] {}\n".format(
self.severity.name.upper(), self.device_id, self.template_id, self.details
)
self._log(to_log)
class IssueHandler:
def __init__(self):
self._issues = []
def add_issue(self, severity: Severity, details: str, message, device_id=""):
issue = Issue(
severity=severity, details=details, message=message, device_id=device_id
)
self._issues.append(issue)
def add_central_issue(
self, severity: Severity, details: str, message, device_id="", template_id=""
):
issue = CentralIssue(
severity=severity,
details=details,
message=message,
device_id=device_id,
template_id=template_id,
)
self._issues.append(issue)
def get_all_issues(self) -> List[Issue]:
return self._issues
def get_issues_with_severity(self, severity: Severity) -> List[Issue]:
"""
arguments:
severity: Severity
returns:
all issues where severity equal specified severity
example:
issue_handler.get_issues_with_severity(Severity.info)
returns all issues classified as "info"
"""
return [issue for issue in self._issues if issue.severity == severity]
def get_issues_with_minimum_severity(self, severity: Severity) -> List[Issue]:
"""
arguments:
severity: Severity
returns:
all issues where severity >= specified severity
example:
issue_handler.get_issues_with_minimum_severity(Severity.warning)
returns all issues classified as "warning" and "error"
"info" will not be included
"""
return [issue for issue in self._issues if issue.severity >= severity]
def get_issues_with_maximum_severity(self, severity: Severity) -> List[Issue]:
"""
arguments:
severity: Severity
returns:
all issues where severity <= specified severity
example:
issue_handler.get_issues_with_maximum_severity(Severity.warning)
returns all issues classified as "warning" and "info"
"error" will not be included
"""
return [issue for issue in self._issues if issue.severity <= severity]