Files
CloudRouterAdvanced/docs/changes/2026-09-03-explicit-private-network-cidrs-plan.md
ayurishchevandClaude Sonnet 5 1ef4b12143 Replace auto-carved private subnets with explicit admin-supplied CIDRs
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
2026-09-04 10:49:24 +03:00

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, но обобщено на произвольное число сетей и роутеров).

Шаги

  1. terraform/variables.tf: удалить private_supernet, private_subnet_prefix_length, private_interface_count; добавить обязательную private_network_cidrs (list(string), без default, 3 validation-блока: непустой список, валидные CIDR, уникальность).
  2. 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].
  3. terraform/scripts/network-init.sh.tpl — без изменений (сопоставление по CIDR-принадлежности не зависит от того, общий CIDR или уникальный).
  4. terraform.tfvars — рабочий пример private_network_cidrs вместо удалённых переменных.
  5. terraform/tests/test_terraform_delivery.py — обновить тесты под новую переменную/локали, убрать carving-коллизии, добавить проверку непересечения и вместимости CIDR.
  6. README.md/docs/QUICKSTART.md — обновить описание.
  7. Summary-документ по завершении.

Верификация

  • terraform fmt -check -recursive.
  • Реальные terraform init/validate (локальный filesystem-mirror провайдера) на нескольких сочетаниях router_count/private_network_cidrs.
  • venv/bin/pytest terraform/tests -v.