I'm sure, by now that it's no surprise that I`m a huge fan of Batfish! More details on why here.

Today I wanted to share with you one of the features that Batfish provides - route analysis. In short,

Batfish allows you to model your entire network and then query/analyze the routes centrally.

This feature is super useful for troubleshooting, and also for educational purposes to see how different configurations impact and change the calculated routes, whilst not needing the horsepower to run a ton of VMs!

Below is a an example:

>>> bfq.routes().answer().frame()
        Node      VRF        Network Next_Hop     Next_Hop_IP Next_Hop_Interface   Protocol Metric Admin_Distance    Tag
0     spine2  default     None  AUTO/NONE(-1l)        Ethernet1/1  connected      0              0      0
1     spine2  default     None  AUTO/NONE(-1l)        Ethernet1/4      local      0              0      0
2      leaf1  default   spine2            dynamic       ospf     41            110   None
3    server1  default    leaf1               eth1     static      0              1   None
4      leaf1  default   spine2            dynamic       ospf     41            110   None
..       ...      ...            ...      ...             ...                ...        ...    ...            ...    ...
112    leaf2  default   spine2            dynamic        bgp      0             20  64520
113  server1  default     None  AUTO/NONE(-1l)               eth1      local      0              0   None
114   spine1  default     None  AUTO/NONE(-1l)        Ethernet1/4      local      0              0      0

But, there is more! You can also query the BGP RIB using the rib='bgp' input, giving you further details about the route such as the AS_PATH etc.

>>> bfq.routes(rib='bgp').answer().frame().iloc[0]
Node                          leaf2
VRF                         default
Next_Hop_Interface          dynamic
Protocol                        bgp
AS_Path                 64520 64521
Metric                            0
Local_Pref                      100
Communities                      []
Origin_Protocol                 bgp
Origin_Type                     igp
Cluster_List                   None
Tag                           64520
Name: 0, dtype: object

Finally, we can programmatically work with this data by returning it in a structured data format (Python dictionary), shown below - then, as they say, we are off to the races!

'rows': [
           'Node': {'id': 'node-leaf2', 'name': 'leaf2'},
           'VRF': 'default',
           'Network': '',
           'Next_Hop_IP': '',
           'Next_Hop_Interface': 'dynamic',
           'Protocol': 'bgp',
           'AS_Path': '64520 64521',
           'Metric': 0,
           'Local_Pref': 100,
           'Communities': [],
           'Origin_Protocol': 'bgp',
           'Origin_Type': 'igp',
           'Originator_Id': '',
           'Cluster_List': None,
           'Tag': 64520
Become a Network Automation Jedi
Join our membership and enjoy:
  • Deep Dive Library
  • Community Support
  • Hands-on Examples
  • Multivendor Labs (beta)

100% Satisfaction Guaranteed!
Cancel your membership at any time.

Join our Community