From 14fdc4a1b6c507cf43309fdce10fbfddbda9f111 Mon Sep 17 00:00:00 2001 From: Dave Wallace Date: Mon, 16 Dec 2019 14:59:02 +0000 Subject: [PATCH] Add VPP NSIM Plugin Keywords Change-Id: I1e080a50a68ded8eebc5e6093c55d06281726684 Signed-off-by: Dave Wallace --- resources/libraries/python/NsimUtil.py | 82 +++++++++++++++++++++++++++++++ resources/libraries/robot/nsim/nsim.robot | 62 +++++++++++++++++++++++ 2 files changed, 144 insertions(+) create mode 100644 resources/libraries/python/NsimUtil.py create mode 100644 resources/libraries/robot/nsim/nsim.robot diff --git a/resources/libraries/python/NsimUtil.py b/resources/libraries/python/NsimUtil.py new file mode 100644 index 0000000000..9d60a911b1 --- /dev/null +++ b/resources/libraries/python/NsimUtil.py @@ -0,0 +1,82 @@ +# Copyright (c) 2019 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: +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""VPP Network Simulator Plugin util library.""" + +from robot.api import logger + +from resources.libraries.python.Constants import Constants +from resources.libraries.python.PapiExecutor import PapiSocketExecutor +from resources.libraries.python.InterfaceUtil import InterfaceUtil + + +class NsimUtil(object): + """VPP NSIM Plugin Keywords.""" + + @staticmethod + def configure_vpp_nsim(node, vpp_nsim_attr, interface0, interface1=None): + """Configure nsim on the specified VPP node. + + :param node: Topology node. + :param vpp_nsim_attr: VPP NSIM configuration attributes + :param interface0: Interface name. + :param interface1: 2nd Interface name for cross-connect feature + :type node: dict + :type vpp_nsim_attr: dict + :type interface0: string or int + :type interface1: string or int + :raises RuntimeError: if no NSIM features are enabled or + vpp papi command fails. + """ + host = node[u"host"] + if vpp_nsim_attr[u"output_feature_enable"] == False \ + and vpp_nsim_attr[u"cross_connect_feature_enable"] == False: + raise RuntimeError(f"No NSIM features enabled on host {host}:\n" + f"vpp_nsim_attr = {vpp_nsim_attr}") + cmd = u"nsim_configure" + args = dict( + delay_in_usec=vpp_nsim_attr[u"delay_in_usec"], + average_packet_size=vpp_nsim_attr[u"average_packet_size"], + bandwidth_in_bits_per_second=vpp_nsim_attr[ + u"bandwidth_in_bits_per_second" + ], + packets_per_drop=vpp_nsim_attr[u"packets_per_drop"], + ) + err_msg = f"Failed to configure NSIM on host {host}" + with PapiSocketExecutor(node) as papi_exec: + papi_exec.add(cmd, **args).get_reply(err_msg) + + if vpp_nsim_attr[u"output_feature_enable"] == True: + cmd = u"nsim_output_feature_enable_disable" + args = dict( + enable_disable=vpp_nsim_attr[u"output_feature_enable"], + sw_if_index=InterfaceUtil.get_interface_index(node, interface0), + ) + err_msg = f"Failed to enable NSIM output feature on " \ + f"host {host} interface {interface0}" + with PapiSocketExecutor(node) as papi_exec: + papi_exec.add(cmd, **args).get_reply(err_msg) + + elif vpp_nsim_attr[u"cross_connect_feature_enable"] == True: + cmd = u"nsim_cross_connect_feature_enable_disable" + args = dict( + enable_disable=vpp_nsim_attr[u"cross_connect_feature_enable"], + sw_if_index0=InterfaceUtil.get_interface_index(node, + interface0), + sw_if_index1=InterfaceUtil.get_interface_index(node, + interface1), + ) + err_msg = f"Failed to enable NSIM output feature on " \ + f"host {host} interface {interface0}" + with PapiSocketExecutor(node) as papi_exec: + papi_exec.add(cmd, **args).get_reply(err_msg) diff --git a/resources/libraries/robot/nsim/nsim.robot b/resources/libraries/robot/nsim/nsim.robot new file mode 100644 index 0000000000..7f51310055 --- /dev/null +++ b/resources/libraries/robot/nsim/nsim.robot @@ -0,0 +1,62 @@ +# Copyright (c) 2019 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: +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +*** Settings *** +| Library | resources.libraries.python.NsimUtil +| +| Documentation | L2 keywords to set up VPP Network Simulator to test hoststack. + +*** Variables *** +| &{vpp_nsim_attr}= +| ... | delay_in_usec=${1} +| ... | average_packet_size=${1500} +| ... | bandwidth_in_bits_per_second=${40000000000} +| ... | packets_per_drop=${0} +| ... | output_feature_enable=${False} +| ... | cross_connect_feature_enable=${False} + +*** Keywords *** +| Set VPP NSIM Attributes +| | [Documentation] +| | ... | Set the VPP NSIM attributes in the +| | ... | vpp_nsim_attr dictionary. +| | +| | ... | *Arguments:* +| | ... | - ${delay_in_usec} - Delay in Microseconds Type: Int +| | ... | - ${average_packet_size} - Average packet size Type: Int +| | ... | - ${bandwidth_in_bits_per_second} - Bandwidth of output interface Type: Int +| | ... | - ${pkts_per_drop} - Number of packets to drop Type: Int +| | ... | - ${output_feature_enable} - Enable/Disable NSIM Output Feature Type: Int +| | ... | - ${cross_connect_feature_enable} - Enable/Disable NSIM Cross Connect +| | ... | Feature Type: Int +| | +| | ... | *Example:* +| | +| | ... | \| Set VPP NSIM Attributes \| output_feature_enable=${True} \| +| | ... | \| packets_per_drop=${pkts_per_drop} \| +| | +| | [Arguments] +| | ... | ${delay_in_usec}=${vpp_nsim_attr.delay_in_usec} +| | ... | ${average_packet_size}=${vpp_nsim_attr.average_packet_size} +| | ... | ${bandwidth_in_bits_per_second}=${vpp_nsim_attr.bandwidth_in_bits_per_second} +| | ... | ${packets_per_drop}=${vpp_nsim_attr.packets_per_drop} +| | ... | ${output_feature_enable}=${vpp_nsim_attr.output_feature_enable} +| | ... | ${cross_connect_feature_enable}=${vpp_nsim_attr.cross_connect_feature_enable} +| | +| | Set To Dictionary | ${vpp_nsim_attr} | delay_in_usec | ${delay_in_usec} +| | Set To Dictionary | ${vpp_nsim_attr} | average_packet_size | ${average_packet_size} +| | Set To Dictionary | ${vpp_nsim_attr} | bandwidth_in_bits_per_second | ${bandwidth_in_bits_per_second} +| | Set To Dictionary | ${vpp_nsim_attr} | packets_per_drop | ${packets_per_drop} +| | Set To Dictionary | ${vpp_nsim_attr} | output_feature_enable | ${output_feature_enable} +| | Set To Dictionary | ${vpp_nsim_attr} | cross_connect_feature_enable | ${cross_connect_feature_enable} + -- 2.16.6