MPLS L2VPN Pseudowires (VPWS / VPLS)
Pseudowire observations discovered per PE via the PW MIBs (PW-STD-MIB RFC 5601, or CISCO-IETF-PW-MIB where the standard is absent) and rolled up server-side into point-to-point VPWS wires and multipoint VPLS instances. All-role observed-topology reads; license state never gates them.
List Pseudowires
GET /api/v1/networks/{networkID}/pseudowires
Flat per-PE pseudowire observations.
Query parameters:
device_id (optional) -- PWs observed by this PE
pw_id (optional) -- VC ID (non-negative integer; LDP-VPLS: the shared VPLS ID)
status (optional) -- up (oper=1) or down (oper<>1)
limit/offset -- pagination
Response: 200 OK (paginated envelope)
{
"data": [
{
"id": "uuid",
"network_id": "uuid",
"device_id": "uuid",
"pw_index": 1,
"pw_id": 100,
"pw_type": 5,
"psn_type": 1,
"owner": 2,
"peer_addr": "198.51.100.13",
"peer_device_id": "uuid",
"name": "Ethernet0/3.100",
"admin_status": 1,
"oper_status": 1,
"inbound_oper_status": 1,
"outbound_oper_status": 1,
"mib_source": 2,
"first_seen": "...", "last_seen": "...", "updated_at": "..."
}
],
"total": 3, "limit": 100, "offset": 0
}
pw_type is the IANA pwType (RFC 4446: 5=ethernet, 4=ethernetTagged; 0 = not yet negotiated). owner {1=manual, 2=maintenanceProtocol/LDP}. mib_source {1=PW-STD-MIB, 2=CISCO-IETF-PW-MIB}. peer_device_id and the per-direction statuses are omitted when unresolved/not applicable (std driver has no per-direction columns).
Error responses:
400 Bad Request -- invalid status or pw_id
Get Pseudowire
GET /api/v1/pseudowires/{id}
Returns a single pseudowire observation by ID.
Error responses:
404 Not Found -- pseudowire does not exist
List VPWS Wires
GET /api/v1/networks/{networkID}/vpws
Point-to-point pseudowire services: connected components of exactly two mutually-paired PW observations, plus unpaired PWs as half-wires (peer off-view or unmonitored). No query parameters; returns a plain JSON array.
Response: 200 OK
[
{
"name": "Ethernet0/3.100",
"pw_id": 100,
"signaling": "ldp",
"endpoints": [
{ "device_id": "uuid", "peer_addr": "198.51.100.13", "name": "Ethernet0/3.100", "oper_status": 1 },
{ "device_id": "uuid", "peer_addr": "198.51.100.3", "name": "Ethernet0/3.100", "oper_status": 1 }
],
"oper_status": 1,
"half_wire": false
}
]
name is the common PW name across both endpoints (on IOS the AC interface), else PW <pw_id>. signaling is ldp, static, or unknown (mixed evidence). oper_status is the worst across endpoints. On a half-wire, endpoints[1] carries the far side honestly: device_id when the peer address resolves to a monitored device that never reported the PW, or only peer_addr when off-view; its oper_status is 0 (unobserved). The array is [] when empty.
List VPLS Instances
GET /api/v1/networks/{networkID}/vpls
Multipoint L2 services: connected components carrying VPLS evidence (a PE holding ≥ 2 member PWs behind one shared per-PE name, with no known non-Ethernet pw_type). Structurally ambiguous components are never fake-classified — a 2-PE mutual pair stays VPWS, and evidence-less fan-out appears in neither rollup (the flat pseudowire list remains its surface). No query parameters; returns a plain JSON array.
Response: 200 OK
[
{
"name": "VPLS 200",
"pw_id": 200,
"signaling": "ldp",
"topology": "mesh",
"sites": [
{ "device_id": "uuid", "name": "pseudowire100002", "peer_count": 2, "up_count": 2, "oper_status": 1 }
],
"oper_status": 1
}
]
name is the common non-empty PW name across sites, else VPLS <pw_id> (IOS numbers pseudowire interfaces per PE, so the fallback is the norm). topology is mesh (every monitored site pair mutually connected), partial (edges missing), or unknown (an unresolved peer prevents assessment); no hub-spoke in v1 — the PW tables carry no spoke marker. oper_status is the worst across member PWs. The array is [] when empty.