X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=resources%2Flibraries%2Fpython%2FNsimUtil.py;fp=resources%2Flibraries%2Fpython%2FNsimUtil.py;h=9d60a911b18bcde66f3ddfbbd84760a96cbdc1da;hb=14fdc4a1b6c507cf43309fdce10fbfddbda9f111;hp=0000000000000000000000000000000000000000;hpb=e0f0c32fbc3f73a1120e5bf775c29aa4a9293974;p=csit.git 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)