Add RFC 2317 classless reverse zone names for sub-/24 subnets
This commit is contained in:
6 files changed
+215
-12
No files matched your search
@@ -0,0 +1,37 @@
|
||||
import pytest
|
||||
|
||||
from mdb.models import Ip4Subnet, Ip6Subnet
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"network,netmask,expected",
|
||||
[
|
||||
# /24 and shorter -> standard octet-boundary name
|
||||
("203.0.113.0", "255.255.255.0", "113.0.203.in-addr.arpa"),
|
||||
("10.0.3.0", "255.255.255.0", "3.0.10.in-addr.arpa"),
|
||||
("10.0.0.0", "255.255.0.0", "0.0.10.in-addr.arpa"),
|
||||
# longer than /24 -> RFC 2317 classless name
|
||||
("192.0.2.192", "255.255.255.192", "192-26.2.0.192.in-addr.arpa"),
|
||||
("10.0.0.0", "255.255.255.252", "0-30.0.0.10.in-addr.arpa"),
|
||||
("10.1.2.0", "255.255.255.128", "0-25.2.1.10.in-addr.arpa"),
|
||||
# host bits set -> normalized down to the network address
|
||||
("192.0.2.200", "255.255.255.192", "192-26.2.0.192.in-addr.arpa"),
|
||||
],
|
||||
)
|
||||
def test_ip4_reverse_zone_name(network, netmask, expected):
|
||||
subnet = Ip4Subnet(network=network, netmask=netmask)
|
||||
assert subnet.reverse_zone_name == expected
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"network,netmask,expected",
|
||||
[
|
||||
("2001:db8", 64, "0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa"),
|
||||
("2001:db8", 48, "0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa"),
|
||||
("2001:db8:abcd", 56, "0.0.d.c.b.a.8.b.d.0.1.0.0.2.ip6.arpa"),
|
||||
("2001:db8", 32, "8.b.d.0.1.0.0.2.ip6.arpa"),
|
||||
],
|
||||
)
|
||||
def test_ip6_reverse_zone_name(network, netmask, expected):
|
||||
subnet = Ip6Subnet(network=network, netmask=netmask)
|
||||
assert subnet.reverse_zone_name == expected
|
||||
@@ -0,0 +1,67 @@
|
||||
import pytest
|
||||
|
||||
from mdb.models import DhcpConfig, Ip4Subnet, Ip6Subnet
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# pre_save signals: populate domain_name once, then leave it frozen
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
def make_ip4subnet(**overrides):
|
||||
dhcp_config = DhcpConfig.objects.create(serial=1, active_serial=1)
|
||||
fields = {
|
||||
"name": "test-subnet",
|
||||
"netmask": "255.255.255.192",
|
||||
"network": "192.0.2.192",
|
||||
"domain_soa": "ns1.example.org",
|
||||
"domain_admin": "admin@example.org",
|
||||
"domain_filename": "db.test-subnet",
|
||||
"dhcp_config": dhcp_config,
|
||||
}
|
||||
fields.update(overrides)
|
||||
return Ip4Subnet.objects.create(**fields)
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_ip4_signal_sets_classless_domain_name():
|
||||
subnet = make_ip4subnet()
|
||||
assert subnet.domain_name == "192-26.2.0.192.in-addr.arpa"
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_ip4_signal_sets_plain_domain_name_for_slash24():
|
||||
subnet = make_ip4subnet(network="203.0.113.0", netmask="255.255.255.0")
|
||||
assert subnet.domain_name == "113.0.203.in-addr.arpa"
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_ip4_signal_does_not_overwrite_existing_domain_name():
|
||||
subnet = make_ip4subnet(domain_name="manual.in-addr.arpa")
|
||||
assert subnet.domain_name == "manual.in-addr.arpa"
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_ip4_domain_name_is_frozen_when_network_changes():
|
||||
subnet = make_ip4subnet()
|
||||
assert subnet.domain_name == "192-26.2.0.192.in-addr.arpa"
|
||||
|
||||
subnet.network = "10.0.0.0"
|
||||
subnet.netmask = "255.255.255.0"
|
||||
subnet.save()
|
||||
subnet.refresh_from_db()
|
||||
|
||||
# The name is derived once and then left alone.
|
||||
assert subnet.domain_name == "192-26.2.0.192.in-addr.arpa"
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_ip6_signal_sets_domain_name():
|
||||
subnet = Ip6Subnet.objects.create(
|
||||
name="ipv6-doc",
|
||||
network="2001:db8",
|
||||
netmask=64,
|
||||
domain_soa="ns1.example.org",
|
||||
domain_admin="admin@example.org",
|
||||
domain_filename="db.reverse-v6",
|
||||
)
|
||||
assert subnet.domain_name == "0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa"
|
||||
Reference in new issue
Block a user