NetBox Data Model for Fabric Orchestrator
This document describes how fabric intent is represented in NetBox for the fabric-orchestrator to consume.
Overview
The fabric-orchestrator uses NetBox as the source of truth for EVPN-VXLAN fabric configuration. Instead of using ConfigContexts, we leverage NetBox's native data models plus the NetBox BGP Plugin for comprehensive fabric representation.
Requirements
- NetBox 4.4.x
- NetBox BGP Plugin v0.17.x
Reference Topology
This data model represents the fabric defined in arista-evpn-vxlan-clab:
- 2 Spine switches (spine1, spine2)
- 8 Leaf switches in 4 MLAG pairs (leaf1-2, leaf3-4, leaf5-6, leaf7-8)
- 4 Hosts dual-homed to MLAG pairs
Data Model Summary
Native NetBox Models
| Feature |
NetBox Model |
API Endpoint |
| Devices |
dcim.Device |
/api/dcim/devices/ |
| Interfaces |
dcim.Interface |
/api/dcim/interfaces/ |
| LAGs/Port-Channels |
dcim.Interface (type=LAG) |
/api/dcim/interfaces/ |
| Cables |
dcim.Cable |
/api/dcim/cables/ |
| VLANs |
ipam.VLAN |
/api/ipam/vlans/ |
| VLAN Groups |
ipam.VLANGroup |
/api/ipam/vlan-groups/ |
| VRFs |
ipam.VRF |
/api/ipam/vrfs/ |
| Route Targets |
ipam.RouteTarget |
/api/ipam/route-targets/ |
| IP Addresses |
ipam.IPAddress |
/api/ipam/ip-addresses/ |
| Prefixes |
ipam.Prefix |
/api/ipam/prefixes/ |
| ASNs |
ipam.ASN |
/api/ipam/asns/ |
| L2VPN (EVPN) |
vpn.L2VPN |
/api/vpn/l2vpns/ |
| L2VPN Terminations |
vpn.L2VPNTermination |
/api/vpn/l2vpn-terminations/ |
NetBox BGP Plugin Models
| Feature |
Plugin Model |
API Endpoint |
| BGP Sessions |
netbox_bgp.BGPSession |
/api/plugins/bgp/sessions/ |
| BGP Peer Groups |
netbox_bgp.PeerGroup |
/api/plugins/bgp/peer-groups/ |
| BGP Communities |
netbox_bgp.Community |
/api/plugins/bgp/communities/ |
| Routing Policies |
netbox_bgp.RoutingPolicy |
/api/plugins/bgp/routing-policies/ |
| Prefix Lists |
netbox_bgp.PrefixList |
/api/plugins/bgp/prefix-lists/ |
| AS Path Lists |
netbox_bgp.ASPathList |
/api/plugins/bgp/as-path-lists/ |
Custom Fields Reference
NetBox doesn't natively support all fabric-specific configurations. The following custom fields must be created to support MLAG, ASN assignment, and VRF extensions.
Complete Custom Fields List
Device Custom Fields
| Field Name |
Label |
Type |
Required |
Description |
asn |
ASN |
Integer |
No |
BGP Autonomous System Number assigned to this device |
mlag_domain_id |
MLAG Domain ID |
Text |
No |
MLAG domain identifier (e.g., "leafs") |
mlag_peer_address |
MLAG Peer Address |
Text |
No |
MLAG peer IP address |
mlag_local_address |
MLAG Local Address |
Text |
No |
MLAG local IP address |
mlag_virtual_mac |
MLAG Virtual MAC |
Text |
No |
Shared virtual-router MAC (e.g., "c001.cafe.babe") |
Interface Custom Fields
| Field Name |
Label |
Type |
Required |
Description |
mlag_peer_link |
MLAG Peer Link |
Boolean |
No |
Marks interface as MLAG peer-link |
mlag_id |
MLAG ID |
Integer |
No |
MLAG port-channel ID for host-facing LAGs |
VRF Custom Fields
| Field Name |
Label |
Type |
Required |
Description |
l3vni |
L3 VNI |
Integer |
No |
Layer 3 VNI for EVPN symmetric IRB |
vrf_vlan |
VRF VLAN |
Integer |
No |
VLAN ID used for L3 VNI SVI |
IP Address Custom Fields
| Field Name |
Label |
Type |
Required |
Description |
virtual_ip |
Virtual IP |
Boolean |
No |
Marks IP as anycast/virtual IP (shared across MLAG pair) |
Custom Field Creation via API
Fabric Component Mapping
Devices and Roles
| Fabric Role |
NetBox Device Role |
Description |
| Spine |
spine |
Spine switches (AS 65000) |
| Leaf |
leaf |
Leaf switches (AS 65001-65004) |
Example Device Setup:
spine1, spine2 - Device Role: spine
leaf1 through leaf8 - Device Role: leaf
Interfaces
| Interface Type |
NetBox Interface Type |
Usage |
| Physical uplinks |
1000base-t / 10gbase-x-sfpp |
Spine-Leaf connections |
| Loopback0 |
virtual |
BGP Router-ID |
| Loopback1 |
virtual |
VTEP source (shared by MLAG pair) |
| Port-Channel |
lag |
MLAG peer-link, host bonds |
| Vxlan1 |
virtual |
VXLAN tunnel interface |
| SVI |
virtual |
VLAN interfaces (Vlan40, etc.) |
IP Addressing Scheme
Based on the reference topology:
| Purpose |
Prefix |
Example |
| Spine-Leaf P2P (Spine1) |
10.0.1.0/24 |
10.0.1.0/31, 10.0.1.2/31, ... |
| Spine-Leaf P2P (Spine2) |
10.0.2.0/24 |
10.0.2.0/31, 10.0.2.2/31, ... |
| MLAG iBGP Peer |
10.0.3.0/24 |
10.0.3.0/31 per MLAG pair |
| MLAG Peer VLAN 4090 |
10.0.199.0/24 |
/31 per MLAG pair |
| Loopback0 (Router-ID) |
10.0.250.0/24 |
Spine: .1-.2, Leaf: .11-.18 |
| Loopback1 (VTEP) |
10.0.255.0/24 |
.11-.14 (shared per MLAG pair) |
Cabling
NetBox's native dcim.Cable model represents physical connections between devices. This enables topology visualization (via plugins like netbox-topology-views) and validation of the fabric infrastructure.
Cable Model
| Field |
Description |
a_terminations |
Source interface(s) |
b_terminations |
Destination interface(s) |
type |
Cable type (e.g., cat6a, mmf-om4, dac-passive) |
status |
connected, planned, decommissioning |
label |
Optional identifier |
length |
Cable length (with unit) |
Spine-Leaf Cabling Matrix
Based on the arista-evpn-vxlan-clab topology:
Spine1 to Leafs
| Spine1 Interface |
Leaf |
Leaf Interface |
Description |
| Ethernet1 |
leaf1 |
Ethernet11 |
Underlay uplink |
| Ethernet2 |
leaf2 |
Ethernet11 |
Underlay uplink |
| Ethernet3 |
leaf3 |
Ethernet11 |
Underlay uplink |
| Ethernet4 |
leaf4 |
Ethernet11 |
Underlay uplink |
| Ethernet5 |
leaf5 |
Ethernet11 |
Underlay uplink |
| Ethernet6 |
leaf6 |
Ethernet11 |
Underlay uplink |
| Ethernet7 |
leaf7 |
Ethernet11 |
Underlay uplink |
| Ethernet8 |
leaf8 |
Ethernet11 |
Underlay uplink |
Spine2 to Leafs
| Spine2 Interface |
Leaf |
Leaf Interface |
Description |
| Ethernet1 |
leaf1 |
Ethernet12 |
Underlay uplink |
| Ethernet2 |
leaf2 |
Ethernet12 |
Underlay uplink |
| Ethernet3 |
leaf3 |
Ethernet12 |
Underlay uplink |
| Ethernet4 |
leaf4 |
Ethernet12 |
Underlay uplink |
| Ethernet5 |
leaf5 |
Ethernet12 |
Underlay uplink |
| Ethernet6 |
leaf6 |
Ethernet12 |
Underlay uplink |
| Ethernet7 |
leaf7 |
Ethernet12 |
Underlay uplink |
| Ethernet8 |
leaf8 |
Ethernet12 |
Underlay uplink |
MLAG Peer-Link Cabling
Each MLAG pair has a dedicated peer-link connection:
| MLAG Pair |
Device A |
Interface A |
Device B |
Interface B |
Description |
| VTEP1 |
leaf1 |
Ethernet10 |
leaf2 |
Ethernet10 |
MLAG peer-link |
| VTEP2 |
leaf3 |
Ethernet10 |
leaf4 |
Ethernet10 |
MLAG peer-link |
| VTEP3 |
leaf5 |
Ethernet10 |
leaf6 |
Ethernet10 |
MLAG peer-link |
| VTEP4 |
leaf7 |
Ethernet10 |
leaf8 |
Ethernet10 |
MLAG peer-link |
Note: In production, peer-links typically use multiple interfaces in a Port-Channel for redundancy (e.g., Ethernet10 + Ethernet13 → Port-Channel10).
Host Dual-Homing Cabling
Hosts are dual-homed to MLAG pairs using LACP bonding:
| Host |
Leaf A |
Leaf A Interface |
Leaf B |
Leaf B Interface |
MLAG ID |
| host1 |
leaf1 |
Ethernet1 |
leaf2 |
Ethernet1 |
1 |
| host2 |
leaf3 |
Ethernet1 |
leaf4 |
Ethernet1 |
1 |
| host3 |
leaf5 |
Ethernet1 |
leaf6 |
Ethernet1 |
1 |
| host4 |
leaf7 |
Ethernet1 |
leaf8 |
Ethernet1 |
1 |
Cabling Conventions
| Interface Range |
Purpose |
| Ethernet1-9 |
Host-facing (downlinks) |
| Ethernet10 |
MLAG peer-link |
| Ethernet11-12 |
Spine uplinks |
Cable Retrieval via API
Topology Visualization
With cables properly defined, the netbox-topology-views plugin can automatically generate fabric diagrams. The plugin uses cable data to draw connections between devices.
Key benefits:
- Auto-generated diagrams: No manual drawing required
- Real-time updates: Topology reflects current NetBox data
- Drill-down: Click devices/cables for details
- Export: SVG/PNG export for documentation
BGP Configuration
ASN Assignments
| Device(s) |
ASN |
Type |
Custom Field |
| spine1, spine2 |
65000 |
eBGP |
asn: 65000 |
| leaf1, leaf2 |
65001 |
iBGP pair |
asn: 65001 |
| leaf3, leaf4 |
65002 |
iBGP pair |
asn: 65002 |
| leaf5, leaf6 |
65003 |
iBGP pair |
asn: 65003 |
| leaf7, leaf8 |
65004 |
iBGP pair |
asn: 65004 |
BGP Sessions (Plugin)
Underlay eBGP Sessions
Each leaf has eBGP sessions to both spines over point-to-point interfaces:
| Local Device |
Local IP |
Remote Device |
Remote IP |
Remote ASN |
| leaf1 |
10.0.1.1 |
spine1 |
10.0.1.0 |
65000 |
| leaf1 |
10.0.2.1 |
spine2 |
10.0.2.0 |
65000 |
Underlay iBGP Sessions
Each MLAG pair has an iBGP session for redundancy:
| Local Device |
Local IP |
Remote Device |
Remote IP |
Notes |
| leaf1 |
10.0.3.0 |
leaf2 |
10.0.3.1 |
next-hop-self |
Overlay EVPN Sessions
EVPN sessions use loopback addresses with ebgp-multihop 3:
| Local Device |
Local IP (Lo0) |
Remote Device |
Remote IP (Lo0) |
AFI/SAFI |
| leaf1 |
10.0.250.11 |
spine1 |
10.0.250.1 |
L2VPN EVPN |
| leaf1 |
10.0.250.11 |
spine2 |
10.0.250.2 |
L2VPN EVPN |
BGP Peer Groups (Plugin)
| Peer Group |
Purpose |
Key Settings |
underlay |
eBGP to spines |
remote-as 65000, maximum-routes 12000 |
underlay_ibgp |
iBGP to MLAG peer |
next-hop-self |
evpn |
EVPN overlay |
update-source Loopback0, ebgp-multihop 3, send-community extended |
VXLAN / EVPN Configuration
L2VPN for EVPN VNI Mappings
NetBox's L2VPN model represents EVPN instances:
| L2VPN Name |
Type |
Identifier (VNI) |
Description |
VLAN40-L2VNI |
EVPN |
100040 |
L2 VXLAN for VLAN 40 |
VRF-gold |
EVPN |
100001 |
L3 VNI for VRF gold |
L2VPN Terminations
Link VLANs to L2VPNs on specific devices:
| L2VPN |
Device |
Interface/VLAN |
VLAN40-L2VNI |
leaf1 |
VLAN 40 |
VLAN40-L2VNI |
leaf2 |
VLAN 40 |
VLAN40-L2VNI |
leaf5 |
VLAN 40 |
VLAN40-L2VNI |
leaf6 |
VLAN 40 |
Route Targets
| VRF/VLAN |
Import RT |
Export RT |
| VLAN 40 |
40:100040 |
40:100040 |
| VRF gold |
1:100001 |
1:100001 |
MLAG Configuration
MLAG configuration uses Custom Fields since NetBox doesn't have native MLAG support.
MLAG Pair Configuration
| Device |
Domain ID |
Local IP |
Peer IP |
Virtual MAC |
| leaf1 |
leafs |
10.0.199.254 |
10.0.199.255 |
c001.cafe.babe |
| leaf2 |
leafs |
10.0.199.255 |
10.0.199.254 |
c001.cafe.babe |
MLAG-Related VLANs
| VLAN |
Name |
Purpose |
Trunk Group |
| 4090 |
mlag-peer |
MLAG peer communication |
mlag-peer |
| 4091 |
mlag-ibgp |
iBGP between MLAG peers |
mlag-peer |
VRF Configuration
VRF Definition
| VRF Name |
RD |
Import RT |
Export RT |
L3 VNI (custom field) |
| gold |
10.0.250.X:1 |
1:100001 |
1:100001 |
100001 |
Note: RD uses device's Loopback0 IP for uniqueness
VRF Interface Assignment
SVIs are assigned to VRFs in NetBox. VRF membership is tracked via IP addresses assigned to interfaces:
| Interface |
VRF |
IP Address |
Virtual IP (custom field) |
| Vlan34 (leaf3) |
gold |
10.34.34.2/24 |
No |
| Vlan34 (leaf4) |
gold |
10.34.34.3/24 |
No |
| Vlan34 (leaf3) |
gold |
10.34.34.1/24 |
Yes (anycast) |
| Vlan78 (leaf7) |
gold |
10.78.78.2/24 |
No |
| Vlan78 (leaf8) |
gold |
10.78.78.3/24 |
No |
| Vlan78 (leaf7) |
gold |
10.78.78.1/24 |
Yes (anycast) |
Data Retrieval Strategy
The fabric-orchestrator retrieves intent from NetBox using pynetbox:
Relationship Diagram
API Filter Compatibility Notes
Working Filters (NetBox 4.4)
| Endpoint |
Filter |
Example |
/api/dcim/devices/ |
role, name, site |
?role=leaf |
/api/dcim/interfaces/ |
device, type, name |
?device=leaf1&type=virtual |
/api/dcim/cables/ |
device, site, rack |
?device=leaf1 |
/api/ipam/ip-addresses/ |
device, interface, vrf |
?device=leaf1&vrf=gold |
/api/ipam/vlans/ |
vid, site, group |
?vid=40 |
/api/vpn/l2vpns/ |
type, name |
?type=evpn |
/api/vpn/l2vpn-terminations/ |
l2vpn, vlan_id |
?l2vpn=VLAN40-L2VNI |
/api/plugins/bgp/sessions/ |
device, peer_group |
?device=leaf1 |
Non-Working Filters (Require Workarounds)
| Endpoint |
Invalid Filter |
Workaround |
/api/ipam/asns/ |
device |
Use custom field asn on Device |
/api/vpn/l2vpn-terminations/ |
device |
Filter by vlan_id then correlate |
/api/dcim/interfaces/ |
vrf |
Query IPs with VRF filter, get interface IDs |
Next Steps
- Custom Fields Setup - Create all custom fields listed above in NetBox
- Cabling Setup - Create cables for spine-leaf, peer-links, and host connections
- Data Population - Enter fabric topology data into NetBox
- NetBox Client - Update
src/netbox/client.py to use custom fields and cables
- Validation - Verify data retrieval matches expected fabric config