config: отсутствие файла и содержание сообщений валидатора
- R20: конфига нет — не стартуем; умолчания существуют для неполного файла, а не для отсутствующего - R21: значение поля в сообщении валидатора печатается по тому же признаку секретности, что у R15 и R16, второй список не заводится - в перечень проверок R18 добавлен формат идентификаторов сущностей
This commit is contained in:
@@ -57,6 +57,28 @@
|
|||||||
(тесты, второй инстанс): без неё их разводят переменной окружения — тем
|
(тесты, второй инстанс): без неё их разводят переменной окружения — тем
|
||||||
самым каналом, который закрывает R1.
|
самым каналом, который закрывает R1.
|
||||||
|
|
||||||
|
### R20. Отсутствие файла конфигурации — ошибка старта
|
||||||
|
|
||||||
|
**ДОЛЖЕН.** Если файла нет ни по пути из опции, ни по имени по умолчанию в
|
||||||
|
рабочей директории (R3), приложение не стартует: сообщение называет
|
||||||
|
искомый путь, код возврата ненулевой.
|
||||||
|
|
||||||
|
**Почему.** Конфиг — артефакт деплоя (R12), и его отсутствие означает, что
|
||||||
|
развёртывание не довело работу до конца, а не что приложение попросили
|
||||||
|
работать на умолчаниях. Умолчания (R7) существуют, чтобы работал
|
||||||
|
**неполный** файл, а не отсутствующий, — именно здесь читатель спотыкается
|
||||||
|
чаще всего.
|
||||||
|
|
||||||
|
Старт без файла ничего не спасает: у приложения с обязательными полями или
|
||||||
|
секретами всё равно упадёт валидация (R18), только вместо одного сообщения
|
||||||
|
«нет `config.toml`» получится каскад «поле пусто», за которым настоящая
|
||||||
|
причина — деплой не отрендерил файл — не видна.
|
||||||
|
|
||||||
|
Приложение, которое запускается вообще без конфигурации, этой конвенцией не
|
||||||
|
описывается: это отдельный случай и отдельная конвенция.
|
||||||
|
|
||||||
|
<!-- local:проверки -->
|
||||||
|
<!-- /local -->
|
||||||
### R4. В репозитории лежит образец, а не рабочий конфиг
|
### R4. В репозитории лежит образец, а не рабочий конфиг
|
||||||
|
|
||||||
**НЕ ДОЛЖЕН.** Реальный конфиг не коммитится; в репозитории — образец.
|
**НЕ ДОЛЖЕН.** Реальный конфиг не коммитится; в репозитории — образец.
|
||||||
@@ -225,7 +247,7 @@
|
|||||||
| R18.1 | обязательные поля заданы (непустота секретов — R15) | в ветке, которая это поле читает |
|
| R18.1 | обязательные поля заданы (непустота секретов — R15) | в ветке, которая это поле читает |
|
||||||
| R18.2 | пути существуют и доступны на запись/чтение по назначению | при первой записи, уже после отчёта об успешном старте |
|
| R18.2 | пути существуют и доступны на запись/чтение по назначению | при первой записи, уже после отчёта об успешном старте |
|
||||||
| R18.3 | числовые диапазоны и единицы: доли, таймауты, счётчики попыток | искажённым поведением без единого сообщения об ошибке |
|
| R18.3 | числовые диапазоны и единицы: доли, таймауты, счётчики попыток | искажённым поведением без единого сообщения об ошибке |
|
||||||
| R18.4 | строки, которые парсятся во что-то (длительности, зоны, URL), реально парсятся | при первом обращении к тому, что за ними стоит |
|
| R18.4 | строки, которые парсятся во что-то (длительности, зоны, URL, идентификаторы сущностей), реально парсятся | при первом обращении к тому, что за ними стоит |
|
||||||
| R18.5 | включённые секции консистентны: у включённой интеграции заданы все обязательные поля | при первом вызове интеграции, часто по расписанию |
|
| R18.5 | включённые секции консистентны: у включённой интеграции заданы все обязательные поля | при первом вызове интеграции, часто по расписанию |
|
||||||
|
|
||||||
**Почему.** Список минимальный и собран по одному признаку — правый
|
**Почему.** Список минимальный и собран по одному признаку — правый
|
||||||
@@ -233,9 +255,6 @@
|
|||||||
потеряна, и диагностируется как дефект приложения. Проверка на старте
|
потеряна, и диагностируется как дефект приложения. Проверка на старте
|
||||||
сводит их все к одному моменту и одному сообщению.
|
сводит их все к одному моменту и одному сообщению.
|
||||||
|
|
||||||
<!-- local:проверки -->
|
|
||||||
<!-- /local -->
|
|
||||||
|
|
||||||
### R19. Проблемы конфига показываются разом
|
### R19. Проблемы конфига показываются разом
|
||||||
|
|
||||||
**ДОЛЖЕН.** Валидация собирает все найденные проблемы и выводит их одним
|
**ДОЛЖЕН.** Валидация собирает все найденные проблемы и выводит их одним
|
||||||
@@ -247,6 +266,26 @@
|
|||||||
одного источника: разом они читаются как одна причина, по одной — как
|
одного источника: разом они читаются как одна причина, по одной — как
|
||||||
череда несвязанных мелочей.
|
череда несвязанных мелочей.
|
||||||
|
|
||||||
|
### R21. Значение поля в сообщении валидатора — по признаку секретности
|
||||||
|
|
||||||
|
**ДОЛЖЕН.** Состав сообщения определяется тем же признаком секретности
|
||||||
|
поля, которым уже пользуются R15 и R16:
|
||||||
|
|
||||||
|
| № | Поле | В сообщении |
|
||||||
|
|---|---|---|
|
||||||
|
| R21.1 | несекретное | имя поля, ожидание и полученное значение: «ожидалось 0–1, получено `1.5`» |
|
||||||
|
| R21.2 | секретное | имя поля и суть нарушения, без значения |
|
||||||
|
|
||||||
|
**Почему.** Сообщение без значения отправляет читателя в файл — сличать
|
||||||
|
глазами каждую строку списка R19; ошибки вида «секунды вместо миллисекунд»
|
||||||
|
или пробел в конце значения из такого сообщения не читаются вовсе. Значение
|
||||||
|
секретного поля при этом печатать некуда: вывод старта уходит в лог
|
||||||
|
супервизора и вывод CI, где круг доступа шире прав файла `0600`, — тот же
|
||||||
|
канал утечки, который закрывает R16. Отдельный список «что не печатать» не
|
||||||
|
заводится: признак один на R15, R16 и R21, а второй список разошёлся бы с
|
||||||
|
первым — и поле оказалось бы секретным для логов, но печатаемым
|
||||||
|
валидатором.
|
||||||
|
|
||||||
## Связано
|
## Связано
|
||||||
|
|
||||||
- `arch/time.md` — формат времени; зона отображения — единственный
|
- `arch/time.md` — формат времени; зона отображения — единственный
|
||||||
|
|||||||
Reference in New Issue
Block a user