Add VPP NSIM Plugin Keywords 19/24019/4
authorDave Wallace <dwallacelf@gmail.com>
Mon, 16 Dec 2019 14:59:02 +0000 (14:59 +0000)
committerVratko Polak <vrpolak@cisco.com>
Fri, 20 Dec 2019 15:30:17 +0000 (15:30 +0000)
Change-Id: I1e080a50a68ded8eebc5e6093c55d06281726684
Signed-off-by: Dave Wallace <dwallacelf@gmail.com>
resources/libraries/python/NsimUtil.py [new file with mode: 0644]
resources/libraries/robot/nsim/nsim.robot [new file with mode: 0644]

diff --git a/resources/libraries/python/NsimUtil.py b/resources/libraries/python/NsimUtil.py
new file mode 100644 (file)
index 0000000..9d60a91
--- /dev/null
@@ -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 (file)
index 0000000..7f51310
--- /dev/null
@@ -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}
+