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
5.8 KiB
5.8 KiB
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" с командами запуска и пояснением про офлайн-природу тестов.
Важные находки в процессе
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.https://hashicorp-releases.mcs.mail.ru— зеркало официальных релизов HashiCorp (terraform CLI и другие продукты HashiCorp), но не третьесторонних провайдеров вродеvkcs(публикуется VK Cloud, не HashiCorp) — поэтому оно решает задачу "установить terraform в venv", но не задачу provider-резолвинга.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работает).