---
# System prepended metadata

title: Диагностические сценарии

---


# Диагностические сценарии

## Коллекция 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`


