Java实现SDN拓扑获取
Java实现SDN拓扑获取
思路
- 由于
Java调用北向接口过程复杂,故此处编写Python脚本获取拓扑 - 使用
Jython包完成Pyhon脚本的调用 - 考虑到
Python和Java的数据结构难以直接转换,这里选择将脚本获取的拓扑用无向图的形式保存本地文件topo.txt - 通过
Java读取本地文件,并进行处理分析,发送到前端
实现
Python脚本编写
-
引入相关包
import sdn_net as sn import networkx as nx import json此处利用了
networkx的Graph图结构;json用于将数据转化为字典集;sdn_net是之前写的流表下发和拓扑抽象的脚本,此处引用其中的函数其实就是懒 -
调用北向接口获取链路信息
G = nx.Graph() status,resp = sn.get_links(ip) resp = json.loads(resp) for i in resp["links"]: G.add_edge(i["src"]["device"],i["dst"]["device"])这里使用了
Graph做无向图,解决了链路双向的处理问题 -
写入本地文件
# 清空文件 f = open('topo.txt', 'w') f.write('') f.close() # 写入文件 f = open('topo.txt', 'a') for i in G.edges(): f.write(i[0]+' '+i[1]+'\n')因为每次获取链路的状态应更新原来的状态,所以需要每次清空文件再进行写入
此处如果不写明topo.txt的绝对路径,在之后的
Java调用中会默认保存到Java项目目录下 -
文件形式改为
Json和前端兄弟商定后,要达到如下效果

故改装代码
filename = "{YOUR PATH}/topo.json" topo = [] for i in G.edges(): topo.append({"a":i[0],"b":i[1]}) with open(filename, 'w') as file_obj: json.dump(topo, file_obj)Json对于前端操作更加方便,此处改用Json存储
Java调用Python脚本
-
导入
Jython包(虽然没用上,
万一以后有用呢)-
在Jython官网下载,得到安装包,使用口令进行安装
java -jar jython_installer-{VERSION}.jar -
到安装位置找到
jython.jar复制放入src->lib
-
右键
lib,选择add as library即可完成载入
-
-
Java调用get_topo.py-
启用
Runtime.getRuntime().exec()函数,由于是在Linux系统下进行,需要修改参数String cmd = "python3 {YOUR PATH}/get_topo.py"; Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", cmd});这里的命令行如果含有空格或
|需要组合成String形式导入,否则命令不运行
-

浙公网安备 33010602011771号