moduleseedparity

package
v0.2.0 Latest Latest
Warning

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

Go to latest
Published: Sep 13, 2026 License: AGPL-3.0 Imports: 3 Imported by: 0

Documentation

Overview

Package moduleseedparity — сверка раздела `seed` манифеста модуля с ЖИВОЙ базой (задача #1891, вторая половина её предиката).

Сверяются ВСЕ ЧЕТЫРЕ подраздела; наружу выведена только НЕВЫРАЗИМОСТЬ

Раздел несёт четыре подраздела — служебные записи, группы, выдачи и вступления, — и сверка судит каждый. Из-под вердикта выведена не половина раздела, а один ВИД строки: тот, который форма манифеста выразить не может.

Вид назван и ВЫВОДИТСЯ из самой формы, а не объявлен списком: у выдачи есть ключ `roleId` и нет ни одного ключа для ОТНОШЕНИЯ, поэтому выдача отношением необъявима ни при каком написании; группа необъявима по следствию — валидатор связности требует, чтобы заведённая группа была названа выдачей манифеста (`ErrGroupNeverGranted`), а такой выдачи у неё нет. Разбор и исходы — #1936.

Невыразимое НЕ ОТБРАСЫВАЕТСЯ молча: Compare возвращает его отдельным перечнем, потребитель печатает каждую строку по имени, а перепись называет его числом. Появится у выдачи ключ отношения — проба предпосылки (`TestBindingFormStillCannotExpressARelationGrant`) покраснеет и потребует расширить сверку. Ведомости прощённых у гейта нет: прощать нечего, пока форма не изменилась, и прощение не понадобится, когда изменится.

Число границы считается ПО ВЛАДЕЛЬЦУ, и это не педантизм

Здесь стояло одно число на все живые строки — «выдач живых 8, из них выразимых формой 0», — и оно складывало два разных предмета. Строка без модуля-владельца (`kacho-api-gateway`, `kacho-bootstrap-admin`, `user:*`, владельческая привязка системного аккаунта) манифестом МОДУЛЯ невыразима by construction: объявлять её некому, и её отсутствие среди объявленного — верно, а не пробел. Пробел — только строка, у которой владелец ЕСТЬ, а формы нет; таких из восьми **две** (`kacho-compute` и `kacho-vpc` → `system_viewer`). Перепись поэтому печатает по каждому подразделу четыре величины: живых · без модуля-владельца · с владельцем · из них формой невыразимых.

Владелец живой строки выводится ИМЕНЕМ, а не приписывается

Служебная запись модуля названа `kacho-<служба>`; служба переводится в модуль закрытого набора платформы (`pkg/platformmodules`). Запись, чьё имя этому не отвечает (`kacho-api-gateway`, `kacho-bootstrap-admin`), манифестом модуля невыразима by construction — у неё нет модуля-владельца, — и считается отдельно. Иначе её отсутствие среди объявленных читалось бы как неполнота.

Index

Constants

View Source
const (
	SubjectTypeGroup          = "group"
	SubjectTypeServiceAccount = "serviceAccount"
)

SubjectTypeGroup / SubjectTypeServiceAccount — написание вида субъекта, принятое МАНИФЕСТОМ. Живая строка переводится в него ОДИН раз, на чтении: второе написание того же предмета разошлось бы с первым молча.

Variables

This section is empty.

Functions

This section is empty.

Types

type Binding

type Binding struct {
	SubjectType string
	SubjectName string
	// RoleID — выдача РОЛЬЮ: единственная форма, которую манифест умеет
	// объявить.
	RoleID string
	// Relation — выдача ОТНОШЕНИЕМ. Ключа для неё у формы манифеста нет ни
	// одного, поэтому строка с непустым Relation невыразима by construction
	// (#1936). Поле здесь ради того, чтобы это было ВИДНО, а не выпадало из
	// чтения молча.
	Relation  string
	ScopeType string
	ScopeID   string
}

Binding — выдача, которую делает установка модуля.

Вид субъекта пишется по-МАНИФЕСТНОМУ (`serviceAccount`, `group`): второе написание того же предмета разошлось бы с первым, поэтому перевод живой строки (`service_account`) делается ОДИН раз, на чтении, а не по месту сравнения.

Якорь области хранится в точечной форме (`iam.cluster`) — так его пишет манифест, и так же переводится живая пара `resource_type`/`resource_id`.

func (Binding) String

func (b Binding) String() string

type Census

type Census struct {
	Manifests int
	SA        Subsection
	Groups    Subsection
	Bindings  Subsection
	Joins     Subsection
}

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

func (Census) String

func (c Census) String() string

type Group

type Group struct {
	Account     string
	Name        string
	Description string
}

Group — группа, заводимая установкой модуля.

func (Group) String

func (g Group) String() string

type Join

type Join struct {
	AccountName  string
	SAName       string
	GroupAccount string
	GroupName    string
}

Join — вступление служебной записи в чужую группу. Обе стороны адресуются ПАРОЙ (аккаунт, имя): так они уникальны в продукте.

func (Join) String

func (j Join) String() string

type ModuleState

type ModuleState struct {
	Module          string
	ManifestFile    string
	DeclaredSA      []ServiceAccount
	LiveSA          []ServiceAccount
	DeclaredGroup   []Group
	LiveGroup       []Group
	DeclaredBinding []Binding
	LiveBinding     []Binding
	DeclaredJoin    []Join
	LiveJoin        []Join
}

ModuleState — обе стороны сверки по одному модулю.

Живые строки приходят сюда УЖЕ отнесёнными к модулю-владельцу: строки без владельца сверке не подлежат и считаются переписью отдельно.

type Result

type Result struct {
	// Findings — расхождения объявленного с живым. Гейт на них падает.
	Findings []string
}

Result — исход сверки.

Перечень ОДИН. Их было два, и различие было несущим: расхождение чинилось правкой манифеста, невыразимое — правкой ФОРМЫ, разными людьми в разных изменениях, и сложить их значило бы требовать от автора манифеста починить то, чего он написать не может.

Второй перечень снят вместе со своим предметом (#1936): форма научилась выражать выдачу отношением, и строк, которых автор написать не может, не осталось. Держать пустой перечень значило бы держать исключение, которому нечего исключать, — оно не истекло бы уже никогда.

func Compare

func Compare(states []ModuleState) Result

Compare сравнивает объявленное с живым по каждому модулю.

Расхождение называется В ОБЕ СТОРОНЫ: строка живая и не объявленная — манифест неполон; объявленная и не живая — манифест обещает то, чего установка не завела. Второе не мягче первого: применитель, когда он появится, заведёт по объявлению.

Обход ОДИН: перечни находок и невыразимого производятся вместе, поэтому вызывающий не может прочитать один и забыть про другой.

type ServiceAccount

type ServiceAccount struct {
	Account     string
	Name        string
	Description string
}

ServiceAccount — служебная запись: то, что сверяется, и ничего сверх. Идентификатор сюда НЕ входит: живой его производит выражение внутри миграции (`'sva' || substr(md5(name), 1, 17)`), то есть он есть частность записи, а не то, что объявляет манифест. Сверять по нему значило бы требовать от манифеста воспроизвести случайность.

func (ServiceAccount) String

func (s ServiceAccount) String() string

type Subsection

type Subsection struct {
	Declared  int
	Live      int
	Ownerless int
	Owned     int
}

Subsection — перепись одного подраздела посева.

Величин ТРИ, и ни одну нельзя выбросить, не потеряв различия, ради которого перепись и печатается: `Live` отвечает, читалось ли вообще что-то; `Ownerless` отделяет невыразимое by construction (объявлять некому) от пробела; `Owned` называет предмет сверки. Одно число вместо трёх скрывало бы ровно тот случай, ради которого граница названа.

ЧЕТВЁРТАЯ величина здесь была — `Inexpressible`, «та часть предмета, которой форма не умеет», — и снята вместе со своим предметом (#1936): форма научилась выражать выдачу отношением, невыразимого вида строки не осталось. Величина, тождественно равная нулю, перепись не уточняет, а разбавляет: читатель ищет у неё смысл и не находит.

func (Subsection) String

func (s Subsection) String() string

Jump to

Keyboard shortcuts

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