OSPFv2协议简介

OSPFv2(开放式最短路径优先版本2)是互联网协议(IP)网络的路由协议。它使用链路状态路由(LSR)算法,并且属于在单个自治系统(AS)内运行的内部网关协议(IGP)组。

测试拓扑

编辑

典型测试场景介绍

1.测试仪表端口Port_1模拟OSPFv2协议会话与DUT设备端口Gi0/0/1建立OSPFv2邻居。

2.测试仪表端口Port_2创建一个interface接口模拟一个路由器设备与DUT设备端口Gi0/0/2在同一网关。

3.测试仪表端口Port_1模拟OSPFv2协议创建一条External LSA发布路由。

4.被测DUT设备生成路由表后,测试仪表端口Port_2创建interface->OSPFv2 External的路由绑定流。

5.发送流量,检查流量没有丢包,路由正常。

手动测试仪表配置

1.预约两个端口Port_1、Port_2

编辑

2.端口Port_1创建一个ipv4 interface

编辑

3.端口Port_1创建一个OSPFv2会话并绑定到interface

编辑

4.端口Port_2创建一个ipv4 interface

编辑

5.端口Port_2创建一条interface->OSPFv2 External的路由绑定流StreamTemplate_1

编辑

编辑

6.订阅StreamBlockStats统计

编辑

7.启动OSPFv2协议,查看设备路由,启动Port_2的绑定流StreamTemplate_2-1

编辑

8.查看流量收发包相等,没有丢包

编辑

Renix Python API自动化测试

测试前置步骤

导入Renix Python API修改当前使用的设备平台

>>> from renix_py_api.renix import *
>>>
>>> # 初始化Renix
>>> initialize()
renix python api init begin
log path: c:\renix_py_api\logs\script_Jul_29_22_11_30_52.log
[INFO] 2022-07-29 11:31:33,324 Receive Msg: listen_port 9002 [INFO] 2022-07-29 11:31:33,324 launch CL successfully with listen port: 9002
[INFO] 2022-07-29 11:31:33,469 Renix api initialization finished
>>> # 修改产品类型
>>> sys_entry = get_sys_entry()
>>> sys_entry.ProductType = 'DARYU'

测试步骤

1.预约两个端口Port_1、Port_2

>>> # 创建端口
>>> Port_1 = Port(upper=sys_entry, Location='//10.0.11.191/1/15')
>>> print(Port_1.Name)
Port_1
>>> Port_2 = Port(upper=sys_entry, Location='//10.0.11.191/1/16')
>>> print(Port_2.Name)
Port_2
>>> # 端口上线
>>> online_command = BringPortsOnlineCommand(PortList=[Port_1.handle, Port_2.handle])
>>> online_command.execute()
>>> print(online_command.PortList)
['Port_1', 'Port_2']

2.端口Port_1创建一个ipv4 interface​​​​​​​

>>> # 创建接口
>>> interface1 = Interface(upper=Port_1)
>>> print(interface1.Name)
Interface_1
>>> # 修改接口类型为IPv4接口
>>> BuildInterfaceCommand(InterfaceList=[interface1.handle], NetworkLayers='eth ipv4').execute()
>>> # 修改接口类型IP地址参数
>>> ipv4layer1 = interface1.get_children('Ipv4Layer')[0]
>>> ipv4layer1.edit(Address='192.168.10.2', Gateway='192.168.10.1', PrefixLength='24')
>>> print(ipv4layer1.__dict__)
{'_Address': '192.168.10.2', '_Step': '0.0.0.1', '_AddressList': [], '_PrefixLength': '24', '_Gateway': '192.168.10.1', '_GatewayStep': '0.0.0.0', '_GatewayList': [], '_GatewayCount': 1, '_GatewayMac': '00:
00:02:01:01:02', '_ResolvedMacList': [], '_ResolvedState': False, '_LayerState': <EnumLayerState.READY: 1>, '_AddressMode': <EnumAddressMode.RANGE: 0>, '_Count': 1, '_VrfName': '', '_VrfHandle': '', '_Name'
: 'Ipv4Layer_1', '_Enable': True, '_ROMTag': '', 'force_auto_sync': True, 'handle': 'Ipv4Layer_1', 'lower': [], 'upper': None, 'relatives': {}}

3.端口Port_1创建一个OSPFv2会话并绑定到interface​​​​​​​

>>> # 创建OSPFv2协议会话
>>> Ospfv2Sesson = Ospfv2ProtocolConfig(upper=Port_1)
>>> print(Ospfv2Sesson.Name)
Ospfv2ProtocolConfig_1
>>> # OSPFv2协议会话与接口绑定
>>> SelectInterfaceCommand(ProtocolList=[Ospfv2Sesson.handle], InterfaceList=[interface1.handle]).execute()

4.端口Port_2创建一个ipv4 interface​​​​​​​

>>> # 创建接口
>>> interface2 = Interface(upper=Port_2)
>>> print(interface2.Name)
Interface_2
>>> # 修改接口类型为IPv4接口
>>> BuildInterfaceCommand(InterfaceList=[interface2.handle], NetworkLayers='eth ipv4').execute()
>>> # 修改接口类型IP地址参数
>>> ipv4layer2 = interface2.get_children('Ipv4Layer')[0]
>>> ipv4layer2.edit(Address='192.168.20.2', Gateway='192.168.20.1', PrefixLength='24')
>>> print(ipv4layer2.__dict__)
{'_Address': '192.168.20.2', '_Step': '0.0.0.1', '_AddressList': [], '_PrefixLength': '24', '_Gateway': '192.168.20.1', '_GatewayStep': '0.0.0.0', '_GatewayList': [], '_GatewayCount': 1, '_GatewayMac': '00:
00:02:01:01:02', '_ResolvedMacList': [], '_ResolvedState': False, '_LayerState': <EnumLayerState.READY: 1>, '_AddressMode': <EnumAddressMode.RANGE: 0>, '_Count': 1, '_VrfName': '', '_VrfHandle': '', '_Name'
: 'Ipv4Layer_2', '_Enable': True, '_ROMTag': '', 'force_auto_sync': True, 'handle': 'Ipv4Layer_2', 'lower': [], 'upper': None, 'relatives': {}}

5.端口Port_2创建一条interface->OSPFv2 External的路由绑定流StreamTemplate_1​​​​​​​

>>> # OSPFv2协议会话创建External Lsa
>>> Ospfv2ExternalLsa = Ospfv2ExternalLsaConfig(upper=Ospfv2Sesson, RouteCount=10, StartNetworkPrefix='100.0.0.2', PrefixLength=24)
>>> print(Ospfv2ExternalLsa.__dict__)
{'_AdvertisingRouterId': '2.1.1.2', '_LsType': <EnumExtLsaLsType.ExtLsaLsType1: 0>, '_RouteCount': 10, '_StartNetworkPrefix': '100.0.0.2', '_PrefixLength': 24, '_Increment': 1, '_EndNetworkPrefix': '100.0.9
.2', '_MetricType': <EnumExtLsaLsMetricType.ExtLsaLsMetricType1: 0>, '_Metric': 1, '_ForwardingAddress': '0.0.0.0', '_RouterTag': 0, '_Options': <EnumOspfv2OptionBit.EBIT: 2>, '_Age': 1, '_SequenceNumber':
2147483649, '_LsaAutomaticConversion': True, '_Checksum': True, '_Name': 'Ospfv2ExternalLsaConfig_1', '_Enable': True, '_ROMTag': '', 'force_auto_sync': True, 'handle': 'Ospfv2ExternalLsaConfig_1', 'lower':
[], 'upper': <renix_py_api.api_gen.Ospfv2ProtocolConfig_Autogen.Ospfv2ProtocolConfig object at 0x0000013D228775E0>, 'relatives': {}}

技巧1:OSPFv2绑定流的源目的端点需要通过LSA对象的get_relatives函数获取,具体方法如下​​​​​​​

>>> # 获取OSPFv2协议绑定流端点对象
>>> DstEndpoint = Ospfv2ExternalLsa.get_relatives('GenerateLsa', direction=EnumRelationDirection.SOURCE)[0]
>>> print(DstEndpoint.__dict__)
{'_NetworkAddress': '100.0.0.2', '_Step': '0.0.1.0', '_PrefixLength': 24, '_NetworkList': [], '_NextHopList': [], '_PrefixLengthList': [], '_Count': 10, '_AddressMode': <EnumAddressMode.RANGE: 0>, '_VrfName
': '', '_VrfHandle': '', '_Name': 'Ospfv2AsExternalRoute_1', '_Enable': True, '_ROMTag': '', 'force_auto_sync': True, 'handle': 'Ospfv2AsExternalRoute_1', 'lower': [], 'upper': None, 'relatives': {}}

技巧2:接口interface绑定流的IPv4源目的端点是IPv4Layer对象,使用方法如下​​​​​​​

>>> # 创建OSPFv2绑定流
>>> binding_stream_command = CreateBindingStreamCommand(SrcEndpointHandles=ipv4layer2.handle, DstEndpointHandles=DstEndpoint.handle, Bidirection=False)
>>> binding_stream_command.execute()
# 创建OSPFv2绑定流
>>> binding_stream_command = CreateBindingStreamCommand(SrcEndpointHandles=ipv4layer1.handle, DstEndpointHandles=DstEndpoint.handle, Bidirection=True)
>>> binding_stream_command.execute()
>>> # 获取创建的绑定流对象的handle
>>> streams_handle = binding_stream_command.BindingStreams
>>> print(streams_handle)
['StreamTemplate_1']

技巧3:通过API的唯一标识handle获取对应的对象使用ROMManager.get_object()  例如: StreamObject = ROMManager.get_object('StreamTemplate_1')​​​​​​​

>>> streams = [ROMManager.get_object(handle) for handle in streams_handle]
>>> print(streams)
[<renix_py_api.api_gen.StreamTemplate_Autogen.StreamTemplate object at 0x0000013D228777C0>]

6.订阅统计​​​​​​​

>>> # 创建OSPFv2会话统计对象
>>> ospf_result_view = PageResultView(upper=sys_entry, DataClassName='Ospfv2SessionResultPropertySet')
>>> ospf_result_query = ResultQuery(upper=ospf_result_view)
>>> # 创建StreamBlockStats统计对象
>>> stream_result_view = PageResultView(upper=sys_entry, DataClassName='StreamBlockStats')
>>> stream_result_query = ResultQuery(upper=stream_result_view)
>>> # 订阅统计
>>> SubscribeResultCommand(ResultViewHandles=[ospf_result_view.handle, stream_result_view.handle]).execute()

7.启动OSPFv2协议,启动Port_2的绑定流StreamTemplate_1

技巧4:停流获取统计必须等待3秒才能获取到稳定统计数据

>>> # 启动协议
>>> StartAllProtocolCommand().execute()
>>> time.sleep(60)
>>> # 发送流量
>>> StartAllStreamCommand().execute()
>>> time.sleep(30)
>>> StopAllStreamCommand().execute()
>>> StopAllProtocolCommand().execute()
>>> # 停流获取统计必须等待3sec才能获取到稳定统计数据
>>> time.sleep(3)

8.查看流量收发包相等,没有丢包

>>> # 获取OSPFv2会话1统计
>>> session_stats = ospf_result_query.get_children('Ospfv2SessionResultPropertySet')
>>> print('TxHello: {}'.format(session_stats[0].TxHello))
TxHello: 10
>>> print('RxHello: {}'.format(session_stats[0].RxHello))
RxHello: 10
>>> # 获取流量StreamTemplate_1的StreamBlockStats统计结果
>>> streamblock_stats = stream_result_query.get_children('StreamBlockStats')
>>> print('TxStreamFrames: {}'.format(streamblock_stats[0].TxStreamFrames))
TxStreamFrames: 24036657
>>> print('RxStreamFrames: {}'.format(streamblock_stats[0].RxStreamFrames))
RxStreamFrames: 24036657

测试后置步骤

释放占用的仪表端口

# 释放端口
ReleasePortCommand(LocationList=['//10.0.11.191/1/15', '//10.0.11.191/1/16'], ForceRelease=True).execute()

总结

脚本语言可以将测试过程编写成脚本,相比手动测试,自动化测试优势在于可以24小时不间断执行测试,能大大提高测试效率,减少人为失误。自动化测试的难点在于脚本开发阶段需要投入比手工测试多出数倍的工作量,而通过学习总结自动化测试中API使用的技巧可以提高自动化开发效率,达到事半功倍的效果。

附录:脚本源码

from renix_py_api.renix import * 

# 初始化Renix
initialize()
# 修改产品类型
sys_entry = get_sys_entry()
sys_entry.ProductType = 'DARYU' # 创建端口
Port_1 = Port(upper=sys_entry, Location='//10.0.11.191/1/15')
Port_2 = Port(upper=sys_entry, Location='//10.0.11.191/1/16')
# 端口上线
BringPortsOnlineCommand(PortList=[Port_1.handle, Port_2.handle]).execute() # 创建接口
interface1 = Interface(upper=Port_1)
# 修改接口类型为IPv4接口
BuildInterfaceCommand(InterfaceList=[interface1.handle], NetworkLayers='eth ipv4').execute() # 修改接口类型IP地址参数
ipv4layer1 = interface1.get_children('Ipv4Layer')[0]
ipv4layer1.edit(Address='192.168.10.2', Gateway='192.168.10.1', PrefixLength='24') # 创建OSPFv2协议会话
Ospfv2Sesson = Ospfv2ProtocolConfig(upper=Port_1)
# OSPFv2协议会话与接口绑定
SelectInterfaceCommand(ProtocolList=[Ospfv2Sesson.handle], InterfaceList=[interface1.handle]).execute() # 创建接口
interface2 = Interface(upper=Port_2)
# 修改接口类型为IPv4接口
BuildInterfaceCommand(InterfaceList=[interface2.handle], NetworkLayers='eth ipv4').execute()
# 修改接口类型IP地址参数
ipv4layer2 = interface2.get_children('Ipv4Layer')[0]
ipv4layer2.edit(Address='192.168.20.2', Gateway='192.168.20.1', PrefixLength='24') # OSPFv2协议会话创建External Lsa
Ospfv2ExternalLsa = Ospfv2ExternalLsaConfig(upper=Ospfv2Sesson, RouteCount=10, StartNetworkPrefix='100.0.0.2', PrefixLength=24) # 创建一条interface->OSPFv2 External的路由绑定流StreamTemplate_1
# 获取OSPFv2协议绑定流端点对象
DstEndpoint = Ospfv2ExternalLsa.get_relatives('GenerateLsa', direction=EnumRelationDirection.SOURCE)[0]
# 创建OSPFv2绑定流
binding_stream_command = CreateBindingStreamCommand(SrcEndpointHandles=ipv4layer2.handle, DstEndpointHandles=DstEndpoint.handle, Bidirection=False)
binding_stream_command.execute() # 获取创建的绑定流对象的handle
streams_handle = binding_stream_command.BindingStreams
# 通过API的唯一标识handle获取对应的对象使用ROMManager.get_object()例如: StreamObject = ROMManager.get_object('StreamTemplate_1')
streams = [ROMManager.get_object(handle) for handle in streams_handle] # 创建OSPFv2会话统计对象
ospf_result_view = PageResultView(upper=sys_entry, DataClassName='Ospfv2SessionResultPropertySet')
ospf_result_query = ResultQuery(upper=ospf_result_view)
# 创建StreamBlockStats统计对象
stream_result_view = PageResultView(upper=sys_entry, DataClassName='StreamBlockStats')
stream_result_query = ResultQuery(upper=stream_result_view)
# 订阅统计
SubscribeResultCommand(ResultViewHandles=[ospf_result_view.handle, stream_result_view.handle]).execute() # 保存配置文件
dirname, tempfilename = os.path.split(os.path.abspath(__file__))
filename, extension = os.path.splitext(tempfilename)
SaveTestCaseCommand(TestCase=f'{dirname}/xcfg/{filename}.xcfg').execute() # 启动协议
StartAllProtocolCommand().execute()
time.sleep(60)
# 发送流量
StartAllStreamCommand().execute()
time.sleep(30)
StopAllStreamCommand().execute()
StopAllProtocolCommand().execute()
# 停流获取统计必须等待3sec才能获取到稳定统计数据
time.sleep(3) # 获取OSPFv2会话1统计
session_stats = ospf_result_query.get_children('Ospfv2SessionResultPropertySet')
print(session_stats[0].__dict__)
TxHello = session_stats[0].TxHello
RxHello = session_stats[0].RxHello
print('TxStreamFrames: {}'.format(TxHello))
print('RxStreamFrames: {}'.format(RxHello))
# 获取流量StreamTemplate_1的StreamBlockStats统计结果
streamblock_stats = stream_result_query.get_children('StreamBlockStats')
print(streamblock_stats[0].__dict__)
TxStreamFrames = streamblock_stats[0].TxStreamFrames
RxStreamFrames = streamblock_stats[0].RxStreamFrames
print('TxStreamFrames: {}'.format(TxStreamFrames))
print('RxStreamFrames: {}'.format(RxStreamFrames)) # 释放端口
ReleasePortCommand(LocationList=['//10.0.11.191/1/15', '//10.0.11.191/1/16'], ForceRelease=True).execute()

信而泰自动化OSPFv2测试小技巧的更多相关文章

  1. IPv6 OSPFv3路由协议测试——信而泰网络测试仪实操

    关键词 IPv6; OSPFv3; OSPFv2. 前言:在网络部署中,动态路由协议是重要的组成部分.良好的路由协议,是保证网络可靠.稳定运行的基础.为了适应IPv6协议栈的变化,OSPFv3协议在保 ...

  2. 基于IPv6的RIPng路由协议测试——信而泰网络测试仪实操

    关键词 IPv6; RIPng; 协议测试; 内部网关协议; 外部网关协议 前言:在国际性网络中,如因特网,拥有很多应用于整个网络的路由选择协议.形成网络的每一个自治系统(AS),都有属于自己的路由选 ...

  3. BGP协议测试—信而泰网络测试仪实操

    关键词  BGP; 协议仿真; 测试原理. 前言:当前信息化时代之下,数据传输已经成为了日常工作和生活必不可少的重要组成部分,网络服务的易得性和可靠性也因此得到广泛关注.这其中负责网络正常工作的诸多协 ...

  4. RFC2544吞吐量测试详细步骤-信而泰Renix软件操作演示

    关键词:RFC1242:RFC2544:吞吐量:吞吐率. 吞吐量概述:吞吐量即吞吐率,这个词首先在RFC1242中被提出,是评估网络设备性能的首要指标,其定义是在设备没有丢帧的情况下的最大的转发速率, ...

  5. IT咨询顾问:一次吐血的项目救火 java或判断优化小技巧 asp.net core Session的测试使用心得 【.NET架构】BIM软件架构02:Web管控平台后台架构 NetCore入门篇:(十一)NetCore项目读取配置文件appsettings.json 使用LINQ生成Where的SQL语句 js_jquery_创建cookie有效期问题_时区问题

    IT咨询顾问:一次吐血的项目救火   年后的一个合作公司上线了一个子业务系统,对接公司内部的单点系统.我收到该公司的技术咨询:项目启动后没有规律的突然无法登录了,重新启动后,登录一断时间后又无法重新登 ...

  6. 不可不知的辅助测试的Fiddler小技巧

    在以前的博文中,时常有分享Fiddler的一些使用技巧,今天再贴下. Fiddler抓包工具使用详解 利用Fiddler拦截接口请求并篡改数据 Fiddler使用过程中容易忽略的小技巧 Mock测试, ...

  7. ISISv6协议测试——信而泰网络测试仪实操

    文章关键词 ISIS协议:路由协议:协议测试: 一.前言: isis是一种与ospf很相似的网络协议(属于动态路由协议),它被应用在巨大规模网络,如运营商以及银行等.同样的它也是基于链路状态算法,支持 ...

  8. BGP4协议测试——信而泰网络测试仪实操

    文章关键词 BGP:路由测试:协议测试:矢量路由协议: 一.前言: BGP是自治系统外部路由协议,用来在AS之间传递路由信息 路径矢量路由协议,从设计上避免了环路的发生 其路由信息中携带了所经过的全部 ...

  9. BGP4+协议测试——信而泰网络测试仪实操

    文章关键词 BGP4+协议:路由协议:协议测试: 一.前言: 为了有效管理高速发展的互联网,而将其划分为多个相对独立的网格,称为自治域(AS).AS之间通过外部网关协议(EGP)来交换网路可达性信息, ...

  10. RFC2544背靠背测试——信而泰Renix测试软件实操

    文章关键词:背靠背测试.合法最小帧间隙.缓存区结构.吞吐量测试. 背靠背测试背景: 随着网络规模的扩大,大量的路由更新消息.频繁的文件传输和数据备份等操作都会导致数据在一段时间内急剧增加,甚至达到该物 ...

随机推荐

  1. python之package定义

    一.简单说明 python是通过module组织代码的,每一个module就是一个python文件,但是modules是通过package来组织的.我们平时在简单测试的时候 一般就是几个Python文 ...

  2. 倒带ChunJun,同心前行|2022年度回顾&2023年共建规划

    ChunJun是一个开始于2018年的批流一体数据集成框架项目,原名FlinkX.2022年2月22日,在FlinkX进行初版开源的整整四年后,技术团队决定对FlinkX进行整体升级,并更名为Chun ...

  3. DRF之过滤类源码分析

    DRF之过滤类源码分析 [一]过滤类介绍及BaseFilterBackend Django REST framework(DRF)中的过滤类允许你在API视图中对查询进行过滤,以根据特定条件筛选结果集 ...

  4. BIO, NIO, AIO 大白话 - 澄澈大学生也能搞懂

    最近天天吃沙县, 就拿沙县分析 BIO Block I/O 沙县分析 相近时间来了4个顾客 顾客 菜品 时间 A 筒骨饭 5min B 茄子肉丝盖饭 7min C 猪脚饭 3min D 茄子肉丝盖饭 ...

  5. Elastic学习之旅 (8) 深入词项和全文搜索

    大家好,我是Edison. 上一篇:Elastic学习之旅 (7) 聚合分析 相信很多童鞋和我一样,有点傻傻分不清Term查询和全文查询的区别,那么今天我们就来一起梳理一下. 基于Term的查询 Te ...

  6. Trie 字典树的原理和应用解析

    如何高效地存储和查找大量字符串或前缀?比如自动补全.拼写检查.敏感词过滤等场景,都对字符串的处理速度有很高要求.哈希表虽然查找快,但并不擅长前缀匹配:普通树结构虽然灵活,但对于大量字符串的处理效率并不 ...

  7. donNet 文件上传下载进度计算(一段代码体现数学在编码中的重要位置)

    上传进度: var 每次成功增加的进度 = Convert.ToDouble(文件已上传大小) / Convert.ToDouble(文件总大小); var 当前进度 = (每次成功增加的进度 *10 ...

  8. antd vue3 图片 手动上传

    <template> <a-upload v-model:file-list="fileList" name="avatar" list-ty ...

  9. leetcode 1047 双出字符串中的相邻元素

    简介 如果能想到栈的话,说明你的基础足够扎实. 我没有想到,我想到的是双向链表.我就是一个弟弟 思路 两个前后指针指向一个双向循环链表,然后判断是否相等相等的话,前一个指针前移,后一个指针后移,中间的 ...

  10. 资深ETL工程师经验分享:ETL项目的5大挑战与策略

    ETL项目的重要性及其复杂性 在我十多年的数据仓库建设经验中,ETL(Extract, Transform, Load)一直是最具挑战性的环节之一.简单来说,ETL就是将分散在各个业务系统中的数据抽取 ...