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