【概要】SDN功能测试工具通过发送协议数据包并根据被测试对象的反馈来判断其功能的完整性,比较典型的工具是OFTest,它模拟控制器向交换机发送OpenFlow协议从而达到测试OpenFlow交换机的目的。
1 工具简介
OFTest是一个基于Python的测试OpenFlow规范的框架和测试套件,它支持1.0/1.2/1.3版本的OpenFlow协议。在测试环境中OFTest相当于一个控制器, 它可以主动或者被动与交换机连接,获取交换机信息来测试OF交换机基本功能。
OFTest对OpenFlow不同协议的支持是通过分析控制平面和数据平面的数据包来判定的,当OFTest模拟控制器发送消息到交换机,收到交换机的响应时,确定出交换机支持的功能。OFTest测试框架如图1所示:
图1 OFTest测试框架
Oftest/oft脚本是进入test框架的接入点,所有测试例都从oft脚本开始运行并在test mode list中进行匹配。运行oftest框架包括两个部分:
(1)建立支持OF协议的python库,所有测试脚本都用python写;
(2)运行oft 。
2 安装
(1)安装依赖:Python2.4/2.5/2.6/2.7、pypcap、scapy。
其它可选软件:Doxygen、doxypy、lint、tcpdump。如果没有安装pypcap可能会导致有关使用VLAN标签的测试失败。
(2)安装OFTest
OFTest安装好后,其默认配置为一个协议为OpenFlow1.0的交换机一直试图连接OFTest的控制器上,端口是6653,使用虚拟端口veth1, veth3, veth5, and veth7连接到数据平面。
(3)运行OFTest,必须在超级用户下执行。
3 使用方法
表 1. OFTest命令通用参数
说明:
(1)--list详细的罗列出所有的测试用例,包括标准用例、非标准用例和禁用用例,非标准用例使用'*'标志,可要求供应商扩展或特殊的交换机配置。禁用用例通常用于试验,有某些特殊用途的,或者是太长而无法正常运行,这些都不是标准测试组的一部分。这里列出输入该参数后的部分测试列表:
(2)--list-test-names屏蔽了对每一个测试例的解释:
表 2. OFTest测试对象参数
测试用例模块可以通过刚刚介绍的list查出来,如执行一个load模块:
表 3. OFTest交换机连接参数
说明:
(1)platform主要是定义oft与switch连接的portmap。它使用veth.py脚本连接本地虚拟机,参数platform的默认值是“veth”,测试远程的交换机使用remote.py,此时参数platform值配置为“remote”,或者使用命令行sudo ./oft --platform=remote修改,也可以添加自己的*.py文件测试远程交换机,方法同remote。
(2)配置oft与switch连接使用的协议版本,OFTest默认测试版本为1.0,也可以手动修改为1.2或者1.3版本,如./oft –V 1.2将OFTest测试版本修改为1.2,测试过程中需要注意交换机和oft的OF协议版本要保持一致。
表 4. OFTest日志参数
说明:
log-file参数可以用于日志的输出位置设置,默认产生的log输出到oft.log文件中,修改log-file=“”可以使log输出到控制台上,也可以定义自己的log文件。
表 5. OFTest测试行为参数
4 应用实例
下面一共例举了三个实例,分别是测试本地OvS交换机、物理SDN交换机、Mininet自带的交换机。
测试环境准备:
■用于测试的3种OpenFlow交换机;
■Root权限运行oft测试工具;
■交换机运行OpenFlow1.0协议,并尝试与oft模拟的控制器连接;
实例一:使用OFTest测试本地虚拟OF交换机
通过测试本地虚拟交换机的功能初步了解oft的运行方式。
(1)下载并运行本地虚拟交换机。
run_switch.py是OFtest提供的一个用于veth口并启动交换机进程的脚本,在最初执行该脚本时我们可以看到如下结果。
可以看出模拟的交换机一直在尝试与OFTest建立连接,由于OFTest还没启动所以日志中连接失败了。
(2)运行oft。
测试用例的执行方式有多种,执行./oft为直接运行所有的测试用例,运行时可以看到每个测试用例的运行结果是成功还是失败。如下:
此时我们也可以从run_switch.py日志看出交换机的连接情况:
另外我们还可以运行具体的某个测试用例,可以先用sudo ./oft --list列出所有的mode和其对应的测试用例。 例如 sudo ./oft flow_matches.UdpDstPort就表明使用flow_matches模块下的UdpDstPort测试用例。
用例执行的其他方式大家可以自行研究。
(3)通过抓包和日志分析虚拟交换机功能是否正常。测试的抓包分析部分截图如下图所示:
(4)测试结束后,使用sudo rmmod veth命令删除交换机产生的虚接口。
实例二:使用OFTest测试物理交换机
该实例使用真实物理交换机,OFTest作为控制器,测试真实的物理交换机与OFTest交互是否正确。
(1)修改platforms/remote.py,port_map={eth0}(根据自己虚拟机的环境修改,此处eth0为运行oft的虚拟机的网口),其它配置使用默认即可。
(2)根据测试环境修改测试用例。如测试port_stats,需要修改OFTest/tests/port_stats.py,原测试用例要求oftset与被测试交换机的端口建立连接,被测试交换机有3个port,并且需要在这3个port之间添加流表并互相收发数据包改变端口的状态,而测试物理交换机只需要向交换机发送port stats请求包即可,以上过程需要去除。
(3)物理交换机向OFTest发起连接请求。例如ovs-vsctl set-controller br0 tcp:192.168.5.124:6653,其中192.168.5.124为OFTest的eth0地址,6653为监听端口。我们可以看到物理交换机与OFTest建立了连接关系:
(4)运行测试用例,命令如下:
(5)通过抓包和日志分析交换机与OFTest之间的交互过程。
实例三:使用OFTest测试远端Mininet中的OF交换机
该实例测试对象为Mininet中的虚拟交换机,重点是为了测试交换机为remote的情况。
(1)根据实际环境修改oft监听交换机的 IP地址和端口;
(2)修改oftest/platforms/remote.py,port_map={eth0}(portmap终端为运行oft的虚拟机的网口,根据虚拟机的实际情况修改);
(3)安装远端Mininet,运行Mininet交换机,并向oft发出连接请求;
(4)运行OFTest,将platform参数改为remote,testmod.testcase换成真实的测试用例:
或者将oft脚本中的platform参数改为remote:
在Mininet中也可看出交换机与OFTest建立连接:
一般情况下oft提供的测试用例与测试环境不相符,直接使用会使测试结果不正确,建议使用Wireshark抓包、查看oft.log日志和脚本调试信息等方法分析错误原因,修改测试脚本。
5 结束语
由此可见OFTest确实是一款功能强大的SDN交换机测试工具,但这仅仅是不够的,SDN交换机还需要从其他方面进行全面的测试,例如:
●图像更新测试:检查image的下载时间和状态、冷启动和热启动后系统的工作情况、逆向更新image等。
●复杂拓扑测试:分别在不同的Packet bytes下检查丢包情况。
●重启测试: 测试设备在各种工作状态下重启,是否可以正常重启,是否可以正确进入系统,启动过程中/启动后系统/串口无错误打印。
●表项测试:检查各profile的可配置资源数、满配检查各项是否可以满配等。
●性能测试:测试对RFC2544协议的支持、流安装和卸载、Packet-In /Out发送接收等。
●互通性与压力测试:与控制器的互通情况,或者通过自动化脚本进行文件读写的操作等。
本文来源于SDNLAB,可点击此阅读原文。如果您对本文感兴趣,可参与以下互动方式与作者近距离交流。
微博(http://weibo.com/sdnlab/)
微信(账号:SDNLAB)
QQ群
SDN研究群(214146842)
OpenDaylight研究群(194240432)