diff --git a/.gitignore b/.gitignore index 9ae5e6b..7e3b6f7 100644 --- a/.gitignore +++ b/.gitignore @@ -69,3 +69,5 @@ event-dispatcher # build artifacts /sless examples/POSTGRES/stress_log*.txt +examples/VM/vm_key +examples/VM/vm_key.pub diff --git a/doc/errors/log.md b/doc/errors/log.md index 3cf97e7..7be93a2 100644 --- a/doc/errors/log.md +++ b/doc/errors/log.md @@ -4,6 +4,62 @@ --- +## 2026-03-26 — БАГ ГЕНЕРАТОРА: modify-only поля помечаются Required в schema ресурса + +``` +Error: Missing required argument + on vc_org.tf line 5, in resource "nubes_vc_org" "dev_org": + 5: resource "nubes_vc_org" "dev_org" { +The argument "v_i_p_configure" is required, but no definition was found. +The argument "resource_name" is required, but no definition was found. +``` + +### Причина + +Генератор (`~/terra/terraform/devops/`) при создании Go-кода ресурса (`19_vc_org_resource.go`) +помечает **все операции ресурса** как `Required` в схеме, включая поля, +которые нужны только для операции `modify` (не для `create`). + +Конкретный пример: `vIPConfigure` (код параметра 662) — это поле операции `modify`, +но попадает в schema с `Required: true`: + +```go +"v_i_p_configure": schema.StringAttribute{Required: true}, +``` + +В YAML-описании сервиса (19_vc_org.yaml) `vIPConfigure` объявлен только под +`operations.modify.params`, а не под `operations.create.params`. + +### Что нужно исправить в генераторе + +В `~/terra/terraform/devops/` (файлы `02_generate_resources_and_docs*.go/sh`): + +Поля, принадлежащие только операции `modify` (или другим не-create операциям), +должны генерироваться как **`Optional: true, Computed: true`**, а не `Required: true`. + +Логика: +- поле в `operations[create].params` → `Required: true` +- поле только в `operations[modify].params` → `Optional: true, Computed: true` +- поле только в state (read-only) → `Computed: true` + +### Временный workaround (действующий) + +В `terraform.tf`-манифесте указывать пустую строку: + +```hcl +v_i_p_configure = "" # modify-only поле; при create не отправляется в API +``` + +Провайдер при Create не передаёт это поле в API (строка 418/556 params), +но schema.Required требует non-null значение в плане. + +### Файлы для правки + +- `~/terra/terraform/devops/profiles/test/generated/go/19_vc_org_resource.go` — сгенерированный, не менять вручную +- **Править нужно шаблоны/генераторы** в `~/terra/terraform/devops/` + +--- + ## 2026-03-22 — БАГ: CreateService/CreateFunction возвращает 409 при `terraform apply -replace` (ИСПРАВЛЕН) ### Симптом diff --git a/examples/DEVfromGround/main.tf b/examples/DEVfromGround/main.tf index 1d1f939..e17eacc 100644 --- a/examples/DEVfromGround/main.tf +++ b/examples/DEVfromGround/main.tf @@ -24,5 +24,5 @@ variable "resource_realm" { provider "nubes" { api_token = var.api_token - api_endpoint = "https://deck-api-dev.ngcloud.ru/api/v1" + api_endpoint = "https://deck-api-dev.ngcloud.ru/api/v1/index.cfm" } diff --git a/examples/DEVfromGround/vc_org.tf b/examples/DEVfromGround/vc_org.tf index 75d2bb2..ee696aa 100644 --- a/examples/DEVfromGround/vc_org.tf +++ b/examples/DEVfromGround/vc_org.tf @@ -3,15 +3,19 @@ // resource_realm задаётся через переменную (terraform.tfvars или -var). resource "nubes_vc_org" "dev_org" { + resource_name = "vcOrg-2" resource_realm = var.resource_realm # organization_type "iaas" — единственный вариант с доступом к организации. # Значение по умолчанию "iaas", явно прописано для читаемости. organization_type = "iaas" - # adopt_existing_on_create = true позволяет взять существующий инстанс под управление. - # Для DEV-стенда оставляем false — при apply создаётся новый; ошибка если уже есть. - adopt_existing_on_create = false + # v_i_p_configure — JSON-список ipSpaces для операции modify. + # При create провайдер не передаёт его в API, но требует non-null значение в плане. + v_i_p_configure = "" + + # adopt_existing_on_create = true — берёт существующий инстанс (dev-org-sless-demo уже создан с null realm от предыдущей попытки). + adopt_existing_on_create = true # suspend_on_destroy = true (по умолчанию) — при destroy инстанс уходит в Suspend, не удаляется. suspend_on_destroy = true diff --git a/examples/NODEJS/main.tf b/examples/NODEJS/main.tf new file mode 100644 index 0000000..442dfba --- /dev/null +++ b/examples/NODEJS/main.tf @@ -0,0 +1,32 @@ +// Создано: 2026-03-23 +// main.tf — провайдер Nubes + переменные для примера NODEJS. +// Ресурс nubes_nodejs: managed Node.js приложение в облаке (не sless-функция). + +terraform { + required_providers { + nubes = { + source = "terra.k8c.ru/nubes/nubes" + version = "5.0.19" + } + } +} + +variable "api_token" { + type = string + sensitive = true +} + +variable "realm" { + type = string + description = "resource_realm — зона размещения ресурса (например: k8s-3-sandbox-nubes-ru)" +} + +variable "git_path" { + type = string + description = "URL git-репозитория с кодом приложения" +} + +provider "nubes" { + api_token = var.api_token + api_endpoint = "https://deck-api-test.ngcloud.ru/api/v1/index.cfm" +} diff --git a/examples/NODEJS/nodejs.tf b/examples/NODEJS/nodejs.tf new file mode 100644 index 0000000..0e1102a --- /dev/null +++ b/examples/NODEJS/nodejs.tf @@ -0,0 +1,22 @@ +# Создано: 2026-03-23 +# nodejs.tf — ресурс nubes_nodejs: managed Node.js приложение. +# Параметры взяты из документации terra.k8c.ru/docs/nubes/nubes/5.0.19/30_registry/resources/nodejs_params_create/ + +resource "nubes_nodejs" "app" { + resource_name = "nodejsdemo1" + domain = "domma" + resource_realm = var.realm + git_path = var.git_path + app_version = "23" + resource_c_p_u = 500 + resource_memory = 1024 + resource_instances = 1 + json_env = jsonencode({}) + adopt_existing_on_create = true + # health_path не задан — используется дефолтный / +} + +output "nodejs_domain" { + description = "Домен развёрнутого Node.js приложения" + value = nubes_nodejs.app.domain +} diff --git a/examples/POSTGRES/code/calc-node/handler.js b/examples/POSTGRES/code/calc-node/handler.js index 7ee3462..29bed1f 100644 --- a/examples/POSTGRES/code/calc-node/handler.js +++ b/examples/POSTGRES/code/calc-node/handler.js @@ -1,116 +1,9 @@ // Создано: 2026-04-10 -// Простой калькулятор — возвращает HTML страницу с кнопками. -// GET → HTML; POST с {a, op, b} → вычисление с результатом на странице. -// Рантайм nodejs20 v0.1.3+ поддерживает HTML-ответ (строка начинающаяся с '<'). +// Демо-функция: возвращает текущее время сервера. +// Юзер меняет код под себя и перебилдит через terraform apply. 'use strict'; -const HTML = ` - -
- - -