Files
CloudRouterAdvanced/docs/changes/2026-09-03-local-delivery-integrity-tests-summary.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

5.8 KiB
Raw Permalink Blame History

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

Дата: 2026-09-03 План: 2026-09-03-local-delivery-integrity-tests-plan.md

Что сделано

venv/ — локальное изолированное окружение (в корне проекта, не в git)

  • python3 -m venv venv.
  • venv/bin/terraform — Terraform v1.16.1 (linux_amd64), скачан с внутреннего зеркала HashiCorp-релизов https://hashicorp-releases.mcs.mail.ru/terraform/1.16.1/, целостность архива проверена по SHA256SUMS перед распаковкой.
  • venv/bin/pip install -r terraform/tests/requirements.txt — pytest 9.1.1, python-hcl2 8.1.3, checkov 3.3.16.

terraform/tests/requirements.txt

Пины версий для воспроизводимой установки пакетов тестирования.

terraform/tests/test_terraform_delivery.py

Pytest-сьют из 28 тестов, полностью офлайн (без terraform init/plan/apply к реальному провайдеру, без облачных вызовов):

  • наличие обязательных файлов поставки (main.tf, variables.tf, terraform.tfvars, scripts/network-init.sh.tpl), отсутствие старого network-init.sh;
  • terraform fmt -check -recursive — единственная проверка, буквально вызывающая сам terraform (из venv/bin, если он там есть, иначе PATH);
  • валидность 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 (NIC-количество реально масштабируется, не хардкод);
  • нарезка приватных подсетей (переиспользование формулы cidrsubnet через ipaddress) не даёт коллизий для 6 комбинаций router_count×private_interface_count (включая крайние: 1×1, 8×4, 1×6);
  • network-init.sh.tpl содержит только ожидаемые Terraform-интерполяции (${pi.cidr}, ${pi.name}) и директиву %{ for pi in private_interfaces }; симуляция рендера ($${ → ${, подстановка тестовых данных) даёт синтаксически валидный bash (bash -n);
  • smoke-тест checkov (офлайн, --skip-download) — не падает; намеренно не проверяет resource_count > 0, см. ограничение ниже.

Результат: 28 passed.

.gitignore (новый файл)

venv/, .pytest_cache/, __pycache__/, *.pyc, .terraform/, .terraform.lock.hcl, *.tfstate*, crash*.log.

README.md

Добавлен раздел "Local delivery integrity tests" с командами запуска и пояснением про офлайн-природу тестов.

Важные находки в процессе

  1. terraform validate/init с реальным провайдером vkcs недостижимы в этом окружении — registry.terraform.io возвращает "Content not available in your region" на API-запросы, а сконфигурированное зеркало terraform-mirror.mcs.mail.ru не хостит hashicorp/vkcs (404 на index.json по протоколу Provider Network Mirror). Это подтверждает более раннюю находку (репозиторий не содержит required_providers) и объясняет, почему для содержательной проверки пришлось построить отдельный pytest+hcl2 сьют вместо terraform validate.
  2. https://hashicorp-releases.mcs.mail.ru — зеркало официальных релизов HashiCorp (terraform CLI и другие продукты HashiCorp), но не третьесторонних провайдеров вроде vkcs (публикуется VK Cloud, не HashiCorp) — поэтому оно решает задачу "установить terraform в venv", но не задачу provider-резолвинга.
  3. checkov не имеет собственных политик для провайдера vkcs — проверено отдельным sanity-тестом на aws_s3_bucket (там checkov нормально нашёл ресурс и прогнал реальные проверки), тогда как на terraform/main.tf он стабильно даёт resource_count: 0. Оставлен в сьюте только как smoke-проверка работоспособности инструмента, не как содержательный security/compliance гейт для этого репозитория.

Верификация

  • venv/bin/pytest terraform/tests -v → 28 passed.
  • venv/bin/terraform version → Terraform v1.16.1.
  • git status подтверждает, что venv/ и .pytest_cache/ не отслеживаются git (.gitignore работает).