Инцидент 2026-09-30 показал: невалидное имя атрибута (s3-inst) проходило генерацию, сборку и заливку, а ломалось только у пользователя (Terraform отвергает схему целиком). - TOOLS/scripts/check_schema_names.sh: проверяет все tfsdk:"..." в сгенерированном Go на [a-z0-9_]; exit 1 при нарушении, с подсказкой про helpers.ToSnake. - 03_build_and_upload_provider.sh: вызов стража после 02 (до сборки и заливки). - ARCHITECTURE.md: страж добавлен в список enforced-скриптов. - HISTORY: пункт 'не закрыто' заменён на 'закрыто' с проверками. Проверено: dev/test/prod -> OK; искусственный пример (tfsdk:"s3-inst") -> exit 1.
5.8 KiB
Релиз dev-провайдера 2.0.1 (2026-09-30)
Стенд: dev. Namespace: nubes-dev/nubes. Версия: 2.0.1.
Команда: ./TOOLS/scripts/03_build_and_upload_provider.sh --profile TOOLS/config/dev
(цикл: 01 YAML из API → 02 Go-ресурсы + доки → сборка 3 платформ → SHA256SUMS →
GPG → заливка 5 объектов в S3).
Что вошло (правки сессии по итогам анализа и ревью)
| Правка | Файл |
|---|---|
| Транзиентный 401 ретраится для GET | core/http.go |
| Partial state при ошибке после создания инстанса (Q5) | core/instance_create.go, templates/instance.go |
| Idempotency pre-check по live без схемы операции | core/modifier_compare.go, core/operation_run_bycode.go |
| ImportState модификаторов заполняет Required | resources_core/{nsxt_snat,org_ip_allocation}_resource.go |
Страж хардкодов покрыл provider/ |
TOOLS/scripts/check_hardcoded_service_ids.sh |
Документация: TOOLS/ARCHITECTURE.md (разделы «API Resilience», «Modifier Idempotency»,
«Lifecycle Vocabulary»), HISTORY/2026-09-30_core_and_modifiers_remediation.md.
Проверки после заливки
| Проверка | Результат |
|---|---|
sha256 локальной сборки vs SHA256SUMS (linux/amd64) |
✅ совпадает (868518880edafccdf723806e6a136d083ee433a1d1d0ffb06737995810a68e8d) |
| Локальный размер linux-архива | 13 172 824 B |
GET /v1/providers/nubes-dev/nubes/versions |
✅ содержит 2.0.1 (+ 2.0.0, 2.0.21–2.0.24) |
GET /v1/providers/nubes-dev/nubes/2.0.1/download/linux/amd64 |
✅ HTTP 200 (302 на presigned S3) |
| Объекты в S3 | 5 шт. (3 zip + SHA256SUMS + SHA256SUMS.sig), загрузка 37.92 MiB |
⚠️ Примечания
- Версия
2.0.1создана заново — ранее она входила в диапазон2.0.0–2.0.20, физически удалённый из dev-реестра (см.HISTORY/2026-09-30_dev_registry_prune_versions.md). VERSIONвTOOLS/config/dev/profile.env:2.0.0→2.0.1.testиprodне перезаливались — правки ядра в них не включены (по указанию владельца).- Версия
2.0.0в реестре осталась от предыдущей заливки (там правок нет).
Инцидент при первой заливке: невалидные имена атрибутов (s3-inst, s3-ref-root)
Симптом. После первой заливки 2.0.1 провайдер не мог отдать схему:
Invalid Attribute/Block Name: "s3-inst" at schema path "map_fixed.s3-inst",
"s3-ref-root" at schema path "s3-ref-root" → падали terraform plan/apply/validate.
Причина. В API dev-стенда в тестовом сервисе 1_dummy появились параметры с кодами
с дефисами (s3-inst, s3-ref-root). Проверено по бэкапам YAML: в наборах от 09:50, 10:15 и
11:05 (из последнего собрана рабочая 2.0.0) их нет, в наборе от 21:35 — 2 вхождения.
То есть данные изменились на стороне платформы уже после утренней заливки.
ToSnake не удалял дефисы → в схему уходило tfsdk:"s3-inst", Terraform отвергает такие имена
(допустимы только [a-z0-9_]) и целиком не загружает схему провайдера.
Фикс. TOOLS/resource-generator/internal/helpers/helpers.go: ToSnake завершается
sanitizeAttrName — всё вне [a-z0-9_] заменяется на _ (s3-inst → s3_inst).
Код для API не меняется: json:"s3-inst" в генерате сохранён (это значение поля, а не имя
атрибута). Проверено: в сгенерированном коде не осталось ни одного tfsdk:"…" с недопустимыми
символами; сборка и go test ./internal/... -short — зелёные.
Повторная заливка. 03 прогнан заново (та же версия 2.0.1), sha256 нового
linux-артефакта: d25a71a31dbc9ab16e494b3d1f68b38b2214bd530045c5a3003f515bc725e407.
Важно про локальный кэш. После перезаписи артефакта под тем же номером Terraform
продолжает использовать старый файл: init -upgrade хеш не пересчитывает (версия и constraint
не изменились). Лечится удалением .terraform.lock.hcl + .terraform и повторным init.
Для внешних потребителей, которые ставят 2.0.1 впервые, проблемы нет — lock получит новый хеш.
Верификация. DEV_STAND/FPipeGmail: провайдер 2.0.1 (после сброса lock) →
terraform validate — Success.
Закрыто. Добавлен страж TOOLS/scripts/check_schema_names.sh: проверяет все
tfsdk:"..." в сгенерированном Go на [a-z0-9_] и включён в 03 (перед сборкой и заливкой).
Проверено: dev/test/prod — OK; на искусственном примере (tfsdk:"s3-inst") страж
падает с exit 1. Теперь невалидная схема не может уехать в реестр.