From 721c3fcfaba467be7afdf1b4a39f1cc0c43d716c Mon Sep 17 00:00:00 2001 From: Repinoid Date: Thu, 24 Sep 2026 13:48:53 +0300 Subject: [PATCH] =?UTF-8?q?feat(stand/FullPipe):=20=D0=BE=D1=80=D0=B3=20or?= =?UTF-8?q?gan=20(org=5Fuid)=20+=20=D1=80=D0=B5=D1=81=D1=83=D1=80=D1=81?= =?UTF-8?q?=D1=8B-=D0=BC=D0=BE=D0=B4=D0=B8=D1=84=D0=B8=D0=BA=D0=B0=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D1=8B=20=E2=80=94=20=D0=B0=D0=BB=D0=BB=D0=BE=D0=BA?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20IP=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5?= =?UTF-8?q?=20=D1=8D=D0=B4=D0=B6=D0=B0,=20=D0=B7=D0=B0=D1=82=D0=B5=D0=BC?= =?UTF-8?q?=20SNAT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DEV_STAND/FullPipe/modifiers.tf | 57 +++++++++++++++++++++++++++++++++ DEV_STAND/FullPipe/variables.tf | 19 +++++++++++ DEV_STAND/FullPipe/versions.tf | 2 +- 3 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 DEV_STAND/FullPipe/modifiers.tf diff --git a/DEV_STAND/FullPipe/modifiers.tf b/DEV_STAND/FullPipe/modifiers.tf new file mode 100644 index 0000000..a12b137 --- /dev/null +++ b/DEV_STAND/FullPipe/modifiers.tf @@ -0,0 +1,57 @@ +# ============================================================================= +# Ресурсы-модификаторы (операции modify, которых нет в create-схеме ресурсов) +# +# Порядок строго такой: +# орга (создана вручную в ЛК) +# -> nubes_vc_vdc.vdc +# -> nubes_vc_nsxt.edge +# -> nubes_vc_org_ip_allocation (выделение внешних IP на орге) +# -> nubes_vc_nsxt_snat (SNAT на эдже этим ipSpace) +# +# Почему аллокация ПОСЛЕ эджа: платформа строит список ipSpace из состояния +# `job.vcd.networkProvider` / `job.vcd.providerGateway`, то есть требует уже +# созданный vDC и Edge. Иначе modify на орге падает +# («Can't cast Complex Object Type Struct to String»). +# ============================================================================= + +# 1. Внешние IP на организации (modify: vIPConfigure, массив перезаписывается целиком) +resource "nubes_vc_org_ip_allocation" "org_ip" { + org_uid = var.org_uid + + vip_configure = jsonencode([ + { + name = var.ip_space_name + count = var.ip_count + } + ]) + + # false = при destroy отправить обратный modify с count=0 (квота обнулится) + keep_on_destroy = false + + depends_on = [nubes_vc_nsxt.edge] +} + +# 2. SNAT на эдже (modify: ipSpaceName) +resource "nubes_vc_nsxt_snat" "snat" { + nsxt_uid = nubes_vc_nsxt.edge.id + ip_space_name = var.ip_space_name + + keep_on_destroy = false + + # ipSpace должен быть уже выделен на организации + depends_on = [nubes_vc_org_ip_allocation.org_ip] +} + +output "allocated_org_ip" { + description = "Выделено внешних IP на организации" + value = { + org_uid = var.org_uid + ip_space_name = var.ip_space_name + ip_count = var.ip_count + } +} + +output "snat_ip_space" { + description = "ipSpace, включённый как SNAT на эдже" + value = nubes_vc_nsxt_snat.snat.ip_space_name +} diff --git a/DEV_STAND/FullPipe/variables.tf b/DEV_STAND/FullPipe/variables.tf index dbe8a3e..4f0ee97 100644 --- a/DEV_STAND/FullPipe/variables.tf +++ b/DEV_STAND/FullPipe/variables.tf @@ -16,6 +16,25 @@ variable "organization" { description = "Имя или UUID организации (vc_org)" } +# UUID той же организации — нужен ресурсам-модификаторам (они адресуются строго по uid) +variable "org_uid" { + type = string + description = "UUID организации (vc_org) для nubes_vc_org_ip_allocation" +} + +# --- Модификаторы (IP на орге + SNAT на эдже) --- + +variable "ip_space_name" { + type = string + description = "Имя ipSpace, доступное организации (смотреть в ЛК, напр. internet-ipv4-v1)" +} + +variable "ip_count" { + type = string + default = "3" + description = "Сколько внешних IP выделить на организации (count — строка)" +} + variable "vdc_resource_name" { type = string default = "fullpipe-vdc" diff --git a/DEV_STAND/FullPipe/versions.tf b/DEV_STAND/FullPipe/versions.tf index 2ef02f3..0f07ad6 100644 --- a/DEV_STAND/FullPipe/versions.tf +++ b/DEV_STAND/FullPipe/versions.tf @@ -4,7 +4,7 @@ terraform { required_providers { nubes = { source = "tf-registry.containerk8s.services.ngcloud.ru/nubes-dev/nubes" - version = "2.0.17" + version = "2.0.19" } } }