Documentation
¶
Overview ¶
Package modulemanifests — ПРОИЗВОДИТЕЛЬ ConfigMap с манифестами модулей (задача #1901).
Предмет ¶
Доставка манифестов заведена целиком (#1875): чарт монтирует именованный ConfigMap, процесс читает смонтированный каталог, страж старта отказывает на сорванной доставке. Наполнить этот ConfigMap в дереве было НЕЧЕМ — ни цели сборки, ни шага подъёма стенда, ни объявления внешнего конвейера. Пока производителя нет, опору на манифесты нельзя объявить ни в одном профиле: под поднимется с пустым каталогом, а процесс откажет, назвав сорванную доставку.
Здесь эта половина и заводится: перечень манифестов ВЫВОДИТСЯ из дерева, имя ConfigMap ВЫВОДИТСЯ из тех же профилей, которые читает helm, а на выходе — объект, который применяет тот, кто поднимает стенд.
Почему перечень выводится, а не выписывается ¶
Выписанный перечень модулей разошёлся бы с деревом молча — и разошёлся бы именно тогда, когда заводят новый модуль: манифест в дереве есть, до службы он не доезжает, и ни одна проверка об этом не говорит. Поэтому источники собираются обходом `services/*/manifest.yaml`, а служба БЕЗ манифеста называется переписью поимённо: «ноль находок» обязано быть отличимо от «ноль прочитанного».
Почему ключ ConfigMap — КАТАЛОГ СЛУЖБЫ, а не имя модуля ¶
Ключ ConfigMap становится именем файла в каталоге доставки, и он же стоит координатой в находке читателя. Каталог службы есть ПРЯМАЯ координата источника (`services/<ключ>/manifest.yaml`) — по ней находку чинят, не держа в голове ничего лишнего. Имя модуля такой координатой не является: каталог `nlb` объявляет модуль `loadbalancer`, и по имени модуля источник пришлось бы искать.
Форма ключа при этом ВЫНУЖДЕННАЯ, а не выбранная: имя `manifest.yaml` в одном ConfigMap может быть только одно, а подкаталога внутри ключа не бывает вовсе — замер обеими командами приведён в `services/iam/internal/manifest/delivery.go`.
Index ¶
Constants ¶
const ConfigMapDataLimit = 1 << 20
ConfigMapDataLimit — сколько байт манифестов помещается в один ConfigMap.
Величина не наша: apiserver отвергает объект больше мебибайта целиком. Замер дерева на день заведения — 95 524 байта в шести манифестах, то есть запас одиннадцатикратный. Предел назван здесь, чтобы превышение приходило переписью производителя, а не отказом apiserver посреди подъёма стенда: второе диагностируется дороже при том же исходе.
Variables ¶
var ErrNoManifests = errors.New("манифеста в дереве нет ни одного")
ErrNoManifests — доставка объявлена, а манифеста в дереве нет ни одного.
Беспредметный обход: положить в ConfigMap нечего, и объявить его пустым нельзя — пустой каталог доставки процесс читает как сорванную доставку и отказывается стартовать.
var ErrNotDeclared = errors.New("доставка манифестов цепочкой профилей не объявлена")
ErrNotDeclared — цепочка профилей доставку не объявляет.
Это ЗАКОННЫЙ исход, а не отказ: стенд вправе не опираться на манифесты, и тогда ConfigMap заводить нечего. Отдельная ошибка, а не пустое имя, потому что вызывающему предстоит развести эти исходы по разным кодам возврата.
Functions ¶
Types ¶
type Census ¶
type Census struct {
// ProfilesRead — профилей цепочки прочитано.
ProfilesRead int
// ServiceDirs — каталогов служб осмотрено.
ServiceDirs int
// Manifests — манифестов найдено.
Manifests int
// WithoutManifest — службы БЕЗ манифеста, поимённо и по возрастанию.
//
// Не находка: манифест заводится своей задачей, и ронять подъём стенда на
// его отсутствии значило бы делать производителя гейтом чужого предмета.
// Но и молчать нельзя: доставка пяти манифестов из шести снаружи выглядит
// точно так же, как доставка всех.
WithoutManifest []string
// Bytes — байт манифестов, доставляемых в ConfigMap.
Bytes int
}
Census — объём осмотренного. Печатается ВСЕГДА, на всяком исходе: без него «ноль находок» не отличается от «ноль прочитанного».
type Source ¶
type Source struct {
// Dir — каталог службы под `services/`. Он же — начало ключа ConfigMap.
Dir string
// Path — путь манифеста ОТ КОРНЯ ДЕРЕВА: координата для находки.
Path string
// Body — содержимое, доставляемое побайтово. Производитель манифест НЕ
// разбирает: годность документа судит читатель на старте службы и гейт
// дерева, и второй судья разошёлся бы с ними формой.
Body []byte
}
Source — манифест модуля, найденный в дереве.