def update_graph(self, new_graph): self.leader_watchdog.check_leader(self.get_leader()) added_edges = new_graph.difference(self.graph) removed_edges = self.graph.difference(new_graph) node_prop_diff = {n: data for n, data in new_graph.nodes_iter(data=True) if n not in self.graph or (data.viewitems() - self.graph.node[n].viewitems())} # Propagate differences if added_edges or removed_edges or node_prop_diff: log.debug('Pushing changes') for u, v in added_edges: self.for_all_listeners('add_edge', u, v, new_graph.export_edge_data(u, v)) for u, v in removed_edges: self.for_all_listeners('remove_edge', u, v) if node_prop_diff: self.for_all_listeners('update_node_properties', **node_prop_diff) if CFG.getboolean(DEFAULTSECT, 'draw_graph'): new_graph.draw(CFG.get(DEFAULTSECT, 'graph_loc')) self.graph = new_graph log.info('LSA update yielded +%d -%d edges changes, ' '%d node property changes', len(added_edges), len(removed_edges), len(node_prop_diff)) self.for_all_listeners('commit')
def apply(self, graph, lsdb): if ip_address(self.routerid) in lsdb.exclude_net and \ CFG.getboolean(DEFAULTSECT, 'exclude_fake_lsa'): log.debug('Skipping AS-external Fake LSA %s via %s', self.address, [self.resolve_fwd_addr(r.fwd_addr) for r in self.routes]) return for route in self.routes: graph.add_edge(self.resolve_fwd_addr(route.fwd_addr), self.prefix, metric=route.metric)
def update_graph(self, new_graph): added_edges = graph_diff(new_graph, self.graph) removed_edges = graph_diff(self.graph, new_graph) # Propagate differences if len(added_edges) > 0 or len(removed_edges) > 0: log.debug('Pushing changes') for u, v in added_edges: self.listener_add_edge(u, v, new_graph[u][v]['metric']) for u, v in removed_edges: self.listener_remove_edge(u, v) if CFG.getboolean(DEFAULTSECT, 'draw_graph'): draw_graph(new_graph) self.graph = new_graph log.info('LSA update yielded +%d -%d edges changes' % (len(added_edges), len(removed_edges)))