-# Copyright (c) 2020 Cisco and/or its affiliates.
+# Copyright (c) 2021 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:
'args' - command arguments.
:rtype: dict
"""
- # TODO: Use a python class instead of dictionary for the return type
proto = vpp_echo_attributes[u"uri_protocol"]
addr = vpp_echo_attributes[u"uri_ip4_addr"]
port = vpp_echo_attributes[u"uri_port"]
'args' - command arguments.
:rtype: dict
"""
- # TODO: Use a python class instead of dictionary for the return type
iperf3_cmd = {}
iperf3_cmd[u"env_vars"] = f"VCL_CONFIG={Constants.REMOTE_FW_DIR}/" \
f"{Constants.RESOURCES_TPL_VCL}/" \
ip_address = f" {iperf3_attributes[u'ip_address']}" if u"ip_address" \
in iperf3_attributes else u""
iperf3_cmd[u"name"] = u"iperf3"
+ # TODO: Use OptionString library.
iperf3_cmd[u"args"] = f"--{iperf3_attributes[u'role']}{ip_address} " \
f"--interval 0{json_results} " \
f"--version{iperf3_attributes[u'ip_version']}"
if u"time" in iperf3_attributes:
iperf3_cmd[u"args"] += \
f" --time {iperf3_attributes[u'time']}"
+ if iperf3_attributes[u"udp"]:
+ iperf3_cmd[u"args"] += u" --udp"
+ iperf3_cmd[u"args"] += \
+ f" --bandwidth {iperf3_attributes[u'bandwidth']}"
+ if iperf3_attributes[u"length"] > 0:
+ iperf3_cmd[u"args"] += \
+ f" --length {iperf3_attributes[u'length']}"
return iperf3_cmd
@staticmethod
message=f"Get {program_name} stderr log failed!")
return stdout_log, stderr_log
+ @staticmethod
+ def get_nginx_command(nginx_attributes, nginx_version, nginx_ins_dir):
+ """Construct the NGINX command using the specified attributes.
+
+ :param nginx_attributes: NGINX test program attributes.
+ :param nginx_version: NGINX version.
+ :param nginx_ins_dir: NGINX install dir.
+ :type nginx_attributes: dict
+ :type nginx_version: str
+ :type nginx_ins_dir: str
+ :returns: Command line components of the NGINX command
+ 'env_vars' - environment variables
+ 'name' - program name
+ 'args' - command arguments.
+ 'path' - program path.
+ :rtype: dict
+ """
+ nginx_cmd = dict()
+ nginx_cmd[u"env_vars"] = f"VCL_CONFIG={Constants.REMOTE_FW_DIR}/" \
+ f"{Constants.RESOURCES_TPL_VCL}/" \
+ f"{nginx_attributes[u'vcl_config']}"
+ if nginx_attributes[u"ld_preload"]:
+ nginx_cmd[u"env_vars"] += \
+ f" LD_PRELOAD={Constants.VCL_LDPRELOAD_LIBRARY}"
+ if nginx_attributes[u'transparent_tls']:
+ nginx_cmd[u"env_vars"] += u" LDP_ENV_TLS_TRANS=1"
+
+ nginx_cmd[u"name"] = u"nginx"
+ nginx_cmd[u"path"] = f"{nginx_ins_dir}nginx-{nginx_version}/sbin/"
+ nginx_cmd[u"args"] = f"-c {nginx_ins_dir}/" \
+ f"nginx-{nginx_version}/conf/nginx.conf"
+ return nginx_cmd
+
@staticmethod
def start_hoststack_test_program(node, namespace, core_list, program):
"""Start the specified HostStack test program.
env_vars = f"{program[u'env_vars']} " if u"env_vars" in program else u""
args = program[u"args"]
- cmd = f"nohup {shell_cmd} \'{env_vars}taskset --cpu-list {core_list} " \
- f"{program_name} {args} >/tmp/{program_name}_stdout.log " \
- f"2>/tmp/{program_name}_stderr.log &\'"
+ program_path = program.get(u"path", u"")
+ # NGINX used `worker_cpu_affinity` in configuration file
+ taskset_cmd = u"" if program_name == u"nginx" else \
+ f"taskset --cpu-list {core_list}"
+ cmd = f"nohup {shell_cmd} \'{env_vars}{taskset_cmd} " \
+ f"{program_path}{program_name} {args} >/tmp/{program_name}_" \
+ f"stdout.log 2>/tmp/{program_name}_stderr.log &\'"
try:
exec_cmd_no_error(node, cmd, sudo=True)
return DUTSetup.get_pid(node, program_name)[0]
program_cmd = f"{env_vars}{program_name} {program[u'args']}"
test_results = f"Test Results of '{program_cmd}':\n"
- if nsim_attr[u"output_feature_enable"] or \
- nsim_attr[u"cross_connect_feature_enable"]:
- if nsim_attr[u"output_feature_enable"]:
+ if nsim_attr[u"output_nsim_enable"] or \
+ nsim_attr[u"xc_nsim_enable"]:
+ if nsim_attr[u"output_nsim_enable"]:
feature_name = u"output"
else:
feature_name = u"cross-connect"
f"NSIM({feature_name}): delay " \
f"{nsim_attr[u'delay_in_usec']} usecs, " \
f"avg-pkt-size {nsim_attr[u'average_packet_size']}, " \
- f"bandwidth {nsim_attr[u'bandwidth_in_bits_per_second']} " \
+ f"bandwidth {nsim_attr[u'bw_in_bits_per_second']} " \
f"bits/sec, pkt-drop-rate {nsim_attr[u'packets_per_drop']} " \
f"pkts/drop\n"
:rtype: bool
"""
return server_defer_fail and client_defer_fail
+
+ @staticmethod
+ def log_vpp_hoststack_data(node):
+ """Retrieve and log VPP HostStack data.
+
+ :param node: DUT node.
+ :type node: dict
+ :raises RuntimeError: If node subtype is not a DUT or startup failed.
+ """
+
+ if node[u"type"] != u"DUT":
+ raise RuntimeError(u"Node type is not a DUT!")
+
+ PapiSocketExecutor.run_cli_cmd(node, u"show error")
+ PapiSocketExecutor.run_cli_cmd(node, u"show interface")