Testing
使用open vswitch和各种第三方提供的工具来测试open vswitch。
内置工具
open vswitch提供各种不同的测试套件和其他测试工具来验证ovs的基础功能。执行测试前必须要参照官方文档编译、配置和启动open vswitch。执行测试用例时不需要安装open vswitch或加载、编译内核模块,也不需要root权限。
单元测试
Open vswitch包含了一套内部测试。提交patch之前,建议执行这些内部测试用例并保证用例通过。如果增加了新特性,则需要针对新特性增加测试用例,保证新增特性不会影响到其他开发者。
执行所有的单元测试(5分总左右):
make check
多线程并行执行:
#结合cpu数量调整线程数量:
make check TESTSUITEFLAGS=-j8
查看支持的测试用例:
make check TESTSUITEFLAGS=-list
只执行一部分测试用例(测试用例之间没有依赖):
#执行第123个公里和第477到第484个测试用例
make check TESTSUITEFLAGS='123 477-484'
更多使用方法及测试参照:
make check TESTSUITEFLAGS=-help
测试结果参照测试报告:tests/testsuite.log
继续执行失败的测试用例:
make check TESTSUITEFLAGS=-j8 RECHECK=yes
调试性单元测试
通过设置环境变量OVS_PAUSE_TEST为1来启动调试性单元测试:
#执行第139个单元测试,遇到错误时停下来:
OVS_PAUSE_TEST=1 make check TESTSUITEFLAGS='-v 139'
覆盖率
安装了lcov并且编译时候开启--enable-coverage选项后,可以执行测试用例并且生成代码覆盖率报告通过执行如下命令:
make check-lcov
同样可以配置选项使用,通过设置TESTSUITEFLAGS.
make check-lcov TESTSUITEFLAGS='-j8 -k ovsdb'
Valgrind
安装了valgrind的情况下,可以使用check-valgrind选项执行内存问题检查:
#用户空间模块:
make check-valgrind
检查结果:tests/testsuite.dir/<N>/valgrind.*
#内核空间模块
make check-kernel-valgrind
检查结果:tests/system/kmod-testsuite.dir/.
OFTest
OF Test是一个openflow协议的测试套件。open vswitch包含了一个makefile选项去执行OF Test(openvswitch在虚拟模式中)。在这种测试模式下,没有报文通过物理或者虚拟网络。unix域套接字代替模拟网络。这个模拟是不完美的,但是设置起来简单很多,不需要额外的物理或者虚拟硬件,也不需要root权限。
基于open vswitch前,必须获得OF Test的拷贝(必须包含commit 406614846c5 ,这个commit包含了ovs-dummy平台)并且安装完依赖项。
OFTest相关的安装使用可参照:SDN交换机功能测试工具OFTest安装与使用总结 - SDNLAB,专注软件定义网络(SDN) - OSCHINA - 中文开源技术交流社区
Note:oftest仅支持到python2.7
执行OFTest测试:
make check-oftest OFT=<oft-bianry>
Ryu
Ryu是一个基于python实现的openflow控制器,包含了大量的openflow测试套件。open vswitch包含了一个makefile选项来运行ryu在模拟模式。
运行Ryu测试前,首先阅读和遵循如上描述。其次获取Ryu代码并安装依赖编译。不需要安装。
执行Ryu测试:
make check-ryu RYUDIR=<ryu-source-dir>
Ryu源码下载:https://github.com/faucetsdn/ryu/archive/refs/tags/v4.34.tar.gz
Ryu入门教程:RYU入门教程 | SDNLAB | 专注网络创新技术
Ryu官方文档:Welcome to RYU the Network Operating System(NOS) — Ryu 4.34 documentation
Datapath testing
open vswitch包含一套针对数据面接口的测试用例,可以测试用户空间和内核空间的数据面。如果新增或者修改了数据面特性,推荐你构建这些测试用例来验证修改。
数据面的测试基于指定的环境变量。测试用例在linux环境上必须使用root权限并且支持namespace。为方便使用,ovs源码中包含了一个Vagrant盒子来支撑这些测试。Vagrant相关的测试运行时支持内核隔离,保护开发环境不会出现内核挂掉或者与测试用例中的配置冲突。
Vagrant(版本1.7.0及以后)
安装:sudo apt-get install vagrant
Native
以上vagrant调用的数据面测试用例在linux下也可以使用root权限手动执行。需要确保没有其他open vswitch在执行这些测试用例。这些测试用例将花费几分钟执行完成,不能并行执行。
Userspcae datapath
执行用户空间的数据面测试用例:
make check-system-userspace
#测试结果输出 tests/system-userspace-testsuite.dir
Userspace datapath with DPDK
测试open vswitch使用dpdk的情况(需保证编译ovs时包含了--with-dpdk选项,并且dpdk已经安装了)。使用root权限执行测试:
sudo -E make check-dpdk
#查看其它支持的选项:
make check-dpdk TESTSUITEFLAGS=--list
DPDK支持的网卡,这些测试用例都支持。如果没有配置大页内存,所有的测试用例都会被跳过。如果没有物理网卡,则物理网卡相关的用例也会被跳过。
kernel datapath
支持对linux内核数据模块测试。测试过程会对插入内核的模块操作,因此ovs内核模块有bug或者upstream内核部分有bug都会导致内核挂掉。
执行测试用例:
#内核模块已经安装:
make check-kernel
#内核模块未安装:
make check-kmod
测试结果:
tests/system-kmod-testsuite.dir
Notes:
测试依赖工具iproute2,特别是ip命令。如果有很多不可解释的错误,请升级iproute2工具。
Static Code Analysis
静态代码分析是一种检查代码的工具。scan-build组件使用clang或者gcc去编译代码并且调用代码分析。编译完成时即生成分析报告。
执行静态代码分析:
$ ./boot.sh
$ ./configure CC=clang # clang
# or
$ ./configure CC=gcc CFLAGS="-std=gnu99" # gcc
$ make clang-analyze
查看分析结果:
使用Travis CI持续迭代
......
vsperf
vsperf项目目的在于开发一个虚拟交换机测试框架,可以用来全面的验证不同的虚拟交换机。
详细参考:VSperf Home - VSPerf - OPNFV Wiki
POC(proof of concepts)
POC是vagrant基于virtualbox或libvirt环境编制的自动化运维文档。允许开发者创建最小的虚拟化环境来验证open vswitch特性是否正常工作。poc在集成第三方软件时是非常有用的,因为标准的单元测试和make check比较有局限性。
vagrant默认使用virtualbox。如果期望使用libvirt,可以安装libvirt插件:
vagrant plugin install vagrant-libvirt
#使用vagrant时,后面跟上--provider=libvirt选项即可
这个特殊的poc演示了使用debain和rom包工具的集成:
cd poc/builders
vagrant up
上面命令执行完成后,生成包(rpm或者deb)在/var/www/html下。
修改ovs代码后rebuild:
git commit -a
vagrant rsync && vagrant provision