private_supernet/private_subnet_prefix_length/private_interface_count
(which auto-derived per-router-per-role micro-subnets via cidrsubnet())
are replaced by a single required variable, private_network_cidrs: one
CIDR per shared private network that router VMs get an interface into,
supplied explicitly by the admin - no auto-carving. Each router gets its
own port/IP inside every listed network (cidrhost(cidr, router_index+2)),
closer to the original lan_net design but generalized to N networks and
N routers. network-init.sh.tpl needed no changes - it already matches
interfaces by CIDR membership regardless of whether the CIDR is shared.
Also fixes a testing gap found along the way: `terraform validate` does
not enforce variable validation{} blocks for externally-supplied values
in this terraform version - only `plan`/`apply` do. The test suite now
exercises those validations for real via `terraform plan` against an
isolated, provider-free copy of variables.tf.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011hXR2ftXZZhJ4Y3XuSoR8r
2.8 KiB
2.8 KiB
План внедрения: явная передача префиксов приватных сетей
Дата: 2026-09-03
Проблема
Приватные подсети роутеров нарезались автоматически (private_supernet + private_subnet_prefix_length + private_interface_count → cidrsubnet()). Администратор должен явно передавать все адресные префиксы — по одному CIDR на каждую приватную сеть, к которой подключаются маршрутизаторы. Автоматической нарезки быть не должно.
Модель меняется: вместо N×router_count изолированных микроподсетей — N общих приватных сетей (по числу переданных префиксов), в каждой свой порт/IP на роутер (аналогично исходной lan_net/lan_port1/2, но обобщено на произвольное число сетей и роутеров).
Шаги
terraform/variables.tf: удалитьprivate_supernet,private_subnet_prefix_length,private_interface_count; добавить обязательнуюprivate_network_cidrs(list(string), без default, 3 validation-блока: непустой список, валидные CIDR, уникальность).terraform/main.tf:router_priv_net/router_priv_subnet—for_eachпо ролям (одна сеть на роль);router_priv_port—for_eachпо (роутер×роль),fixed_ip = cidrhost(role_cidr, router_index + 2).templatefile()берёт CIDR изlocal.private_network_cidr[role].terraform/scripts/network-init.sh.tpl— без изменений (сопоставление по CIDR-принадлежности не зависит от того, общий CIDR или уникальный).terraform.tfvars— рабочий примерprivate_network_cidrsвместо удалённых переменных.terraform/tests/test_terraform_delivery.py— обновить тесты под новую переменную/локали, убрать carving-коллизии, добавить проверку непересечения и вместимости CIDR.README.md/docs/QUICKSTART.md— обновить описание.- Summary-документ по завершении.
Верификация
terraform fmt -check -recursive.- Реальные
terraform init/validate(локальный filesystem-mirror провайдера) на нескольких сочетанияхrouter_count/private_network_cidrs. venv/bin/pytest terraform/tests -v.