From d5df187de42917afe038275751fe9bbcb9a7d93b Mon Sep 17 00:00:00 2001 From: catborise Date: Fri, 23 Oct 2026 13:32:08 +0300 Subject: [PATCH] fix(networks, storages): a name in use is refused by the page again The create forms of networks and storage pools checked the new name against the host's list of networks or pools, but that list holds one dict per object, so the name never matched and the check never fired; libvirt refused the duplicate with its own wording. The check now compares names: the page shows its own message, nothing is sent to libvirt, and the Logs page gets a failed row "...: add: name already in use". --- networks/tests/test_audit_rows.py | 8 +++----- networks/views.py | 5 +++-- storages/tests/test_audit_rows.py | 9 ++++----- storages/views.py | 5 +++-- 4 files changed, 13 insertions(+), 14 deletions(-) diff --git a/networks/tests/test_audit_rows.py b/networks/tests/test_audit_rows.py index ef133e61..cc2cbe77 100644 --- a/networks/tests/test_audit_rows.py +++ b/networks/tests/test_audit_rows.py @@ -86,8 +86,6 @@ class NetworkRowTests(TestCase): self.client.post(url, {"create": "", "name": "audit-net", "forward": "nat", "subnet": "198.51.100.0/24", "dhcp4": "on"}) self.client.post(url, {"create": "", "name": "bad name!", "forward": "nat"}) # invalid form - self.client.post(url, {"create": "", "name": "lab", "forward": "nat", "subnet": "203.0.113.0/24"}) - [first, second] = rows() - self.assertEqual(first, ("Network audit-net: add", True)) - self.assertFalse(second[1]) - self.assertTrue(second[0].startswith("Network lab: add: "), second[0]) + response = self.client.post(url, {"create": "", "name": "lab", "forward": "nat", "subnet": "203.0.113.0/24"}) + self.assertIn("Network pool name already in use", [str(m) for m in get_messages(response.wsgi_request)]) + self.assertEqual(rows(), [("Network audit-net: add", True), ("Network lab: add: name already in use", False)]) diff --git a/networks/views.py b/networks/views.py index de5a32cd..f194f26e 100644 --- a/networks/views.py +++ b/networks/views.py @@ -6,7 +6,7 @@ from django.shortcuts import get_object_or_404, render from django.urls import reverse from django.utils.translation import gettext_lazy as _ from libvirt import libvirtError -from logs.audit import audit +from logs.audit import audit, failed from vrtManager.network import network_size, wvmNetwork, wvmNetworks from networks.forms import AddNetPool @@ -40,9 +40,10 @@ def networks(request, compute_id): form = AddNetPool(request.POST) if form.is_valid(): data = form.cleaned_data - if data["name"] in networks: + if data["name"] in [net["name"] for net in networks]: msg = _("Network pool name already in use") messages.error(request, msg) + failed(request, compute, f"Network {data['name']}", "add", "name already in use") errors = True if ( data["forward"] in ["bridge", "macvtap"] diff --git a/storages/tests/test_audit_rows.py b/storages/tests/test_audit_rows.py index 7bb1e8b2..f834b30e 100644 --- a/storages/tests/test_audit_rows.py +++ b/storages/tests/test_audit_rows.py @@ -161,14 +161,13 @@ class PoolAndVolumeRowTests(TransactionTestCase): url = reverse("storages", args=[self.compute.pk]) self.client.post(url, {"create": "1", "name": "audit-pool", "stg_type": "dir", "target": "/srv/audit-pool"}) self.client.post(url, {"create": "1", "name": "bad name!", "stg_type": "dir", "target": "/srv/x"}) # invalid - from libvirt import libvirtError - - # libvirt refuses a name in use (the page's own name check compares names with dicts) - self.pools.create_storage.side_effect = libvirtError("pool 'default' already exists") + self.pools.get_storages_info.return_value = [{"name": "default"}] + self.pools.create_storage.reset_mock() self.client.post(url, {"create": "1", "name": "default", "stg_type": "dir", "target": "/srv/default"}) + self.pools.create_storage.assert_not_called() self.assertEqual(rows(), [ ("Storage pool audit-pool: add", True), - ("Storage pool default: add: pool 'default' already exists", False), + ("Storage pool default: add: name already in use", False), ]) def test_volume_add_and_delete(self): diff --git a/storages/views.py b/storages/views.py index 20e49ef3..57acc98c 100644 --- a/storages/views.py +++ b/storages/views.py @@ -12,7 +12,7 @@ from django.utils.translation import gettext_lazy as _ from libvirt import libvirtError from operations import claims, jobs from operations.utils import busy_message -from logs.audit import audit +from logs.audit import audit, failed from vrtManager.util import OperationError from vrtManager.storage import wvmStorage, wvmStorages @@ -80,9 +80,10 @@ def storages(request, compute_id): form = AddStgPool(request.POST) if form.is_valid(): data = form.cleaned_data - if data["name"] in storages: + if data["name"] in [stg["name"] for stg in storages]: msg = _("Pool name already use") messages.error(request, msg) + failed(request, compute, f"Storage pool {data['name']}", "add", "name already in use") errors = True if data["stg_type"] == "rbd": if not data["secret"]: