cleaned up some of the logic for deleting nodes/edges

This commit is contained in:
bharnden 2019-11-22 16:30:25 -08:00
parent 46627aad11
commit e8f8fa3bd5
4 changed files with 37 additions and 46 deletions

View file

@ -469,13 +469,13 @@ class CoreClient:
) )
return node return node
def delete_graph_nodes(self, node_ids, edge_tokens): def delete_graph_nodes(self, node_ids, edges):
""" """
remove the nodes selected by the user and anything related to that node remove the nodes selected by the user and anything related to that node
such as link, configurations, interfaces such as link, configurations, interfaces
:param list[int] node_ids: list of nodes to delete :param list[int] node_ids: list of nodes to delete
:param list edge_tokens: list of edges to delete :param list edges: list of edges to delete
:return: nothing :return: nothing
""" """
# delete the nodes # delete the nodes
@ -496,11 +496,11 @@ class CoreClient:
self.reusable.sort() self.reusable.sort()
# delete the edges and interfaces # delete the edges and interfaces
for i in edge_tokens: for edge in edges:
try: try:
self.links.pop(i) self.links.pop(edge.token)
except KeyError: except KeyError:
logging.error("invalid edge token: %s", i) logging.error("invalid edge token: %s", edge.token)
def create_interface(self, canvas_node): def create_interface(self, canvas_node):
node = canvas_node.core_node node = canvas_node.core_node

View file

@ -388,30 +388,11 @@ class CanvasGraph(tk.Canvas):
:param event: :param event:
:return: :return:
""" """
# hide nodes, links, link information that shows on the GUI # delete canvas data
to_delete_nodes, to_delete_edge_tokens = ( node_ids, edges = self.canvas_management.delete_selected_nodes()
self.canvas_management.delete_selected_nodes()
)
# delete nodes and link info stored in CanvasGraph object # delete core data
node_ids = [] self.core.delete_graph_nodes(node_ids, edges)
for nid in to_delete_nodes:
canvas_node = self.nodes.pop(nid)
node_ids.append(canvas_node.core_node.id)
for token in to_delete_edge_tokens:
self.edges.pop(token)
# delete the edge data inside of canvas node
canvas_node_link_to_delete = []
for canvas_id, node in self.nodes.items():
for e in node.edges:
if e.token in to_delete_edge_tokens:
canvas_node_link_to_delete.append(tuple([canvas_id, e]))
for nid, edge in canvas_node_link_to_delete:
self.nodes[nid].edges.remove(edge)
# delete the related data from core
self.core.delete_graph_nodes(node_ids, to_delete_edge_tokens)
def add_node(self, x, y): def add_node(self, x, y):
plot_id = self.find_all()[0] plot_id = self.find_all()[0]

View file

@ -33,6 +33,9 @@ class InterfaceManager:
self.cidr = self.cidr.next() self.cidr = self.cidr.next()
return self.cidr return self.cidr
def deleted_interface(self, interface):
logging.info("deleted interface: %s", interface)
def determine_subnet(self, canvas_src_node, canvas_dst_node): def determine_subnet(self, canvas_src_node, canvas_dst_node):
src_node = canvas_src_node.core_node src_node = canvas_src_node.core_node
dst_node = canvas_dst_node.core_node dst_node = canvas_dst_node.core_node

View file

@ -39,23 +39,30 @@ class CanvasComponentManagement:
self.selected.clear() self.selected.clear()
def delete_selected_nodes(self): def delete_selected_nodes(self):
selected_nodes = list(self.selected.keys())
edges = set() edges = set()
for n in selected_nodes: node_ids = []
edges = edges.union(self.canvas.nodes[n].edges) for node_id in list(self.selected):
edge_canvas_ids = [x.id for x in edges] bbox_id = self.selected[node_id]
edge_tokens = [x.token for x in edges] canvas_node = self.canvas.nodes.pop(node_id)
link_infos = [x.link_info.id1 for x in edges] + [x.link_info.id2 for x in edges] node_ids.append(canvas_node.core_node.id)
self.canvas.delete(node_id)
for i in edge_canvas_ids: self.canvas.delete(bbox_id)
self.canvas.itemconfig(i, state="hidden") self.canvas.delete(canvas_node.text_id)
for edge in canvas_node.edges:
for i in link_infos: if edge in edges:
self.canvas.itemconfig(i, state="hidden") continue
edges.add(edge)
for cnid, bbid in self.selected.items(): self.canvas.edges.pop(edge.token)
self.canvas.itemconfig(cnid, state="hidden") self.canvas.delete(edge.id)
self.canvas.itemconfig(bbid, state="hidden") self.canvas.delete(edge.link_info.id1)
self.canvas.itemconfig(self.canvas.nodes[cnid].text_id, state="hidden") self.canvas.delete(edge.link_info.id2)
other_id = edge.src
other_interface = edge.src_interface
if edge.src == node_id:
other_id = edge.dst
other_interface = edge.dst_interface
other_node = self.canvas.nodes[other_id]
other_node.edges.remove(edge)
other_node.interfaces.remove(other_interface)
self.selected.clear() self.selected.clear()
return selected_nodes, edge_tokens return node_ids, edges