Ethernet Interface¶
The EthernetInterface class manages ethernet interface objects in Palo Alto Networks' Strata Cloud Manager. Ethernet interfaces support three modes: Layer 2, Layer 3, and TAP. Layer 3 mode supports static IP, DHCP, or PPPoE addressing. The class provides methods for CRUD operations and enforces container requirements using folder, snippet, or device parameters.
Class Overview¶
from scm.client import ScmClient
# Initialize client
client = ScmClient(
client_id="your_client_id",
client_secret="your_client_secret",
tsg_id="your_tsg_id"
)
# Access ethernet interfaces via the client
ethernet_interfaces = client.ethernet_interface
| Method | Description | Parameters | Return Type |
|---|---|---|---|
create() |
Creates a new ethernet interface | data: Dict[str, Any] |
EthernetInterfaceResponseModel |
get() |
Retrieves an ethernet interface by ID | object_id: str |
EthernetInterfaceResponseModel |
update() |
Updates an existing ethernet interface | ethernet: EthernetInterfaceUpdateModel |
EthernetInterfaceResponseModel |
list() |
Lists ethernet interfaces with optional filtering | folder, snippet, device, plus filters |
List[EthernetInterfaceResponseModel] |
fetch() |
Fetches a single ethernet interface by name within a container | name: str, folder, snippet, device |
EthernetInterfaceResponseModel |
delete() |
Deletes an ethernet interface by ID | object_id: str |
None |
Ethernet Interface Model Attributes¶
| Attribute | Type | Required | Default | Description |
|---|---|---|---|---|
name |
str | Yes | None | Variable name (must start with $, max 63 chars) |
default_value |
str | No | None | Physical interface (e.g., "ethernet1/1") |
id |
UUID | Yes* | None | Unique identifier (*response/update only) |
comment |
str | No | None | Description. Max 1023 chars |
link_speed |
str | No | "auto" | Link speed (auto, 10, 100, 1000, 10000, etc.) |
link_duplex |
str | No | "auto" | Link duplex (auto, half, full) |
link_state |
str | No | "auto" | Link state (auto, up, down) |
poe |
PoeConfig | No | None | Power over Ethernet configuration |
layer2 |
EthernetLayer2 | No** | None | Layer 2 mode configuration |
layer3 |
EthernetLayer3 | No** | None | Layer 3 mode configuration |
tap |
EthernetTap | No** | None | TAP mode configuration |
folder |
str | No*** | None | Folder location. Max 64 chars |
snippet |
str | No*** | None | Snippet location. Max 64 chars |
device |
str | No*** | None | Device location. Max 64 chars |
* Only required for update and response models * Only one mode (layer2/layer3/tap) can be configured at a time ** Exactly one container must be provided for create operations
Interface Modes¶
Layer 2 Mode¶
Layer 2 mode operates at the data link layer with VLAN tagging and LLDP support.
interface_data = {
"name": "$layer2-interface",
"layer2": {
"vlan_tag": "100",
"lldp": {"enable": True}
},
"folder": "Interfaces"
}
Layer 3 Mode with Static IP¶
Layer 3 mode with static IP addresses for routed interfaces.
interface_data = {
"name": "$wan-interface",
"default_value": "ethernet1/1",
"layer3": {
"ip": [{"name": "192.168.1.1/24"}],
"mtu": 1500,
"interface_management_profile": "allow-ping"
},
"folder": "Interfaces"
}
Layer 3 Mode with DHCP¶
Layer 3 mode using DHCP for dynamic IP assignment.
interface_data = {
"name": "$dhcp-interface",
"default_value": "ethernet1/1",
"layer3": {
"dhcp_client": {
"enable": True,
"create_default_route": True,
"default_route_metric": 10
}
},
"folder": "Interfaces"
}
Layer 3 Mode with PPPoE¶
Layer 3 mode using PPPoE for ISP connections.
interface_data = {
"name": "$pppoe-interface",
"default_value": "ethernet1/1",
"layer3": {
"pppoe": {
"enable": True,
"username": "user@isp.com",
"password": "secret",
"authentication": "auto"
}
},
"folder": "Interfaces"
}
TAP Mode¶
TAP mode for traffic monitoring without affecting traffic flow.
Naming Convention¶
Ethernet interface names in SCM must start with $ (dollar sign) as they are variable references. The default_value field specifies the physical interface assignment.
# Correct usage
{
"name": "$wan-interface", # Variable name (required $ prefix)
"default_value": "ethernet1/1", # Physical interface assignment
"folder": "Interfaces"
}
Exceptions¶
| Exception | HTTP Code | Description |
|---|---|---|
InvalidObjectError |
400 | Invalid data or parameters |
MissingQueryParameterError |
400 | Missing required parameters |
ObjectNotPresentError |
404 | Interface not found |
AuthenticationError |
401 | Authentication failed |
ServerError |
500 | Internal server error |
Methods¶
List Ethernet Interfaces¶
# List all interfaces in a folder
interfaces = client.ethernet_interface.list(folder="Interfaces")
for iface in interfaces:
print(f"Name: {iface.name}")
if iface.layer2:
print(f" Mode: Layer 2, VLAN: {iface.layer2.vlan_tag}")
elif iface.layer3:
print(f" Mode: Layer 3")
elif iface.tap:
print(f" Mode: TAP")
# Filter by mode
layer3_interfaces = client.ethernet_interface.list(
folder="Interfaces",
mode="layer3"
)
# Filter by link speed
gigabit_interfaces = client.ethernet_interface.list(
folder="Interfaces",
link_speed="1000"
)
Filtering Responses¶
# Exact match only
exact_interfaces = client.ethernet_interface.list(
folder="Interfaces",
exact_match=True
)
# Exclude specific folders
filtered = client.ethernet_interface.list(
folder="Interfaces",
exclude_folders=["All"]
)
Fetch an Ethernet Interface¶
# Fetch by name
interface = client.ethernet_interface.fetch(
name="$wan-interface",
folder="Interfaces"
)
print(f"Found interface: {interface.name}")
# Get by ID
interface_by_id = client.ethernet_interface.get(interface.id)
Create an Ethernet Interface¶
# Create Layer 3 interface with static IP
layer3_interface = {
"name": "$wan-interface",
"default_value": "ethernet1/1",
"comment": "WAN Interface",
"link_speed": "1000",
"link_duplex": "full",
"layer3": {
"ip": [{"name": "203.0.113.1/24"}],
"mtu": 1500,
"arp": [
{"name": "203.0.113.254", "hw_address": "00:11:22:33:44:55"}
]
},
"folder": "Interfaces"
}
result = client.ethernet_interface.create(layer3_interface)
print(f"Created interface: {result.name} ({result.id})")
# Create Layer 2 interface
layer2_interface = {
"name": "$layer2-interface",
"layer2": {
"vlan_tag": "200",
"lldp": {"enable": True}
},
"folder": "Interfaces"
}
result = client.ethernet_interface.create(layer2_interface)
Update an Ethernet Interface¶
# Fetch existing interface
existing = client.ethernet_interface.fetch(
name="$wan-interface",
folder="Interfaces"
)
# Modify attributes
existing.comment = "Updated WAN Interface"
if existing.layer3:
existing.layer3.mtu = 9000
# Update
updated = client.ethernet_interface.update(existing)
Delete an Ethernet Interface¶
Use Cases¶
Managing Configuration Changes¶
# Commit changes
result = client.commit(
folders=["Interfaces"],
description="Updated ethernet interfaces",
sync=True
)
print(f"Commit job ID: {result.job_id}")
Error Handling¶
from scm.exceptions import (
InvalidObjectError,
MissingQueryParameterError,
ObjectNotPresentError
)
try:
interface = client.ethernet_interface.create({
"name": "$test-interface",
"layer2": {"vlan_tag": "100"},
"layer3": {"ip": [{"name": "10.0.0.1/24"}]}, # Error: both modes
"folder": "Interfaces"
})
except InvalidObjectError as e:
print(f"Invalid configuration: {e.message}")
except MissingQueryParameterError as e:
print(f"Missing parameter: {e.message}")
# Name pattern validation
try:
interface = client.ethernet_interface.create({
"name": "ethernet1/1", # Error: missing $ prefix
"folder": "Interfaces"
})
except ValidationError as e:
print("Name must start with $ (dollar sign)")