# Диагностические сценарии
## Коллекция 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`