docs: add README for yang module
Usage examples for all path classes: - Interfaces, Loopbacks, VLANs - BGP with AFI-SAFI - VXLAN VNI mappings - MLAG, EVPN (with limitations noted) - Port-Channel - Subscription helpers Part of #3
This commit is contained in:
200
src/yang/README.md
Normal file
200
src/yang/README.md
Normal file
@@ -0,0 +1,200 @@
|
|||||||
|
# YANG Module
|
||||||
|
|
||||||
|
This module provides YANG path constants and utilities for managing Arista EVPN-VXLAN fabrics via gNMI.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
The module contains validated gNMI paths for Arista EOS 4.35.0F, organized by feature:
|
||||||
|
|
||||||
|
| Class | Model | Description |
|
||||||
|
|-------|-------|-------------|
|
||||||
|
| `Interfaces` | OpenConfig | Physical and logical interfaces |
|
||||||
|
| `Loopbacks` | OpenConfig | Loopback interfaces |
|
||||||
|
| `VLANs` | OpenConfig | VLAN configuration and SVIs |
|
||||||
|
| `BGP` | OpenConfig | BGP global, neighbors, AFI-SAFI |
|
||||||
|
| `VXLAN` | Arista Exp | VXLAN VNI mappings |
|
||||||
|
| `MLAG` | Arista Exp | MLAG config (state via eAPI) |
|
||||||
|
| `EVPN` | Arista Exp | EVPN instances (state via eAPI) |
|
||||||
|
| `PortChannel` | OpenConfig | LAG/Port-Channel |
|
||||||
|
| `System` | OpenConfig | System configuration |
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
```python
|
||||||
|
from yang.paths import Interfaces, BGP, VXLAN
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage Examples
|
||||||
|
|
||||||
|
### Interfaces
|
||||||
|
|
||||||
|
```python
|
||||||
|
from yang.paths import Interfaces
|
||||||
|
|
||||||
|
# Get all interfaces
|
||||||
|
path = Interfaces.ROOT
|
||||||
|
# -> "/interfaces/interface"
|
||||||
|
|
||||||
|
# Get specific interface
|
||||||
|
path = Interfaces.interface("Ethernet1")
|
||||||
|
# -> "/interfaces/interface[name=Ethernet1]"
|
||||||
|
|
||||||
|
# Get interface state
|
||||||
|
path = Interfaces.state("Ethernet1")
|
||||||
|
# -> "/interfaces/interface[name=Ethernet1]/state"
|
||||||
|
|
||||||
|
# Get operational status
|
||||||
|
path = Interfaces.oper_status("Ethernet1")
|
||||||
|
# -> "/interfaces/interface[name=Ethernet1]/state/oper-status"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Loopbacks
|
||||||
|
|
||||||
|
```python
|
||||||
|
from yang.paths import Loopbacks
|
||||||
|
|
||||||
|
# Get loopback interface
|
||||||
|
path = Loopbacks.interface(0)
|
||||||
|
# -> "/interfaces/interface[name=Loopback0]"
|
||||||
|
|
||||||
|
# Use predefined constants
|
||||||
|
path = Loopbacks.LOOPBACK0 # Router ID
|
||||||
|
path = Loopbacks.LOOPBACK1 # VTEP source
|
||||||
|
```
|
||||||
|
|
||||||
|
### VLANs
|
||||||
|
|
||||||
|
```python
|
||||||
|
from yang.paths import VLANs
|
||||||
|
|
||||||
|
# Get all VLANs
|
||||||
|
path = VLANs.ROOT
|
||||||
|
# -> "/network-instances/network-instance[name=default]/vlans/vlan"
|
||||||
|
|
||||||
|
# Get specific VLAN
|
||||||
|
path = VLANs.vlan(40)
|
||||||
|
# -> "/network-instances/network-instance[name=default]/vlans/vlan[vlan-id=40]"
|
||||||
|
|
||||||
|
# Get SVI interface
|
||||||
|
path = VLANs.svi(40)
|
||||||
|
# -> "/interfaces/interface[name=Vlan40]"
|
||||||
|
```
|
||||||
|
|
||||||
|
### BGP
|
||||||
|
|
||||||
|
```python
|
||||||
|
from yang.paths import BGP, AfiSafi
|
||||||
|
|
||||||
|
# Get all neighbors
|
||||||
|
path = BGP.NEIGHBORS
|
||||||
|
# -> "/network-instances/.../bgp/neighbors/neighbor"
|
||||||
|
|
||||||
|
# Get specific neighbor
|
||||||
|
path = BGP.neighbor("10.0.1.0")
|
||||||
|
|
||||||
|
# Get neighbor session state
|
||||||
|
path = BGP.neighbor_session_state("10.0.1.0")
|
||||||
|
|
||||||
|
# Get EVPN AFI-SAFI for neighbor
|
||||||
|
path = BGP.neighbor_afi_safi("10.0.250.1", AfiSafi.L2VPN_EVPN)
|
||||||
|
```
|
||||||
|
|
||||||
|
### VXLAN
|
||||||
|
|
||||||
|
```python
|
||||||
|
from yang.paths import VXLAN
|
||||||
|
|
||||||
|
# Get all VNI mappings
|
||||||
|
path = VXLAN.VLAN_TO_VNIS
|
||||||
|
# -> "/interfaces/interface[name=Vxlan1]/arista-vxlan/vlan-to-vnis"
|
||||||
|
|
||||||
|
# Get specific VNI
|
||||||
|
path = VXLAN.vlan_to_vni(40)
|
||||||
|
# -> ".../vlan-to-vnis/vlan-to-vni[vlan=40]"
|
||||||
|
|
||||||
|
# Get L3 VNI (VRF-to-VNI)
|
||||||
|
path = VXLAN.vrf_to_vni("gold")
|
||||||
|
# -> ".../vrf-to-vnis/vrf-to-vni[vrf=gold]"
|
||||||
|
|
||||||
|
# Get VTEP source interface config
|
||||||
|
path = VXLAN.SOURCE_INTERFACE
|
||||||
|
```
|
||||||
|
|
||||||
|
### MLAG
|
||||||
|
|
||||||
|
```python
|
||||||
|
from yang.paths import MLAG
|
||||||
|
|
||||||
|
# Get MLAG config
|
||||||
|
path = MLAG.CONFIG
|
||||||
|
# -> "/arista/eos/mlag/config"
|
||||||
|
|
||||||
|
# ⚠️ Note: MLAG state is NOT available via gNMI
|
||||||
|
# Use eAPI for: show mlag
|
||||||
|
```
|
||||||
|
|
||||||
|
### EVPN
|
||||||
|
|
||||||
|
```python
|
||||||
|
from yang.paths import EVPN
|
||||||
|
|
||||||
|
# Get all EVPN instances
|
||||||
|
path = EVPN.INSTANCES
|
||||||
|
# -> "/arista/eos/evpn/evpn-instances"
|
||||||
|
|
||||||
|
# Get specific instance
|
||||||
|
path = EVPN.instance("40")
|
||||||
|
|
||||||
|
# Get route-targets
|
||||||
|
path = EVPN.route_target("40")
|
||||||
|
|
||||||
|
# ⚠️ Note: EVPN state is NOT available via gNMI
|
||||||
|
# Use eAPI for: show bgp evpn
|
||||||
|
```
|
||||||
|
|
||||||
|
### Port-Channel
|
||||||
|
|
||||||
|
```python
|
||||||
|
from yang.paths import PortChannel
|
||||||
|
|
||||||
|
# Get port-channel interface
|
||||||
|
path = PortChannel.interface(999)
|
||||||
|
# -> "/interfaces/interface[name=Port-Channel999]"
|
||||||
|
|
||||||
|
# Get LAG aggregation config
|
||||||
|
path = PortChannel.aggregation(999)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Subscriptions
|
||||||
|
|
||||||
|
```python
|
||||||
|
from yang.paths import FabricSubscriptions, SubscriptionPath
|
||||||
|
|
||||||
|
# Get pre-built subscription paths
|
||||||
|
for sub in FabricSubscriptions.all():
|
||||||
|
print(f"Path: {sub.path}, Mode: {sub.mode}")
|
||||||
|
|
||||||
|
# Individual subscriptions
|
||||||
|
sub = FabricSubscriptions.INTERFACE_STATE
|
||||||
|
sub = FabricSubscriptions.BGP_SESSIONS
|
||||||
|
sub = FabricSubscriptions.VXLAN_VNIS
|
||||||
|
|
||||||
|
# Create custom subscription
|
||||||
|
custom = SubscriptionPath(
|
||||||
|
path="/interfaces/interface[name=Ethernet1]/state",
|
||||||
|
mode="on-change"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Limitations
|
||||||
|
|
||||||
|
| Feature | Config | State | Notes |
|
||||||
|
|---------|--------|-------|-------|
|
||||||
|
| MLAG | ✅ | ❌ | Use eAPI for state |
|
||||||
|
| EVPN | ✅ | ❌ | Use eAPI for state |
|
||||||
|
|
||||||
|
## References
|
||||||
|
|
||||||
|
- [Full YANG Paths Documentation](../../docs/yang-paths.md)
|
||||||
|
- [Arista YANG Models](https://github.com/aristanetworks/yang/tree/master/EOS-4.35.0F)
|
||||||
|
- [OpenConfig Models](https://github.com/openconfig/public)
|
||||||
Reference in New Issue
Block a user