Skip to main content

Service Models

Overview

The Service models provide a structured way to manage network services in Palo Alto Networks' Strata Cloud Manager. These models support both TCP and UDP protocols with port configurations and protocol-specific overrides. Services can be defined in folders, snippets, or devices. The models handle validation of inputs and outputs when interacting with the SCM API.

Models

The module provides the following Pydantic models:

  • ServiceBaseModel: Base model with fields common to all service operations
  • ServiceCreateModel: Model for creating new services
  • ServiceUpdateModel: Model for updating existing services
  • ServiceResponseModel: Response model for service operations
  • Protocol: Protocol configuration container (TCP or UDP)
  • TCPProtocol: TCP protocol settings with port and override options
  • UDPProtocol: UDP protocol settings with port and override options
  • Override: Protocol override settings (timeout, halfclose_timeout, timewait_timeout)

All models use extra="forbid" configuration, which rejects any fields not explicitly defined in the model.

Attributes

AttributeTypeRequiredDefaultDescription
namestrYesNoneName of the service. Max length: 63 chars. Must match pattern: ^[a-zA-Z0-9_ .-]+$
protocolProtocolYesNoneProtocol configuration (TCP or UDP)
descriptionstrNoNoneDescription of the service. Max length: 1023 chars
tagList[str]NoNoneList of tags
folderstrNo*NoneFolder where service is defined. Max length: 64 chars
snippetstrNo*NoneSnippet where service is defined. Max length: 64 chars
devicestrNo*NoneDevice where service is defined. Max length: 64 chars
idUUIDYes**NoneUUID of the service (response only)

* Exactly one container type (folder/snippet/device) must be provided ** Only required for response model

Protocol Attributes

AttributeTypeRequiredDefaultDescription
tcpTCPNo*NoneTCP protocol configuration
udpUDPNo*NoneUDP protocol configuration
portstrYesNonePort numbers (e.g. "80" or "80,8080")
overrideOverrideNoNoneProtocol override settings

* Exactly one protocol type (tcp/udp) must be provided

Exceptions

The Service models can raise the following exceptions during validation:

  • ValueError: Raised in several scenarios:
    • When neither or both TCP and UDP protocols are provided in protocol configuration
    • When multiple container types (folder/snippet/device) are specified for create operations
    • When no container type is specified for create operations
    • When name pattern validation fails
    • When port format validation fails

Model Validators

Protocol Type Validation

The models enforce that exactly one protocol type (TCP or UDP) must be specified:

# Using dictionary
from scm.config.objects import Service

# Error: both TCP and UDP provided
try:
service_dict = {
"name": "invalid-service",
"protocol": {
"tcp": {"port": "80"},
"udp": {"port": "53"} # Can't specify both TCP and UDP
},
"folder": "Texas"
}
service = Service(api_client)
response = service.create(service_dict)
except ValueError as e:
print(e) # "Exactly one of 'tcp' or 'udp' must be provided in 'protocol'."

# Using model directly
from scm.models.objects import ServiceCreateModel, Protocol

# Error: no protocol specified
try:
service = ServiceCreateModel(
name="invalid-service",
protocol=Protocol(),
folder="Texas"
)
except ValueError as e:
print(e) # "Exactly one of 'tcp' or 'udp' must be provided in 'protocol'."

Container Type Validation

For create operations, exactly one container type must be specified:

# Using dictionary
try:
service_dict = {
"name": "invalid-service",
"protocol": {"tcp": {"port": "80"}},
"folder": "Texas",
"device": "fw01" # Can't specify both folder and device
}
response = service.create(service_dict)
except ValueError as e:
print(e) # "Exactly one of 'folder', 'snippet', or 'device' must be provided."

# Using model directly
try:
service = ServiceCreateModel(
name="invalid-service",
protocol=Protocol(tcp=TCPProtocol(port="80")),
folder="Texas",
device="fw01"
)
except ValueError as e:
print(e) # "Exactly one of 'folder', 'snippet', or 'device' must be provided."

Usage Examples

Creating a TCP Service

from scm.client import Scm

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

# Using dictionary
tcp_data = {
"name": "web-service",
"protocol": {
"tcp": {
"port": "80,443",
"override": {
"timeout": 30,
"halfclose_timeout": 15
}
}
},
"description": "Web service ports",
"folder": "Texas",
"tag": ["web", "production"]
}

response = client.service.create(tcp_data)
print(f"Created service: {response.name} (ID: {response.id})")

Creating a UDP Service

# Using dictionary
udp_data = {
"name": "dns-service",
"protocol": {
"udp": {
"port": "53"
}
},
"description": "DNS service",
"snippet": "Network Services",
"tag": ["dns", "network"]
}

response = client.service.create(udp_data)
print(f"Created UDP service: {response.name}")

Updating a Service

# Fetch existing service
existing = client.service.fetch(name="web-service", folder="Texas")

# Modify attributes using dot notation
existing.protocol.tcp.port = "80,443,8080"
existing.protocol.tcp.override.timeout = 60
existing.tag = ["web", "production", "updated"]

# Pass modified object to update()
updated = client.service.update(existing)
print(f"Updated service: {updated.name}")
print(f"New ports: {updated.protocol.tcp.port}")

Working with Response Models

# List and process services
services = client.service.list(folder="Texas")

for svc in services:
print(f"Service: {svc.name} (ID: {svc.id})")
if svc.protocol.tcp:
print(f" TCP Ports: {svc.protocol.tcp.port}")
if svc.protocol.tcp.override:
print(f" Timeout: {svc.protocol.tcp.override.timeout}")
elif svc.protocol.udp:
print(f" UDP Ports: {svc.protocol.udp.port}")