Files
ipam_control/docs/changes/002-prefix-vrf-change/SUMMARY.md
T
ayurishchevandClaude Sonnet 5 a846d30872 IPAM Manager: API, UI-админка, журнал аудита
Backend (FastAPI, SQLAlchemy 2, Alembic, PostgreSQL 16):
- организации, VRF, префиксы (дерево, использование, автоназначение),
  адреса, операторы связи, устройства и типы устройств; JWT, роли admin/viewer;
- VRF принадлежит организации (составной FK), смена VRF у префикса
  переносит поддерево, имя VRF уникально в организации;
- журнал аудита: поиск и фильтры, ротация (срок/количество), очистка
  по паролю с блокировкой, IP клиента и метаданные запроса
  (X-Forwarded-For только от TRUSTED_PROXIES).

UI (web/, без сборки): экраны и диалоги по макетам «IPAM Manager»,
кликабельные строки реестров, локальные шрифты IBM Plex,
собственные выпадающие списки.

Окружение: docker-compose (postgres + app), миграции Alembic 0001-0004,
scripts/gen_env.py, scripts/seed_demo.py, 11 автотестов (pytest).
Документация: README.md и docs/changes/001-005 (планы и итоги).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-20 12:27:47 +03:00

4.5 KiB
Raw Blame History

Суммаризация: смена VRF у префикса и целостность «VRF ⊂ организация» (изменение 002)

Сделано

  • API: PATCH /prefixes/{id} принимает vrf_id. Перенос — только в VRF той же организации (иначе 422), вместе со всем поддеревом; дубль CIDR в целевом VRF → 409 со списком конфликтов, откат целиком. Родитель пересчитывается в целевом VRF; логика подбора родителя вынесена в общую attach_to_tree (её же использует создание префикса). В журнал пишется VRF: старый → новый и число перенесённых.
  • БД (миграция 0002): UNIQUE(id, organization_id) на vrfs + составной FK prefixes(vrf_id, organization_id) → vrfs; имя VRF уникально в организации без учёта регистра (uq_vrfs_org_lower_name). Миграция сама проверяет данные на дубли/расхождения. Проверено: upgrade → check (без дрейфа) → downgrade → upgrade.
  • UI: в окне редактирования префикса появилось поле «VRF» (только VRF текущей организации), подсказка «Вместе с префиксом будет перенесено вложенных: N» при выборе другого VRF; ошибки 409/422 — в баннере окна.
  • Тесты: +2 (всего 6, все проходят против контейнеров): уникальность имён VRF по организациям; перенос поддерева (409 / 422 / успех).

Найдено и исправлено попутно

  • Дубликат при создании (организация, VRF, тип, устройство, адрес, префикс) приводил к 500 вместо 409: ошибка уникальности возникала на flush, минуя обработку. Добавлен services.flush с тем же переводом в 409 и глобальный обработчик IntegrityError как страховка.
  • Меню действий строки оставалось на экране под открытым диалогом после выбора пункта.

Ограничения

  • В UI кнопка «⋯» есть только у листовых префиксов (как в макете), поэтому перенос целого поддерева через интерфейс недоступен — только через API; подсказка про вложенные в UI готова и появится, если добавить действие у родительских префиксов.

Дополнение: локальные шрифты

IBM Plex Sans (400/500/600) и Mono (400/500) в формате woff2 (latin + cyrillic, ~150 КБ всего) лежат в web/fonts/, подключены через fonts/fonts.css (@font-face с unicode-range); ссылка на fonts.googleapis.com удалена. Проверено: при загрузке UI нет ни одного запроса за пределы приложения.

Дополнение: выпадающие списки в диалогах

  • Баг: в окне «Редактировать префикс» на экране адресов список VRF был пуст (VRF загружались только на экране «Префиксы») — теперь запрашиваются и на экране адресов.
  • Нативный <select> во всех диалогах (VRF, статус, родитель, организация, тип, устройство) заменён на собственный выпадающий список в стиле меню строк: скруглённая карточка с тенью, подсветка выбранного и наведения, значение хранится в скрытом поле; закрытие по клику вне списка и по Esc (диалог при этом не закрывается), навигация стрелками ↑/↓. Это также ближе к макетам, где поля выбора — кнопки с шевроном.