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:
2025-12-26 13:47:00 +00:00
parent 9edf963704
commit 0f0336296a

200
src/yang/README.md Normal file
View 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)