云端卫士实战录 | OFTest 的安装和使用

《实战录》导语

云端卫士《实战录》栏目定期会向粉丝朋友们分享一些在开发运维中的经验和技巧,2017年我们将一如既往地为朋友们奉献更多优质内容。本期分享人为云端卫士工程师欧文玉美眉,主要介绍OFTest 的安装和使用。


1. OFTest简介

OFTest是基于python的用于测试openflow交换机的框架,现已经可以用来测试Openflow 1.0, 1.2, 1.3, 1.4版本。它在测试环境中相当于一个控制器,可以主动或被动的与交换机连接,从而获取of交换机的信息并测试交换机的基本功能。

OFTest对OpenFlow不同协议的支持是通过分析控制平面和数据平面的数据包来判定的,如果oftest发送给交换机的消息得到了交换机的响应,则确定该交换机支持这项功能,反之则认为该交换机不支持。

OFTest测试框架如图1所示:


2. 安装OFTest

所用环境:一台系统为centos7的虚拟机


2.1安装依赖


首先需要安装python2.7,如果已经安装了,先用version命令确认一下自己的虚机中是不是2.7版本的,如果不是的话最好升级一下,此处就不详细说明了。


其次安装scapy,注意这里是scapy不是scrapy,scapy安装直接使用yum即可,命令如下:

# yum install scapy


其他可选软件:pypcapy,tcpdump(最好要有),doxygen,doxpy,lint(我未安装)。如果没有安装pypcapy可能会导致有关使用VLAN标签的测试失败。


2.2安装OFTest


Oftest代码直接从github下载:


# git clone git://github.com/floodlight/oftest
# cd oftest
运行OFTest
# ./oft


oftest/oft脚本是进入test框架的接入点,所有测试例都从oft脚本开始运行并在test mode list中进行匹配,所以下载完成后便可以直接使用./oft运行所有的测试用例,如需选择性的运行只需加上对应参数。运行oftest框架包括两个部分:


(1)建立支持OF协议的python库,所有测试脚本都用python写;
(2)运行oft 。


2.3配置OFTest


OFTest运行时默认为openflow 1.0,若要测试其他版本只需要将oft中的参数openflow_version改为相应的版本即可。 1.2、1.3、1.4的测试例分别在文件夹tests-1.2 ,tests-1.3,test-1.4中,可见测试例很少,需要根据需要自己添加。添加测试例需要按照相应的版本协议构建数据包。

    # Switch connection options
     ……
"openflow_version"   : "1.0",//修改此处切换版本号

测试远程交换机时,需要修改remote.py中的参数,按自己虚机和交换机的实际情况修改,如下:

仅供参考

# Update this dictionary to suit your environment.
remote_port_map = {
    23 : "eth2",//of交换机的23端口连接到OFTest本地eth2
    24 : "eth3",
    25 : "eth4",
    26 : "eth5"
}

修改配置之后运行./oft提示“port_map”失败,可先运行./run_switch.py激活交换机。


注意:oftest与onos一样是连接到6653口上的控制器,所以不能同时运行!


运行以下脚本确保交换机已连接到控制器并且用例能启动:./oft basic.Echo


显示成功:



以/test-1.3/groups.py为例



一个class即为一个测试用例,使用前可以进入测试用例脚本查看所需的用例,然后输入命令:# ./oft groups.GroupAdd


即可运行此用例。


以下是OFTest常用的命令参数:


表 1. OFTest命令通用参数


说明:--list详细的罗列出所有的测试用例,包括标准用例、非标准用例和禁用用例,非标准用例使用'*'标志,可要求供应商扩展或特殊的交换机配置。禁用用例通常用于试验,有某些特殊用途的,或者是太长而无法正常运行,这些都不是标准测试组的一部分。

--list-test-names屏蔽了对每一个测试例的解释。


其余命令视情况用--help查询,这里就不一一例举了。


3. 实战演练

3.1用优先级来测试交换机flow容量


测试交换机型号:盛科v350


首先用python写好测试用的代码,大致如下:

仅供参考

class Overwrite(base_tests.SimpleDataPlane):
    """
    Verify that overwriting a flow changes most fields but preserves stats
    """
    def runTest(self):
        in_port, out_port1, out_port2 = openflow_ports(3)

        delete_all_flows(self.controller)  //首先清空所有flow

        table_id = test_param_get("table", 0)
        match = ofp.match([
            ofp.oxm.in_port(in_port),
        ])
        priority = 1
        ppid = priority
        while ppid < 3000:    //设置优先级数值如果小于3000则递增
              logging.info("Inserting flow")
              request = ofp.message.flow_add(
                      table_id=table_id,
                      match=match,
                      instructions=[
                          ofp.instruction.apply_actions([ofp.action.output(out_port1)]),
                      ],
                      buffer_id=ofp.OFP_NO_BUFFER,
                      priority=ppid,
                      flags=ofp.OFPFF_SEND_FLOW_REM,
                      cookie=random.randint(0,9007199254740992))//构造flow表
              self.controller.message_send(request)
              do_barrier(self.controller)
              ppid += 1
        # Check that the fields in the flow stats entry match the second flow-add
        stats = get_flow_stats(self, ofp.match())
        self.assertEquals(len(stats), 1)
        entry = stats[0]
        logging.debug(entry.show())
        self.assertEquals(entry.instructions, request.instructions)
        self.assertEquals(entry.flags, request.flags)
        self.assertEquals(entry.cookie, request.cookie)


将代码保存到tests-1.3目录下,并执行命令:./oft flow


等代码运行结束,到交换机上查询结果,观察最高优先级的那条flow即可得知交换机最大容量,如图:



此处使用3000作为最大值的原因是,估测到此交换机的容量大约为2000多条,使用者可根据实际情况更改用例。


3.2用groupId来测试group表容量


代码大致如下:

仅供参考

class GroupAdd(GroupTest):
    def runTest(self):
        port1, = openflow_ports(1)
        id = 0
        while id < 64: //设置groupid最大值,如果小于64则递增
            msg = ofp.message.group_add(
                group_type=ofp.OFPGT_ALL,
                group_id=id,
                buckets=[
                    ofp.bucket(actions=[ofp.action.output(port1)])])

            self.controller.message_send(msg)
            do_barrier(self.controller)
            id+=1  //构建group表

        Stats= get_stats(self, ofp.message.group_desc_stats_request())
        self.assertEquals(stats, [
            ofp.group_desc_stats_entry(
                group_type=msg.group_type,
                group_id=msg.group_id,
                buckets=msg.buckets)])





等代码运行结束,到交换机上查询结果,观察groupId最大的那条group表即可得知交换机最大容量,如图:



原理与flow的测试用例相似。


4.总结

用oftest的测试用例来测试,用例运行结束后提示的成功或失败并不是最重要的,重要的是交换机上的表项结果是否达成预期。


参考

http://blog.163.com/he_junwei/blog/static/1979376462015124410240/

http://blog.csdn.net/sdnlab/article/details/41962879


“云端卫士”是中盈优创资讯科技有限公司旗下的系列安全产品的主品牌,为客户提供全系列、一体化、可运营的安全产品,包括网络攻击追踪溯源系统、网络攻击检测分析系统、网络流量态势感知系统、安全威胁态势感知系统、安全运营支撑系统、分布式抗拒绝服务攻击系统等。更多信息请拨打400-818-5108咨询,或访问www.cloudguarder.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值