producer

package
v1.5.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 13, 2026 License: Apache-2.0 Imports: 8 Imported by: 0

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

View Source
const ConfigMapDataLimit = 1 << 20

ConfigMapDataLimit — сколько байт манифестов помещается в один ConfigMap.

Величина не наша: apiserver отвергает объект больше мебибайта целиком. Замер дерева на день заведения — 95 524 байта в шести манифестах, то есть запас одиннадцатикратный. Предел назван здесь, чтобы превышение приходило переписью производителя, а не отказом apiserver посреди подъёма стенда: второе диагностируется дороже при том же исходе.

Variables

View Source
var ErrNoManifests = errors.New("манифеста в дереве нет ни одного")

ErrNoManifests — доставка объявлена, а манифеста в дереве нет ни одного.

Беспредметный обход: положить в ConfigMap нечего, и объявить его пустым нельзя — пустой каталог доставки процесс читает как сорванную доставку и отказывается стартовать.

View Source
var ErrNotDeclared = errors.New("доставка манифестов цепочкой профилей не объявлена")

ErrNotDeclared — цепочка профилей доставку не объявляет.

Это ЗАКОННЫЙ исход, а не отказ: стенд вправе не опираться на манифесты, и тогда ConfigMap заводить нечего. Отдельная ошибка, а не пустое имя, потому что вызывающему предстоит развести эти исходы по разным кодам возврата.

Functions

func Render

func Render(d Delivery) ([]byte, error)

Render собирает объект ConfigMap.

Порядок ключей ЗАКРЕПЛЁН (по каталогу службы): вывод производителя читают глазами и сверяют гейтом, а карта Go порядка не имеет — два прогона дали бы разный текст при неизменном дереве.

Types

type Census

type Census struct {
	// ProfilesRead — профилей цепочки прочитано.
	ProfilesRead int
	// ServiceDirs — каталогов служб осмотрено.
	ServiceDirs int
	// Manifests — манифестов найдено.
	Manifests int
	// WithoutManifest — службы БЕЗ манифеста, поимённо и по возрастанию.
	//
	// Не находка: манифест заводится своей задачей, и ронять подъём стенда на
	// его отсутствии значило бы делать производителя гейтом чужого предмета.
	// Но и молчать нельзя: доставка пяти манифестов из шести снаружи выглядит
	// точно так же, как доставка всех.
	WithoutManifest []string
	// Bytes — байт манифестов, доставляемых в ConfigMap.
	Bytes int
}

Census — объём осмотренного. Печатается ВСЕГДА, на всяком исходе: без него «ноль находок» не отличается от «ноль прочитанного».

func (Census) Summary

func (c Census) Summary() string

Summary — перепись одной строкой.

type Delivery

type Delivery struct {
	Name    string
	Sources []Source
	Census  Census
}

Delivery — то, что производитель собрал: имя объекта, источники и перепись.

func Collect

func Collect(repoRoot string, profiles []string) (Delivery, error)

Collect читает объявленное имя из профилей и собирает манифесты дерева.

Перепись возвращается ВСЕГДА, включая отказ: без неё «профили прочитаны, имя не объявлено» не отличается от «профили не прочитаны».

type Source

type Source struct {
	// Dir — каталог службы под `services/`. Он же — начало ключа ConfigMap.
	Dir string
	// Path — путь манифеста ОТ КОРНЯ ДЕРЕВА: координата для находки.
	Path string
	// Body — содержимое, доставляемое побайтово. Производитель манифест НЕ
	// разбирает: годность документа судит читатель на старте службы и гейт
	// дерева, и второй судья разошёлся бы с ними формой.
	Body []byte
}

Source — манифест модуля, найденный в дереве.

func (Source) Key

func (s Source) Key() string

Key — ключ ConfigMap для этого источника.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL