Merge pull request #24 from dmitriev-e/fix/catalog-zone-get-or-create

Fix/catalog zone get or create
This commit is contained in:
Sven Luethi authored and GitHub committed 2026-07-16 09:07:45 +02:00
commit f80318707d
3 files changed
+14 -18

No files matched your search

+2 -2
View File
@@ -74,8 +74,8 @@ multiple views yields unpredicted behavior.
#### NOTIFY #### NOTIFY
Clients may be notified of zone changes using the NOTIFY mechanism defined in RFC 1996. Clients may be notified of zone changes using the NOTIFY mechanism defined in RFC 1996.
When enabled, the zone transfer endpoint keeps track of any client that successfully queried the When enabled, the zone transfer endpoint keeps track of any client that successfully queried the
endpoint and when a zone changes. Once a zone has changed, NetBox informs each client of said endpoint. Once a zone has changed, NetBox informs each client about the zone changed so that the
change. client can request a new zone transfer.
Note that this feature uses NetBox's background job system to schedule the messages asynchronously. Note that this feature uses NetBox's background job system to schedule the messages asynchronously.
In order to work, you need at least one `rq-worker` service running in the background to handle In order to work, you need at least one `rq-worker` service running in the background to handle
+1 -1
View File
@@ -2,7 +2,7 @@ from netbox.plugins import PluginConfig
from django.conf import settings from django.conf import settings
from .logger import get_logger from .logger import get_logger
__version__ = "1.5.4" __version__ = "1.5.6"
LOGGER = get_logger(__name__) LOGGER = get_logger(__name__)
+11 -15
View File
@@ -3,16 +3,11 @@ import dns.zone
import dns.rdatatype import dns.rdatatype
import dns.rdataclass import dns.rdataclass
from .logger import get_logger from .logger import get_logger
from netbox_dns.models import Zone from netbox_dns.models import Zone as NBZone
from netbox_dns_bridge.models import IntegerKeyValueSetting, CatalogZoneMemberIdentifier from netbox_dns_bridge.models import IntegerKeyValueSetting, CatalogZoneMemberIdentifier
from uuid import uuid4 from uuid import uuid4
from base64 import b32encode from base64 import b32encode
from django.db import ( from django.db import transaction, close_old_connections, OperationalError
transaction,
close_old_connections,
OperationalError,
RelatedObjectDoesNotExist
)
LOGGER = get_logger(__name__) LOGGER = get_logger(__name__)
@@ -20,7 +15,7 @@ LOGGER = get_logger(__name__)
def increment_soa_serial() -> int: def increment_soa_serial() -> int:
with transaction.atomic(): with transaction.atomic():
try: try:
soa_serial_obj = ( soa_serial_obj, _ = (
IntegerKeyValueSetting.objects.select_for_update().get_or_create( IntegerKeyValueSetting.objects.select_for_update().get_or_create(
key="catalog-zone-soa-serial", key="catalog-zone-soa-serial",
defaults={"value": 1}, defaults={"value": 1},
@@ -58,7 +53,7 @@ def create_zone(name, view_name) -> dns.zone.Zone:
try: try:
# get zones from netbox # get zones from netbox
nb_zones = Zone.objects.filter( nb_zones = NBZone.objects.filter(
view__name=view_name, active=True view__name=view_name, active=True
).select_related("catz_identifier") ).select_related("catz_identifier")
@@ -71,9 +66,9 @@ def create_zone(name, view_name) -> dns.zone.Zone:
# Create PTR record # Create PTR record
try: try:
catz_identifier = nb_zone.catz_identifier catz_identifier = nb_zone.catz_identifier
except RelatedObjectDoesNotExist: except NBZone.catz_identifier.RelatedObjectDoesNotExist:
catz_identifier = nb_zone.catz_identifier.create( catz_identifier = CatalogZoneMemberIdentifier.objects.create(
name=_generate_member_identifier() zone=nb_zone, name=_generate_member_identifier()
) )
p_name = catz_identifier.name p_name = catz_identifier.name
@@ -129,7 +124,7 @@ def _generate_member_identifier() -> str:
return b32encode(uuid4().bytes)[0:26].lower().decode("UTF-8") return b32encode(uuid4().bytes)[0:26].lower().decode("UTF-8")
def update_member_identifier(zone: Zone) -> None: def update_member_identifier(zone: NBZone) -> None:
try: try:
CatalogZoneMemberIdentifier.objects.update_or_create( CatalogZoneMemberIdentifier.objects.update_or_create(
zone=zone, zone=zone,
@@ -142,9 +137,10 @@ def update_member_identifier(zone: Zone) -> None:
def _create_soa_rdataset() -> dns.rdataset: def _create_soa_rdataset() -> dns.rdataset:
try: try:
serial = IntegerKeyValueSetting.objects.get_or_create( serial_obj, _ = IntegerKeyValueSetting.objects.get_or_create(
key="catalog-zone-soa-serial", defaults={"value": 1} key="catalog-zone-soa-serial", defaults={"value": 1}
).value )
serial = serial_obj.value
# SOA Record components # SOA Record components
ttl = 0 ttl = 0