1
0
Fork 0
mirror of https://github.com/retspen/webvirtcloud synced 2026-11-09 11:46:49 +00:00
webvirtcloud/networks/tests/test_add_net_pool_form.py
catborise 0a1219c659 fix(networks): a subnet that is not one is refused by the create form
The create-network form only checked the characters of its subnets, so
192.0.2.0/33 or 999.0.2.0/24 passed and network_size raised a
ValueError: the user got a server error instead of a message. So did a
subnet too small for the gateway, DHCP range and broadcast address that
network_size derives (0.0.0.0/32, 255.255.255.255/32), and 192.0.2.0/31
or a bare address gave an inverted DHCP range.

Each subnet field now parses its value as a network of its IP version
and refuses it with a field error otherwise. An IPv4 prefix must be /30
or shorter; the IPv6 prefix must be /64, which the view checked after
the form and now the form does.
2026-10-20 22:37:44 +03:00

37 lines
1.5 KiB
Python

"""The create-network form takes real subnets of the right IP version; one
it refuses is a field error, not a server error."""
from django.test import SimpleTestCase
from networks.forms import AddNetPool
def form(**fields):
return AddNetPool({"name": "wvc-test-net", "forward": "nat", **fields})
class SubnetTests(SimpleTestCase):
def test_subnets_are_accepted(self):
for subnet in ("192.0.2.0/24", "192.0.2.0/30", "255.255.255.252/30"):
with self.subTest(subnet=subnet):
self.assertTrue(form(subnet=subnet, subnet6="2001:db8::/64").is_valid())
self.assertTrue(form().is_valid()) # both optional
def test_a_subnet_that_is_not_one_is_refused(self):
for field, value in (
("subnet", "192.0.2.0/33"),
("subnet", "999.0.2.0/24"),
("subnet", "2001:db8::/64"),
("subnet6", "2001:db8::/129"),
("subnet6", "192.0.2.0/24"),
# no room for a gateway, a DHCP range and a broadcast address
("subnet", "192.0.2.0"),
("subnet", "192.0.2.0/31"),
("subnet", "0.0.0.0/32"),
("subnet", "255.255.255.255/32"),
# libvirt takes only /64 for IPv6
("subnet6", "2001:db8::"),
("subnet6", "2001:db8::/120"),
("subnet6", "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"),
):
with self.subTest(field=field, value=value):
self.assertIn(field, form(**{field: value}).errors)