7.7 KiB
7.7 KiB
Universal Rebuild — Архитектура и рабочая цепочка (актуально)
Документ для нового чата: описывает, как устроено «универсальное ядро», как формируются YAML‑спеки сервисов и как генерируются Go‑ресурсы. Учитывает ошибки/уроки из текущего чата.
0) Базовые правила работы
- Не менять существующий Go‑код без явного согласования.
- Новая логика — только новые функции/файлы (если не было явного разрешения на правку).
- Все операции с облаком — read‑only, если отдельно не разрешено создание/удаление.
- Для токенов: новый
access_tokenсохранять в/home/naeel/terra/HH-MM-SS.token.
1) Архитектура (слои)
1.1 Универсальное ядро (core)
Папка: universal_rebuild/internal/core
client.go— универсальный клиент API и общий flow операций.- Критерий завершения операции:
dtFinish(см. комментарии в коде). Логику запрещено менять без согласования.
1.2 Провайдер (provider)
Папка: universal_rebuild/internal/provider
- Конфигурация провайдера, получение токена, подключение ресурсов через реестр.
1.3 Сгенерированные ресурсы
Папка: universal_rebuild/internal/resources_gen
- Автогенерируемые ресурсы Terraform по YAML‑спецификациям.
registry.go(генерируется) — регистрирует все ресурсы.crud.go— общие CRUD‑хелперы (создание/modify/delete). Этот файл не генерируется, его нужно сохранять.
1.4 YAML‑спеки ресурсов
Папка: universal_rebuild/resources_yaml
- YAML для каждого сервиса. Источник истины для генератора ресурсов.
- Формат включает
create.params,modify.params,lifecycle.
1.5 Генераторы
- YAML‑генератор без instanceUid
universal_rebuild/tools/service_params_gen/main.go- Получает параметры сервиса напрямую через
/index.cfm?endpoint=....
- Go‑генератор
universal_rebuild/tools/gen/main.go- Читает YAML и генерирует ресурсы +
registry.go.
2) Как получить параметры сервиса (без instanceUid)
Источник описан в:
docs/40_analysis/har/discovery/service_parameters_fetch.md
API‑цепочка:
GET /api/v1/index.cfm?endpoint=/services/{svcId}- даёт список операций сервиса (
operations)
- даёт список операций сервиса (
GET /api/v1/index.cfm?endpoint=/serviceOperation/{svcOperationId}- даёт
cfsParams(id, code, type, required, default, valueList, refSvcId, func)
- даёт
- (опц.)
GET /api/v1/index.cfm?endpoint=/param-value-list/{svcOperationCfsParamId}
Почему так: прямых эндпойнтов на список параметров по service_id нет. Параметры извлекаются из описаний операций.
3) YAML‑генерация (service_params_gen)
Файл: universal_rebuild/tools/service_params_gen/main.go
Входные переменные:
NUBES_API_TOKEN(если не задан — берётся изtest_universal/terraform.tfvars)NUBES_API_ENDPOINT(по умолчаниюhttps://deck-api.ngcloud.ru/api/v1/index.cfm)NUBES_SERVICE_ID(обязателен)NUBES_SERVICE_NAME(опц.)NUBES_OUTPUT(опц.)
Пример:
cd /home/naeel/terra/universal_rebuild
NUBES_SERVICE_ID=1 NUBES_SERVICE_NAME=dummy go run ./tools/service_params_gen/main.go
Результат:
/home/naeel/terra/universal_rebuild/resources_yaml/dummy.yaml
4) Go‑генерация (tools/gen)
Файл: universal_rebuild/tools/gen/main.go
Что делает:
- читает все YAML из
resources_yaml/ - генерирует ресурсы в
internal/resources_gen/ - генерирует
registry.go
Команда:
cd /home/naeel/terra/universal_rebuild
go run ./tools/gen/main.go
5) Build
cd /home/naeel/terra/universal_rebuild
go build -o terraform-provider-nubes
6) Важные нюансы и ошибки (из опыта чата)
6.1 resourceRealm
resourceRealmдолжен задаваться пользователем в .tf, если параметр required.- Нельзя автоподставлять
serviceNameкак realm: API отклонит (пример с Postgres).
6.2 Warnings о дубликатах
- Предупреждение о
RESOURCE WITH SAME NAME EXISTSдолжно появляться только на create (когда state.ID отсутствует). - Для managed ресурсов (ID уже есть) предупреждения быть не должно.
6.3 Deleted ресурсы
- Если
explainedStatus=deletedилиisDeleted=true→ ресурс считается отсутствующим, state должен очищаться.
6.4 Имена параметров
- Генератор может создавать «разбитые» snake_case для CamelCase (например
resource_c_p_u). - Это ожидаемо, но если критично — нужен отдельный маппинг (по согласованию).
7) Проверенная цепочка (dummy)
- YAML:
NUBES_SERVICE_ID=1 NUBES_SERVICE_NAME=dummy go run ./tools/service_params_gen/main.go
- Go‑код:
go run ./tools/gen/main.go
- Build:
go build -o terraform-provider-nubes
8) Что делать дальше
- Повторять пункты 3–5 для каждого сервиса:
NUBES_SERVICE_ID=13 NUBES_SERVICE_NAME=bucketNUBES_SERVICE_ID=90 NUBES_SERVICE_NAME=postgres
- Проверять YAML на корректность required‑параметров,
resourceRealmи defaults. - Поднимать ресурсы в
.tfи тестировать: create / modify / suspend / delete.
9) Где искать доп. материалы
- Архитектура (старые, но полезные):
docs/ai_universal_provider_gen.mddocs/00_overview/ai_universal_provider_gen.md
- API discovery:
docs/40_analysis/har/discovery/service_parameters_fetch.md
Короткая формула:
API (services → serviceOperation) → YAML → Go resources + registry → build → tests.
10) Политика удаления (карантин)
- Многие инстансы нельзя удалять сразу: из-за возможных данных действует 2‑недельный карантин.
- Dummy подпадает под эту политику.
- Для
nubes_dummyпри destroy или удалении из манифеста выполняетсяsuspend, а неdelete. - При
apply, если инстанс dummy в состоянии suspend, выполняетсяresume.