Commit Graph
153 Commits
Author SHA1 Message Date
Repinoid 4197a76aba 1 2026-09-30 21:01:05 +03:00
Repinoid 7a6f6650c6 docs(architecture): зафиксированы решения Q1/Q2/Q4
- Q1: POST не ретраится (не идемпотентен; Idempotency-Key у API нет) — решение.
- Q2: при ошибке после POST /instanceOperations и до run операция остаётся черновиком;
  отмены нет (ни в коде, ни в HAR — DELETE /instanceOperations/{uid} отсутствует).
- Q4: единый контракт жизненного цикла — keep_on_destroy + suspend_on_destroy;
  delete_strategy (YAML) = маппинг на них (noop_warn/inverse/error).
2026-09-30 20:53:31 +03:00
Repinoid 9da97663c6 fix(Q5): сохранять instanceUid при ошибке после создания + partial state
Проблема: CreateGenericInstanceUniversalV6 при ЛЮБОЙ ошибке после создания инстанса
возвращал "", а шаблон Create при ошибке не писал ID в state => облачный инстанс
осиротевал (Terraform о нём не знает, повторный apply упирается в страж дубликатов).

- core/instance_create.go: ошибки после получения instanceUid возвращают uid вместе
  с ошибкой (POST /instanceOperations, пустой opUid, разбор cfsParams, resolve,
  отправка параметров, validate, run, waitForOperationFinish, ensureInstanceCreated).
  До создания uid — по-прежнему "".
- templates/instance.go: при err != nil и id != "" -> data.ID + resp.State.Set (partial
  state), затем AddError.
- client_test.go: TestCreateGenericInstance_KeepsUIDWhenOperationCreateFails,
  TestCreateGenericInstance_EmptyUIDWhenInstanceCreateFails.
- ARCHITECTURE.md: пункт про partial state.

Проверено: 02 (dev) + dev-materialize -> 40 файлов resources_gen содержат фикс;
go build ./... OK; go test ./internal/... -short PASS.
2026-09-30 20:53:14 +03:00
Repinoid 383f8ea321 fix(core): транзиентный 401 теперь ретраится для GET
isRetryable (core/http.go): добавлен StatusUnauthorized (401) к {429,502,503,504}.
Gateway может временно отклонять валидный JWT — без этого одиночный 401 ронял
read/plan/поллинг.

- client_test.go: юнит-тест TestIsRetryable (401/429/502/503/504 = true; 400/403/404/500 = false).
- ARCHITECTURE.md: раздел API Resilience приведён к фактическому поведению
  (401 реализован; POST не ретраится намеренно).

Проверено: go build ./... OK; go test ./internal/core/... -short OK.
2026-09-30 20:33:48 +03:00
Repinoid c5a4499094 chore(tools): страж хардкодов покрыл provider/ + id сервиса в именованную константу
check_hardcoded_service_ids.sh:
- область расширена с TOOLS/ на TOOLS/ + provider/internal/ (кроме generated resources_gen/);
- второй паттерн: литеральный ref-service id в ResolveRefSvcParamValue/DisplayName(ctx, N,...);
- справка обновлена (убран удалённый serviceSpecificModifiers);
- сервис-специфичные литералы пояснены как 'именованные константы'.

org_ip_allocation_resource.go: ResolveRefSvcParamValue(ctx, 19, ...) -> svcIDVcOrg.

Проверено: bash TOOLS/scripts/check_hardcoded_service_ids.sh -> OK (exit 0).
2026-09-30 20:33:09 +03:00
Repinoid 047d53a67b docs(architecture): привести TOOLS/ARCHITECTURE.md в соответствие с кодом
- Core Principles 2-3: 'универсально/генерируется' отнесено к core/ и resources_gen/,
  а не ко всему сервис-коду.
- API Resilience: 401 НЕ ретраится (isRetryable = 429/502/503/504, только GET) —
  помечено как незакрытый разрыв со спекой.
- Exception Registry: убран удалённый реестр serviceSpecificModifiers
  (yaml-generator/main.go), описаны ручные модификаторы + несуществующий modifiers.yaml.
- Новый раздел 'Lifecycle Vocabulary': три несогласованных словаря destroy.
- Rules: 'two registries' -> один реестр + ручные ресурсы.
2026-09-30 20:32:29 +03:00
Repinoid bed269cf27 release: перезаливка провайдера во все 3 стенда — prod 1.0.0, dev 2.0.0, test 3.0.0
Полный цикл 03 (01+02 → сборка 3 платформ → GPG → заливка S3) по каждому стенду:
- prod nubes/nubes 1.0.0;
- dev  nubes-dev/nubes 2.0.0  (VERSION в profile.env: 2.0.24 → 2.0.0);
- test nubes-test/nubes 3.0.0.

Проверено: sha256 залитого linux-бинарника == локальной сборке на всех трёх;
API /versions отдаёт 1.0.0 / 2.0.0 / 3.0.0; в S3 по 5 объектов на версию.

Последствия (приняты владельцем): версии X.0.0 перезаписаны → у пользователей
с .terraform.lock.hcl будет checksum mismatch (лечится terraform init -upgrade).
Подробности: HISTORY/2026-09-30_release_1_0_0_2_0_0_3_0_0_all_stands.md
2026-09-30 19:16:48 +03:00
Repinoid a68a36a0d2 fix(config): prod — включить Vault (151 k8sOpenbao) по сверке с облачным каталогом
Сверка TOOLS/config/prod/services_list.txt с облачным каталогом
(GET /api/v1/svc/services?isProductionReady=true → 36 сервисов):
- активных в файле было 35, лишних нет, но не хватало 151 k8sOpenbao (Vault);
- комментарий «нет в PROD UI» устарел: сервис отдаётся каталогом prod
  (isProductionReady=true, resourceRealmTypeId=3).

После правки: 36 активных = 36 в облаке, перегенерация prod дала 36 YAML,
включая 151_k8s_openbao.yaml. dev (40/40) и test (36/36) расхождений не имели.
2026-09-30 10:13:13 +03:00
Repinoid 1e796c8eb1 chore(tools): удалить мёртвые легаси-скрипты и общий services_list.txt
Удалено (100% мёртвое, ничего не вызывает):
- TOOLS/scripts/10_yaml_stability_run.sh
- TOOLS/scripts/11_yaml_stability_run_latest.sh
- TOOLS/scripts/12_generate_yamls_latest.sh
- TOOLS/scripts/13_generate_yamls_clean.sh
- TOOLS/scripts/02_generate_resources_and_docs_template_v2.sh
- TOOLS/config/services_list.txt (общий список: код его не читает, а как
  «объединение» он устарел — в нём активен id 27, который в test/prod
  закомментирован как «нет в UI», и отсутствуют 87/88/97/153 из dev)

Все ссылки в документации указывали на профильные списки либо будут
исправлены отдельным коммитом.
2026-09-30 09:50:28 +03:00
Repinoid cbd559d767 docs(tools): канонический пайплайн + история ужесточения генерации YAML
- TOOLS/README.md: раздел «Канонический пайплайн (порядок шагов)» и описание
  безопасной генерации (staging → атомарная замена, бэкапы, маркер .stand);
- TOOLS/ARCHITECTURE.md: ссылки devops/… → TOOLS/config/<stand>/…;
- HISTORY/2026-09-30_yaml_pipeline_hardening.md: полная история изменений
  (что было не так, что сделано, прогон по стендам, коммиты, проверки).
2026-09-30 09:39:26 +03:00
Repinoid ad4daab358 chore(tools): легаси-скрипты генерации отключены (fail-fast DEPRECATED)
10/11/12/13 + 02_..._template_v2 нерабочие (зовут 01 без --profile, ищут
*.token в корне репо) и не вызываются никаким рабочим скриптом (ссылки —
только в исторических HISTORY/NOTES). Теперь падают сразу с подсказкой
канонического пути вместо мнимой работы; 13 вдобавок больше не может
сделать rm -f provider/resources_yaml/*.yaml.

Проверено: bash -n OK, guard отдаёт exit 2.
2026-09-30 09:38:42 +03:00
Repinoid 12b3932817 fix(tools): безопасная генерация YAML — staging + атомарная замена, без легаси-фолбэков
01_generate_yamls.sh:
- генерация в staging-каталог; рабочий каталог не удаляется заранее;
  атомарная замена (mv) только при полном успехе, старый каталог → бэкап
  resources_yaml.bak-<UTC> (ротация KEEP_BACKUPS=5);
- убран легаси-фолбэк токена 'ls -t ROOT/*.token' (подхватывал чужой токен);
- NUBES_API_ENDPOINT обязателен (убран молчаливый PROD-дефолт);
- имя сервиса берётся из 2-го поля services_list.txt (убран лишний HTTP-запрос);
- убран безусловный rm старого YAML перед генерацией (неатомарность);
- удалён дубль SERVICES_FILE_DEFAULT; маркер .stand защищает от чужого стенда;
- синхронизированы комментарии (REQUEST_DELAY 0.5, пути, формат списка).

yaml-generator/internal/config:
- NUBES_API_ENDPOINT обязателен (убран PROD-дефолт);
- убран легаси-поиск последнего *.token в корне репо (loadToken/findLatestToken);
- убран несуществующий путь provider/devops/config/services_list.txt
  (теперь требуется явный NUBES_SERVICES_FILE);
- удалены мёртвые getenvDefault/findLatestToken.

Проверено: bash -n OK, go vet/go build OK.
2026-09-30 09:28:41 +03:00
Repinoid d6d0b733ae chore(dev): поднять версию провайдера 2.0.17 -> 2.0.24
Конфиг отставал от реестра (там уже 2.0.23), из-за чего генератор доков
подставлял неверную версию. Дальше — генерация и релиз 2.0.24.
2026-09-30 08:35:59 +03:00
Repinoid bc1af681aa build(docs): скрипт 04 копирует картинки docs/diagrams (*.svg|png) в публикуемый docs_dir; README диаграмм — раздел о публикации 2026-09-28 09:20:25 +03:00
Repinoid a366f47eff docs: move diagram artifacts to docs/diagrams, add vApp-IP precondition link and creation guide 2026-09-26 19:30:41 +03:00
Repinoid 6791e8fb5f docs: add styled infrastructure dependency diagram (generator + png + svg) 2026-09-26 19:13:57 +03:00
Nail 22c6c83a0f generator: третий режим destroy keep_on_destroy (state_only) для всех instance-ресурсов + предупреждения «заморожен/оставлен как есть» 2026-09-24 19:06:40 +03:00
Repinoid a5a5f83730 chore(dev): bump провайдера 2.0.16 -> 2.0.17 (чистая генерация без модификаторов) 2026-09-23 08:46:32 +03:00
Repinoid d5dc1212ba refactor(yaml-gen): убрать вплетение модификаторов — YAML = чистая полная выгрузка из API 2026-09-23 08:42:01 +03:00
Repinoid 200bf457ce fix(gen): Update без modify перечитывает read-back поля через RefreshResourceState (устраняет устаревший state_params/ложный дрейф) 2026-09-23 07:04:02 +03:00
Repinoid b9fa18164c fix(core,gen): UseStateForUnknown для Optional+Computed + live-dосылка без тихого fallback (R1+R3+A/B) 2026-09-22 22:35:45 +03:00
Repinoid a011358660 fix(core): досылать незаданные modify-params из live state.params (а не paramValue формы) — устраняет сброс needEnableAVI/ALB 2026-09-22 22:04:09 +03:00
Repinoid e0ad8bb472 chore(dev): bump провайдера 2.0.12 -> 2.0.13 2026-09-22 21:44:59 +03:00
Repinoid 73357d0e0f fix(gen): bt как функция в шаблоне modifier + обновить описание 2.0.12 2026-09-22 21:22:56 +03:00
Repinoid bd46d11155 test(core,gen): unit-тесты modifierDesiredEqualsCurrent и ValidateSpec modifier 2026-09-22 21:20:43 +03:00
Repinoid 6a722e49cf feat(yaml): реестр исключений модификаторов (delete_strategy/idempotency/delete_params) 2026-09-22 21:17:09 +03:00
Repinoid 6b0378cc0d refactor(gen): шаблон modifier — reconcile(override), Delete стратегия, idempotency-вызов 2026-09-22 21:17:09 +03:00
Repinoid 8e24f8107e feat(gen): GenModifier расширение (DeleteStrategy/Idempotency/DeleteParams) + LoadSpecs + ValidateSpec 2026-09-22 21:07:15 +03:00
Repinoid 6e297cc649 feat(lib): delete_strategy/idempotency/delete_params в OperationSpec (+DeleteParam) 2026-09-22 21:03:11 +03:00
Repinoid c2deff1a58 chore(dev): bump провайдера 2.0.11 -> 2.0.12; закрепить 2.0.11 в FullPipe 2026-09-22 19:49:41 +03:00
Repinoid 3a2a93b32e chore(dev): bump версии провайдера 2.0.10 -> 2.0.11 2026-09-22 19:26:17 +03:00
Repinoid 261809ba99 fix(generator): is_modifiable=true → параметр НЕ create-only (канон: меняется в UI → меняется в Terraform) 2026-09-22 19:21:42 +03:00
Repinoid 7e2ad415b4 chore(dev): bump версии провайдера 2.0.9 -> 2.0.10 2026-09-22 18:56:45 +03:00
Repinoid 9107ba00fa chore(dev): bump версии провайдера 2.0.8 -> 2.0.9 2026-09-22 16:49:55 +03:00
Repinoid c7c80fd1bd fix(yaml-generator): сортировать subParams по ID — детерминированный порядок вложенных параметров 2026-09-22 14:36:04 +03:00
Repinoid 78f9dfbcfb refactor(build): эфемерные generated-копии — dev-materialize по стенду вместо постоянного дубля 2026-09-22 13:48:36 +03:00
Repinoid c14f7de7bc docs: раздел «Реестр исключений» + диалог код-ревью opus/astra 2026-09-22 08:31:22 +03:00
Repinoid dc321b5e3a refactor(generator): реестры исключений (данные) вместо хардкодов svc.ID==N / ServiceID==N 2026-09-22 08:31:22 +03:00
Repinoid 05f56c5e00 fix(build): гейт дрейфа сгенерированного кода + запрет прямой сборки из provider/ 2026-09-22 08:31:22 +03:00
Repinoid 13beb9c142 release(dev): 2.0.8 2026-09-21 21:56:42 +03:00
Repinoid 3c0157a1af fix(generator): read-back параметры без Default -> Optional+Computed (универсальное правило ShouldBeOptionalComputed) 2026-09-21 21:48:54 +03:00
Repinoid 25080b7379 release(dev): 2.0.7 2026-09-21 21:18:03 +03:00
Repinoid 724f5f7efb fix(generator): убрать create-time проверку существования из ModifyPlan (ломал tainted-replace и terraform destroy) 2026-09-21 20:54:57 +03:00
Repinoid 67c4d2f190 tool(scripts): validate_docs_examples.sh — terraform validate по примерам из сгенерированных доков 2026-09-21 20:41:13 +03:00
Repinoid 69808bdf09 release(dev): 2.0.6 2026-09-21 20:30:59 +03:00
Repinoid c6715e81be fix(generator): передавать supportsSuspend в diagnostics; не генерировать suspend_on_destroy для сервисов без suspend 2026-09-21 20:26:41 +03:00
Repinoid 3ca0752df8 fix(docs-generator): строковые дефолты в кавычках (default 81.22.46.22 ломал HCL-парсер: Invalid number literal) 2026-09-21 20:26:41 +03:00
Repinoid 7c2cc673cc fix(docs-generator): array-map-fixed = jsonencode([...]) (StringAttribute, не объект); классификация по data_type, а не is_json 2026-09-21 20:22:27 +03:00
Repinoid af2e10b1d5 fix(docs-generator): вложенные map-fixed как аргумент '= {' (а не блок), array-map-fixed через jsonencode 2026-09-21 20:19:42 +03:00
Repinoid 54b0baa718 release(dev): 2.0.5 2026-09-21 20:08:55 +03:00