aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Wallace <dwallacelf@gmail.com>2019-12-16 14:59:02 +0000
committerVratko Polak <vrpolak@cisco.com>2019-12-20 15:30:17 +0000
commit14fdc4a1b6c507cf43309fdce10fbfddbda9f111 (patch)
treee9657f0ad851d66d89dc44fd1b93cf73df73d0a3
parente0f0c32fbc3f73a1120e5bf775c29aa4a9293974 (diff)
Add VPP NSIM Plugin Keywords
Change-Id: I1e080a50a68ded8eebc5e6093c55d06281726684 Signed-off-by: Dave Wallace <dwallacelf@gmail.com>
-rw-r--r--resources/libraries/python/NsimUtil.py82
-rw-r--r--resources/libraries/robot/nsim/nsim.robot62
2 files changed, 144 insertions, 0 deletions
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}
+