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}")