5 Commits
12 changed files with 480 additions and 43 deletions
+54
View File
@@ -35,6 +35,21 @@ API стенда ──▶ generated/<стенд>/resources_yaml/ ──▶ gene
В `profile.env` также: `PROVIDER_NAME=nubes`, пути GPG-ключей, актуальная `VERSION` стенда. В `profile.env` также: `PROVIDER_NAME=nubes`, пути GPG-ключей, актуальная `VERSION` стенда.
## Нумерация версий провайдера по стендам
> ⛔ **ЕДИНСТВЕННАЯ схема (с 2026-09-03).** Старые диапазоны (`prod=2.*`, `dev=3.*`,
> `test=5.*`, а также `0.0.x`) — ЛЕГАСИ, **НЕ ИСПОЛЬЗОВАТЬ**. Полная чистка реестра
> выполнена 2026-09-03 — старые версии удалены из S3.
| Стенд | Диапазон версий | Первая |
|---|---|---|
| **prod** (`nubes`) | `1.*.*` | `1.0.0` |
| **dev** (`nubes-dev`) | `2.*.*` | `2.0.0` |
| **test** (`nubes-test`) | `3.*.*` | `3.0.0` |
Версия передаётся аргументом в `03_build_and_upload_provider.sh <ver>` и хранится в
`VERSION` в `profile.env`. Источник правды — [`VERSIONS.md`](../../VERSIONS.md).
## Поток A — генерация Markdown (API → YAML → .md) ## Поток A — генерация Markdown (API → YAML → .md)
| Шаг | Скрипт | Результат | | Шаг | Скрипт | Результат |
@@ -106,6 +121,45 @@ API стенда ──▶ generated/<стенд>/resources_yaml/ ──▶ gene
- Доставка до браузера: S3 → ВМ-зеркало (`/var/www/tf-docs/`) → nginx ВМ отдаёт `/<namespace>/` → под `tf_docs` (reverse-proxy в кластере) → `https://tf-docs.nodejsk8s.dev.nubes.ru/<namespace>/`. - Доставка до браузера: S3 → ВМ-зеркало (`/var/www/tf-docs/`) → nginx ВМ отдаёт `/<namespace>/` → под `tf_docs` (reverse-proxy в кластере) → `https://tf-docs.nodejsk8s.dev.nubes.ru/<namespace>/`.
- ВМ отдаёт также по прямому IP `http://5.172.178.213/<namespace>/`. - ВМ отдаёт также по прямому IP `http://5.172.178.213/<namespace>/`.
## Требования к окружению (настроено 2026-09-03)
Чтобы пайплайн работал **штатно и не ломался**, на машине сборки должно быть:
| Компонент | Как проверить | Что ставить |
|---|---|---|
| `python3-venv` (Debian/Ubuntu) | `python3 -m venv /tmp/v && ls /tmp/v/bin/pip` | `sudo apt install -y python3.12-venv` — без него venv создаётся БЕЗ pip |
| `.venv` проекта с mkdocs | `.venv/bin/python -m mkdocs --version` | пересоздать: `rm -rf .venv && python3 -m venv .venv && .venv/bin/pip install mkdocs==1.6.1 mkdocs-material==9.7.3` |
| Системный mkdocs (запасной) | `python3 -m mkdocs --version` | `pip3 install --user mkdocs==1.6.1 mkdocs-material==9.7.3` |
| `mc` (MinIO client) | `mc --version` | см. docs min.io |
| docker + образ `squidfunk/mkdocs-material` (запасной) | `docker images` | `docker pull squidfunk/mkdocs-material` |
> **Почему так.** `04` при `--profile` собирает через `.venv` проекта. Если `.venv` пустой/сломан (нет pip/mkdocs) — сборка падает. Корень: без системного пакета `python3.12-venv` виртуальное окружение создаётся без `pip`/`ensurepip`. Это чинится один раз (apt + пересоздание `.venv`), дальше не ломается.
> Версии зафиксированы: `mkdocs==1.6.1`, `mkdocs-material==9.7.3` (совпадают и в системном python3, и в `.venv`).
## Публикация: где запускать `mc mirror`
S3 (`s3.msk-1.ngcloud.ru`) из локальной сети **рвёт большие ответы** (рекурсивный листинг >нескольких сотен объектов зависает: `mc: Unable to list ... unexpected EOF`; малые `mc ls`/`mc cp` работают). Поэтому **заливку на S3 делать с ВМ `5.172.178.213`** — у неё быстрый канал до S3 (~10 МБ/с).
Полный цикл публикации стенда (сборка локально → S3 с ВМ → зеркало на ВМ):
```bash
# 1. Сборка (локально, штатно)
./TOOLS/scripts/04_build_and_publish_docs.sh --profile TOOLS/config/test 5.0.8
# (если site/ собирался docker-ом от root — mkdocs не сможет его перезаписать:
# sudo rm -rf site или docker run --rm -v $PWD:/docs --entrypoint rm squidfunk/mkdocs-material -rf /docs/site)
# 2. Передать собранный site/ на ВМ
tar -C site -cf - . | ssh naeel@5.172.178.213 'rm -rf ~/tmp-docs-site && mkdir -p ~/tmp-docs-site && tar -C ~/tmp-docs-site -xf -'
# 3. Залить на S3 с ВМ (быстрый канал)
ssh naeel@5.172.178.213 'mc mirror --overwrite --remove ~/tmp-docs-site/ registry/terraform-registry/docs/nubes-test/nubes/'
# 4. Обновить зеркало /var/www/tf-docs (откуда nginx отдаёт сайт)
ssh naeel@5.172.178.213 'mc mirror --overwrite --remove "registry/terraform-registry/docs/nubes-test/nubes/" /var/www/tf-docs/nubes-test/'
```
> ⚠️ Если `mc mirror`/`mc ls -r` локально зависает — это не баг скрипта, а сеть до S3; заливать с ВМ.
## Быстрые команды ## Быстрые команды
```bash ```bash
@@ -0,0 +1,85 @@
# Баг Dev-генератора: рассинхрон nested-параметра
**Дата:** 2026-09-03
**Статус:** план решения, изменения не выполнены
## Симптом
Сборка Dev-провайдера падает на сгенерированном `95_nodejs_resource.go`:
```text
plan.JsonEnv.IsNull undefined
plan.JsonEnv.IsUnknown undefined
plan.JsonEnv.ValueString undefined
```
## Причина
В Dev API один и тот же параметр `jsonEnv` описан по-разному:
- в `create` — `map` с `sub_params` (`DB_PASS`), то есть nested-параметр;
- в `modify` — `map` без `sub_params`, то есть параметр выглядит плоским.
Генератор объединяет параметры через `params.Merge`. Поэтому в канонической
`SchemaParams` `jsonEnv` становится nested и модель содержит
`*NodejsJsonEnvModel`.
Однако `params.AlignParamTypes` переносит вложенные параметры только когда у
параметра операции уже установлен `HasSubParams`. У `modify.jsonEnv` этот флаг
ложный, поэтому `ModifyParams` сохраняет scalar-представление.
Шаблон `Update` видит `modify.jsonEnv` как scalar и генерирует вызовы
`IsNull()`, `IsUnknown()` и `ValueString()`. В сгенерированной модели это
указатель на nested-структуру, поэтому Go-код не компилируется.
## Универсальное решение
Генератор не должен содержать условий для Dev, Test, Prod или конкретного
сервиса. Нужна единая нормализация всех operation params относительно общей
канонической схемы:
```text
schemaParams = Merge(createParams, modifyParams, deleteParams)
createParams = NormalizeAgainstSchema(createParams, schemaParams)
modifyParams = NormalizeAgainstSchema(modifyParams, schemaParams)
deleteParams = NormalizeAgainstSchema(deleteParams, schemaParams)
```
Нормализация должна рекурсивно переносить из канонической схемы структурные
свойства:
- `Type`;
- `HasSubParams`;
- `SubParams` и их типы.
Собственные свойства конкретной операции должны сохраняться: `ID`,
`Required`, `Default`, описания и остальные operation-specific поля.
После нормализации `SchemaParams.jsonEnv` и `ModifyParams.jsonEnv` будут иметь
одинаковую nested-структуру, а шаблон сгенерирует nested-обработку вместо
scalar-методов.
## Граница ответственности
Расхождение Dev API остаётся дефектом входной схемы, но не должно ломать
универсальный генератор. Исправление только YAML Dev или специальная проверка
`jsonEnv` были бы стендовыми обходами и не решают общий класс проблем.
## Обязательная проверка
Добавить генераторный тест на общий случай:
```text
create: map-fixed/map с sub_params
modify: тот же code без sub_params
ожидание: modify после нормализации — nested
```
Проверка результата: сгенерированный Go-код должен компилироваться, а nested
параметр не должен получать scalar-вызовы в `Update`.
## Текущий статус стендов
- Test `3.0.0` опубликован.
- Prod `1.0.0` опубликован.
- Dev `2.0.0` не опубликован: сборка остановилась на компиляции generated Go.
+61
View File
@@ -0,0 +1,61 @@
# 2026-09-03 — Чистка реестра + новая нумерация версий + баг dev
## Новая схема нумерации версий (с 2026-09-03)
| Стенд | Namespace | Диапазон | Первая |
|---|---|---|---|
| prod | `nubes` | `1.*.*` | `1.0.0` |
| dev | `nubes-dev` | `2.*.*` | `2.0.0` |
| test | `nubes-test` | `3.*.*` | `3.0.0` |
⛔ Старые схемы (`prod=2.*`, `dev=3.*`, `test=5.*`, `0.0.x`) — ЛЕГАСИ, не использовать.
Обновлено: `VERSIONS.md`, `TOOLS/config/*/profile.env`, `DOCS_PIPELINE/README.md`,
`docs/30_registry/guides/getting-started.md`.
## Чистка реестра
Из S3 (`nubes-terraform-registry`, креды super `1112_terraform`) удалены ВСЕ старые версии:
- `nubes-dev`: 3.0.2–3.0.6
- `nubes`: 2.0.2, 2.0.3, 2.0.5, 2.0.6
- `nubes-test`: 0.0.1, 5.0.1–5.0.5, 5.1.17
После чистки в каждом namespace — 0 объектов. Легаси (5.1.17 и т.д.) нигде не осталось.
## Статус перегенерации (2026-09-03)
- ✅ **test** `3.0.0` — сгенерирован и загружен (`Done. Version 3.0.0 uploaded`).
- ❌ **dev** `2.0.0` — НЕ собирается (пропущен по решению пользователя), см. баг ниже.
- ⏳ **prod** `1.0.0` — в работе.
## Баг dev: nodejs jsonEnv (create vs modify)
Симптом: `03` dev падает на компиляции сгенерированного кода:
```
internal/resources_gen/95_nodejs_resource.go:350-353:
plan.JsonEnv.IsNull / IsUnknown / ValueString undefined
(type *NodejsJsonEnvModel has no field or method ...)
```
Причина: **API dev** для nodejs `jsonEnv`:
- в `create` (op id=58) — `map` **с `sub_params`** (типизированные ключи, напр. DB_PASS) → генератор создаёт вложенную модель `NodejsJsonEnvModel`;
- в `modify` (op id=59) — `map` **без `sub_params`** → генератор для diff генерирует строковое сравнение (`IsNull/ValueString`).
У test/prod `jsonEnv` без sub_params в обоих операциях → строка → собирается.
Корень: `TOOLS/resource-generator/internal/params/params.go`, `AlignParamTypes` —
подмешивает `SubParams` из schema в modify только если `HasSubParams` уже true:
```go
if !p.HasSubParams { continue } // modify-jsonEnv (без sub) пропускается
```
Возможный фикс: наследовать `HasSubParams`/`SubParams` из schema для параметров с тем же
code. ⚠️ Нюанс: diff-шаблон исключает nested-поля из `hasServiceParamChanges` — изменение
nested jsonEnv не будет триггерить modify (нужно продумать отдельно).
**Вывод:** сервисы/структуры API стендов отличаются (dev jsonEnv — nested в create).
Каждый стенд рассматривать независимо. dev отложен до решения по генератору/API.
## Прочее (инфраструктура, этот же день)
- Токены API `secrets/*.token` были отозваны на стороне IAM (401 IAM error при валидном exp) — обновлены 2026-09-03.
- S3-креды `.s3cfg_registry` (docs) не имеют прав на бакет бинарников `nubes-terraform-registry`;
заливка бинарников — subuser `super` аккаунта `1112_terraform` (см. `tf_registry/HISTORY/HOWTO-UPLOAD.md`).
+106
View File
@@ -0,0 +1,106 @@
# План: чистка реестра + новая нумерация версий по стендам
> Для Flash. Цель — убрать ВСЕ старые залитые версии (легаси) и ввести единый
> принцип нумерации, чтобы старое (5.1.17 и т.п.) больше нигде не всплывало.
## Новый принцип нумерации (ЗАФИКСИРОВАТЬ)
| Стенд | Namespace | Диапазон версий | Первая версия по новой схеме |
|---|---|---|---|
| **prod** | `nubes` | `1.*.*` | `1.0.0` |
| **dev** | `nubes-dev` | `2.*.*` | `2.0.0` |
| **test** | `nubes-test` | `3.*.*` | `3.0.0` |
> ⛔ Старые схемы (`prod=2.*`, `dev=3.*`, `test=5.*`, а также `0.0.1`) — ЛЕГАСИ.
> Никогда больше не использовать.
## Текущее состояние в S3 (нужно УДАЛИТЬ ВСЁ)
Бакет `nubes-terraform-registry`, префикс `tf-registry.containerk8s.services.ngcloud.ru/<ns>/nubes/`:
- `nubes-dev`: `3.0.2 3.0.3 3.0.4 3.0.5 3.0.6`
- `nubes` (prod): `2.0.2 2.0.3 2.0.5 2.0.6`
- `nubes-test`: `0.0.1 5.0.1 5.0.2 5.0.3 5.0.4 5.0.5 5.1.17`
## Шаг 1 — Удалить все залитые версии из S3
Креды на запись: subuser `super` аккаунта `1112_terraform`,
передаются через переменные окружения `S3_ACCESS_KEY` и `S3_SECRET_KEY`.
```bash
mc alias set super-s3 https://s3.msk-1.ngcloud.ru "$S3_ACCESS_KEY" "$S3_SECRET_KEY" --api S3v4
# Удалить ВСЕ версии каждого стенда (рекursивно, включая подфайлы)
mc rm --recursive --force super-s3/nubes-terraform-registry/tf-registry.containerk8s.services.ngcloud.ru/nubes-test/nubes/
mc rm --recursive --force super-s3/nubes-terraform-registry/tf-registry.containerk8s.services.ngcloud.ru/nubes-dev/nubes/
mc rm --recursive --force super-s3/nubes-terraform-registry/tf-registry.containerk8s.services.ngcloud.ru/nubes/nubes/
```
Проверка после удаления (должно быть пусто):
```bash
mc ls super-s3/nubes-terraform-registry/tf-registry.containerk8s.services.ngcloud.ru/nubes-test/nubes/
mc ls super-s3/nubes-terraform-registry/tf-registry.containerk8s.services.ngcloud.ru/nubes-dev/nubes/
mc ls super-s3/nubes-terraform-registry/tf-registry.containerk8s.services.ngcloud.ru/nubes/nubes/
```
## Шаг 2 — Зафиксировать новую нумерацию в конфигах и док-файлах
Обновить (каждый файл — по новому принципу prod=1.*, dev=2.*, test=3.*):
1. **`VERSIONS.md`** — таблица версий по стендам + схема:
- PROD → `1.*` (первая `1.0.0`)
- DEV → `2.*` (первая `2.0.0`)
- TEST → `3.*` (первая `3.0.0`)
2. **`TOOLS/config/prod/profile.env`** → `VERSION="1.0.0"`
3. **`TOOLS/config/dev/profile.env`** → `VERSION="2.0.0"`
4. **`TOOLS/config/test/profile.env`** → `VERSION="3.0.0"`
5. **`DOCS_PIPELINE/README.md`** — раздел про нумерацию версий (схема выше).
6. **`docs/30_registry/guides/getting-started.md`** — `version = "..."` в примере привести
к актуальной (или оставить как «подставьте нужную», но НЕ 5.0.5 и не 5.1.17).
> ⚠️ Проверить, что в этих файлах нигде не осталось `5.1.17`, `5.0.x`, `3.0.x`
> (кроме новой схемы), `2.0.x` (кроме новой `1.x` для prod). Сделать `grep -rn`.
## Шаг 3 — Перегенерировать провайдеры по новой схеме (01→02→03)
Для каждого стенда (порядок test → dev → prod), версия = первая по новой схеме:
```bash
cd /home/naeel/TF/tf_provider
# TEST → 3.0.0
./TOOLS/scripts/01_generate_yamls.sh --profile TOOLS/config/test
./TOOLS/scripts/02_generate_resources_and_docs_v2.sh --profile TOOLS/config/test
S3_ACCESS_KEY="$S3_ACCESS_KEY" S3_SECRET_KEY="$S3_SECRET_KEY" \
./TOOLS/scripts/03_build_and_upload_provider.sh --profile TOOLS/config/test 3.0.0
# DEV → 2.0.0
./TOOLS/scripts/01_generate_yamls.sh --profile TOOLS/config/dev
./TOOLS/scripts/02_generate_resources_and_docs_v2.sh --profile TOOLS/config/dev
S3_ACCESS_KEY="$S3_ACCESS_KEY" S3_SECRET_KEY="$S3_SECRET_KEY" \
./TOOLS/scripts/03_build_and_upload_provider.sh --profile TOOLS/config/dev 2.0.0
# PROD → 1.0.0
./TOOLS/scripts/01_generate_yamls.sh --profile TOOLS/config/prod
./TOOLS/scripts/02_generate_resources_and_docs_v2.sh --profile TOOLS/config/prod
S3_ACCESS_KEY="$S3_ACCESS_KEY" S3_SECRET_KEY="$S3_SECRET_KEY" \
./TOOLS/scripts/03_build_and_upload_provider.sh --profile TOOLS/config/prod 1.0.0
```
> Документацию (04) НЕ запускать — пользователь пока не просил.
## Предусловия (ПРОВЕРЕНО)
- Go 1.23.1, docker, `mc`, GPG-ключи — на месте.
- Токены API `secrets/{dev,test,prod}.token` — ОБНОВЛЕНЫ 2026-09-03 (валидны, exp 2027-03-02).
- `operation_timeouts.json` в каждом профиле — на месте.
- S3-креды на запись бинарников — `super` subuser (см. выше).
- `registry.env`: hostname `tf-registry.containerk8s.services.ngcloud.ru`, bucket `nubes-terraform-registry`.
## Контроль
После каждого `03` — сообщение `Done. Version X.Y.Z uploaded.`
После всех — в S3 должны остаться ТОЛЬКО:
- `nubes/nubes/1.0.0/`
- `nubes-dev/nubes/2.0.0/`
- `nubes-test/nubes/3.0.0/`
+78
View File
@@ -0,0 +1,78 @@
# План: перегенерация провайдеров всех стендов (версия 0.0.1)
> Для Flash. Генерацию выполняет Flash по этому плану. Документацию НЕ трогать.
## Цель
Перегенерировать код Terraform-провайдера Nubes для 3 стендов из API и залить
бинарники **версии 0.0.1**. Документацию не генерировать и не публиковать.
## Версия
`0.0.1` — для всех трёх стендов.
## Порядок стендов
`test` → `dev` → `prod`
## Команды (для каждого стенда, по порядку)
```bash
cd /home/naeel/TF/tf_provider
# стенд = test | dev | prod
./TOOLS/scripts/01_generate_yamls.sh --profile TOOLS/config/<стенд>
./TOOLS/scripts/02_generate_resources_and_docs_v2.sh --profile TOOLS/config/<стенд>
./TOOLS/scripts/03_build_and_upload_provider.sh --profile TOOLS/config/<стенд> 0.0.1
```
Полные команды:
```bash
# TEST
./TOOLS/scripts/01_generate_yamls.sh --profile TOOLS/config/test
./TOOLS/scripts/02_generate_resources_and_docs_v2.sh --profile TOOLS/config/test
./TOOLS/scripts/03_build_and_upload_provider.sh --profile TOOLS/config/test 0.0.1
# DEV
./TOOLS/scripts/01_generate_yamls.sh --profile TOOLS/config/dev
./TOOLS/scripts/02_generate_resources_and_docs_v2.sh --profile TOOLS/config/dev
./TOOLS/scripts/03_build_and_upload_provider.sh --profile TOOLS/config/dev 0.0.1
# PROD
./TOOLS/scripts/01_generate_yamls.sh --profile TOOLS/config/prod
./TOOLS/scripts/02_generate_resources_and_docs_v2.sh --profile TOOLS/config/prod
./TOOLS/scripts/03_build_and_upload_provider.sh --profile TOOLS/config/prod 0.0.1
```
## Что делает каждый шаг
| Шаг | Результат |
|---|---|
| `01` | тянет YAML-спеки ресурсов из API стенда → `generated/<стенд>/resources_yaml/` |
| `02` | YAML → **Go-код** (`generated/<стенд>/go/`) + `.md`-доки (`generated/<стенд>/docs/`, побочный продукт — НЕ публикуем) |
| `03` | кросс-сборка linux/windows/darwin amd64 (`go build -ldflags "-X main.version=0.0.1 -X main.address=tf-registry.containerk8s.services.ngcloud.ru/<ns>/nubes"`) → `SHA256SUMS` + GPG-подпись → `mc cp` в S3 |
## Namespace и target S3 (автоматически из profile.env + registry.env)
| Стенд | Namespace | Бинарники в S3 |
|---|---|---|
| dev | `nubes-dev` | `nubes-terraform-registry/tf-registry.containerk8s.services.ngcloud.ru/nubes-dev/nubes/0.0.1/` |
| test | `nubes-test` | `.../nubes-test/nubes/0.0.1/` |
| prod | `nubes` | `.../nubes/nubes/0.0.1/` |
## Предусловия — ПРОВЕРЕНО, всё готово
- Go 1.23.1, docker 29.1.3, `mc`, GPG (`secrets/private_key.asc`, `public_key.asc`).
- Токены API: `secrets/{dev,test,prod}.token` на месте.
- API-эндпоинты доступны (HTTP 403 без токена — ожидаемо, токен передаёт 01).
- `TOOLS/config/<стенд>/operation_timeouts.json` на месте.
- `registry.env`: `REGISTRY_HOSTNAME=tf-registry.containerk8s.services.ngcloud.ru`, `S3_BUCKET=nubes-terraform-registry`.
## Чего НЕ делать
- НЕ запускать `04_build_and_publish_docs.sh` (документация не нужна сейчас).
- НЕ менять версию `0.0.1` на другую.
- НЕ трогать `.venv`/mkdocs (для 03 не нужны).
## Контроль успеха
Каждый `03` должен завершиться сообщением `Done. Version 0.0.1 uploaded.`
Проверка версии в реестре после заливки (опционально):
```bash
curl -s https://tf-registry.containerk8s.services.ngcloud.ru/v1/providers/<ns>/nubes/versions
```
(должна появиться `0.0.1`).
+1 -1
View File
@@ -4,7 +4,7 @@ TOKEN_FILE="secrets/dev.token"
# Release versions # Release versions
# Version # Version
VERSION="3.0.8" VERSION="2.0.0"
NAMESPACE="nubes-dev" NAMESPACE="nubes-dev"
PROVIDER_NAME="nubes" PROVIDER_NAME="nubes"
+1 -1
View File
@@ -4,7 +4,7 @@ TOKEN_FILE="secrets/prod.token"
# Release versions # Release versions
# Version # Version
VERSION="2.0.8" VERSION="1.0.0"
NAMESPACE="nubes" NAMESPACE="nubes"
PROVIDER_NAME="nubes" PROVIDER_NAME="nubes"
+1 -1
View File
@@ -3,7 +3,7 @@ NUBES_API_ENDPOINT="https://lk-api-gateway-test.ngcloud.ru/api/v1/svc"
TOKEN_FILE="secrets/test.token" TOKEN_FILE="secrets/test.token"
# Version # Version
VERSION="5.0.8" VERSION="3.0.0"
NAMESPACE="nubes-test" NAMESPACE="nubes-test"
PROVIDER_NAME="nubes" PROVIDER_NAME="nubes"
+36 -31
View File
@@ -74,8 +74,8 @@ S3CFG_REGISTRY="$(resolve_root_path "$S3CFG_REGISTRY")"
TMP_DOCS_DIR="" TMP_DOCS_DIR=""
if [[ -n "$PROFILE_DIR" ]]; then if [[ -n "$PROFILE_DIR" ]]; then
# ⛔ NEVER merge with docs/ — ONLY generated docs from docs_gen/<stand>/ # ⛔ NEVER merge with docs/ — ONLY generated docs from generated/<stand>/docs/
DOCS_GEN_DIR="${DOCS_GEN_DIR:-generated/test}" DOCS_GEN_DIR="${DOCS_GEN_DIR:-generated/$(basename "$PROFILE_DIR")/docs}"
DOCS_GEN_DIR="$(resolve_root_path "$DOCS_GEN_DIR")" DOCS_GEN_DIR="$(resolve_root_path "$DOCS_GEN_DIR")"
if [[ -d "$DOCS_GEN_DIR" ]]; then if [[ -d "$DOCS_GEN_DIR" ]]; then
export MKDOCS_DOCS_DIR="$DOCS_GEN_DIR" export MKDOCS_DOCS_DIR="$DOCS_GEN_DIR"
@@ -89,34 +89,6 @@ fi
DOCS_API_ENDPOINT="${NUBES_API_ENDPOINT:-https://lk-api-gateway.ngcloud.ru/api/v1/svc}" DOCS_API_ENDPOINT="${NUBES_API_ENDPOINT:-https://lk-api-gateway.ngcloud.ru/api/v1/svc}"
DOCS_API_ENDPOINT="$(normalize_api_endpoint "$DOCS_API_ENDPOINT")" DOCS_API_ENDPOINT="$(normalize_api_endpoint "$DOCS_API_ENDPOINT")"
if [[ -n "${MKDOCS_DOCS_DIR:-}" ]]; then
export DOCS_GUIDE_VERSION="$VERSION"
export DOCS_GUIDE_API_ENDPOINT="$DOCS_API_ENDPOINT"
export DOCS_GUIDE_FILE="${MKDOCS_DOCS_DIR}/guides/getting-started.md"
python3 - <<'PY'
import os
import re
from pathlib import Path
guide_path = Path(os.environ["DOCS_GUIDE_FILE"])
if guide_path.exists():
text = guide_path.read_text(encoding="utf-8")
text = re.sub(
r'(version\s*=\s*")([0-9.]+)("\s*#\s*Поставьте нужную вам версию провайдера)',
lambda m: f'{m.group(1)}{os.environ["DOCS_GUIDE_VERSION"]}{m.group(3)}',
text,
count=1,
)
text = re.sub(
r'(api_endpoint\s*=\s*")([^"]+)(")',
lambda m: f'{m.group(1)}{os.environ["DOCS_GUIDE_API_ENDPOINT"]}{m.group(3)}',
text,
count=1,
)
guide_path.write_text(text, encoding="utf-8")
PY
fi
load_s3cfg_registry() { load_s3cfg_registry() {
local cfg="$1" local cfg="$1"
if [[ ! -f "$cfg" ]]; then if [[ ! -f "$cfg" ]]; then
@@ -159,7 +131,7 @@ load_s3cfg_registry() {
TMP_CFG="${ROOT_DIR}/.mkdocs.tmp.yml" TMP_CFG="${ROOT_DIR}/.mkdocs.tmp.yml"
export ROOT_DIR export ROOT_DIR
# Copy 30_registry assets and curated content into docs dir # Copy 30_registry assets and curated content into docs dir (ДО подстановки версии)
if [[ -n "${MKDOCS_DOCS_DIR:-}" ]]; then if [[ -n "${MKDOCS_DOCS_DIR:-}" ]]; then
if [[ -d "${ROOT_DIR}/docs/30_registry" ]]; then if [[ -d "${ROOT_DIR}/docs/30_registry" ]]; then
mkdir -p "${MKDOCS_DOCS_DIR}/30_registry" mkdir -p "${MKDOCS_DOCS_DIR}/30_registry"
@@ -171,6 +143,39 @@ if [[ -n "${MKDOCS_DOCS_DIR:-}" ]]; then
fi fi
fi fi
# Per-стенд подстановка в getting-started (после копирования 30_registry в docs_dir)
if [[ -n "${MKDOCS_DOCS_DIR:-}" ]]; then
export DOCS_GUIDE_VERSION="$VERSION"
export DOCS_GUIDE_API_ENDPOINT="$DOCS_API_ENDPOINT"
export DOCS_GUIDE_NAMESPACE="$NAMESPACE"
export DOCS_GUIDE_FILE="${MKDOCS_DOCS_DIR}/30_registry/guides/getting-started.md"
python3 - <<'PY'
import os
import re
from pathlib import Path
guide_path = Path(os.environ["DOCS_GUIDE_FILE"])
if guide_path.exists():
text = guide_path.read_text(encoding="utf-8")
# source namespace: .../{{NAMESPACE}}/nubes -> .../<ns>/nubes
text = text.replace("{{NAMESPACE}}", os.environ["DOCS_GUIDE_NAMESPACE"])
# version (первое вхождение version = "x.y.z" — блок required_providers)
text = re.sub(
r'(version\s*=\s*")([0-9.]+)(")',
lambda m: f'{m.group(1)}{os.environ["DOCS_GUIDE_VERSION"]}{m.group(3)}',
text,
count=1,
)
text = re.sub(
r'(api_endpoint\s*=\s*")([^"]+)(")',
lambda m: f'{m.group(1)}{os.environ["DOCS_GUIDE_API_ENDPOINT"]}{m.group(3)}',
text,
count=1,
)
guide_path.write_text(text, encoding="utf-8")
PY
fi
python3 - <<'PY' python3 - <<'PY'
import os import os
import re import re
+10 -7
View File
@@ -4,9 +4,9 @@
| Стенд | Namespace | Версия | Дата заливки | | Стенд | Namespace | Версия | Дата заливки |
|---|---|---|---| |---|---|---|---|
| DEV | `nubes-dev` | `3.0.2` | 2026-08-09 | ✅ из DEV API | | PROD | `nubes` | `1.0.0` | 2026-09-03 | (новая нумерация) |
| TEST | `nubes-test` | `5.0.1` | 2026-08-09 | ✅ | | DEV | `nubes-dev` | `2.0.0` | 2026-09-03 | (новая нумерация) |
| PROD | `nubes` | `2.0.1` | — | | | TEST | `nubes-test` | `3.0.0` | 2026-09-03 | (новая нумерация) |
## Как проверить ## Как проверить
@@ -23,8 +23,11 @@ curl -s https://tf-registry.containerk8s.services.ngcloud.ru/v1/providers/nubes/
## Схема версионирования ## Схема версионирования
| Стенд | Первая цифра | > ⛔ ЕДИНСТВЕННАЯ СХЕМА (с 2026-09-03). Старые диапазоны (prod=2.*, dev=3.*,
> test=5.*, а также 0.0.x) — ЛЕГАСИ, НЕ ИСПОЛЬЗОВАТЬ.
| Стенд | Диапазон |
|---|---| |---|---|
| PROD | `2.*` | | PROD | `1.*` |
| DEV | `3.*` | | DEV | `2.*` |
| TEST | `5.*` | | TEST | `3.*` |
+2 -2
View File
@@ -24,8 +24,8 @@
terraform { terraform {
required_providers { required_providers {
nubes = { nubes = {
source = "tf-registry.containerk8s.services.ngcloud.ru/nubes/nubes" source = "tf-registry.containerk8s.services.ngcloud.ru/{{NAMESPACE}}/nubes"
version = "5.0.5" # Поставьте нужную вам версию провайдера version = "0.0.0" # автозамена на версию стенда при сборке (prod=1.x, dev=2.x, test=3.x)
} }
} }
} }
+45
View File
@@ -0,0 +1,45 @@
# Проверка решения бага Dev-генератора
Ты выполняешь короткий read-only review. Ничего не меняй, не запускай генерацию,
не собирай и не публикуй провайдер.
## Задача
Проверь, правильно ли диагностирован баг и правильно ли предложено решение:
1. `create.jsonEnv` может быть nested (`sub_params`), а `modify.jsonEnv` — без
`sub_params`.
2. `Merge` формирует каноническую схему из параметров операций.
3. `AlignParamTypes` выравнивает типы, но не переносит `HasSubParams/SubParams`,
если у operation-параметра `HasSubParams` изначально false.
4. Шаблон `Update` поэтому генерирует scalar-вызовы для поля, которое в модели
является nested-структурой.
5. Универсальное решение — нормализовать каждый набор operation params
относительно канонической `SchemaParams`, рекурсивно наследуя структурные
свойства, без условий по стенду или сервису.
## Прочитать только эти файлы
1. `TOOLS/resource-generator/internal/params/params.go`
2. `TOOLS/resource-generator/internal/loader/loader.go`
3. `TOOLS/resource-generator/internal/helpers/helpers.go` — только функции
`IsNested` и связанные с nested-моделями
4. `TOOLS/resource-generator/internal/templates/instance.go` — только участки
`Update` и проверки `IsNested`
5. `TOOLS/resource-generator/internal/types/types.go`
6. `generated/dev/resources_yaml/95_nodejs.yaml` — только `jsonEnv` в create и modify
7. `generated/dev/go/95_nodejs_resource.go` — только модель `JsonEnv` и `Update`
Не изучай остальные сервисы, стенды, историю проекта или API вне этих файлов.
## Формат ответа
Ответь максимум в 5 коротких пунктах:
- **Вердикт:** прав / частично прав / неправ.
- **Доказательство:** одна конкретная цепочка от YAML до ошибочного Go-кода.
- **Решение:** корректно ли выравнивать operation params по канонической схеме.
- **Риск:** один главный риск предлагаемого решения.
- **Итог:** что именно нужно изменить или что менять не следует.
Не предлагай реализацию, diff, рефакторинг или дополнительные исследования.