From bdfca054d8425a57496cca8308da36c118b5340f Mon Sep 17 00:00:00 2001 From: Jan Gelety Date: Mon, 14 Aug 2017 16:25:46 +0200 Subject: CSIT-778: Add mac-ip binding acl l2bd perf test Change-Id: Iaced68458b0e4070f861be7854ee428ae8ca4e13 Signed-off-by: Jan Gelety --- resources/libraries/python/IPUtil.py | 24 +++++ resources/libraries/python/L2Util.py | 26 +++++ .../performance/performance_configuration.robot | 107 ++++++++++----------- .../robot/performance/performance_setup.robot | 5 +- 4 files changed, 104 insertions(+), 58 deletions(-) (limited to 'resources/libraries') diff --git a/resources/libraries/python/IPUtil.py b/resources/libraries/python/IPUtil.py index 4bd8869cb6..d2f2adcf28 100644 --- a/resources/libraries/python/IPUtil.py +++ b/resources/libraries/python/IPUtil.py @@ -24,6 +24,30 @@ from resources.libraries.python.topology import Topology class IPUtil(object): """Common IP utilities""" + @staticmethod + def ip_to_int(ip_str): + """Convert IP address from string format (e.g. 10.0.0.1) to integer + representation (167772161). + + :param ip_str: IP address in string representation. + :type ip_str: str + :returns: Integer representation of IP address. + :rtype: int + """ + return int(ip_address(unicode(ip_str))) + + @staticmethod + def int_to_ip(ip_int): + """Convert IP address from integer representation (e.g. 167772161) to + string format (10.0.0.1). + + :param ip_int: IP address in integer representation. + :type ip_int: int + :returns: String representation of IP address. + :rtype: str + """ + return str(ip_address(ip_int)) + @staticmethod def vpp_ip_probe(node, interface, addr, if_type="key"): """Run ip probe on VPP node. diff --git a/resources/libraries/python/L2Util.py b/resources/libraries/python/L2Util.py index a909e8611b..6b8bc042e3 100644 --- a/resources/libraries/python/L2Util.py +++ b/resources/libraries/python/L2Util.py @@ -13,6 +13,8 @@ """L2 Utilities Library.""" +from textwrap import wrap + from robot.api.deco import keyword from resources.libraries.python.topology import Topology @@ -23,6 +25,30 @@ from resources.libraries.python.ssh import exec_cmd_no_error class L2Util(object): """Utilities for l2 configuration.""" + @staticmethod + def mac_to_int(mac_str): + """Convert MAC address from string format (e.g. 01:02:03:04:05:06) to + integer representation (1108152157446). + + :param mac_str: MAC address in string representation. + :type mac_str: str + :returns: Integer representation of MAC address. + :rtype: int + """ + return int(mac_str.replace(':', ''), 16) + + @staticmethod + def int_to_mac(mac_int): + """Convert MAC address from integer representation (e.g. 1108152157446) + to string format (01:02:03:04:05:06). + + :param mac_int: MAC address in integer representation. + :type mac_int: str + :returns: String representation of MAC address. + :rtype: int + """ + return ':'.join(wrap("{:012x}".format(mac_int), width=2)) + @staticmethod def vpp_add_l2fib_entry(node, mac, interface, bd_id): """ Create a static L2FIB entry on a vpp node. diff --git a/resources/libraries/robot/performance/performance_configuration.robot b/resources/libraries/robot/performance/performance_configuration.robot index cdd3c9d02b..7db6577095 100644 --- a/resources/libraries/robot/performance/performance_configuration.robot +++ b/resources/libraries/robot/performance/performance_configuration.robot @@ -22,6 +22,8 @@ | Library | resources.libraries.python.TrafficGenerator | Library | resources.libraries.python.TrafficGenerator.TGDropRateSearchImpl | Library | resources.libraries.python.Classify +| Library | resources.libraries.python.IPUtil +| Library | resources.libraries.python.L2Util | Resource | resources/libraries/robot/shared/default.robot | Resource | resources/libraries/robot/shared/interfaces.robot | Resource | resources/libraries/robot/shared/counters.robot @@ -934,10 +936,6 @@ | | ... | \| GigabitEthernet0/8/0 \| | | ... | | ... | _NOTE:_ This KW uses following test case variables: -| | ... | - ${tg_if1_mac} - MAC address of TG interface towards DUT1. -| | ... | Type: string -| | ... | - ${tg_if2_mac} - MAC address of TG interface towards DUT2. -| | ... | Type: string | | ... | - ${src_ip_start} - Source IP address start. Type: string | | ... | - ${ip_step} - IP address step. Type: string | | ... | - ${src_mac_start} - Source MAC address start in format with colons. @@ -949,62 +947,67 @@ | | ... | Type: integer | | ... | - ${acl_action} - Action for the rule - deny, permit, permit+reflect. | | ... | Type: string -| | ... | - ${trex_stream1_subnet} - IP subnet used by T-Rex in direction 0->1. +| | ... | - ${tg_stream1_subnet} - IP subnet used by TG in direction 0->1. | | ... | Type: string -| | ... | - ${trex_stream2_subnet} - IP subnet used by T-Rex in direction 1->0. +| | ... | - ${tg_stream2_subnet} - IP subnet used by TG in direction 1->0. +| | ... | Type: string +| | ... | - ${tg_stream1_mac} - Source MAC address of traffic stream 1. +| | ... | Type: string +| | ... | - ${tg_stream2_mac} - Source MAC address of traffic stream 2. | | ... | Type: string | | ... | - ${tg_mac_mask} - MAC address mask for traffic streams. | | ... | 00:00:00:00:00:00 is a wildcard mask. Type: string | | ... | | [Arguments] | ${dut} | ${dut_if1}=${None} | ${dut_if2}=${None} -| | ${src_ip_int} = | Evaluate -| | ... | int(ipaddress.ip_address(unicode($src_ip_start))) - $ip_step -| | ... | modules=ipaddress +| | ... +| | ${src_ip_int} = | IP To Int | ${src_ip_start} +| | ${src_ip_int} = | Evaluate | ${src_ip_int} - ${ip_step} +| | ... | | ${ip_limit} = | Set Variable | 255.255.255.255 -| | ${ip_limit_int} = | Evaluate -| | ... | int(ipaddress.ip_address(unicode($ip_limit))) | modules=ipaddress -| | ${src_mac_int} = | Evaluate -| | ... | int($src_mac_start.replace(':', ''), 16) - $src_mac_step +| | ${ip_limit_int} = | IP To Int | ${ip_limit} +| | ... +| | ${src_mac_int} = | Mac To Int | ${src_mac_start} +| | ${src_mac_int} = | Evaluate | ${src_mac_int} - ${src_mac_step} +| | ... | | ${mac_limit} = | Set Variable | ff:ff:ff:ff:ff:ff -| | ${mac_limit_int} = | Evaluate -| | ... | int($mac_limit.replace(':', ''), 16) +| | ${mac_limit_int} = | Mac To Int | ${mac_limit} +| | ... | | ${acl}= | Set Variable | ipv4 permit | | :FOR | ${nr} | IN RANGE | 0 | ${no_hit_aces_number} -| | | ${src_ip_int} = | Evaluate | $src_ip_int + $ip_step -| | | ${src_mac_int} = | Evaluate | $src_mac_int + $src_mac_step -| | | ${ipv4_limit_reached}= | Set Variable If -| | | ... | $src_ip_int > $ip_limit_int | ${True} -| | | ${mac_limit_reached}= | Set Variable If -| | | ... | $src_mac_int > $mac_limit_int | ${True} -| | | Run Keyword If | $ipv4_limit_reached is True | Log -| | | ... | Can't do more iterations - IPv4 address limit has been reached. -| | | ... | WARN -| | | Run Keyword If | $mac_limit_reached is True | Log -| | | ... | Can't do more iterations - MAC address limit has been reached. -| | | ... | WARN -| | | ${src_ip} = | Run Keyword If | $ipv4_limit_reached is True -| | | ... | Set Variable | ${ip_limit} -| | | ... | ELSE | Evaluate | str(ipaddress.ip_address($src_ip_int)) -| | | ... | modules=ipaddress -| | | ${src_mac}= | Run Keyword If | $mac_limit_reached is True -| | | ... | Set Variable | ${mac_limit} -| | | ... | ELSE | Evaluate -| | | ... | ':'.join(textwrap.wrap("{:012x}".format($src_mac_int), width=2)) -| | | ... | modules=textwrap -| | | ${acl}= | Catenate | ${acl} | ip ${src_ip}/32 -| | | ... | mac ${src_mac} | mask ${src_mac_mask}, -| | | Exit For Loop If -| | | ... | $ipv4_limit_reached is True or $mac_limit_reached is True -| | ${acl}= | Catenate | ${acl} -| | ... | ipv4 ${acl_action} ip ${trex_stream1_subnet} mac ${tg_if1_mac} -| | ... | mask ${tg_mac_mask}, -| | ... | ipv4 ${acl_action} ip ${trex_stream2_subnet} mac ${tg_if2_mac} -| | ... | mask ${tg_mac_mask} -| | Add Macip Acl Multi Entries | ${dut} | rules=${acl} +| | | ${src_ip_int} = | Evaluate | ${src_ip_int} + ${ip_step} +| | | ${src_mac_int} = | Evaluate | ${src_mac_int} + ${src_mac_step} +| | | ${ipv4_limit_reached}= | Set Variable If +| | | ... | ${src_ip_int} > ${ip_limit_int} | ${TRUE} +| | | ${mac_limit_reached}= | Set Variable If +| | | ... | ${src_mac_int} > ${mac_limit_int} | ${TRUE} +| | | Run Keyword If | '${ipv4_limit_reached}' == '${TRUE}' | Log +| | | ... | Can't do more iterations - IPv4 address limit has been reached. +| | | ... | WARN +| | | Run Keyword If | '${mac_limit_reached}' == '${TRUE}' | Log +| | | ... | Can't do more iterations - MAC address limit has been reached. +| | | ... | WARN +| | | ${src_ip} = | Run Keyword If | '${ipv4_limit_reached}' == '${TRUE}' +| | | ... | Set Variable | ${ip_limit} +| | | ... | ELSE | Int To IP | ${src_ip_int} +| | | ${src_mac}= | Run Keyword If | '${mac_limit_reached}' == '${TRUE}' +| | | ... | Set Variable | ${mac_limit} +| | | ... | ELSE | Int To Mac | ${src_mac_int} +| | | ${acl}= | Catenate | ${acl} | ip ${src_ip}/32 +| | | ... | mac ${src_mac} | mask ${src_mac_mask}, +| | | Exit For Loop If | '${ipv4_limit_reached}' == '${TRUE}' or '${mac_limit_reached}' == '${TRUE}' +| | ${acl0}= | Catenate | ${acl} +| | ... | ipv4 ${acl_action} ip ${tg_stream1_subnet} mac ${tg_stream1_mac} +| | ... | mask ${tg_mac_mask} +| | ${acl1}= | Catenate | ${acl} +| | ... | ipv4 ${acl_action} ip ${tg_stream2_subnet} mac ${tg_stream2_mac} +| | ... | mask ${tg_mac_mask} +| | Add Macip Acl Multi Entries | ${dut} | rules=${acl0} +| | Add Macip Acl Multi Entries | ${dut} | rules=${acl1} | | ${acl_idx}= | Set Variable | 0 -| | Run Keyword If | $dut_if1 is not None +| | Run Keyword Unless | '${dut_if1}' == '${NONE}' | | ... | Add Del Macip Acl Interface | ${dut} | ${dut_if1} | add | ${acl_idx} -| | Run Keyword If | $dut_if2 is not None +| | ${acl_idx}= | Set Variable | 1 +| | Run Keyword Unless | '${dut_if2}' == '${NONE}' | | ... | Add Del Macip Acl Interface | ${dut} | ${dut_if2} | add | ${acl_idx} | Initialize L2 bridge domain with MACIP ACLs on DUT1 in 3-node circular topology @@ -1033,17 +1036,9 @@ | | ... | - ${dut2_if1} - DUT2 interface towards DUT1. | | ... | - ${dut2_if2} - DUT2 interface towards TG. | | ... -| | ... | _NOTE 2:_ This KW sets following test case variables: -| | ... | - ${tg_if1_mac} - MAC address of TG interface towards DUT1. -| | ... | - ${tg_if2_mac} - MAC address of TG interface towards DUT2. -| | ... | | Configure L2BD forwarding | ${dut1} | ${dut1_if1} | ${dut1_if2} | | Configure L2XC | ${dut2} | ${dut2_if1} | ${dut2_if2} | | All Vpp Interfaces Ready Wait | ${nodes} -| | ${tg_if1_mac}= | Get Interface MAC | ${tg} | ${tg_if1} -| | Set Test Variable | ${tg_if1_mac} -| | ${tg_if2_mac}= | Get Interface MAC | ${tg} | ${tg_if2} -| | Set Test Variable | ${tg_if2_mac} | | Configure MACIP ACLs | ${dut1} | ${dut1_if1} | ${dut1_if2} | Initialize L2 bridge domains with Vhost-User in 3-node circular topology diff --git a/resources/libraries/robot/performance/performance_setup.robot b/resources/libraries/robot/performance/performance_setup.robot index 73643dac68..0dc7f78b45 100644 --- a/resources/libraries/robot/performance/performance_setup.robot +++ b/resources/libraries/robot/performance/performance_setup.robot @@ -602,5 +602,6 @@ | | ... | | Tear down performance discovery test | ${rate} | ${framesize} | | ... | ${traffic_profile} -| | Vpp Log Macip Acl Settings | ${dut1} -| | Vpp Log Macip Acl Interface Assignment | ${dut1} +| | Run Keyword And Ignore Error | Vpp Log Macip Acl Settings | ${dut1} +| | Run Keyword And Ignore Error +| | ... | Vpp Log Macip Acl Interface Assignment | ${dut1} -- cgit 1.2.3-korg