Releases: Vadims06/topolograph
v2.34 (20.07.2023)
New features
Multi LSDBs upload support #37, #39. Available via API.
Multi LSDBs upload via API
If a network has multiple areas, it is needed to get LSDB output from multiple devices and save it into separate files. Example below uses two LSDB outputs saved in the lsdb_samples
folder.
- Cisco_ospf.txt
- Juniper_ospf.txt
Python sample code:
import requests
TOPOLOGRAPH_HOST="127.0.0.1"
TOPOLOGRAPH_PORT=5000
TOPOLOGRAPH_WEB_API_USERNAME_EMAIL="your login"
TOPOLOGRAPH_WEB_API_PASSWORD="your password"
from pprint import pprint as pp
lsdbs_attr_ll = []
lsdb_dir = os.path.join(os.getcwd(), 'lsdb_samples')
for vendor_name, protocol_name in [('Cisco', 'ospf'), ('Juniper', 'ospf')]:
f_name = os.path.join(lsdb_dir, f"{vendor_name}_{protocol_name}.txt")
with open(f_name) as f:
lsdbs_attr_ll.append({'lsdb_output': f.read(), 'vendor_device': vendor_name, 'igp_protocol': protocol_name})
r_post = requests.post(f'http://{TOPOLOGRAPH_HOST}:{TOPOLOGRAPH_PORT}/api/graphs', auth=(TOPOLOGRAPH_WEB_API_USERNAME_EMAIL, TOPOLOGRAPH_WEB_API_PASSWORD), json=lsdbs_attr_ll, timeout=(5, 30))
pp(r_post.json())
v2.33 (11.07.2023)
New features
Basic graph analytic's algorithm were added:
- Find central node/s in the network
- Find the most N loaded/critical nodes in the network
- Find the most N loaded/critical edges in the network
- Find "single point of failure" nodes. If they fail, the network will lose the connection between nodes (become disjointed)
- Find fault tolerant nodes. If they fail, the network will keep connected.
New features
Central nodes
The most 3 loaded/critical nodes
The most 3 loaded/critical edges
Single point of failure
Fault tolerant nodes
Enhancements
- "-" Yaml syntax clashed with "zoom in" keyword hotkey of graph
- Documentation. Cisco NX-OS commands for getting OSPF LSDB were added.
v2.32 (24.06.2023)
New features
- Extreme OSPF support is added
- Ericsson OSPF support is added
- Yaml based topology. Network design mode.
Yaml based topology
Topolograph visualizes topologies based on OSPF/IS-IS LSDB files, but starting from v2.32 it accepts YAML to build a graph. It can be used for building arbitrary topologies (not exactly IGP domains), but moreover it can keep the topology updated via Rest API. It's the first version of Network Diagram as a Service (NDAS)!
OSPF/IS-IS LSDB <-> YAML is interchangeable now in both ways, so it allows to make a design of IGP domain from the scratch or based on uploaded a LSDB, add new links/edges between nodes or change igp's cost and then check network reaction based on our changes.
Basic YAML based topology.
Build a graph with defined nodes
and edges
.
Node attributes
node's name
is mandatory. Should be in IP-address format. To change it to any other value - uselabel
- Tags of node are optional. Any key (type string): value (str, int, float, dictionary, list) pairs.
There is a graph with 6 nodes. Select all primary nodes (ha_role
:primary
) in the first DC (dc1
)
import requests
from pprint import pprint as pp
query_params = {'location': 'dc1', 'ha_role': 'primary'}
r_get = requests.get(f'http://{TOPOLOGRAPH_HOST}:{TOPOLOGRAPH_PORT}/api/diagram/{graph_time}/nodes', auth=(' ', ' '), params=query_params, timeout=(5, 30))
Reply
pp(r_get.json())
[{'ha_role': 'primary',
'id': 1,
'label': '10.10.10.2',
'location': 'dc1',
'name': '10.10.10.2',
'size': 15}]
Edge attributes
src
,dst
is mandatory.cost
is optional. Default is 1. Equal to OSPF/IS-IS cost.directed
is optional. Default is false.- Tags of edge are optional. Any key (type string): value (str, int, float, dictionary, list) pairs.
Select all edges over verizon ISP between10.10.10.2
and10.10.10.4
query_params = {'src_node': '10.10.10.2', 'dst_node': '10.10.10.4', 'isp': 'verizon'}
r_get = requests.get(f'http://{TOPOLOGRAPH_HOST}:{TOPOLOGRAPH_PORT}/api/diagram/{graph_time}/edges', auth=(' ', ' '), params=query_params, timeout=(5, 30))
Reply
pp(r_get.json())
[{'bw': 1000,
'cost': 1,
'dst': '10.10.10.4',
'id': 3,
'isp': 'verizon',
'media': 'fiber',
Network reaction on adding new link between devices.
Let's add a new link with cost
1 between R3 (10.10.10.3) and R4 (10.10.10.4) device and see how network will react on it.
Obviously, we see traffic increase on direct link R3<->R4 and traffic decrease to R2 (10.10.10.2) and R5 (10.10.10.5).
v2.31 (18.03.2023)
New features
- ZTE IS-IS support is added
Enhancements
- IS-IS template fix
- Minor bugfixes
v2.30 (17.03.2023)
Enhancements
OSPF/IS-IS cost on edge labels
- LabelFrom, LabelTo is available now on topolograph. Meanwhile it is possible to switch this view off.
- OSPF/IS-IS cost on the shortest path
API reply code
- In case of pushing bad OSPF/IS-IS LSDB - reply is Bad Request, 400. Linked to watcher api ValueError: UNAUTHORIZED
v2.29.1 (08.02.2023)
Enhancements
- Fix issue 31 Support for importing Cisco NX-OS DB
Metrics:
->Metric:
network/subnet Number:
->Network/Subnet Number:
v2.29 (04.02.2023)
Enhancements
VRF (ospf vrf instances) support
- A single node might have several OSPF instances in different VRFs and in order to remove duplicated nodes on the graph - it possible to create VRF, associate OSPF VRF instances with VRF and master node (the node which will be on the graph)
VRF names can be imported via CSV file
v2.28 (30.12.2022)
Enhancements
The shortest path API
It allows to get the shortest path between two OSPF RID, or it also accepts IP address or IP Subnet as source/destination and returns the following:
- path's cost
- the shortest path
- unbackuped parts of the shortest path (if these links go down, we will lose a connectivity between the source and destination).
get the shortest path
src_node
and dst_node
accepts OSPF RID as a value.
r_post = requests.post('https://topolograph.com/api/path', auth=('', ''), json={'graph_time': '27Dec2022_22h46m01s_7_hosts_ospfwatcher', 'src_node': '192.168.100.100', 'dst_node': '10.1.123.23'})
r_post.json()
A '192.168.100.100' - '10.1.1.4'
link is shown as nonbackuped
The visual path
get backup path
removedEdgesAsNodePairsFromSptPath_ll_in_ll
accepts a list of edges which will be treated as down links
r_post = requests.post('https://topolograph.com/api/path', auth=('', ''), json={'graph_time': '27Dec2022_22h46m01s_7_hosts_ospfwatcher', 'src_node': '192.168.100.100', 'dst_node': '10.1.123.23', 'removedEdgesAsNodePairsFromSptPath_ll_in_ll': [['10.1.1.4', '10.1.1.2']]})
r_post.json()
get the shortest path for networks
There is a separate method for getting the shortest path, which accepts IP addresses/IP network as an input.
Let's build a path between 192.1.113.99
IP and 192.1.213.0/24
network.
r_post = requests.post('https://topolograph.com/api/path/network', auth=('', ''), json={'graph_time': '27Dec2022_22h46m01s_7_hosts_ospfwatcher', 'src_ip_or_network': '192.1.113.99', 'dst_ip_or_network': '192.1.213.0/24'})
r_post.json()
Full API schema is here
v2.27 (28.12.2022)
OSPF Watcher is integrated into Topolograph
OSPF Monitoring page
The solution is available only on docker-based Topolograph. It requires launching topolograph-docker and ospfwatcher on your on-premise host. Right after it OSPF topology changes will be logged into Topolograph's DB and ELK. Topolograph's OSPFWatcher page provides the following options:
- filter logs by start and end time
- filter network event by new/old subnets, up/down links, cost changes events
Demo logs
OSPF Monitoring page is prefilled by demo logs.
Event on timeline dashboard is clickable - the historical event is shown on the graph too. For example if we choose the link down event between 10.1.1.2 and 10.1.1.4 on the timeline dashboard, we see an appropriate link on the graph. It means that this link went down at 8:26 AM UTC.
All logs are grouped by the detected device.
New subnet event shows where the subnet appeared
Filter any subnet-related events, select Change metric event
up/down link events
Red timelines show link (~adjacency) down events, green one - up link (~adjacency).
Timeline 10.1.1.2-10.1.1.3
has been selected.
Enhancements
A favicon is added.
v2.26.4 (26.11.2022)
Enhancements
igp_protocol
attribute in Graph POST API request is added. May includeospf
orisis