我试图从rest调用中创建简单的节点和边图.到目前为止,能够获取节点,将其作为json转储并发送到d3进行可视化。这里的问题是,我无法绘制边或链接。它给了我一个错误
e = (link['link']['destination']['node']['node-id'], link['link']['source']['node']['node-id'])
TypeError: 'int' object has no attribute '__getitem__'这是来自的节点和链接调用的详细信息。
Nodes List:
Node ID - openflow:1
Node ID - host:00:00:00:00:00:01
Node ID - openflow:2
Node ID - host:00:00:00:00:00:02
Links List:
Link ID - host:00:00:00:00:00:01/openflow:1:1
Link ID - openflow:2:1/host:00:00:00:00:00:02
Link ID - openflow:1:2
Link ID - openflow:2:2
Link ID - openflow:1:1/host:00:00:00:00:00:01
Link ID - host:00:00:00:00:00:02/openflow:2:1这是API中的详细信息调用。
{
u'network-topology': {
u'topology': [
{
u'node': [
{
u'opendaylight-topology-inventory:inventory-node-ref': u"/opendaylight-inventory:nodes/opendaylight-inventory:node[opendaylight-inventory:id='openflow:1']",
u'node-id': u'openflow:1',
u'termination-point': [
{
u'opendaylight-topology-inventory:inventory-node-connector-ref': u"/opendaylight-inventory:nodes/opendaylight-inventory:node[opendaylight-inventory:id='openflow:1']/opendaylight-inventory:node-connector[opendaylight-inventory:id='openflow:1:2']",
u'tp-id': u'openflow:1:2'
},
{
u'opendaylight-topology-inventory:inventory-node-connector-ref': u"/opendaylight-inventory:nodes/opendaylight-inventory:node[opendaylight-inventory:id='openflow:1']/opendaylight-inventory:node-connector[opendaylight-inventory:id='openflow:1:1']",
u'tp-id': u'openflow:1:1'
},
{
u'opendaylight-topology-inventory:inventory-node-connector-ref': u"/opendaylight-inventory:nodes/opendaylight-inventory:node[opendaylight-inventory:id='openflow:1']/opendaylight-inventory:node-connector[opendaylight-inventory:id='openflow:1:LOCAL']",
u'tp-id': u'openflow:1:LOCAL'
}
]
},
{
u'host-tracker-service:addresses': [
{
u'first-seen': 1562655393902,
u'ip': u'10.0.0.1',
u'mac': u'00:00:00:00:00:01',
u'id': 6,
u'last-seen': 1562655393902
}
],
u'host-tracker-service:id': u'00:00:00:00:00:01',
u'host-tracker-service:attachment-points': [
{
u'active': True,
u'corresponding-tp': u'host:00:00:00:00:00:01',
u'tp-id': u'openflow:1:1'
}
],
u'node-id': u'host:00:00:00:00:00:01',
u'termination-point': [
{
u'tp-id': u'host:00:00:00:00:00:01'
}
]
},
{
u'opendaylight-topology-inventory:inventory-node-ref': u"/opendaylight-inventory:nodes/opendaylight-inventory:node[opendaylight-inventory:id='openflow:2']",
u'node-id': u'openflow:2',
u'termination-point': [
{
u'opendaylight-topology-inventory:inventory-node-connector-ref': u"/opendaylight-inventory:nodes/opendaylight-inventory:node[opendaylight-inventory:id='openflow:2']/opendaylight-inventory:node-connector[opendaylight-inventory:id='openflow:2:LOCAL']",
u'tp-id': u'openflow:2:LOCAL'
},
{
u'opendaylight-topology-inventory:inventory-node-connector-ref': u"/opendaylight-inventory:nodes/opendaylight-inventory:node[opendaylight-inventory:id='openflow:2']/opendaylight-inventory:node-connector[opendaylight-inventory:id='openflow:2:1']",
u'tp-id': u'openflow:2:1'
},
{
u'opendaylight-topology-inventory:inventory-node-connector-ref': u"/opendaylight-inventory:nodes/opendaylight-inventory:node[opendaylight-inventory:id='openflow:2']/opendaylight-inventory:node-connector[opendaylight-inventory:id='openflow:2:2']",
u'tp-id': u'openflow:2:2'
}
]
},
{
u'host-tracker-service:addresses': [
{
u'first-seen': 1562655393906,
u'ip': u'10.0.0.2',
u'mac': u'00:00:00:00:00:02',
u'id': 7,
u'last-seen': 1562655393906
}
],
u'host-tracker-service:id': u'00:00:00:00:00:02',
u'host-tracker-service:attachment-points': [
{
u'active': True,
u'corresponding-tp': u'host:00:00:00:00:00:02',
u'tp-id': u'openflow:2:1'
}
],
u'node-id': u'host:00:00:00:00:00:02',
u'termination-point': [
{
u'tp-id': u'host:00:00:00:00:00:02'
}
]
}
],
u'link': [
{
u'link-id': u'host:00:00:00:00:00:01/openflow:1:1',
u'destination': {
u'dest-node': u'openflow:1',
u'dest-tp': u'openflow:1:1'
},
u'source': {
u'source-tp': u'host:00:00:00:00:00:01',
u'source-node': u'host:00:00:00:00:00:01'
}
},
{
u'link-id': u'openflow:2:1/host:00:00:00:00:00:02',
u'destination': {
u'dest-node': u'host:00:00:00:00:00:02',
u'dest-tp': u'host:00:00:00:00:00:02'
},
u'source': {
u'source-tp': u'openflow:2:1',
u'source-node': u'openflow:2'
}
},
{
u'link-id': u'openflow:1:2',
u'destination': {
u'dest-node': u'openflow:2',
u'dest-tp': u'openflow:2:2'
},
u'source': {
u'source-tp': u'openflow:1:2',
u'source-node': u'openflow:1'
}
},
{
u'link-id': u'openflow:2:2',
u'destination': {
u'dest-node': u'openflow:1',
u'dest-tp': u'openflow:1:2'
},
u'source': {
u'source-tp': u'openflow:2:2',
u'source-node': u'openflow:2'
}
},
{
u'link-id': u'openflow:1:1/host:00:00:00:00:00:01',
u'destination': {
u'dest-node': u'host:00:00:00:00:00:01',
u'dest-tp': u'host:00:00:00:00:00:01'
},
u'source': {
u'source-tp': u'openflow:1:1',
u'source-node': u'openflow:1'
}
},
{
u'link-id': u'host:00:00:00:00:00:02/openflow:2:1',
u'destination': {
u'dest-node': u'openflow:2',
u'dest-tp': u'openflow:2:1'
},
u'source': {
u'source-tp': u'host:00:00:00:00:00:02',
u'source-node': u'host:00:00:00:00:00:02'
}
}
],
u'topology-id': u'flow:1'
}
]
}
}这是我测试的代码,它只能得到节点,但不能得到链接/边.
# get nodes
resp, content = h.request(url, "GET")
nodeData = json.loads(content)
topology = nodeData['network-topology']['topology'][0]
print "Nodes List:"
for i in range(len(topology['node'])):
print "Node ID - ", topology['node'][i]['node-id']
i += 1
# Get links/edges
resp, content = h.request(url, "GET")
linkData = json.loads(content)
topology = linkData['network-topology']['topology'][0]
print "Links List:"
for i in range(len(topology['link'])):
print "Link ID - ", topology['link'][i]['link-id']
i += 1
# Add nodes and links into graph
graph = nx.Graph()
for node in range(len(topology['node'])):
graph.add_node(topology['node'][node]['node-id'])
for link in range(len(topology['link'])):
e = (link['link']['destination']['node']['node-id'], link['link']['source']['node']['node-id'])
graph.add_edge(*e)
print "Graph Nodes:"
print graph.nodes()
print "Graph Links:"
print graph.links()
# write json formatted data to use in visualization
d = json_graph.node_link_data(graph)
json.dump(d, open('topo.json','w'))
print('Wrote node-link JSON data')我尝试删除与链接/边缘相关的代码,保留节点,没有问题。当我为遇到问题的链接添加图形时,我可以得到topo.json..but中节点的详细信息。
这里的问题是,我无法绘制边或链接。它给了我一个错误
e = (link['link']['destination']['node']['node-id'], link['link']['source']['node']['node-id'])
TypeError: 'int' object has no attribute '__getitem__'我只是不知道如何解决it...appreciate,here..Thanks专家的建议和帮助
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
我修改了下面的内容,但是得到了不同的错误TypeError:字符串索引必须是整数
# Get links/edges
resp, content = h.request(url, "GET")
linkData = json.loads(content)
a = linkData['network-topology']['topology'][0]
print a
# Add links into graph
graph = nx.Graph()
for link in a:
e = (link['link']['destination']['node']['node-id'], link['link']['source']['node']['node-id'])
graph.add_edge(*e)打印上面的输出在下面
{
u'node': [
{
u'opendaylight-topology-inventory:inventory-node-ref': u"/opendaylight-inventory:nodes/opendaylight-inventory:node[opendaylight-inventory:id='openflow:1']",
u'node-id': u'openflow:1',
u'termination-point': [
{
u'opendaylight-topology-inventory:inventory-node-connector-ref': u"/opendaylight-inventory:nodes/opendaylight-inventory:node[opendaylight-inventory:id='openflow:1']/opendaylight-inventory:node-connector[opendaylight-inventory:id='openflow:1:2']",
u'tp-id': u'openflow:1:2'
},
{
u'opendaylight-topology-inventory:inventory-node-connector-ref': u"/opendaylight-inventory:nodes/opendaylight-inventory:node[opendaylight-inventory:id='openflow:1']/opendaylight-inventory:node-connector[opendaylight-inventory:id='openflow:1:1']",
u'tp-id': u'openflow:1:1'
},
{
u'opendaylight-topology-inventory:inventory-node-connector-ref': u"/opendaylight-inventory:nodes/opendaylight-inventory:node[opendaylight-inventory:id='openflow:1']/opendaylight-inventory:node-connector[opendaylight-inventory:id='openflow:1:LOCAL']",
u'tp-id': u'openflow:1:LOCAL'
}
]
},
{
u'host-tracker-service:addresses': [
{
u'first-seen': 1562655393902,
u'ip': u'10.0.0.1',
u'mac': u'00:00:00:00:00:01',
u'id': 6,
u'last-seen': 1562655393902
}
],
u'host-tracker-service:id': u'00:00:00:00:00:01',
u'host-tracker-service:attachment-points': [
{
u'active': True,
u'corresponding-tp': u'host:00:00:00:00:00:01',
u'tp-id': u'openflow:1:1'
}
],
u'node-id': u'host:00:00:00:00:00:01',
u'termination-point': [
{
u'tp-id': u'host:00:00:00:00:00:01'
}
]
},
{
u'opendaylight-topology-inventory:inventory-node-ref': u"/opendaylight-inventory:nodes/opendaylight-inventory:node[opendaylight-inventory:id='openflow:2']",
u'node-id': u'openflow:2',
u'termination-point': [
{
u'opendaylight-topology-inventory:inventory-node-connector-ref': u"/opendaylight-inventory:nodes/opendaylight-inventory:node[opendaylight-inventory:id='openflow:2']/opendaylight-inventory:node-connector[opendaylight-inventory:id='openflow:2:LOCAL']",
u'tp-id': u'openflow:2:LOCAL'
},
{
u'opendaylight-topology-inventory:inventory-node-connector-ref': u"/opendaylight-inventory:nodes/opendaylight-inventory:node[opendaylight-inventory:id='openflow:2']/opendaylight-inventory:node-connector[opendaylight-inventory:id='openflow:2:1']",
u'tp-id': u'openflow:2:1'
},
{
u'opendaylight-topology-inventory:inventory-node-connector-ref': u"/opendaylight-inventory:nodes/opendaylight-inventory:node[opendaylight-inventory:id='openflow:2']/opendaylight-inventory:node-connector[opendaylight-inventory:id='openflow:2:2']",
u'tp-id': u'openflow:2:2'
}
]
},
{
u'host-tracker-service:addresses': [
{
u'first-seen': 1562655393906,
u'ip': u'10.0.0.2',
u'mac': u'00:00:00:00:00:02',
u'id': 7,
u'last-seen': 1562655393906
}
],
u'host-tracker-service:id': u'00:00:00:00:00:02',
u'host-tracker-service:attachment-points': [
{
u'active': True,
u'corresponding-tp': u'host:00:00:00:00:00:02',
u'tp-id': u'openflow:2:1'
}
],
u'node-id': u'host:00:00:00:00:00:02',
u'termination-point': [
{
u'tp-id': u'host:00:00:00:00:00:02'
}
]
}
],
u'link': [
{
u'link-id': u'host:00:00:00:00:00:01/openflow:1:1',
u'destination': {
u'dest-node': u'openflow:1',
u'dest-tp': u'openflow:1:1'
},
u'source': {
u'source-tp': u'host:00:00:00:00:00:01',
u'source-node': u'host:00:00:00:00:00:01'
}
},
{
u'link-id': u'openflow:2:1/host:00:00:00:00:00:02',
u'destination': {
u'dest-node': u'host:00:00:00:00:00:02',
u'dest-tp': u'host:00:00:00:00:00:02'
},
u'source': {
u'source-tp': u'openflow:2:1',
u'source-node': u'openflow:2'
}
},
{
u'link-id': u'openflow:1:2',
u'destination': {
u'dest-node': u'openflow:2',
u'dest-tp': u'openflow:2:2'
},
u'source': {
u'source-tp': u'openflow:1:2',
u'source-node': u'openflow:1'
}
},
{
u'link-id': u'openflow:2:2',
u'destination': {
u'dest-node': u'openflow:1',
u'dest-tp': u'openflow:1:2'
},
u'source': {
u'source-tp': u'openflow:2:2',
u'source-node': u'openflow:2'
}
},
{
u'link-id': u'openflow:1:1/host:00:00:00:00:00:01',
u'destination': {
u'dest-node': u'host:00:00:00:00:00:01',
u'dest-tp': u'host:00:00:00:00:00:01'
},
u'source': {
u'source-tp': u'openflow:1:1',
u'source-node': u'openflow:1'
}
},
{
u'link-id': u'host:00:00:00:00:00:02/openflow:2:1',
u'destination': {
u'dest-node': u'openflow:2',
u'dest-tp': u'openflow:2:1'
},
u'source': {
u'source-tp': u'host:00:00:00:00:00:02',
u'source-node': u'host:00:00:00:00:00:02'
}
}
],
u'topology-id': u'flow:1'
}到目前为止还在努力解决it...no的运气.
需要从API调用中获取所有节点和链接(源和目标),并将其保存到json文件中,然后发送到d3.js进行图形访问。请给我建议。谢谢
发布于 2019-07-09 10:17:01
这个for循环:
for link in range(len(topology['link'])):
e = (link['link']['destination']['node']['node-id'], link['link']['source']['node']['node-id'])
graph.add_edge(*e)告诉Python给link赋值0,1,2,.直到topology['link']的长度(嗯,长度减去1)。这解释了for循环第一行中的错误,这是当它试图在整数['link']中找到条目0时第一次经历的错误。整数没有这样的条目。
你是想做for link in topology['link']:还是别的什么?看来您希望link是某种形式的小块。
您的代码还有其他问题。
for i in range(len(topology['link'])):
print "Link ID - ", topology['link'][i]['link-id']
i += 1i+=1在块的末尾没有多大意义,因为下一次循环时,i会从for循环中得到一个新的值。我还想知道在topology['node']上的for循环中是否存在隐藏的错误,类似于循环中的错误。
https://stackoverflow.com/questions/56947952
复制相似问题