-
Notifications
You must be signed in to change notification settings - Fork 0
/
bgp_neighbor_l2vpn_evpn_prefix_received.py
executable file
·120 lines (99 loc) · 3.31 KB
/
bgp_neighbor_l2vpn_evpn_prefix_received.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#!/usr/bin/env python3
"""
Name: bgp_neighbor_l2vpn_evpn_prefix_received.py
Description: NXAPI: display bgp l2vpn evpn summary info
"""
our_version = 104
script_name = "bgp_neighbor_l2vpn_evpn_prefix_received"
# standard libraries
import argparse
from concurrent.futures import ThreadPoolExecutor
# local libraries
from nxapi_netbox.args.args_cookie import ArgsCookie
from nxapi_netbox.args.args_nxapi_tools import ArgsNxapiTools
from nxapi_netbox.general.log import get_logger
from nxapi_netbox.netbox.netbox_session import netbox, get_device_mgmt_ip
from nxapi_netbox.vault.vault import get_vault
from nxapi_netbox.nxapi.nxapi_bgp_l2vpn_evpn_summary import NxapiBgpL2vpnEvpnSummary
def get_parser():
help_nonzero = (
"if specified, only display neighbors with non-zero prefixes received"
)
ex_prefix = "Example: "
ex_nonzero = "{} --nonzero".format(ex_prefix)
parser = argparse.ArgumentParser(
description="DESCRIPTION: NXAPI: display bgp l2vpn evpn summary info",
parents=[ArgsCookie, ArgsNxapiTools],
)
default = parser.add_argument_group(title="DEFAULT SCRIPT ARGS")
mandatory = parser.add_argument_group(title="MANDATORY SCRIPT ARGS")
default.add_argument(
"--nonzero",
dest="nonzero",
required=False,
default=False,
action="store_true",
help="{} {}".format(help_nonzero, ex_nonzero),
)
parser.add_argument(
"--version", action="version", version="{} v{}".format("%(prog)s", our_version)
)
return parser.parse_args()
def get_device_list():
try:
return cfg.devices.split(",")
except:
log.error(
"exiting. Cannot parse --devices {}. Example usage: --devices leaf_1,spine_2,leaf_2".format(
cfg.devices
)
)
exit(1)
def print_header():
print(fmt.format("ip", "hostname", "l2vpn_evpn_neighbor", "prefix_rx"))
def print_output(futures):
for future in futures:
output = future.result()
if output == None:
continue
for line in output:
print(line)
def collect_prefix_rx(ip, bgp):
lines = list()
for neighbor in bgp.neighbor_info:
bgp.neighbor = neighbor
try:
prefixreceived = int(bgp.prefixreceived)
except:
log.error(
"exiting. cannot convert bgp.prefixreceived {} to int()".format(
bgp.prefixreceived
)
)
exit(1)
if prefixreceived == 0 and cfg.nonzero == True:
continue
lines.append(fmt.format(ip, bgp.hostname, bgp.neighbor, bgp.prefixreceived))
lines.append("")
return lines
def worker(device, vault):
ip = get_device_mgmt_ip(nb, device)
i = NxapiBgpL2vpnEvpnSummary(vault.nxos_username, vault.nxos_password, ip, log)
i.nxapi_init(cfg)
i.vrf = cfg.vrf
i.refresh()
return collect_prefix_rx(ip, i)
cfg = get_parser()
log = get_logger(script_name, cfg.loglevel, "DEBUG")
vault = get_vault(cfg.vault)
vault.fetch_data()
nb = netbox(vault)
devices = get_device_list()
fmt = "{:<15} {:<20} {:<19} {:>9}"
print_header()
executor = ThreadPoolExecutor(max_workers=len(devices))
futures = list()
for device in devices:
args = [device, vault]
futures.append(executor.submit(worker, *args))
print_output(futures)