Skip to content

Commit 42ed34e

Browse files
Copilotrwxd
andcommitted
Fix: Allow global_read_only without requiring zones field
Co-authored-by: rwxd <40308458+rwxd@users.noreply.github.com>
1 parent dba788e commit 42ed34e

File tree

2 files changed

+59
-2
lines changed

2 files changed

+59
-2
lines changed

powerdns_api_proxy/models.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from functools import lru_cache
22
from typing import TypedDict
33

4-
from pydantic import BaseModel, field_validator
4+
from pydantic import BaseModel, field_validator, model_validator
55

66
from powerdns_api_proxy.logging import logger
77
from powerdns_api_proxy.utils import (
@@ -53,7 +53,7 @@ def __init__(self, **data):
5353
class ProxyConfigEnvironment(BaseModel):
5454
name: str
5555
token_sha512: str
56-
zones: list[ProxyConfigZone]
56+
zones: list[ProxyConfigZone] = []
5757
global_read_only: bool = False
5858
global_search: bool = False
5959
global_tsigkeys: bool = False
@@ -74,6 +74,14 @@ def validate_token(cls, token_sha512):
7474
raise ValueError("A SHA512 hash must be 128 digits long")
7575
return token_sha512
7676

77+
@model_validator(mode='after')
78+
def validate_zones_or_global_read_only(self):
79+
if not self.zones and not self.global_read_only:
80+
raise ValueError(
81+
"Either 'zones' must be non-empty or 'global_read_only' must be True"
82+
)
83+
return self
84+
7785
def __init__(self, **data):
7886
super().__init__(**data)
7987
if self.global_read_only:

tests/unit/config_test.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -595,3 +595,52 @@ def test_tsigkeys_allowed_globally():
595595
environment = deepcopy(dummy_proxy_environment)
596596
environment.global_tsigkeys = True
597597
assert check_pdns_tsigkeys_allowed(environment) is True
598+
599+
600+
def test_global_read_only_without_zones():
601+
"""Test that global_read_only=True allows empty zones list"""
602+
env = ProxyConfigEnvironment(
603+
name="Test Global Read Only",
604+
token_sha512=dummy_proxy_environment_token_sha512,
605+
global_read_only=True
606+
)
607+
assert env.global_read_only is True
608+
assert env.zones == []
609+
610+
611+
def test_environment_with_neither_zones_nor_global_read_only_fails():
612+
"""Test that providing neither zones nor global_read_only fails validation"""
613+
with pytest.raises(ValueError) as err:
614+
ProxyConfigEnvironment(
615+
name="test",
616+
token_sha512=dummy_proxy_environment_token_sha512
617+
)
618+
assert "Either 'zones' must be non-empty or 'global_read_only' must be True" in str(err.value)
619+
620+
621+
def test_environment_with_empty_zones_and_no_global_read_only_fails():
622+
"""Test that explicitly providing empty zones without global_read_only fails"""
623+
with pytest.raises(ValueError) as err:
624+
ProxyConfigEnvironment(
625+
name="test",
626+
token_sha512=dummy_proxy_environment_token_sha512,
627+
zones=[]
628+
)
629+
assert "Either 'zones' must be non-empty or 'global_read_only' must be True" in str(err.value)
630+
631+
632+
def test_proxy_config_with_global_read_only_environment():
633+
"""Test that ProxyConfig works with global_read_only environment without zones"""
634+
config = ProxyConfig(
635+
pdns_api_url="https://powerdns-api.example.com",
636+
pdns_api_token="blablub",
637+
environments=[
638+
ProxyConfigEnvironment(
639+
name="foo",
640+
token_sha512=dummy_proxy_environment_token_sha512,
641+
global_read_only=True
642+
)
643+
]
644+
)
645+
assert config.environments[0].global_read_only is True
646+
assert config.environments[0].zones == []

0 commit comments

Comments
 (0)