@ -3,75 +3,63 @@
# Get topologies
import sys
from birdvisu import maps_new
from birdvisu . maps_new import providers
from birdvisu . providers import BirdSocketTopologyProvider , OspfFileTopologyProvider
ref_topo_file = ' reference.ospf '
if len ( sys . argv ) > 1 :
ref_topo_file = sys . argv [ 1 ]
with open ( ref_topo_file ) as ref_file :
ref_topo = providers . OspfFileTopologyProvider ( ref_file ) . get_topology ( )
ref_topo = OspfFileTopologyProvider ( ref_topo_file ) . get_topology ( )
try :
cur_topo = providers . BirdSocketTopologyProvider ( ) . get_topology ( )
except OSError :
# HACK!
import traceback as tb
tb . print_exc ( file = sys . stderr )
print ( f ' Could not get current topology from BIRD, \n '
' will load reference one with random omissions \n ---- ' , file = sys . stderr )
with open ( ref_topo_file ) as ref_file :
cur_topo = providers . OspfFileTopologyProvider ( ref_file ) . get_topology ( )
import random
random . seed ( ' birdvisu_demo ' )
# Routers:
for _ in range ( random . randint ( 1 , 3 ) ) :
key , router_to_delete = random . choice ( list ( cur_topo . routers . items ( ) ) )
for l in router_to_delete . links :
lk = ( l . router . ident , l . network . ident )
del cur_topo . links [ lk ]
l . network . links . remove ( l )
del cur_topo . routers [ key ]
# Networks:
for _ in range ( random . randint ( 1 , 3 ) ) :
key , network_to_delete = random . choice ( list ( cur_topo . networks . items ( ) ) )
for l in network_to_delete . links :
lk = ( l . router . ident , l . network . ident )
del cur_topo . links [ lk ]
l . router . links . remove ( l )
del cur_topo . networks [ key ]
# Links:
for _ in range ( random . randint ( 1 , 3 ) ) :
key , link_to_delete = random . choice ( list ( cur_topo . links . items ( ) ) )
link_to_delete . router . links . remove ( link_to_delete )
link_to_delete . network . links . remove ( link_to_delete )
del cur_topo . links [ key ]
# Combine topologies
combiner = maps_new . TopologyCombiner ( )
# NOTE: the following string literals convey meaning for annotators, so they
# should not be changed carelessly.
combiner . add_topology ( ' reference ' , ref_topo )
combiner . add_topology ( ' actual ' , cur_topo )
final_topo = combiner . get_complete_topology ( )
cur_topo = BirdSocketTopologyProvider ( instance = ' ospfv2 ' , area = 1 ) . get_topology ( )
except OSError as e :
raise NotImplementedError ( ' Cannot create a mock topology atm ' ) from e
# Create combined topology
from birdvisu . topo_v3 import TopologyV3
combined_topology = TopologyV3 . combine_topologies ( reference = ref_topo , current = cur_topo )
combined_topology . freeze ( )
# Annotate it
from birdvisu . topo_v3 import VertexID
from birdvisu . annotations import AnnotatedTopology , AnnotatorID
from birdvisu . annotations . analysis import TopologyDifference , ShortestPathTree
from ipaddress import IPv4Address
annot_topo = AnnotatedTopology ( combined_topology )
annotators = [
AnnotatorID ( TopologyDifference ) ,
AnnotatorID ( ShortestPathTree , ( VertexID (
family = None ,
is_router = True ,
address = None ,
router_id = int ( IPv4Address ( ' 172.23.100.10 ' ) ) ,
dr_id = None ,
discriminator = None
) , ' current ' ) ) ,
]
for ann_id in annotators :
annot_topo . run_annotator ( ann_id )
# ---
# Show it
from birdvisu . visualisation import annotators
from birdvisu import maps_new
# annotators.create_qgritems does not like being run without Qt initialization.
from PySide6 import QtCore , QtGui , QtWidgets
app = QtWidgets . QApplication ( [ ] )
annotated_topology = maps_new . annotate_topology ( final_topo ,
annotated_topology = maps_new . annotate_topology ( combined_topology ,
# A semi-canonical set of annotators:
[
annotators . difference_annotator ,
annotators . extract_positions ,
annotators . random_position ,
annotators . assign_brushes ,