diff options
author | Jan Gelety <jgelety@cisco.com> | 2017-12-19 09:15:14 +0100 |
---|---|---|
committer | Jan Gelety <jgelety@cisco.com> | 2018-01-17 16:27:20 +0100 |
commit | 95998a67270ffd72f09ce6f3d43235c723edf36b (patch) | |
tree | 4e56b84fee35fcfb5a84538ec73caeb80eeae007 /resources/libraries/python | |
parent | e81d599029f31fb433089eecf0d160ab01719383 (diff) |
CSIT-675: SRv6 performance tests
- update L1 KWs
- update L2 KWs
- tests with one SID (no SRH insertion)
- tests with two SIDs (SRH inserted) and decapsulation
- tests with two SIDs (SRH inserted) without decapsulation
- enabled packet traces and logged packet traces in the test case
tear down if test failed
Change-Id: I3a0f4c350eed3f42509c6d49e832faa78fe64dbb
Signed-off-by: Jan Gelety <jgelety@cisco.com>
Diffstat (limited to 'resources/libraries/python')
-rw-r--r-- | resources/libraries/python/DUTSetup.py | 31 | ||||
-rw-r--r-- | resources/libraries/python/SRv6.py | 142 |
2 files changed, 93 insertions, 80 deletions
diff --git a/resources/libraries/python/DUTSetup.py b/resources/libraries/python/DUTSetup.py index d76a2f4096..e0479cfb60 100644 --- a/resources/libraries/python/DUTSetup.py +++ b/resources/libraries/python/DUTSetup.py @@ -1,4 +1,4 @@ -# Copyright (c) 2016 Cisco and/or its affiliates. +# Copyright (c) 2018 Cisco and/or its affiliates. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at: @@ -26,7 +26,11 @@ class DUTSetup(object): """Contains methods for setting up DUTs.""" @staticmethod def start_vpp_service_on_all_duts(nodes): - """Start up the VPP service on all nodes.""" + """Start up the VPP service on all nodes. + + :param nodes: Nodes in the topology. + :type nodes: dict + """ ssh = SSH() for node in nodes.values(): if node['type'] == NodeType.DUT: @@ -402,3 +406,26 @@ class DUTSetup(object): if int(ret_code) != 0: raise RuntimeError('Failed to load {0} kernel module on host {1}'. format(module, node['host'])) + + @staticmethod + def vpp_enable_traces_on_all_duts(nodes): + """Enable vpp packet traces on all DUTs in the given topology. + + :param nodes: Nodes in the topology. + :type nodes: dict + """ + for node in nodes.values(): + if node['type'] == NodeType.DUT: + DUTSetup.vpp_enable_traces_on_dut(node) + + @staticmethod + def vpp_enable_traces_on_dut(node): + """Enable vpp packet traces on the DUT node. + + :param node: DUT node to set up. + :type node: dict + """ + + vat = VatExecutor() + vat.execute_script("enable_dpdk_traces.vat", node, json_out=False) + vat.execute_script("enable_vhost_user_traces.vat", node, json_out=False) diff --git a/resources/libraries/python/SRv6.py b/resources/libraries/python/SRv6.py index cafc4a075d..03a55a41ed 100644 --- a/resources/libraries/python/SRv6.py +++ b/resources/libraries/python/SRv6.py @@ -1,4 +1,4 @@ -# Copyright (c) 2017 Cisco and/or its affiliates. +# Copyright (c) 2018 Cisco and/or its affiliates. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at: @@ -13,29 +13,25 @@ """Segment Routing over IPv6 dataplane utilities library.""" -from enum import Enum - from resources.libraries.python.VatExecutor import VatTerminal -from resources.libraries.python.VatJsonUtil import VatJsonUtil from resources.libraries.python.topology import Topology -class SRv6Behaviour(Enum): - """Defines SRv6 endpoint functions implemented in VPP.""" - # Endpoint function - END = 'end' - # Endpoint function with Layer-3 cross-connect - END_X = 'end.x' - # Endpoint with decapsulation and Layer-2 cross-connect - END_DX2 = 'end.dx2' - # Endpoint with decapsulation and IPv4 cross-connect - END_DX4 = 'end.dx4' - # Endpoint with decapsulation and IPv4 table lookup - END_DT4 = 'end.dt4' - # Endpoint with decapsulation and IPv6 cross-connect - END_DX6 = 'end.dx6' - # Endpoint with decapsulation and IPv6 table lookup - END_DT6 = 'end.dt6' +# SRv6 LocalSID supported functions. +# Endpoint function +SRV6BEHAVIOUR_END = 'end' +# Endpoint function with Layer-3 cross-connect +SRV6BEHAVIOUR_END_X = 'end.x' +# Endpoint with decapsulation and Layer-2 cross-connect +SRV6BEHAVIOUR_END_DX2 = 'end.dx2' +# Endpoint with decapsulation and IPv4 cross-connect +SRV6BEHAVIOUR_END_DX4 = 'end.dx4' +# Endpoint with decapsulation and IPv4 table lookup +SRV6BEHAVIOUR_END_DT4 = 'end.dt4' +# Endpoint with decapsulation and IPv6 cross-connect +SRV6BEHAVIOUR_END_DX6 = 'end.dx6' +# Endpoint with decapsulation and IPv6 table lookup +SRV6BEHAVIOUR_END_DT6 = 'end.dt6' class SRv6(object): @@ -68,21 +64,21 @@ class SRv6(object): :raises ValueError: If unsupported SRv6 LocalSID function used or required parameter is missing. """ - if behavior == SRv6Behaviour.END: + if behavior == SRV6BEHAVIOUR_END: params = '' - elif behavior in [SRv6Behaviour.END_X, SRv6Behaviour.END_DX4, - SRv6Behaviour.END_DX6]: + elif behavior in [SRV6BEHAVIOUR_END_X, SRV6BEHAVIOUR_END_DX4, + SRV6BEHAVIOUR_END_DX6]: if interface is None or next_hop is None: raise ValueError('Required data missing.\ninterface:{0}\n' 'next_hop:{1}'.format(interface, next_hop)) interface_name = Topology.get_interface_name(node, interface) params = '{0} {1}'.format(interface_name, next_hop) - elif behavior == SRv6Behaviour.END_DX2: + elif behavior == SRV6BEHAVIOUR_END_DX2: if interface is None: raise ValueError('Required data missing.\ninterface:{0}\n'. format(interface)) params = '{0}'.format(interface) - elif behavior in [SRv6Behaviour.END_DT4, SRv6Behaviour.END_DT6]: + elif behavior in [SRV6BEHAVIOUR_END_DT4, SRV6BEHAVIOUR_END_DT6]: if fib_table is None: raise ValueError('Required data missing.\nfib_table:{0}\n'. format(fib_table)) @@ -91,15 +87,14 @@ class SRv6(object): raise ValueError('Unsupported SRv6 LocalSID function: {0}'. format(behavior)) - with VatTerminal(node) as vat: - resp = vat.vat_terminal_exec_cmd_from_template( + with VatTerminal(node, json_param=False) as vat: + vat.vat_terminal_exec_cmd_from_template( 'srv6/sr_localsid_add.vat', local_sid=local_sid, behavior=behavior, params=params) - VatJsonUtil.verify_vat_retval( - resp[0], - err_msg='Create SRv6 LocalSID {0} failed on node {1}'.format( - local_sid, node['host'])) + if "exec error: Misc" in vat.vat_stdout: + raise RuntimeError('Create SRv6 LocalSID {0} failed on node {1}'. + format(local_sid, node['host'])) @staticmethod def delete_sr_localsid(node, local_sid): @@ -110,14 +105,13 @@ class SRv6(object): :type node: dict :type local_sid: str """ - with VatTerminal(node) as vat: - resp = vat.vat_terminal_exec_cmd_from_template( + with VatTerminal(node, json_param=False) as vat: + vat.vat_terminal_exec_cmd_from_template( 'srv6/sr_localsid_del.vat', local_sid=local_sid) - VatJsonUtil.verify_vat_retval( - resp[0], - err_msg='Delete SRv6 LocalSID {0} failed on node {1}'.format( - local_sid, node['host'])) + if "exec error: Misc" in vat.vat_stdout: + raise RuntimeError('Delete SRv6 LocalSID {0} failed on node {1}'. + format(local_sid, node['host'])) @staticmethod def show_sr_localsids(node): @@ -126,7 +120,7 @@ class SRv6(object): :param node: Given node to show localSIDs on. :type node: dict """ - with VatTerminal(node) as vat: + with VatTerminal(node, json_param=False) as vat: vat.vat_terminal_exec_cmd_from_template( 'srv6/sr_localsids_show.vat') @@ -145,15 +139,14 @@ class SRv6(object): """ sid_conf = 'next ' + ' next '.join(sid_list) - with VatTerminal(node) as vat: - resp = vat.vat_terminal_exec_cmd_from_template( + with VatTerminal(node, json_param=False) as vat: + vat.vat_terminal_exec_cmd_from_template( 'srv6/sr_policy_add.vat', bsid=bsid, sid_conf=sid_conf, mode=mode) - VatJsonUtil.verify_vat_retval( - resp[0], - err_msg='Create SRv6 policy for BindingSID {0} failed on node ' - '{1}'.format(bsid, node['host'])) + if "exec error: Misc" in vat.vat_stdout: + raise RuntimeError('Create SRv6 policy for BindingSID {0} failed on' + ' node {1}'.format(bsid, node['host'])) @staticmethod def delete_sr_policy(node, bsid): @@ -164,14 +157,13 @@ class SRv6(object): :type node: dict :type bsid: str """ - with VatTerminal(node) as vat: - resp = vat.vat_terminal_exec_cmd_from_template( + with VatTerminal(node, json_param=False) as vat: + vat.vat_terminal_exec_cmd_from_template( 'srv6/sr_policy_del.vat', bsid=bsid) - VatJsonUtil.verify_vat_retval( - resp[0], - err_msg='Delete SRv6 policy for BindingSID {0} failed on node ' - '{1}'.format(bsid, node['host'])) + if "exec error: Misc" in vat.vat_stdout: + raise RuntimeError('Delete SRv6 policy for BindingSID {0} failed on' + ' node {1}'.format(bsid, node['host'])) @staticmethod def show_sr_policies(node): @@ -186,7 +178,7 @@ class SRv6(object): @staticmethod def configure_sr_steer(node, mode, bsid, interface=None, ip_addr=None, - mask=None): + prefix=None): """Create SRv6 steering policy on the given node. :param node: Given node to create steering policy on. @@ -196,38 +188,38 @@ class SRv6(object): L2 mode). :param ip_addr: IPv4/IPv6 address (Optional, required in case of L3 mode). - :param mask: IP address mask (Optional, required in case of L3 mode). + :param prefix: IP address prefix (Optional, required in case of L3 + mode). :type node: dict :type mode: str :type bsid: str :type interface: str - :type ip_addr: int - :type mask: int + :type ip_addr: str + :type prefix: int :raises ValueError: If unsupported mode used or required parameter is missing. """ - if mode == 'l2': + if mode.lower() == 'l2': if interface is None: raise ValueError('Required data missing.\ninterface:{0}\n'. format(interface)) interface_name = Topology.get_interface_name(node, interface) params = 'l2 {0}'.format(interface_name) - elif mode == 'l3': - if ip_addr is None or mask is None: + elif mode.lower() == 'l3': + if ip_addr is None or prefix is None: raise ValueError('Required data missing.\nIP address:{0}\n' - 'mask:{1}'.format(ip_addr, mask)) - params = '{0}/{1}'.format(ip_addr, mask) + 'mask:{1}'.format(ip_addr, prefix)) + params = 'l3 {0}/{1}'.format(ip_addr, prefix) else: raise ValueError('Unsupported mode: {0}'.format(mode)) - with VatTerminal(node) as vat: - resp = vat.vat_terminal_exec_cmd_from_template( + with VatTerminal(node, json_param=False) as vat: + vat.vat_terminal_exec_cmd_from_template( 'srv6/sr_steer_add_del.vat', params=params, bsid=bsid) - VatJsonUtil.verify_vat_retval( - resp[0], - err_msg='Create SRv6 steering policy for BindingSID {0} failed on ' - 'node {1}'.format(bsid, node['host'])) + if "exec error: Misc" in vat.vat_stdout: + raise RuntimeError('Create SRv6 steering policy for BindingSID {0}' + ' failed on node {1}'.format(bsid, node['host'])) @staticmethod def delete_sr_steer(node, mode, bsid, interface=None, ip_addr=None, @@ -266,14 +258,13 @@ class SRv6(object): else: raise ValueError('Unsupported mode: {0}'.format(mode)) - with VatTerminal(node) as vat: - resp = vat.vat_terminal_exec_cmd_from_template( + with VatTerminal(node, json_param=False) as vat: + vat.vat_terminal_exec_cmd_from_template( 'srv6/sr_steer_add_del.vat', params=params, bsid=bsid) - VatJsonUtil.verify_vat_retval( - resp[0], - err_msg='Delete SRv6 policy for bsid {0} failed on node {1}'.format( - bsid, node['host'])) + if "exec error: Misc" in vat.vat_stdout: + raise RuntimeError('Delete SRv6 policy for bsid {0} failed on node' + ' {1}'.format(bsid, node['host'])) @staticmethod def show_sr_steering_policies(node): @@ -295,11 +286,6 @@ class SRv6(object): :type node: dict :type ip6_addr: str """ - with VatTerminal(node) as vat: - resp = vat.vat_terminal_exec_cmd_from_template( + with VatTerminal(node, json_param=False) as vat: + vat.vat_terminal_exec_cmd_from_template( 'srv6/sr_set_encaps_source.vat', ip6_addr=ip6_addr) - - VatJsonUtil.verify_vat_retval( - resp[0], - err_msg='Set SRv6 encapsulation source address {0} failed on node' - ' {1}'.format(ip6_addr, node['host'])) |