Skip to main content

DNS Proxy Models

Overview​

The DNS Proxy models provide a structured way to represent and validate DNS proxy configuration data for Palo Alto Networks' Strata Cloud Manager. These models manage DNS proxy settings including default servers, domain-specific rules, static entries, caching behavior, and TCP/UDP query configurations.

Models​

The module provides the following Pydantic models:

  • DnsProxyBaseModel: Base model with fields common to all DNS proxy operations
  • DnsProxyCreateModel: Model for creating new DNS proxy configurations
  • DnsProxyUpdateModel: Model for updating existing DNS proxy configurations
  • DnsProxyResponseModel: Response model for DNS proxy operations

Sub-Models​

The module also provides several sub-models for nested configuration:

  • DnsProxyDefaultServer: Default DNS server configuration
  • DnsProxyDomainServer: DNS proxy rule (domain server) entry
  • DnsProxyStaticEntry: Static domain name mapping entry
  • DnsProxyTcpQueries: TCP queries configuration
  • DnsProxyUdpQueries: UDP queries configuration
  • DnsProxyUdpRetries: UDP query retry configuration
  • DnsProxyCacheMaxTtl: Cache max TTL configuration
  • DnsProxyCache: DNS cache configuration

The DnsProxyBaseModel and DnsProxyCreateModel / DnsProxyUpdateModel use extra="forbid" configuration, which rejects any fields not explicitly defined in the model. The DnsProxyResponseModel uses extra="ignore" to provide resilience against unexpected fields returned by the API.

Field Aliases​

Several fields in the DNS Proxy models use aliases to map between Python attribute names (underscores) and the API's hyphenated field names. The following aliases are defined:

Python AttributeAPI Field NameModel
domain_serversdomain-serversDnsProxyBaseModel
static_entriesstatic-entriesDnsProxyBaseModel
tcp_queriestcp-queriesDnsProxyBaseModel
udp_queriesudp-queriesDnsProxyBaseModel
domain_namedomain-nameDnsProxyDomainServer
max_pending_requestsmax-pending-requestsDnsProxyTcpQueries
time_to_livetime-to-liveDnsProxyCacheMaxTtl
cache_ednscache-ednsDnsProxyCache
max_ttlmax-ttlDnsProxyCache

All models use populate_by_name=True, so you can use either the Python attribute name or the API field name when constructing model instances.

Model Attributes​

DnsProxyBaseModel​

This is the base model containing fields common to all DNS proxy operations.

AttributeTypeRequiredDefaultDescription
namestrYesNoneDNS proxy name. Max 31 chars.
enabledboolNoNoneEnable DNS proxy.
defaultDnsProxyDefaultServerNoNoneDefault DNS server configuration.
interfaceList[str]NoNoneInterfaces on which to enable DNS proxy service.
domain_serversList[DnsProxyDomainServer]NoNoneDNS proxy rules (domain servers). Alias: domain-servers.
static_entriesList[DnsProxyStaticEntry]NoNoneStatic domain name mappings. Alias: static-entries.
tcp_queriesDnsProxyTcpQueriesNoNoneTCP queries configuration. Alias: tcp-queries.
udp_queriesDnsProxyUdpQueriesNoNoneUDP queries configuration. Alias: udp-queries.
cacheDnsProxyCacheNoNoneDNS cache configuration.
folderstrNo**NoneFolder location. Pattern: ^[a-zA-Z\d\-_. ]+$. Max 64 chars.
snippetstrNo**NoneSnippet location. Pattern: ^[a-zA-Z\d\-_. ]+$. Max 64 chars.
devicestrNo**NoneDevice location. Pattern: ^[a-zA-Z\d\-_. ]+$. Max 64 chars.

** Exactly one container (folder/snippet/device) must be provided for create operations

DnsProxyCreateModel​

Inherits all fields from DnsProxyBaseModel and enforces that exactly one of folder, snippet, or device is provided during creation.

DnsProxyUpdateModel​

Extends DnsProxyBaseModel by adding:

AttributeTypeRequiredDefaultDescription
idUUIDYesNoneThe unique identifier of the DNS proxy

DnsProxyResponseModel​

Extends DnsProxyBaseModel by adding:

AttributeTypeRequiredDefaultDescription
idUUIDYesNoneThe unique identifier of the DNS proxy
note

The DnsProxyResponseModel uses extra="ignore" instead of extra="forbid". This means it will silently ignore any extra fields returned by the API that are not defined in the model, providing resilience against API changes.

Sub-Models​

DnsProxyDefaultServer​

Default DNS server configuration.

AttributeTypeRequiredDefaultDescription
inheritanceDict[str, Any]NoNoneInheritance settings with 'source' (dynamic interface)
primarystrYesNonePrimary DNS name server IP address.
secondarystrNoNoneSecondary DNS name server IP address.

DnsProxyDomainServer​

DNS proxy rule (domain server) entry for domain-specific DNS resolution.

AttributeTypeRequiredDefaultDescription
namestrYesNoneProxy rule name.
cacheableboolNoNoneEnable caching for this DNS proxy rule.
domain_nameList[str]NoNoneDomain names that will be matched. Alias: domain-name.
primarystrYesNonePrimary DNS server IP address.
secondarystrNoNoneSecondary DNS server IP address.

DnsProxyStaticEntry​

Static domain name mapping entry for direct name-to-address resolution.

AttributeTypeRequiredDefaultDescription
namestrYesNoneStatic entry name. Max 31 chars.
domainstrYesNoneFully qualified domain name. Max 255 chars.
addressList[str]YesNoneResolved IP addresses.

DnsProxyTcpQueries​

TCP queries configuration.

AttributeTypeRequiredDefaultDescription
enabledboolYesNoneTurn on forwarding of TCP DNS queries.
max_pending_requestsintNoNoneUpper limit on concurrent TCP DNS requests (64-256). Alias: max-pending-requests.

DnsProxyUdpQueries​

UDP queries configuration.

AttributeTypeRequiredDefaultDescription
retriesDnsProxyUdpRetriesNoNoneRetry configuration for UDP queries.

DnsProxyUdpRetries​

UDP query retry configuration.

AttributeTypeRequiredDefaultDescription
intervalintNoNoneTime in seconds for another request to be sent (1-30).
attemptsintNoNoneMaximum number of retries before trying next server (1-30).

DnsProxyCacheMaxTtl​

Cache max TTL configuration.

AttributeTypeRequiredDefaultDescription
enabledboolYesNoneEnable max TTL for this DNS object.
time_to_liveintNoNoneTime in seconds after which entry is cleared (60-86400). Alias: time-to-live.

DnsProxyCache​

DNS cache configuration.

AttributeTypeRequiredDefaultDescription
enabledboolYesNoneTurn on caching for this DNS object.
cache_ednsboolNoNoneCache EDNS UDP response. Alias: cache-edns.
max_ttlDnsProxyCacheMaxTtlNoNoneMaximum TTL configuration. Alias: max-ttl.

Exceptions​

The models perform strict validation and will raise ValueError in scenarios such as:

  • When creating a proxy (DnsProxyCreateModel), if not exactly one container (folder, snippet, or device) is provided.
  • When container identifiers (folder, snippet, device) do not match the required pattern or exceed the maximum length.
  • When the name field exceeds the maximum length of 31 characters.
  • When max_pending_requests in DnsProxyTcpQueries is outside the range of 64-256.
  • When interval or attempts in DnsProxyUdpRetries is outside the range of 1-30.
  • When time_to_live in DnsProxyCacheMaxTtl is outside the range of 60-86400.

Model Validators​

Container Validation in DnsProxyCreateModel​

  • validate_container_type: After model initialization, this validator checks that exactly one of the container fields (folder, snippet, or device) is provided. If not, it raises a ValueError.

Usage Examples​

Creating a DNS Proxy​

Using a Dictionary​

from scm.models.network import DnsProxyCreateModel

proxy_data = {
"name": "corp-dns-proxy",
"enabled": True,
"default": {
"primary": "8.8.8.8",
"secondary": "8.8.4.4"
},
"interface": ["ethernet1/1"],
"folder": "Networking",
}

# Validate and create model instance
proxy = DnsProxyCreateModel(**proxy_data)
payload = proxy.model_dump(exclude_unset=True, by_alias=True)
print(payload)

Using the Model Directly​

from scm.models.network import DnsProxyCreateModel
from scm.models.network.dns_proxy import (
DnsProxyDefaultServer,
DnsProxyDomainServer,
DnsProxyCache,
DnsProxyCacheMaxTtl,
)

# Create DNS proxy with sub-models
proxy = DnsProxyCreateModel(
name="advanced-dns-proxy",
enabled=True,
default=DnsProxyDefaultServer(
primary="10.0.0.1",
secondary="10.0.0.2"
),
domain_servers=[
DnsProxyDomainServer(
name="internal-rule",
domain_name=["*.corp.example.com"],
primary="10.1.0.1",
cacheable=True
)
],
cache=DnsProxyCache(
enabled=True,
cache_edns=False,
max_ttl=DnsProxyCacheMaxTtl(
enabled=True,
time_to_live=3600
)
),
folder="Networking",
)
payload = proxy.model_dump(exclude_unset=True, by_alias=True)
print(payload)

Using Hyphenated Field Names (API Aliases)​

from scm.models.network import DnsProxyCreateModel

# You can use the hyphenated API field names thanks to populate_by_name=True
proxy_data = {
"name": "alias-example",
"enabled": True,
"default": {
"primary": "8.8.8.8"
},
"domain-servers": [
{
"name": "internal",
"domain-name": ["*.internal.com"],
"primary": "10.0.0.1"
}
],
"tcp-queries": {
"enabled": True,
"max-pending-requests": 128
},
"cache": {
"enabled": True,
"cache-edns": True,
"max-ttl": {
"enabled": True,
"time-to-live": 7200
}
},
"folder": "Networking",
}

proxy = DnsProxyCreateModel(**proxy_data)
payload = proxy.model_dump(exclude_unset=True, by_alias=True)
print(payload)

Updating a DNS Proxy​

from scm.client import Scm

# Initialize client
client = Scm(
client_id="your_client_id",
client_secret="your_client_secret",
tsg_id="your_tsg_id",
)

# Fetch existing proxy
existing = client.dns_proxy.fetch(name="corp-dns-proxy", folder="Networking")

# Update the default DNS servers
existing.default = {"primary": "1.1.1.1", "secondary": "1.0.0.1"}

# Pass modified object to update()
updated = client.dns_proxy.update(existing)
print(f"Updated proxy: {updated.name}")