Resolve the default security group UUID dynamically instead of hardcoding it

The "default" security group VK Cloud auto-creates in every project has
a UUID unique to that project, but main.tf hardcoded one project's UUID
across all 4 instance resources (router, priv_srv_01/02/03) - not
portable to another project. Replaced with data.vkcs_networking_secgroup
(matched by name = "default", verified against the real provider schema
via terraform providers schema -json on the local provider mirror) behind
local.default_security_group_id. The new default_security_group_id
variable is a last-resort manual override via coalesce() for projects
where the lookup doesn't fit (non-standard name/SDN) - not the normal path.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011hXR2ftXZZhJ4Y3XuSoR8r
This commit is contained in:
ayurishchevandClaude Sonnet 5 committed 2026-09-06 20:32:05 +03:00
1 parent 1ef4b12143
commit b5d6367fd8
7 files changed
+174 -6

No files matched your search

@@ -0,0 +1,28 @@
# План внедрения: динамическое вычисление UUID Default Security Group
Дата: 2026-09-04
## Проблема
В `terraform/main.tf` в 4 местах (router, priv_srv_01/02/03) захардкожен литерал `"d479b4d7-55b3-4ff1-bf8d-24d826a38f11"` — UUID системной Security Group `default`, автоматически создаваемой в каждом проекте VK Cloud, но **уникальной по UUID для каждого проекта**. Код не переносим между проектами без ручной правки.
## Решение
Провайдер `vkcs` предоставляет data source `vkcs_networking_secgroup` (проверено локально через `terraform providers schema -json` на уже установленном provider-mirror v0.17.2) с фильтром по `name`/`sdn` и computed-атрибутом `id`. Автосозданная группа по умолчанию называется `default` (подтверждено пользователем для целевого проекта).
Явная передача UUID через переменную (в т.ч. `TF_VAR_default_security_group_id`) остаётся только как fallback на крайний случай — через `coalesce()`.
## Шаги
1. `terraform/main.tf`: добавить `data "vkcs_networking_secgroup" "default" { name = "default"; sdn = "sprut" }` и `locals.default_security_group_id = coalesce(var.default_security_group_id, data.vkcs_networking_secgroup.default.id)`; заменить 4 вхождения литерала на `local.default_security_group_id`.
2. `terraform/variables.tf`: добавить `default_security_group_id` (string, default `null`, без validation — это осознанный override).
3. `terraform/tests/test_terraform_delivery.py`: regression-guard на отсутствие старого UUID-литерала; проверка, что data source и локаль существуют и используются; расширить `variables.tf`-only plan-тест на новую переменную.
4. `README.md`/`docs/QUICKSTART.md`: кратко описать механизм и его fallback-статус.
5. Summary-документ по завершении.
## Верификация
- `terraform fmt -check -recursive`.
- Реальные `terraform init`/`validate` через локальный provider-mirror.
- `venv/bin/pytest terraform/tests -v`.
- Реальный lookup (`plan`/`apply` с настоящими credentials) проверяется пользователем самостоятельно в VK Cloud — вне офлайн-песочницы.
@@ -0,0 +1,34 @@
# Summary: динамическое вычисление UUID Default Security Group
Дата: 2026-09-04
План: [2026-09-04-dynamic-default-secgroup-plan.md](2026-09-04-dynamic-default-secgroup-plan.md)
## Что сделано
### `terraform/main.tf`
Добавлен `data "vkcs_networking_secgroup" "default" { name = "default"; sdn = "sprut" }` и `locals.default_security_group_id = coalesce(var.default_security_group_id, data.vkcs_networking_secgroup.default.id)`. Все 4 вхождения захардкоженного литерала `"d479b4d7-55b3-4ff1-bf8d-24d826a38f11"` (в `security_group_ids` роутера и `priv_srv_01/02/03`) заменены на `local.default_security_group_id`.
Точное имя автосозданной группы (`default`, нижний регистр) подтверждено пользователем для целевого проекта. Data source и его атрибуты (`id` актуален, `secgroup_id` deprecated) проверены локально через `terraform providers schema -json` на уже установленном filesystem-mirror провайдера v0.17.2 — без обращения к реальному облаку.
### `terraform/variables.tf`
Добавлена `default_security_group_id` (string, default `null`, без validation) — explicit override как крайняя мера; при `null` (значение по умолчанию) используется динамический lookup.
### `terraform/tests/test_terraform_delivery.py`
Добавлены хелперы `find_local()` (main.tf теперь содержит два отдельных блока `locals {}`, поэтому старое обращение по индексу `main["locals"][0]` было неверным — исправлено) и `find_data_sources()`. Новые тесты:
- `test_default_security_group_data_source_exists` — data source объявлен с `name = "default"`;
- `test_default_security_group_id_local_prefers_override_then_lookup` — точная проверка выражения `coalesce(...)`;
- `test_no_hardcoded_security_group_uuid_in_main` — regression-guard: в `main.tf` не должно быть ни одного литерала в форме UUID;
- `test_all_instances_use_default_security_group_local` — все `vkcs_compute_instance` ссылаются на `local.default_security_group_id`, а не на литерал;
- `test_default_security_group_id_override_accepted` — реальный `terraform plan` на изолированном `variables.tf` принимает и `null` (по умолчанию), и явный override.
Итог сьюта: **38 passed** (было 32).
### `README.md` / `docs/QUICKSTART.md`
Добавлено краткое описание механизма и явная пометка override-переменной как "крайняя мера".
## Верификация
- `terraform fmt -check -recursive` → чисто.
- Реальные `terraform init`/`validate` (локальный provider-mirror) — с override и без → оба успешны.
- `venv/bin/pytest terraform/tests -v` → **38 passed**.
- Реальный lookup данных (`vkcs_networking_secgroup.default` резолвится в существующую группу проекта) можно проверить только `terraform plan`/`apply` с настоящими credentials в самом VK Cloud — вне рамок этой офлайн-песочницы; это отдельный шаг для пользователя при первом реальном деплое.