15 KiB
Запрос на глубокий анализ — Terraform Provider for Nubes Cloud
Контекст
Проект — Terraform Provider для облачной платформы Nubes Cloud (Taffy/Deck API).
Провайдер написан на Go с использованием terraform-plugin-framework (SDK v2).
Версия: 5.0.52
Тип: Universal Provider — один core-движок, ресурсы генерируются из YAML-спек.
Структура проекта
Папки (корень: /home/naeel/tf_provider/)
internal/
├── core/ # Универсальный клиент API (client.go, instance_ops.go, instance_lookup.go)
├── provider/ # Реализация провайдера и НЕ-сгенерированных ресурсов (VM, Edge, VDC, VApp, Postgres, S3 и др.)
├── generated/ # Сгенерированные bolvan-ресурсы
└── registrykeys/ # Ключи для GPG-подписи
universal_rebuild/ # Новая универсальная архитектура (ядро, генераторы, YAML-спеки)
├── internal/
│ ├── core/ # Универсальный клиент (client.go) — v6 API flow
│ ├── provider/ # Конфиг провайдера
│ ├── resources_core/ # CRUD-логика (crud.go), хелперы, валидация, реф-параметры
│ └── resources_gen/ # АВТОМАТИЧЕСКИ СГЕНЕРИРОВАННЫЕ ресурсы (~100 файлов)
├── tools/
│ ├── gen/ # Go-генератор (читает YAML → генерирует ресурсы + registry.go)
│ ├── gen_v2/ # Версия 2 генератора
│ ├── service_params_gen/ # YAML-генератор (API → YAML)
│ ├── docs_template_gen/ # Генератор документации
│ └── service_spec_gen/ # Генератор спек
└── resources_yaml/ # YAML-спеки (сейчас только embed.go — встраиваются в бинарник)
devops/ # Скрипты сборки и деплоя
├── config/
│ ├── services_list.txt # Список всех сервисов (30+ строк)
│ └── operation_timeouts.json # Таймауты операций по сервисам
├── 01_generate_yamls.sh # Шаг 1: YAML из API
├── 02_generate_resources_and_docs*.sh # Шаг 2: генерация Go + docs
└── 03_build_and_upload_provider.sh # Шаг 3: сборка + публикация
docs/ # Документация
├── 00_overview/ # Обзор
├── 20_discovery/ # Discovery сервисов
├── 30_registry/ # Реестр ресурсов
├── 40_analysis/ # Анализы и форензика
├── 50_history/ # История (23 файла — пошагово весь процесс разработки)
├── 60_strategy/ # Стратегия и философия провайдера
├── 70_api/ # API-документация и дампы
└── help/ # Справка
Что уже сделано и известно
Архитектура API (Taffy/Deck)
Базовый URL: https://deck-api.ngcloud.ru/api/v1/index.cfm
Жизненный цикл операции:
POST /instances— создать placeholder инстанса → получаемinstanceUidPOST /instanceOperations— создать операцию (create/modify/suspend/resume/delete) →instanceOperationUidGET /instanceOperations/{uid}?fields=cfsParams— получить схему параметровPOST /instanceOperationCfsParams— отправить значения параметров (каждый параметр поsvcOperationCfsParamId)GET /instanceOperations/{uid}/validate-cfs— валидацияPOST /instanceOperations/{uid}/run— запуск операцииGET /instanceOperations/{uid}— поллинг доdtFinish(критерий завершения)
Получение состояния инстанса: GET /instances/{instanceUid} → explainedStatus, isDeleted, availableOperations
Получение списка инстансов: GET /instances?page=N&size=100
Список сервисов (30+)
Сервисы с service_id от 1 до 150:
- Инфраструктурные: vcOrg(19), vc_vdc(21), vc_nsxt(22), vc_vm(23/27/28), vapp(26), vcexternalip(25), vcVdcGroup(29)
- Базы данных: postgres(90), mariadb(115), mongodb(92), redis(91), clickhouse(120), vmpostgre(32), kafka(116)
- Хранилища: s3(12), s3bucket(13)
- Приложения: nextcloud(50), superset(81), harbor(82), flask(89), lucee(94), nodejs(95), pgadmin(96), nodered(97), http(98), gitea(99), rabbitmq(93), nifi(117), openwhisk(100)
- DNS: dnszone(110), dnsrecord(111)
- K8s: k8s_sthutrval_cluster(150)
- Прочее: dummy(1), template(2), tenant(112), vcComplex(113), GiteaComplex(114), akhq(119), valoTenant(149)
Lifecycle-логика (для сервисов с suspend/resume)
- Флаги:
adopt_existing_on_create(default: false),suspend_on_destroy(default: true) - Apply/Create: проверка облака по
resource_name→ статус-матрица принятия решений - Destroy: по умолчанию suspend, при
suspend_on_destroy=false— только state - Modify: через
RunInstanceOperationUniversalс params поsvcOperationCfsParamId - Replace: запрещён для suspend-сервисов
Проблемы, известные из истории
- Case-sensitivity имён (docs/60_strategy/terraform_case_sensitivity_fix.md)
- Ref-параметры и валидация на adopt (docs/60_strategy/adopt_ref_validation.md)
- VApp UID inconsistency / displayName resolve bug (история 23)
- Subresource generation — не все подресурсы корректно генерируются
- Params normalisation — CamelCase → snake_case может ломаться
- Postgres immutables — некоторые параметры нельзя менять после создания (ForceNew)
- Operation timeouts — разные сервисы требуют разных таймаутов
- Deleted instances — определение deleted через
explainedStatusиisDeleted - Валидация статусов —
not created,pending,failedдолжны блокировать adopt - ResourceAlreadyExists diagnostics — обязательны два варианта в сообщении
Архитектура universal_rebuild (ключевые особенности)
- Ядро (core): UniversalClient — универсальный клиент,
CreateGenericInstanceUniversalV6,RunInstanceOperationUniversal,FindInstanceByDisplayName - Resources_core:
CreateResource,UpdateResource,DeleteResource,RunOperationByCode— обёртки CRUD с timeout override - Resources_gen: ~100 автогенерированных файлов ресурсов (все сервисы)
- Генераторы:
service_params_gen→ YAML,gen/gen_v2→ Go код,docs_template_gen→ документация - YAML-спеки: сейчас встраиваются через embed.go, но есть YAML-генератор
Генерация (devops pipeline)
01_generate_yamls.sh— получает YAML из API для всех сервисов изservices_list.txt02_generate_resources_and_docs*.sh— запускает Go-генератор + docs-генератор03_build_and_upload_provider.sh— сборка под 3 ОС + GPG-подпись + загрузка в S304_build_and_publish_docs.sh— сборка mkdocs + публикация в S3
Документация
- MkDocs Material theme
- Документация генерируется из тех же YAML-спек
- Публикуется в S3 bucket
terraform-registry
Что НУЖНО изучить подробно
1. API: неизвестные эндпойнты и возможности
- Есть ли другие эндпойнты, кроме задокументированных?
- Как работает
/services/{svcId}/default(deprecated — что вместо)? - Есть ли batch-операции?
- Пагинация: какие лимиты? Есть ли курсор?
- Rate limiting: есть ли? Какие лимиты?
- Есть ли эндпойнт для массового получения всех инстансов с параметрами?
2. Параметры сервисов (svcOperationCfsParamId)
Для каждого сервиса:
- Полный список
cfsParams(все операции: create, modify, suspend, resume, delete, action) - Какие параметры required, какие optional, какие read-only (outputs)
- Какие параметры имеют
refSvcId(ссылки на другие сервисы) - Какие параметры имеют
valueList(выпадающие списки) - DataType: какие бывают (string, boolean, list, uuid, int, float, json?)
- Default values — откуда берутся?
- Какие параметры immutable (create-only)
- Какие параметры зависят от других (dependency chain)
3. Статусы и состояния инстансов
- Все возможные значения
explainedStatus - Все возможные значения
isDeleted - Матрица переходов (state machine):
creating→runningrunning→suspend→runningrunning→deletedfailed→ ?not created→ ?
- Что происходит при
pending/operation in progress? - Как долго длятся типичные операции?
4. Операции (kinds и их семантика)
kind: instance— полный CRUDkind: subresource— операции внутри инстанса (create_user, delete_database и т.д.)kind: action— одноразовые операции (restart, redeploy, recovery)- Для каждого сервиса: какие subresource и action операции доступны?
- Как subresource идентифицируются? (через parent instanceUid? свой instanceUid?)
- Есть ли операции, которые не вписываются в схему?
5. Схема YAML-спек
- Нужно восстановить формат YAML для примера одного-двух сервисов (dummy, postgres, s3bucket)
- Какие поля обязательны? Какие опциональны?
- Как описываются operations с kind-ами?
- Как описываются timeout-ы?
- Как описываются outputs?
- Как описываются service_man (руководство пользователя)?
- Как описываются lifecycle-правила (suspend_on_destroy, adopt_existing_on_create)?
6. Ошибки и проблемы продакшена
- Все известные баги из истории (23 файла в docs/50_history/)
- Какие ресурсы сейчас не работают? (VApp UID, Postgres immutables и т.д.)
- Какие тесты падают или неполны?
- Есть ли проблемы с GPG-ключами / реестром?
- Есть ли проблемы с S3-публикацией?
7. Тестовое покрытие
- Какие тесты написаны в
universal_rebuild/internal/resources_core/? - Есть ли интеграционные тесты с реальным API?
- Какие тесты нужны, но отсутствуют?
- Есть ли моки для API?
8. Безопасность
- Как управляются токены? Какой механизм refresh?
- Есть ли поддержка разных эндпойнтов (prod/dev)?
- Как обрабатываются чувствительные данные (пароли БД, ключи)?
- Есть ли валидация входящих параметров на injection?
9. Производительность
- Сколько времени занимает типичный apply?
- Есть ли узкие места в поллинге?
- Оптимальные интервалы поллинга для разных операций?
- Есть ли кэширование?
10. Документация (MkDocs)
- Как генерируется документация из YAML?
- Как работает шаблонизация?
- Что надо исправить/дополнить?
Формат ответа
Пожалуйста, предоставь детальный анализ по каждому из 10 пунктов. Для каждого пункта:
- Текущее понимание (что уже известно из контекста)
- Пробелы в знаниях (чего не хватает)
- Гипотезы (что можно предположить на основе имеющихся данных)
- Что нужно сделать (конкретные шаги: какие файлы прочитать, какие API вызвать, какие тесты запустить)
- Риски (какие проблемы могут возникнуть)
Особое внимание удели:
- Формату YAML-спек (п.5) — это основа всей генерации
- Полному списку cfsParams для топ-10 сервисов (п.2)
- Матрице состояний (п.3) — критично для lifecycle-логики
- Ошибкам из истории (п.6) — чтобы не повторять
Если для какого-то пункта информации в предоставленном контексте недостаточно — укажи это и предложи, где искать недостающие данные (какие файлы прочитать, какие curl-запросы выполнить).
Важно: Ничего НЕ ДЕЛАЙ в файловой системе. Никаких изменений кода, файлов, конфигов. Только анализ.