# Диагностические сценарии ## Коллекция DiagnosticScenarios Диагностический сценарий. Поля: * name - уникальное имя сценария * is_active * description * checks - список проверок * name - уникальное имя проверки (в пределах сценария) * description - описание * is_active * depends_on - список `check.name`, которые должны успешно завершиться для выполнения проверки. `$previous` -- код для предыдущего значения * check - название проверки (см. далее) * arg0 - аргументы проверки, шаблон Jinja2 (см. далее) * `is_critical` - признак критичности (остановка при неудачном завершении) * `alarm_class` - опциональный класс аварии * `alarm_reference` - шаблон для alarm reference * ??? - описание аварии (шаблон) ## DiagnosticRules Пакет диагностических сценариев. Поля: * name * is_active * description * match_labels * exclude_labels * scenarios * diagnostic_scenario - сценарий * `is_critical` - останавлииваться, при аварии * labels - список требуемых меток * exclude_labels - список меток, запрещающих запуск * events - список событий * always * reboot * first * ... ? * store - сохранять результат прогона ## IGetDiagnostic ``` py class IGetDiagnostic(BaseInterface): config = DictListParameter(attrs={ "name": StringParameter(), # DiagnosticScenario.name "checks": DictListParameter(attrs={ "name": StringParameter(), "depends_on": StringParameter(), "check": StringParameter(), "arg0": StringParameter(), }) }) returns = DictListParameter(attrs={ "rule": StringParameter(), "name": StringParameter(), "status": BooleanParameter(), "skipped": BooleanParameter(), "error": StringParameter(requred=False), "data": DictParameter(), }) ``` ## Скрипт get_diagnostic Метод handler содержит интерпретатор диагностических сценариев. Проверки реализуются в виде методов `diag_XXX` и имеют сигнатуру: ``` py def diag_XXX(self, arg0: str) -> BaseDiagResult: ... ``` где ``` class BaseDiagResult(object): status: bool def __init__(self, data): ... class OkDiagResult(BaseDiagResult): status = True class ErrDiagResult(BaseDiagResult): status = False ``` При этом, для удобства использования в базовом скрипте get_diagnostic определяются методы ``` py def ok(self, data: Dict[str, Any]) -> OkDiagResult: ... def err(self, data: List[str]) -> ErrDiagResult: ... ``` # >>>> Добавляется список диагностик по аналогии со списком метрик: * **diagnostic** - ссылка на диагностику * **enable_periodic** (bool) - запускать в рамках перодического опроса * **enable_box** (bool) - запускать в рамках полного опроса * **enable_manual** (bool) - вручную через интерфейс пользователя * **fail_policy** - реакция при провале диагностики * `Pass` - ничего не делать * `Stop` - останавливать опрос * `Raise Alarm` - поднимать аварию * `Raise Alarm & Stop` - останавливать опрос и поднимать аварию * **alarm_class** - ссылка на класс аварии Дополнительно можно предусмотреть: * **set_capability** - по итогам записать результат в `Capability` * **fire_event** - отправить сигнал для смены `Workflow`