Skip to main content

Route Prefix List Models

Overview​

The Route Prefix List models provide a structured way to represent and validate route prefix list configuration data for Palo Alto Networks' Strata Cloud Manager. Route prefix lists are used for prefix-based route filtering in BGP and OSPF routing policies. Each entry can match a specific network with optional greater-than-or-equal (ge) and less-than-or-equal (le) prefix length modifiers, or match any network using the special any keyword.

Models​

The module provides the following Pydantic models:

  • RoutePrefixListBaseModel: Base model with fields common to all route prefix list operations
  • RoutePrefixListCreateModel: Model for creating new route prefix lists
  • RoutePrefixListUpdateModel: Model for updating existing route prefix lists
  • RoutePrefixListResponseModel: Response model for route prefix list operations
  • RoutePrefixListIpv4: IPv4 prefix list container
  • RoutePrefixListIpv4Entry: Individual IPv4 prefix list entry
  • RoutePrefixListPrefix: Prefix configuration (oneOf: network "any" or entry)
  • RoutePrefixListPrefixEntry: Prefix entry with network and optional ge/le

The RoutePrefixListBaseModel and RoutePrefixListCreateModel / RoutePrefixListUpdateModel use extra="forbid" configuration, which rejects any fields not explicitly defined in the model. The RoutePrefixListResponseModel uses extra="ignore" to provide resilience against unexpected fields returned by the API.

Model Attributes​

RoutePrefixListBaseModel​

This is the base model containing fields common to all route prefix list operations.

AttributeTypeRequiredDefaultDescription
namestrYesNoneFilter prefix list name.
descriptionstrNoNoneDescription.
ipv4RoutePrefixListIpv4NoNoneIPv4 prefix list 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

RoutePrefixListCreateModel​

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

RoutePrefixListUpdateModel​

Extends RoutePrefixListBaseModel by adding:

AttributeTypeRequiredDefaultDescription
idUUIDYesNoneThe unique identifier of the route prefix list

RoutePrefixListResponseModel​

Extends RoutePrefixListBaseModel by adding:

AttributeTypeRequiredDefaultDescription
idUUIDYesNoneThe unique identifier of the route prefix list
note

The RoutePrefixListResponseModel 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.

Supporting Models​

RoutePrefixListIpv4​

IPv4 prefix list container holding the list of entries.

AttributeTypeRequiredDefaultDescription
ipv4_entryList[RoutePrefixListIpv4Entry]NoNoneIPv4 prefix list entries.

RoutePrefixListIpv4Entry​

Individual IPv4 prefix list entry with sequence number, action, and prefix matching.

AttributeTypeRequiredDefaultDescription
nameintNoNoneSequence number (1-65535).
actionstrNoNoneAction: deny or permit. Pattern: ^(deny|permit)$
prefixRoutePrefixListPrefixNoNonePrefix configuration.

RoutePrefixListPrefix​

Prefix configuration. Uses oneOf semantics: network and entry are mutually exclusive.

AttributeTypeRequiredDefaultDescription
networkstrNo*NoneNetwork keyword (must be any). Pattern: ^any$
entryRoutePrefixListPrefixEntryNo*NonePrefix entry with network address and optional ge/le.

* network and entry are mutually exclusive.

RoutePrefixListPrefixEntry​

Prefix entry with network address and optional ge/le modifiers.

AttributeTypeRequiredDefaultDescription
networkstrNoNoneNetwork address (e.g., "10.0.0.0/8").
greater_than_or_equalintNoNoneGreater than or equal to prefix length (0-32).
less_than_or_equalintNoNoneLess than or equal to prefix length (0-32).

Exceptions​

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

  • When creating a route prefix list (RoutePrefixListCreateModel), if not exactly one container (folder, snippet, or device) is provided.
  • When both network and entry are set in RoutePrefixListPrefix (mutually exclusive).
  • When an entry sequence number is outside the valid range (1-65535).
  • When an entry action is not deny or permit.
  • When ge/le values are outside the valid range (0-32).
  • When container identifiers (folder, snippet, device) do not match the required pattern or exceed the maximum length.

Model Validators​

OneOf Validator in RoutePrefixListPrefix​

  • validate_prefix_type: Ensures that network and entry are mutually exclusive. If both are set, it raises a ValueError. A prefix can either match any network (using network: "any") or a specific prefix entry, but not both.

Container Validation in RoutePrefixListCreateModel​

  • 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 Route Prefix List​

Using a Dictionary​

from scm.models.network import RoutePrefixListCreateModel

prefix_list_data = {
"name": "prefix-list-1",
"description": "Allow default and specific prefixes",
"ipv4": {
"ipv4_entry": [
{
"name": 10,
"action": "permit",
"prefix": {
"entry": {
"network": "10.0.0.0/8",
"greater_than_or_equal": 16,
"less_than_or_equal": 24,
},
},
},
{
"name": 20,
"action": "permit",
"prefix": {
"entry": {
"network": "172.16.0.0/12",
"greater_than_or_equal": 16,
"less_than_or_equal": 28,
},
},
},
{
"name": 100,
"action": "deny",
"prefix": {
"network": "any",
},
},
],
},
"folder": "Routing",
}

# Validate and create model instance
prefix_list = RoutePrefixListCreateModel(**prefix_list_data)
payload = prefix_list.model_dump(exclude_unset=True, by_alias=True)
print(payload)

Using the Model Directly​

from scm.models.network import (
RoutePrefixListCreateModel,
RoutePrefixListIpv4,
RoutePrefixListIpv4Entry,
RoutePrefixListPrefix,
RoutePrefixListPrefixEntry,
)

# Build prefix list entries
entries = [
RoutePrefixListIpv4Entry(
name=10,
action="permit",
prefix=RoutePrefixListPrefix(
entry=RoutePrefixListPrefixEntry(
network="10.0.0.0/8",
greater_than_or_equal=16,
less_than_or_equal=24,
),
),
),
RoutePrefixListIpv4Entry(
name=100,
action="deny",
prefix=RoutePrefixListPrefix(network="any"),
),
]

# Create the prefix list
prefix_list = RoutePrefixListCreateModel(
name="prefix-list-2",
description="Specific prefix filtering",
ipv4=RoutePrefixListIpv4(ipv4_entry=entries),
folder="Routing",
)
payload = prefix_list.model_dump(exclude_unset=True, by_alias=True)
print(payload)

Updating a Route Prefix List​

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 prefix list
existing = client.route_prefix_list.fetch(name="prefix-list-1", folder="Routing")

# Modify description
existing.description = "Updated prefix filtering rules"

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