Support networkx 2.0

Networkx 2.0 released recently.  The main difference for us is that
"node" is no longer a dictionary and should be accessed via "nodes",
and the topological_sort returns an interator

Closes-Bug: 1712693
Change-Id: I78e89f2261b8b8d28c68b517c1e61691ab40016c
This commit is contained in:
Ian Wienand 2017-09-21 14:07:20 +10:00 committed by yolanda.robla
parent df00e9adcb
commit a47ff0dd4a

View File

@ -190,7 +190,7 @@ def create_graph(config, default_config, state):
# ensure node names are unique. networkx by default # ensure node names are unique. networkx by default
# just appends the attribute to the node dict for # just appends the attribute to the node dict for
# existing nodes, which is not what we want. # existing nodes, which is not what we want.
if node.name in dg.node: if node.name in dg.nodes:
raise BlockDeviceSetupException( raise BlockDeviceSetupException(
"Duplicate node name: %s" % (node.name)) "Duplicate node name: %s" % (node.name))
logger.debug("Adding %s : %s", node.name, node) logger.debug("Adding %s : %s", node.name, node)
@ -210,12 +210,12 @@ def create_graph(config, default_config, state):
logger.debug("Edges for %s: f:%s t:%s", name, logger.debug("Edges for %s: f:%s t:%s", name,
edges_from, edges_to) edges_from, edges_to)
for edge_from in edges_from: for edge_from in edges_from:
if edge_from not in dg.node: if edge_from not in dg.nodes:
raise BlockDeviceSetupException( raise BlockDeviceSetupException(
"Edge not defined: %s->%s" % (edge_from, name)) "Edge not defined: %s->%s" % (edge_from, name))
dg.add_edge(edge_from, name) dg.add_edge(edge_from, name)
for edge_to in edges_to: for edge_to in edges_to:
if edge_to not in dg.node: if edge_to not in dg.nodes:
raise BlockDeviceSetupException( raise BlockDeviceSetupException(
"Edge not defined: %s->%s" % (name, edge_to)) "Edge not defined: %s->%s" % (name, edge_to))
dg.add_edge(name, edge_to) dg.add_edge(name, edge_to)
@ -231,9 +231,9 @@ def create_graph(config, default_config, state):
# Topological sort (i.e. create a linear array that satisfies # Topological sort (i.e. create a linear array that satisfies
# dependencies) and return the object list # dependencies) and return the object list
call_order_nodes = nx.topological_sort(dg) call_order_nodes = list(nx.topological_sort(dg))
logger.debug("Call order: %s", list(call_order_nodes)) logger.debug("Call order: %s", call_order_nodes)
call_order = [dg.node[n]['obj'] for n in call_order_nodes] call_order = [dg.nodes[n]['obj'] for n in call_order_nodes]
return dg, call_order return dg, call_order