aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTibor Frank <tifrank@cisco.com>2019-01-23 10:59:29 +0100
committerTibor Frank <tifrank@cisco.com>2019-01-23 14:45:09 +0000
commit8bac97fb07e863573f5a2914058e1d23229d279b (patch)
tree4fdf647edfe51a72eece45fce70822ef4d4321b9
parent12b5c1d2de914e8aabb62587028e4e92fd298173 (diff)
Fix PyLint errors
Change-Id: I5a369f4b9f9b478375fda4a634bf57cc9623e972 Signed-off-by: Tibor Frank <tifrank@cisco.com>
-rw-r--r--resources/libraries/python/ContainerUtils.py18
-rw-r--r--resources/libraries/python/DPDK/L3fwdTest.py25
-rw-r--r--resources/libraries/python/DropRateSearch.py36
-rw-r--r--resources/libraries/python/MLRsearch/NdrPdrResult.py5
-rw-r--r--resources/libraries/python/MLRsearch/ReceiveRateInterval.py5
-rw-r--r--resources/libraries/python/Routing.py104
-rw-r--r--resources/libraries/python/VPPUtil.py4
-rw-r--r--resources/libraries/python/honeycomb/HcAPIKwACL.py15
-rw-r--r--resources/libraries/python/honeycomb/Netconf.py6
-rw-r--r--resources/libraries/python/honeycomb/Notifications.py6
-rw-r--r--resources/libraries/python/ssh.py12
-rw-r--r--resources/libraries/robot/honeycomb/access_control_lists.robot21
12 files changed, 101 insertions, 156 deletions
diff --git a/resources/libraries/python/ContainerUtils.py b/resources/libraries/python/ContainerUtils.py
index 5fa0a575e9..11bb964665 100644
--- a/resources/libraries/python/ContainerUtils.py
+++ b/resources/libraries/python/ContainerUtils.py
@@ -183,9 +183,9 @@ class ContainerManager(object):
container_vat_template,
mid1=mid1, mid2=mid2, sid1=sid1, sid2=sid2,
socket1='{dir}/memif-{c_name}-{sid}'.
- format(c_name=c_name, sid=sid1, dir=guest_dir),
+ format(c_name=c_name, sid=sid1, dir=guest_dir),
socket2='{dir}/memif-{c_name}-{sid}'.
- format(c_name=c_name, sid=sid2, dir=guest_dir))
+ format(c_name=c_name, sid=sid2, dir=guest_dir))
elif chain_topology == 'cross_horiz':
if mod > 1:
raise RuntimeError('Container chain topology {topology} '
@@ -206,21 +206,21 @@ class ContainerManager(object):
c_name = self.engine.container.name
guest_dir = self.engine.container.mnt[0].split(':')[1]
if 'DUT1' in self.engine.container.name:
- if_pci = Topology.get_interface_pci_addr( \
+ if_pci = Topology.get_interface_pci_addr(
self.engine.container.node, dut1_if)
- if_name = Topology.get_interface_name( \
+ if_name = Topology.get_interface_name(
self.engine.container.node, dut1_if)
if 'DUT2' in self.engine.container.name:
- if_pci = Topology.get_interface_pci_addr( \
+ if_pci = Topology.get_interface_pci_addr(
self.engine.container.node, dut2_if)
- if_name = Topology.get_interface_name( \
+ if_name = Topology.get_interface_name(
self.engine.container.node, dut2_if)
self.engine.create_vpp_startup_config_dpdk_dev(if_pci)
self.engine.create_vpp_exec_config(
container_vat_template,
mid1=mid1, sid1=sid1, if_name=if_name,
socket1='{dir}/memif-{c_name}-{sid}'.
- format(c_name=c_name, sid=sid1, dir=guest_dir))
+ format(c_name=c_name, sid=sid1, dir=guest_dir))
elif chain_topology == 'chain_functional':
for i, container in enumerate(self.containers):
mid1 = i % mod + 1
@@ -236,9 +236,9 @@ class ContainerManager(object):
container_vat_template,
mid1=mid1, mid2=mid2, sid1=sid1, sid2=sid2,
socket1='{dir}/memif-{c_name}-{sid}'.
- format(c_name=c_name, sid=sid1, dir=guest_dir),
+ format(c_name=c_name, sid=sid1, dir=guest_dir),
socket2='{dir}/memif-{c_name}-{sid}'.
- format(c_name=c_name, sid=sid2, dir=guest_dir),
+ format(c_name=c_name, sid=sid2, dir=guest_dir),
rx_mode=memif_rx_mode)
else:
raise RuntimeError('Container topology {topology} not implemented'.
diff --git a/resources/libraries/python/DPDK/L3fwdTest.py b/resources/libraries/python/DPDK/L3fwdTest.py
index 84c623e716..d4b9f16197 100644
--- a/resources/libraries/python/DPDK/L3fwdTest.py
+++ b/resources/libraries/python/DPDK/L3fwdTest.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2018 Cisco and/or its affiliates.
+# 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:
@@ -19,6 +19,7 @@ from resources.libraries.python.ssh import SSH
from resources.libraries.python.constants import Constants
from resources.libraries.python.topology import NodeType, Topology
+
class L3fwdTest(object):
"""Test the DPDK l3fwd performance."""
@@ -50,35 +51,27 @@ class L3fwdTest(object):
adj_mac0, adj_mac1 = L3fwdTest.get_adj_mac(nodes_info, dut_node,
dut_if1, dut_if2)
- list_cores = lcores_list.split(',')
+ list_cores = [int(item) for item in lcores_list.split(',')]
# prepare the port config param
+ nb_cores = int(nb_cores)
index = 0
port_config = ''
for port in range(0, 2):
for queue in range(0, int(queue_nums)):
- if int(nb_cores) == 1:
- index = 0
- temp_str = '({port}, {queue}, {core}),'.\
- format(port=port, queue=queue,
- core=int(list_cores[index]))
- else:
- temp_str = '({port}, {queue}, {core}),'.\
- format(port=port, queue=queue,
- core=int(list_cores[index]))
-
- port_config += temp_str
- index = index + 1
+ index = 0 if nb_cores == 1 else index
+ port_config += '({port}, {queue}, {core}),'.\
+ format(port=port, queue=queue, core=list_cores[index])
+ index += 1
ssh = SSH()
ssh.connect(dut_node)
- jumbo = 'yes' if jumbo_frames else 'no'
cmd = '{fwdir}/tests/dpdk/dpdk_scripts/run_l3fwd.sh ' \
'"{lcores}" "{ports}" {mac1} {mac2} {jumbo}'.\
format(fwdir=Constants.REMOTE_FW_DIR, lcores=lcores_list,
ports=port_config.rstrip(','), mac1=adj_mac0,
- mac2=adj_mac1, jumbo=jumbo)
+ mac2=adj_mac1, jumbo='yes' if jumbo_frames else 'no')
ret_code, _, _ = ssh.exec_command_sudo(cmd, timeout=600)
if ret_code != 0:
diff --git a/resources/libraries/python/DropRateSearch.py b/resources/libraries/python/DropRateSearch.py
index 9b7c46668d..d090306cc5 100644
--- a/resources/libraries/python/DropRateSearch.py
+++ b/resources/libraries/python/DropRateSearch.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2018 Cisco and/or its affiliates.
+# 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:
@@ -409,37 +409,7 @@ class DropRateSearch(object):
res = self._get_res_based_on_search_type(res)
- if self._search_linear_direction == SearchDirection.BOTTOM_UP:
- # loss occurred and it was above acceptance criteria
- if not res:
- # if this is first run then we didn't find drop rate
- if prev_rate is None:
- self._search_result = SearchResults.FAILURE
- self._search_result_rate = None
- # else we found the rate, which is value from previous run
- else:
- self._search_result = SearchResults.SUCCESS
- self._search_result_rate = prev_rate
- return
- # there was no loss / loss below acceptance criteria
- elif res:
- prev_rate = rate
- rate += self._rate_linear_step
- if rate > self._rate_max:
- if prev_rate != self._rate_max:
- # one last step with rate set to _rate_max
- rate = self._rate_max
- continue
- else:
- self._search_result = SearchResults.SUCCESS
- self._search_result_rate = prev_rate
- return
- else:
- continue
- else:
- raise RuntimeError("Unknown search result")
-
- elif self._search_linear_direction == SearchDirection.TOP_DOWN:
+ if self._search_linear_direction == SearchDirection.TOP_DOWN:
# loss occurred, decrease rate
if not res:
prev_rate = rate
@@ -465,8 +435,6 @@ class DropRateSearch(object):
else:
raise Exception("Unknown search direction")
- raise Exception("Wrong codepath")
-
def verify_search_result(self):
"""Fail if search was not successful.
diff --git a/resources/libraries/python/MLRsearch/NdrPdrResult.py b/resources/libraries/python/MLRsearch/NdrPdrResult.py
index 80df0ef333..7b8cfd6449 100644
--- a/resources/libraries/python/MLRsearch/NdrPdrResult.py
+++ b/resources/libraries/python/MLRsearch/NdrPdrResult.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2018 Cisco and/or its affiliates.
+# 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:
@@ -13,7 +13,8 @@
"""Module defining NdrPdrResult class."""
-from ReceiveRateInterval import ReceiveRateInterval
+from resources.libraries.python.MLRsearch.ReceiveRateInterval \
+ import ReceiveRateInterval
class NdrPdrResult(object):
diff --git a/resources/libraries/python/MLRsearch/ReceiveRateInterval.py b/resources/libraries/python/MLRsearch/ReceiveRateInterval.py
index 6dff1b8a7a..ec3cbb7462 100644
--- a/resources/libraries/python/MLRsearch/ReceiveRateInterval.py
+++ b/resources/libraries/python/MLRsearch/ReceiveRateInterval.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2018 Cisco and/or its affiliates.
+# 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:
@@ -15,7 +15,8 @@
import math
-from ReceiveRateMeasurement import ReceiveRateMeasurement
+from resources.libraries.python.MLRsearch.ReceiveRateMeasurement \
+ import ReceiveRateMeasurement
class ReceiveRateInterval(object):
diff --git a/resources/libraries/python/Routing.py b/resources/libraries/python/Routing.py
index e6485ba3bc..a682c90102 100644
--- a/resources/libraries/python/Routing.py
+++ b/resources/libraries/python/Routing.py
@@ -22,81 +22,67 @@ class Routing(object):
"""Routing utilities."""
@staticmethod
- def vpp_route_add(node, network, prefix_len, gateway=None,
- interface=None, use_sw_index=True, resolve_attempts=10,
- count=1, vrf=None, lookup_vrf=None, multipath=False,
- weight=None, local=False):
+ def vpp_route_add(node, network, prefix_len, **kwargs):
"""Add route to the VPP node.
:param node: Node to add route on.
:param network: Route destination network address.
:param prefix_len: Route destination network prefix length.
- :param gateway: Route gateway address.
- :param interface: Route interface.
- :param vrf: VRF table ID (Optional).
- :param use_sw_index: Use sw_if_index in VAT command.
- :param resolve_attempts: Resolve attempts IP route add parameter.
- :param count: number of IP addresses to add starting from network IP
- :param local: The route is local
- with same prefix (increment is 1). If None, then is not used.
- :param lookup_vrf: VRF table ID for lookup.
- :param multipath: Enable multipath routing.
- :param weight: Weight value for unequal cost multipath routing.
+ :param kwargs: Optional key-value arguments:
+
+ gateway: Route gateway address. (str)
+ interface: Route interface. (str)
+ vrf: VRF table ID. (int)
+ use_sw_index: Use sw_if_index in VAT command. (bool)
+ resolve_attempts: Resolve attempts IP route add parameter. (int)
+ count: number of IP addresses to add starting from network IP (int)
+ local: The route is local with same prefix (increment is 1).
+ If None, then is not used. (bool)
+ lookup_vrf: VRF table ID for lookup. (int)
+ multipath: Enable multipath routing. (bool)
+ weight: Weight value for unequal cost multipath routing. (int)
+
:type node: dict
:type network: str
:type prefix_len: int
- :type gateway: str
- :type interface: str
- :type use_sw_index: bool
- :type resolve_attempts: int
- :type count: int
- :type vrf: int
- :type lookup_vrf: int
- :type multipath: bool
- :type weight: int
- :type local: bool
+ :type kwargs: dict
"""
- if interface:
+
+ gateway = kwargs.get("gateway", '')
+ intf = kwargs.get("interface", '')
+ use_sw_index = kwargs.get("use_sw_index", True)
+ resolve_attempts = kwargs.get("resolve_attempts", 10)
+ count = kwargs.get("count", 1)
+ vrf = kwargs.get("vrf", None)
+ l_vrf = kwargs.get("lookup_vrf", None)
+ multipath = kwargs.get("multipath", False)
+ weight = kwargs.get("weight", None)
+ local = kwargs.get("local", False)
+
+ if intf:
if use_sw_index:
int_cmd = ('sw_if_index {}'.
- format(Topology.get_interface_sw_index(node,
- interface)))
+ format(Topology.get_interface_sw_index(node, intf)))
else:
- int_cmd = interface
+ int_cmd = intf
else:
int_cmd = ''
- rap = 'resolve-attempts {}'.format(resolve_attempts) \
- if resolve_attempts else ''
-
- via = 'via {}'.format(gateway) if gateway else ''
-
- cnt = 'count {}'.format(count) \
- if count else ''
-
- vrf = 'vrf {}'.format(vrf) if vrf else ''
-
- lookup_vrf = 'lookup-in-vrf {}'.format(lookup_vrf) if lookup_vrf else ''
-
- multipath = 'multipath' if multipath else ''
-
- weight = 'weight {}'.format(weight) if weight else ''
-
- local = 'local' if local else ''
-
with VatTerminal(node, json_param=False) as vat:
- vat.vat_terminal_exec_cmd_from_template('add_route.vat',
- network=network,
- prefix_length=prefix_len,
- via=via,
- vrf=vrf,
- interface=int_cmd,
- resolve_attempts=rap,
- count=cnt,
- lookup_vrf=lookup_vrf,
- multipath=multipath,
- weight=weight,
- local=local)
+ vat.vat_terminal_exec_cmd_from_template(
+ 'add_route.vat',
+ network=network,
+ prefix_length=prefix_len,
+ via='via {}'.format(gateway) if gateway else '',
+ vrf='vrf {}'.format(vrf) if vrf else '',
+ interface=int_cmd,
+ resolve_attempts='resolve-attempts {}'.
+ format(resolve_attempts) if resolve_attempts else '',
+ count='count {}'.format(count) if count else '',
+ lookup_vrf='lookup-in-vrf {}'.format(l_vrf) if l_vrf else '',
+ multipath='multipath' if multipath else '',
+ weight='weight {}'.format(weight) if weight else '',
+ local='local' if local else '')
@staticmethod
def add_fib_table(node, table_id, ipv6=False):
diff --git a/resources/libraries/python/VPPUtil.py b/resources/libraries/python/VPPUtil.py
index d6c02a3e8a..63d9aaca86 100644
--- a/resources/libraries/python/VPPUtil.py
+++ b/resources/libraries/python/VPPUtil.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2018 Cisco and/or its affiliates.
+# 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:
@@ -79,7 +79,7 @@ class VPPUtil(object):
break
else:
raise RuntimeError('VPP failed to start on host {name}'.
- format(name=node['host']))
+ format(name=node['host']))
DUTSetup.get_service_logs(node, Constants.VPP_UNIT)
@staticmethod
diff --git a/resources/libraries/python/honeycomb/HcAPIKwACL.py b/resources/libraries/python/honeycomb/HcAPIKwACL.py
index 19cdb37c47..b2848411a1 100644
--- a/resources/libraries/python/honeycomb/HcAPIKwACL.py
+++ b/resources/libraries/python/honeycomb/HcAPIKwACL.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2018 Cisco and/or its affiliates.
+# 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:
@@ -13,6 +13,8 @@
"""This module implements keywords to manipulate ACL data structures using
Honeycomb REST API."""
+
+
from robot.api import logger
from resources.libraries.python.topology import Topology
@@ -255,17 +257,15 @@ class ACLKeywords(object):
" under ACL table {1}.".format(session_match, table_name))
@staticmethod
- def create_acl_plugin_classify_chain(node, list_name, data, macip=False):
+ def create_acl_plugin_classify_chain(node, list_name, data):
"""Create classify chain using the ietf-acl node.
:param node: Honeycomb node.
:param list_name: Name for the classify list.
:param data: Dictionary of settings to send to Honeycomb.
- :param macip: Use simple MAC+IP classifier. Optional.
:type node: dict
:type list_name: str
:type data: dict
- :type macip: bool
:returns: Content of response.
:rtype: bytearray
:raises HoneycombError: If the operation fails.
@@ -284,21 +284,18 @@ class ACLKeywords(object):
return resp
@staticmethod
- def set_acl_plugin_interface(node, interface, acl_name,
- direction, macip=False):
+ def set_acl_plugin_interface(node, interface, acl_name, direction):
"""Assign an interface to an ietf-acl classify chain.
:param node: Honeycomb node.
:param interface: Name of an interface on the node.
:param acl_name: Name of an ACL chain configured through ACL-plugin.
- :param direction: Classify incoming or outgiong packets.
+ :param direction: Classify incoming or outgoing packets.
Valid options are: ingress, egress
- :param macip: Use simple MAC+IP classifier. Optional.
:type node: dict
:type interface: str or int
:type acl_name: str
:type direction: str
- :type macip: bool
:returns: Content of response.
:rtype: bytearray
:raises ValueError: If the direction argument is incorrect.
diff --git a/resources/libraries/python/honeycomb/Netconf.py b/resources/libraries/python/honeycomb/Netconf.py
index 303361034e..caca14ed1a 100644
--- a/resources/libraries/python/honeycomb/Netconf.py
+++ b/resources/libraries/python/honeycomb/Netconf.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2018 Cisco and/or its affiliates.
+# 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:
@@ -126,14 +126,12 @@ class Netconf(object):
logger.trace(reply)
return reply.replace(self.delimiter, "")
- def get_all_responses(self, size=4096, time_out=3):
+ def get_all_responses(self, size=4096):
"""Read responses from the receive buffer and catenate together
until a read operation times out.
:param size: Maximum number of bytes to read in one iteration.
- :param time_out: Timeout value for getting the complete response.
:type size: int
- :type time_out: int
:returns: Content of response.
:rtype: str
"""
diff --git a/resources/libraries/python/honeycomb/Notifications.py b/resources/libraries/python/honeycomb/Notifications.py
index 7bba00a2d2..38f1fd3093 100644
--- a/resources/libraries/python/honeycomb/Notifications.py
+++ b/resources/libraries/python/honeycomb/Notifications.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2018 Cisco and/or its affiliates.
+# 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:
@@ -27,14 +27,12 @@ class Notifications(Netconf):
- read received notifications
"""
- def add_notification_listener(self, subscription, time_out=10):
+ def add_notification_listener(self, subscription):
"""Open a new channel on the SSH session, connect to Netconf subsystem
and subscribe to receive Honeycomb notifications.
:param subscription: RPC for subscription to notifications.
- :param time_out: Timeout value for each read operation in seconds.
:type subscription: str
- :type time_out: int
:raises HoneycombError: If subscription to notifications fails.
"""
diff --git a/resources/libraries/python/ssh.py b/resources/libraries/python/ssh.py
index 4beec5aa83..a23d163768 100644
--- a/resources/libraries/python/ssh.py
+++ b/resources/libraries/python/ssh.py
@@ -13,15 +13,17 @@
"""Library for SSH connection management."""
-import paramiko
+
import socket
import StringIO
-from paramiko import RSAKey
+from time import time, sleep
+
+from paramiko import RSAKey, SSHClient, AutoAddPolicy
from paramiko.ssh_exception import SSHException, NoValidConnectionsError
from robot.api import logger
from scp import SCPClient
-from time import time, sleep
+
__all__ = ["exec_cmd", "exec_cmd_no_error"]
@@ -86,8 +88,8 @@ class SSH(object):
pkey = RSAKey.from_private_key(
StringIO.StringIO(node['priv_key']))
- self._ssh = paramiko.SSHClient()
- self._ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+ self._ssh = SSHClient()
+ self._ssh.set_missing_host_key_policy(AutoAddPolicy())
self._ssh.connect(node['host'], username=node['username'],
password=node.get('password'), pkey=pkey,
diff --git a/resources/libraries/robot/honeycomb/access_control_lists.robot b/resources/libraries/robot/honeycomb/access_control_lists.robot
index 4a68878144..37cd03c6be 100644
--- a/resources/libraries/robot/honeycomb/access_control_lists.robot
+++ b/resources/libraries/robot/honeycomb/access_control_lists.robot
@@ -1,4 +1,4 @@
-# Copyright (c) 2017 Cisco and/or its affiliates.
+# 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:
@@ -10,6 +10,7 @@
# 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.
+
*** Variables ***
#TODO: update based on resolution of bug https://jira.fd.io/browse/HONEYCOMB-119
@@ -356,7 +357,7 @@
| | [Arguments] | ${node} | ${acl_list_name} | ${acl_list_settings}
| | ... | ${macip}=${False}
| | Create ACL plugin classify chain
-| | ... | ${node} | ${acl_list_name} | ${acl_list_settings} | ${macip}
+| | ... | ${node} | ${acl_list_name} | ${acl_list_settings}
| Honeycomb assigns plugin-ACL chain to interface
| | [Documentation] | Applies classification through the high-level\
@@ -377,7 +378,7 @@
| | ... | ${node} | ${interface} | ${acl_list_name} | ${direction}
| | ... | ${macip}=${False}
| | Set ACL plugin interface
-| | ... | ${node} | ${interface} | ${acl_list_name} | ${direction} | ${macip}
+| | ... | ${node} | ${interface} | ${acl_list_name} | ${direction}
| Clear plugin-ACL configuration
| | [Documentation] | Removes ACl assignment from interface, then deletes\
@@ -438,12 +439,12 @@
| | ${tx_port_name}= | Get interface name | ${tg_node} | ${tx_port}
| | ${rx_port_name}= | Get interface name | ${tg_node} | ${rx_port}
| | ${args}= | Catenate | --src_mac | ${tx_mac}
-| | ... | --dst_mac | ${rx_mac}
-| | ... | --src_ip | ${src_ip}
-| | ... | --dst_ip | ${dst_ip}
-| | ... | --tx_if | ${tx_port_name}
-| | ... | --rx_if | ${rx_port_name}
-| | ... | --icmp_type | ${icmp_type}
-| | ... | --icmp_code | ${icmp_code}
+| | ... | --dst_mac | ${rx_mac}
+| | ... | --src_ip | ${src_ip}
+| | ... | --dst_ip | ${dst_ip}
+| | ... | --tx_if | ${tx_port_name}
+| | ... | --rx_if | ${rx_port_name}
+| | ... | --icmp_type | ${icmp_type}
+| | ... | --icmp_code | ${icmp_code}
| | Run Traffic Script On Node | send_icmp_type_code.py
| | ... | ${tg_node} | ${args}