19 lines
2.2 KiB
Markdown
19 lines
2.2 KiB
Markdown
# Итог: исправление удаления организации (изменение 007)
|
||||
|
|
|
|||
|
|
## Проблема
|
|||
|
|
`DELETE /api/v1/organizations/{id}` возвращал `409 «Запись с такими значениями уже существует»` для организаций без префиксов, устройств и операторов.
|
|||
|
|
|
|||
|
|
## Причина
|
|||
|
|
В `delete_org` служебные VRF и сама организация удалялись одним `commit()` через `db.delete()`. Между `Vrf` и `Organization` нет ORM-`relationship()`,
|
|||
|
|
поэтому порядок DELETE в unit of work не гарантирован: `DELETE FROM organizations` выполнялся раньше `DELETE FROM vrfs` и нарушал FK `vrfs_organization_id_fkey`.
|
|||
|
|
Ошибка `IntegrityError` в `commit()` превращалась в общий 409. Тесты проблему не видели: фикстура `org` перед удалением организации вручную удаляет её VRF.
|
|||
|
|
|
|||
|
|
## Что сделано
|
|||
|
|
- `app/api/v1/refs.py`: VRF организации удаляются явным `db.execute(delete(Vrf).where(...))` до удаления организации.
|
|||
|
|
- `tests/test_api.py`: `test_delete_organization` — организация с префиксом → 409 «Нельзя удалить…»; пустая организация (VRF `default` удаляется вместе с ней) → 204, затем 404.
|
|||
|
|
- Схема БД, миграции и UI не менялись.
|
|||
|
|
|
|||
|
|
## Проверка
|
|||
|
|
- Новый тест на старом коде падал (409), на новом проходит; полный набор — 13 passed.
|
|||
|
|
- Один из прогонов сразу после перезапуска контейнера дал разовый сбой `test_journal_search_and_filters` (`total == 0`); два повторных полных прогона и отдельный прогон — без ошибок. Связь с правкой не выявлена.
|
|||
|
|
- Стенд `ipam_control_006` пересобран только по сервису `app`, БД и данные сохранены.
|