docs: история — SubParams, размоноличивание, багфиксы lifecycle
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
# 2026-07-16 — SubParams: map-fixed → nested Terraform attributes
|
||||
|
||||
## Контекст
|
||||
Генератор ресурсов не обрабатывал `map-fixed`/`array-map-fixed` параметры —
|
||||
они шли как `types.String`, пользователь был вынужден писать JSON руками.
|
||||
|
||||
Теперь YAML содержит `sub_params` (получены через метод Виталия —
|
||||
`/instanceOperations/default/{id}` с `dataDescriptor`), и генератор
|
||||
раскрывает их во вложенные Terraform-блоки.
|
||||
|
||||
## Изменения (2026-07-16, ветка svc-api)
|
||||
|
||||
### Подготовка
|
||||
- Переход на Gateway API (`lk-api-gateway`) для всех стендов
|
||||
- Метод Виталия: `/instanceOperations/default/{id}` вместо `/serviceOperation/{id}`
|
||||
- YAML сгенерированы заново: dev=50, test=48, prod=46
|
||||
- Списки сервисов обновлены из Gateway
|
||||
- DDoS-Guard: User-Agent + Referer для всех запросов
|
||||
- LEGACY-пометки на всех старых `deck-api`
|
||||
|
||||
### Размоноличивание templates.go
|
||||
- `templates.go` (1224 строки) → 3 файла: `instance.go`, `subresource.go`, `action.go`
|
||||
- Имена констант (`Instance`, `Subresource`, `Action`) не менялись
|
||||
|
||||
### Багфиксы lifecycle (Соннет)
|
||||
- **Баг A**: нет `HasError()` guard после диагностик в Create — сайд-эффект выполнялся вопреки ошибкам
|
||||
- **Баг B**: `not created` → авто-delete+create в crud.go противоречил философии (должен быть hard error)
|
||||
|
||||
### SubParams — вложенные Terraform-блоки
|
||||
|
||||
**Изменённые файлы:**
|
||||
|
||||
| Файл | Что |
|
||||
|------|-----|
|
||||
| `TOOLS/resource-generator/internal/types/types.go` | `SubParams []Param`, `IsNested bool` в `Param` |
|
||||
| `TOOLS/resource-generator/internal/loader/loader.go` | `ConvertParams` — рекурсивная конвертация SubParams; `NormalizeParamType` → `map-fixed`/`array-map-fixed` |
|
||||
| `TOOLS/resource-generator/internal/helpers/helpers.go` | 8 новых функций: `IsNested`, `IsNestedList`, `NestedModelName`, `NestedTfType`, `NestedSchemaType`, `NestedSchemaBlock`, `NestedSchemaEnd`, `NestedJSONExpr`, `SubSchemaType`, `SubDefaultExpr` |
|
||||
| `TOOLS/resource-generator/internal/templates/instance.go` | nested struct'ы перед Model, `SingleNestedAttribute`/`ListNestedAttribute` в Schema, `BuildJSON` в Create/Modify |
|
||||
| `TOOLS/resource-generator/internal/writers/writers.go` | 10 новых template-функций зарегистрировано |
|
||||
| `provider/internal/resources_core/helpers.go` | `BuildJSON(map[string]string) string` — строит JSON из map |
|
||||
|
||||
**Что генерируется (пример postgres):**
|
||||
|
||||
```go
|
||||
// Вложенный struct
|
||||
type PostgresClusterConfigurationModel struct {
|
||||
Cpu types.Int64 `tfsdk:"cpu" json:"cpu"`
|
||||
Memory types.Int64 `tfsdk:"memory" json:"memory"`
|
||||
Replicas types.Int64 `tfsdk:"replicas" json:"replicas"`
|
||||
Disk types.Int64 `tfsdk:"disk" json:"disk"`
|
||||
}
|
||||
|
||||
// В Model — указатель на nested struct
|
||||
ClusterConfiguration *PostgresClusterConfigurationModel `tfsdk:"cluster_configuration"`
|
||||
|
||||
// В Schema — SingleNestedAttribute
|
||||
"cluster_configuration": schema.SingleNestedAttribute{Required: true,
|
||||
Attributes: map[string]schema.Attribute{
|
||||
"cpu": schema.Int64Attribute{Optional: true, Computed: true, Default: int64default.StaticInt64(500)},
|
||||
...
|
||||
},
|
||||
},
|
||||
|
||||
// В Create/Modify — JSON через BuildJSON
|
||||
params[788] = resources_core.BuildJSON(map[string]string{
|
||||
"cpu": fmt.Sprintf("%d", data.ClusterConfiguration.Cpu.ValueInt64()),
|
||||
...
|
||||
})
|
||||
```
|
||||
|
||||
**Для array-map-fixed** (postgresConf) — `ListNestedAttribute` + `[]Model`.
|
||||
|
||||
### Результаты генерации
|
||||
|
||||
| Стенд | Go-файлов |
|
||||
|-------|-----------|
|
||||
| dev | 73 |
|
||||
| test | 70 |
|
||||
| prod | 65 |
|
||||
|
||||
### Подводные камни (учтены)
|
||||
- **Required + Default**: подполя с default → `Optional + Computed + Default`
|
||||
- **JSON-ключи**: `json:"cpu"` теги = оригинальный code (camelCase)
|
||||
- **types.* в JSON**: `BuildJSON` вместо `json.Marshal` (types.Int64 не маршалится как число)
|
||||
- **value_list**: enum-валидаторы — out of scope
|
||||
- **SubParams только для Instance**: subresource/action используют плоские параметры
|
||||
|
||||
### Версия
|
||||
5.0.68 → 5.0.73
|
||||
Reference in New Issue
Block a user