README
¶
tests/newman/scripts — Newman runner
Скрипты newman regression pipeline:
gen.py— генератор Postman-коллекций изcases/*.pyrun.sh— full-run по всем сервисам или одному (SERVICE=iam-account)
Вердиктный слой ВЕНДОРЕН СЮДА, а не лежит в корне чужого дерева.
assert-suites-green.sh,exec-coverage.pyиcoverage.pyсудят в дереве платформы семь её наборов и потому не принадлежат ни одному; набор службы — восьмой, и он уехал в отдельный репозиторий, где подъём по дереву корня монорепо не достаёт by construction. Без слоя прогонщик, генератор и сверщик кейсов отказывают ПЕРВОЙ СТРОКОЙ, до любого обращения к стенду.Поэтому слой и общий слой отбора (
../kacholib/) здесь СКОПИРОВАНЫ, а расхождение копии с оригиналом держитvendor_provenance_test.py:../vendor-provenance.jsonнесёт отпечаток каждого файла и ПЕРЕЧИСЛЯЕТ каждую подстановку — что стояло в оригинале, что стоит здесь и почему. Правка копии без правки записи роняет пробу с именем файла; сверка с самим оригиналом — по ручкеKANAME_VENDOR_UPSTREAM, и перепись на каждом прогоне называет, сверялась она или нет. Подтянуть копию заново —vendor_provenance_sync.py --upstream <дерево> --pull.Сверку с оригиналом конвейер ТРЕБУЕТ, а не предлагает (с 2026-09-12). Прежде ручка была единственным входом, и при незаданной ручке держатель печатал «сверено с оригиналом 0» — правду — и выходил кодом 0: конвейер читает КОД, поэтому неизмеренная ось выглядела ровно как измеренная и не измерилась ни разу. Теперь
--require-upstreamдаёт при отсутствии дерева код 3 — третий исход, не проход и не находка, — а дерево платформы выбирается вe2e-newman.ymlпо ревизии, объявленной в записи ЕДИНСТВЕННЫМ местом. Провязку держитvendor_upstream_wiring_test.py— ВОСЕМЬ осей: пин в годной форме · пин объявлен один раз, и это дом записи · сверка потребована · дерево дано тому же шагу · дерево берётся по пину из записи · выборка в подкаталог и раньше сверки · КОД ДЕРЖАТЕЛЯ ДОЕЗЖАЕТ до вердикта шага · ПОСЛАБЛЕНИЕ у выборки спарено с тем, кто ловит отказ. Судит она РАЗОБРАННОЕ описание процесса: флаг встречается в комментариях, и проверка подстрокой зеленела бы на собственном объяснении. Разбор у пробы СВОЙ, а pyyaml — контроль: общий прогонщик проб третьего исхода для гейта не знает, и обязательная зависимость давала бы красное о дереве там, где вердикта нет.
validate-cases.py— сверщик КАТАЛОГА кейсов: переписьdocs/CASES-INDEX.mdпротив дерева (итог и по каждому модулю) + покрытие каждого идентификатора. Тело общее на дерево (tests/newman/kacholib/casesindex.py), здесь — только решения набора; доказательство инъекцией —casesindex_test.py. Уникальность идентификаторов держит не он, а хребет генератора (_scan_suite): дубль роняет самgen.py
Форма базового удостоверения (#1253) — объявлена ОДИН раз в
../credential-secret-form.json; читают её двое, и вторая копия образца не
заводится:
credsecretmint/— программа чеканки настоящим кодом продукта (ids.NewID+credsecret.Mint) и Go-пробаform_test.go, сверяющая объявление с тем, что продукт ЧЕКАНИТ. Идёт обычнымmake test-unit(её вторым прогоном,go test ./...), отдельного вызова не требует;gen.py— helpercredential_secret_pattern(вид)подставляет вид и вставляет образец в порождаемый скрипт кейса.
Самопроверки (стенд не нужен; одна провязана в конвейер, вторая — нет):
selftest_basic_access_token.py— настоящий newman по настоящей коллекции против подставного края; секрет в законном ответе чеканит продукт. Законный вход обязан пройти молча, девять инъекций — упасть, назвав себя. В ЭТОМ РЕПОЗИТОРИИ НЕ ПРОВЯЗАНА, и это долг, а не норма. Прежняя редакция адресовала её «e2e-newman.yml, jobplan, шаг „форма базового удостоверения сверена с чеканкой продукта"». Координата мёртвая по трём осям сразу, и у каждой свой предикат: заданий у процесса ДВА —suiteиstand; названного шага нет ни в одном процессе дерева (grep -rl "форма базового удостоверения" .github/→ ни одного файла); держателяinternal/repohygieneздесь нет вовсе (git ls-files | grep -c "^internal/repohygiene/"→ 0) — он живёт в дереве платформы. Зовёт эту самопробу СЕГОДНЯ ноль мест: имя встречается в трёх файлах (git grep -l selftest_basic_access_token | wc -l→ 3), и это она сама, эта страница и проза в комментарииcredsecretmint/main.go. Про предикат #1253 и гейт платформы всё сказанное верно ТАМ; здесь производителя зелёного утверждения нет, и написанное иначе читалось бы как выполненная провязка. Вердикт стоит на ПОЛУ: «упавших ноль» приходит и от полосы, где нечего было исполнять, поэтому законный вход обязан быть ИСПОЛНЕН, а не только не упасть. Пол сам есть утверждение, и его доказательство (--self-test, девять осей по три утверждения) идёт ПЕРВЫМ действием каждого запуска — отдельной строкой в конвейере оно было бы вторым местом об одном предмете и снималось бы молча, а вызывающего по построению снять нельзя, не сняв сам производитель;selftest_token_facade_forms.py— в конвейер НЕ провязана; предмет своей задачи, здесь не чинится. Перепись по дереву на день провязки (единица счёта — отслеживаемый git файлtests/newman/scripts/selftest_*.py): самопроверок 15, без единого вызывающего 5. Число — ориентир, а не гейт: перемеряйте предикатом из шапкиinternal/repohygiene/basiccredentialproofrun_test.go;
Третий исход набора — «условие не создано», и он отличим МАШИННО:
gen.py::PRECONDITION_MARK— единственный производитель метки. Её несёт утверждение стража адреса (require_env_url), которое падает тогда и только тогда, когда прогонщик не инъектировал переменную с адресом поверхности;tests/newman/scripts/assert-suites-green.sh— читает метку у производителя ЭТОГО набора (не выписывает её) и считает помеченное ОТДЕЛЬНОЙ строкой. Кодов возврата три:0зелено,1находка,3условие не создано. Тройка НИКОГДА не приходит вместе с находкой — иначе категория стала бы маской. Вычитания метка не заводит: помеченное остаётся в общем числе падений, прогон остаётся ненулевым;tests/newman/scripts/precondition_mark_test.py(+precondition_mark_injection_test.py) — держат единственность производителя: кейс, поставивший метку себе, вывел бы своё падение из находок без чьего-либо решения;tests/newman/scripts/precondition_outcome_test.py— гоняет НАСТОЯЩИЙ вердиктный гейт на синтетических отчётах и утверждает ПАРУ «текст + код возврата» по каждой оси. newman для него не нужен. Все три идут прогонщиком.github/scripts/run-python-probes.pyпо суффиксу_test.py, отдельного шага в конвейере не требуют.
Адрес собственных REST-фронтов службы приходит от deploy/scripts/
own-rest-front-address.py: порт — ПО ИМЕНИ порта Service, транспорт и режим
проверки клиента — из переменных процесса, всё ОДНИМ обращением к посадке.
Оттуда же приходит РЕШЕНИЕ, требует ли фронт проверенного клиентского листа на
рукопожатии: прогонщик его не вычисляет — предикат живёт у продукта
(MTLSConfig.InternalRESTRequiresClientCert), а вторая его копия разошлась бы с
первой молча. Транспорт этого вопроса не решает: фронт под TLS бывает и
односторонним, и на нём лист подан впустую. Прогонщик ничего из этого не
выписывает, и это держит гейт deploy/scripts/assert-own-front-address-is-read.py.
Структурно адаптировано от kacho-vpc/tests/newman/scripts/.
Координаты в прозе: ДВА дерева, и который из них — сказано здесь один раз
Набор приехал из монорепо PRO-Robotech/kacho вместе со своей прозой, и проза
ссылается на оба дерева сразу. Перечислять это у каждого упоминания значило бы
завести сотни мест об одном предмете, поэтому соглашение объявлено ЗДЕСЬ, один раз.
Резолвятся в этом репозитории (и обязаны резолвиться — мёртвая координата тут
есть находка): tests/newman/**, internal/**, cmd/**, pkg/** нет —
фундамент приезжает модулем, tools/** кроме названного ниже, deploy/Chart.yaml
и deploy/values*.yaml, .github/**.
НЕ резолвятся и не должны — это координаты ДЕРЕВА ПЛАТФОРМЫ, где живут остальные семь наборов и машинерия её стенда. Перепись на момент вендоринга вердиктного слоя:
| префикс | вхождений в прозе набора | что это |
|---|---|---|
deploy/scripts/ |
270 | подъём стенда платформы, проброс переменных, гейты посадки и шардов |
internal/repohygiene/ |
25 | гейты дерева платформы |
tools/pythonprobes |
22 | гейт проводки проб платформы; ЗДЕСЬ его нет — см. долг ниже |
gateway/ |
20 | край платформы: он производит свойства, которые проверяют 40 модулей кейсов из 41 |
proto/kaname/ |
12 | контракты; сюда они приезжают модулем платформы, а не файлами |
services/{vpc,storage,compute,nlb,registry}/ |
10 | соседние наборы и их домены |
КТО ЭТИ ПРОБЫ ЗОВЁТ. .github/workflows/e2e-newman.yml, задание suite
(отображаемое имя — «набор — оснастка, пробы, покрытие, долг»; ключ и имя разные, и
адресовать надо КЛЮЧОМ: по отображаемому имени задание не выбирается) — шагом
python3 .github/scripts/run-python-probes.py, и перед ним отдельным шагом
идёт --self-test прогонщика: способность вердикта упасть доказывается ДО того,
как ему поверят. Состав прогонщик собирает ОБХОДОМ отслеживаемого дерева и ни
одного файла по имени не называет, поэтому новая проба попадает под прогон по
построению, а не после того, как кто-то вспомнит.
ДОЛГ, НАЗВАННЫЙ ЧИСЛОМ. Проводку проб — «всякий отслеживаемый файл
*_test.py покрыт образцом прогонщика» — в дереве платформы держит гейт
tools/pythonprobes; в этом репозитории его НЕТ. Половина свойства здесь есть и
работает: прогонщик печатает перепись по каждому образцу и отказывает на пустом
обходе. Вторая половина (файл проб, которого не покрывает ни один образец)
сегодня не держится ничем, и это надо читать как долг, а не как норму.
Directories
¶
| Path | Synopsis |
|---|---|
|
credsecretmint — печатает базовое удостоверение, ОТЧЕКАНЕННОЕ КОДОМ ПРОДУКТА.
|
credsecretmint — печатает базовое удостоверение, ОТЧЕКАНЕННОЕ КОДОМ ПРОДУКТА. |