1 # Copyright (c) 2016 Cisco and/or its affiliates.
2 # Licensed under the Apache License, Version 2.0 (the "License");
3 # you may not use this file except in compliance with the License.
4 # You may obtain a copy of the License at:
6 # http://www.apache.org/licenses/LICENSE-2.0
8 # Unless required by applicable law or agreed to in writing, software
9 # distributed under the License is distributed on an "AS IS" BASIS,
10 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 # See the License for the specific language governing permissions and
12 # limitations under the License.
14 """Traffic script executor library."""
16 from robot.api import logger
18 from resources.libraries.python.constants import Constants
19 from resources.libraries.python.ssh import SSH
21 __all__ = ['TrafficScriptExecutor']
24 class TrafficScriptExecutor(object):
25 """Traffic script executor utilities."""
29 """Escape quotation mark and dollar mark for shell command.
31 :param string: String to escape.
33 :return: Escaped string.
36 return string.replace('"', '\\"').replace("$", "\\$")
39 def run_traffic_script_on_node(script_file_name, node, script_args,
41 """Run traffic script on the TG node.
43 :param script_file_name: Traffic script name.
44 :param node: Node to run traffic script on.
45 :param script_args: Traffic scripts arguments.
46 :param timeout: Timeout (optional).
47 :type script_file_name: str
49 :type script_args: str
51 :raises RuntimeError: ICMP echo Rx timeout.
52 :raises RuntimeError: DHCP REQUEST Rx timeout.
53 :raises RuntimeError: DHCP DISCOVER Rx timeout.
54 :raises RuntimeError: TCP/UDP Rx timeout.
55 :raises RuntimeError: ARP reply timeout.
56 :raises RuntimeError: Traffic script execution failed.
58 logger.trace("{}".format(timeout))
62 "virtualenv --system-site-packages --never-download env && " +
63 "export PYTHONPATH=${{PWD}}; " +
64 ". ${{PWD}}/env/bin/activate; " +
65 "resources/traffic_scripts/{} {}") \
66 .format(Constants.REMOTE_FW_DIR, script_file_name,
68 (ret_code, stdout, stderr) = ssh.exec_command_sudo(
69 'sh -c "{}"'.format(TrafficScriptExecutor._escape(cmd)),
71 logger.debug("stdout: {}".format(stdout))
72 logger.debug("stderr: {}".format(stderr))
73 logger.debug("ret_code: {}".format(ret_code))
75 if "RuntimeError: ICMP echo Rx timeout" in stderr:
76 raise RuntimeError("ICMP echo Rx timeout")
77 elif "RuntimeError: DHCP REQUEST Rx timeout" in stderr:
78 raise RuntimeError("DHCP REQUEST Rx timeout")
79 elif "RuntimeError: DHCP DISCOVER Rx timeout" in stderr:
80 raise RuntimeError("DHCP DISCOVER Rx timeout")
81 elif "RuntimeError: TCP/UDP Rx timeout" in stderr:
82 raise RuntimeError("TCP/UDP Rx timeout")
83 elif "Error occurred: ARP reply timeout" in stdout:
84 raise RuntimeError("ARP reply timeout")
85 elif "RuntimeError: ESP packet Rx timeout" in stderr:
86 raise RuntimeError("ESP packet Rx timeout")
88 raise RuntimeError("Traffic script execution failed")
91 def traffic_script_gen_arg(rx_if, tx_if, src_mac, dst_mac, src_ip, dst_ip):
92 """Generate traffic script basic arguments string.
94 :param rx_if: Interface that receives traffic.
95 :param tx_if: Interface that sends traffic.
96 :param src_mac: Source MAC address.
97 :param dst_mac: Destination MAC address.
98 :param src_ip: Source IP address.
99 :param dst_ip: Destination IP address.
106 :return: Traffic script arguments string.
109 args = ('--rx_if {0} --tx_if {1} --src_mac {2} --dst_mac {3} --src_ip'
110 ' {4} --dst_ip {5}').format(rx_if, tx_if, src_mac, dst_mac,