9.9 KiB
Universal Provider (ядро + генератор ресурсов) — подробный отчёт
Дата: 2026-01-31
Цель
Нужна архитектура «универсального провайдера», где:
- есть ядро (общий клиент и универсальный флоу операций);
- есть папка ресурсов (Go-файлы ресурсов);
- есть папка YAML-описаний сервисов (чтобы DevOps мог добавить сервис одним файлом);
- есть генератор, который:
- читает YAML,
- генерирует ресурсы,
- генерирует реестр ресурсов,
- дальше выполняется build (ядро + ресурсы из папки).
В итоге: если файла ресурса нет — в провайдере его не будет. Если YAML изменён — перегенерация.
Итоговая архитектура (v2.0.0, «голое» ядро + ресурсы)
Новая сборка размещена в:
Структура:
- nubes_provider_gen/internal/core — ядро (клиент, универсальный flow, запуск операций)
- nubes_provider_gen/internal/provider — провайдер (schema + клиент)
- nubes_provider_gen/internal/resources_gen — сгенерированные ресурсы (Go)
- nubes_provider_gen/resources_yaml — YAML-описания сервисов
- nubes_provider_gen/tools/gen — генератор
- nubes_provider_gen/test_persistent — тестовые манифесты
1) Ядро (core)
Файл: nubes_provider_gen/internal/core/client.go
Содержит:
UniversalClientс HTTP-клиентом и API endpoint/token.- Универсальный flow CreateGenericInstanceUniversalV6:
- POST /instances
- POST /instanceOperations (create)
- GET /instanceOperations/{opUid}?fields=cfsParams
- POST /instanceOperationCfsParams (явные параметры)
- POST /instanceOperationCfsParams (дефолтные/пустые для пропущенных)
- GET /instanceOperations/{opUid}/validate-cfs
- POST /instanceOperations/{opUid}/run
- Универсальные операции:
RunInstanceOperationUniversal(delete/suspend/resume и т.д.)RunInstanceOperationUniversalWithDefaults(modify с автоподстановкой параметров)
- Утилиты:
FindInstanceByDisplayNameGetInstanceState
Почему нужно WithDefaults для modify На modify требуются обязательные параметры (часто даже те, что не меняются). Без них backend падает.
2) Провайдер (provider)
Файл: nubes_provider_gen/internal/provider/provider.go
- Тип провайдера:
nubes - Адрес:
terrareg.kube5s.ru/nubes/nubes - Ресурсы приходят из реестра:
resources_gen.AllResources()— возвращает список функций создания ресурсов.
3) Генератор (tools/gen)
Файл: nubes_provider_gen/tools/gen/main.go
Функции:
- Читает все YAML-файлы в
resources_yaml/ - Генерирует ресурсный Go-файл в
internal/resources_gen/для каждого YAML - Генерирует
registry.goсAllResources()
То есть:
- Добавили YAML → сгенерировали Go → build
- Нет YAML → нет Go → нет ресурса
4) YAML-описания
Файл: nubes_provider_gen/resources_yaml/dummy.yaml
Минимальная схема (пример dummy):
name,service_id,display_name_defaultcreate.params— ID параметров createmodify.params— ID параметров modifylifecycle— defaults дляadopt_existing_on_createиsuspend_on_destroy
Что было сделано (конкретные шаги)
Шаг 1. «Голое» ядро + генератор
Создан отдельный проект:
- nubes_provider_gen Сделан core + provider + tools/gen + resources_yaml.
Шаг 2. YAML для dummy
Создан YAML dummy: nubes_provider_gen/resources_yaml/dummy.yaml
Шаг 3. Генерация ресурсов
Команда:
go run ./tools/gen
Сгенерированы:
- nubes_provider_gen/internal/resources_gen/dummy_resource.go
- nubes_provider_gen/internal/resources_gen/registry.go
Шаг 4. Build
Команда:
go build -o terraform-provider-nubes
Шаг 5. Тесты dummy
Тестовый конфиг:
Проверены сценарии:
apply(create/adopt) — OKmodify(duration 750 → 820) — OKdestroy(suspend_on_destroy = true) — OKapplyпосле suspend (resume/adopt c явнымadopt_existing_on_create) — OK- удаление ресурса из манифеста +
apply— OK - возвращение ресурса в манифест +
apply— OK
Ошибки и как решались
1) action modify not available
Причина: в Update использовался id из Plan (неизвестен).
Решение: брать id из State.
2) API error 400: Parameter specified does not belong to this operation
Причина: неверные ID параметров modify.
Решение: для modify использовать 287/288 вместо 198/199.
3) API error 500: checkParam ... instanceOperationCfsParamUid (повторно)
Причина: операция modify требует подстановки всех параметров; без них backend падает. Решение:
- Добавлен
RunInstanceOperationUniversalWithDefaults— читаетcfsParamsи заполняет недостающие - Позже для dummy оказалось нужно отправлять все параметры (не только required)
4) TLS handshake timeout
Причина: VPN/сеть. Решение: повторить команду.
5) status 401
Причина: токен истёк/невалидный.
Решение: заменить токен и сохранить по правилу /home/naeel/terra/HH-MM-SS.token.
6) Критерий завершения операции (важно)
Любая операция (create/modify/delete/suspend/resume) считается завершённой, когда у неё заполнено время окончания.
Это является признаком завершения и успеха, и ошибки. В UI и API ориентируемся на наличие dtFinish.
Текущее состояние
- Провайдер «голый» + ресурсы из YAML работает.
dummyполностью тестируется из YAML → Go → build.- В
resources_genприсутствует 1 ресурс:nubes_dummy.
План (следующий шаг)
- Расширить YAML-схему:
- поддержку дополнительных параметров (например, failInProgress, whereFail и т.п.)
- поддержку optional параметров с явными defaults
- Добавить генерацию документации из YAML
- Добавить проверку схемы YAML (валидация) перед генерацией
- Скрипт "build pipeline":
- gen → registry → go build
- Опционально: тестовый фреймворк для «batch» тестов
Важные файлы
- Ядро: nubes_provider_gen/internal/core/client.go
- Генератор: nubes_provider_gen/tools/gen/main.go
- Реестр: nubes_provider_gen/internal/resources_gen/registry.go
- YAML dummy: nubes_provider_gen/resources_yaml/dummy.yaml
- Сгенерированный ресурс: nubes_provider_gen/internal/resources_gen/dummy_resource.go
- Тесты: nubes_provider_gen/test_persistent/main.tf
MAYDO (отложено до запроса заказчика)
- Добавить в YAML
outputs(изstate/out) иstate_params(изstate/params). - Добавить
param_meta:valueList,func,refSvcId,dataDescriptor. - Добавить
secrets(изvault) с пометкой чувствительных данных. - Добавить
operations(man/описания, доступные операции) для генерации доков. - Добавить поддержку
subparams(nested/list/json) и типизацию сложных структур. - Добавить обработку версий операций (если API это отдаёт).