Files
CloudRouterAdvanced/docs/changes/2026-09-03-local-delivery-integrity-tests-plan.md
ayurishchevandClaude Sonnet 5 5979a9a58b Add adaptive router VM/interface scaling and local delivery integrity tests
Terraform now provisions router_count IaaS Router VMs (default 2, no
longer hardcoded to router1/router2), each with 1 public +
private_interface_count isolated private interfaces (no shared LAN or
VRRP between routers). Both counts scale via Terraform variables and
TF_VAR_* environment variables. The post-install script became a
Terraform template that matches interfaces to their expected subnet by
CIDR instead of a fragile "first private IP" heuristic.

Added an offline pytest suite (terraform/tests/) that checks the
delivery's internal consistency and runs real terraform init/validate
against the actual vkcs provider schema via a project-local filesystem
mirror (provider binary fetched from its GitHub releases, bypassing the
region-blocked HashiCorp registry) - no cloud credentials or API calls
involved. terraform/versions.tf now declares the previously-missing
required_providers block.

Ansible (inventory.ini, base/frr_router/keepalived roles) still assumes
the old 2-router/2-NIC/VRRP topology and is not yet adapted - documented
as a follow-up, not addressed here.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011hXR2ftXZZhJ4Y3XuSoR8r
2026-09-03 16:03:12 +03:00

4.4 KiB

План внедрения: локальная проверка целостности поставки terraform

Дата: 2026-09-03

Проблема

Нужно проверить целостность поставки terraform/ средствами terraform, но terraform validate/plan с реальным провайдером vkcs недостижимы в этом окружении (см. предыдущие изменения): реестр registry.terraform.io блокирует регион ("Content not available in your region"), а сконфигурированное зеркало terraform-mirror.mcs.mail.ru не содержит провайдер hashicorp/vkcs (404 на index.json) — в репозитории также исторически отсутствует блок required_providers. Пользователь подтвердил: тесты строго локальные, настройку облачных сущностей не выполняем.

Требуется: установить terraform в изолированное локальное окружение (venv/ в корне проекта), внутри — Python virtualenv с пакетами для тестов, и выполнить содержательную офлайн-проверку поставки.

Шаги

  1. python3 -m venv venv в корне проекта.
  2. Скачать бинарь terraform (v1.16.1, linux_amd64) с внутреннего зеркала https://hashicorp-releases.mcs.mail.ru/terraform/, проверить SHA256SUMS, распаковать в venv/bin/terraform. (Это зеркало официальных релизов HashiCorp — провайдер vkcs там не публикуется, т.к. это сторонний провайдер VK Cloud, не HashiCorp; проблема с провайдером этим не решается, но сам terraform CLI теперь изолированно установлен в venv, как и просил пользователь.)
  3. venv/bin/pip install -r terraform/tests/requirements.txt — pytest, python-hcl2, checkov (checkov оставлен как smoke-проверка; у него нет собственных правил для провайдера vkcs, что подтверждено отдельным sanity-тестом на aws_s3_bucket).
  4. Написать terraform/tests/test_terraform_delivery.py — pytest-сьют, полностью офлайн:
    • наличие обязательных файлов поставки;
    • terraform fmt -check -recursive (единственная проверка, буквально использующая сам terraform-бинарь);
    • валидность HCL всех .tf-файлов через python-hcl2;
    • переменные router_count/private_interface_count объявлены с ожидаемыми дефолтами и не переопределены в terraform.tfvars (иначе TF_VAR_* не сработает);
    • vkcs_compute_instance.router использует count = var.router_count, отсутствуют легаси-ресурсы router1/router2/lan_port1/lan_port2;
    • locals.private_roles генерируется из var.private_interface_count, dynamic "network" использует local.private_roles;
    • нарезка приватных подсетей (cidrsubnet) не даёт коллизий — переиспользована через ipaddress для нескольких комбинаций router_count/private_interface_count;
    • network-init.sh.tpl содержит только ожидаемые Terraform-интерполяции (${pi.cidr}, ${pi.name}), директиву %{ for pi in private_interfaces }, и рендерится в синтаксически валидный bash (симуляция templatefile() + bash -n).
  5. .gitignore — добавить venv/, .pytest_cache/, __pycache__/, .terraform/, *.tfstate* (венв и кэши не должны попасть в git).
  6. README.md — короткий раздел про запуск тестов.
  7. Summary-документ по завершении.

Верификация

  • venv/bin/pytest terraform/tests -v — все тесты должны быть зелёными.