diff options
author | Vincenzo Riccobene <vincenzox.m.riccobene@intel.com> | 2015-12-24 13:21:51 +0000 |
---|---|---|
committer | Jörgen Karlsson <jorgen.w.karlsson@ericsson.com> | 2015-12-28 00:18:23 +0000 |
commit | 8375eec566fc4266d940e98a61d78707c4801f93 (patch) | |
tree | 27e9c250cb3133c912515d39e525b144d2d47a31 /yardstick/vTC/apexlake/experimental_framework | |
parent | 3f55749cad3033219adfb47885b6269b207f1588 (diff) |
Fix small things for integration of ApexLake with Yardstick
Changes small things required for the integration of ApexLake with Yardstick
JIRA: YARDSTICK-35
Change-Id: I6f92d738cb80e34108b76f900382e9c05ecabe70
Signed-off-by: Vincenzo Riccobene <vincenzox.m.riccobene@intel.com>
Diffstat (limited to 'yardstick/vTC/apexlake/experimental_framework')
12 files changed, 109 insertions, 64 deletions
diff --git a/yardstick/vTC/apexlake/experimental_framework/api.py b/yardstick/vTC/apexlake/experimental_framework/api.py index b9e806157..635dcd2cf 100644 --- a/yardstick/vTC/apexlake/experimental_framework/api.py +++ b/yardstick/vTC/apexlake/experimental_framework/api.py @@ -74,9 +74,15 @@ class FrameworkApi(object): :param test_cases: Test cases to be ran on the workload (dict() of dict()) - Each string represents a test case and it is one - of the strings provided by the - "get_available_test_cases()" function output. + + Example: + test_case = dict() + test_case['name'] = 'module.Class' + test_case['params'] = dict() + test_case['params']['throughput'] = '1' + test_case['params']['vlan_sender'] = '1007' + test_case['params']['vlan_receiver'] = '1006' + test_cases = [test_case] :param iterations: Number of cycles to be executed (int) @@ -103,17 +109,21 @@ class FrameworkApi(object): correspond to the place holders (#parameter_name) specified in the heat template. - :return: None + :return: dict() Containing results """ + common.init(api=True) # Input Validation common.InputValidation.validate_os_credentials(openstack_credentials) credentials = openstack_credentials + msg = 'The provided heat_template does not exist' template = "{}{}".format(common.get_template_dir(), heat_template) common.InputValidation.validate_file_exist(template, msg) + msg = 'The provided iterations variable must be an integer value' common.InputValidation.validate_integer(iterations, msg) + msg = 'The provided heat_template_parameters variable must be a ' \ 'dictionary' common.InputValidation.validate_dictionary(heat_template_parameters, @@ -131,7 +141,8 @@ class FrameworkApi(object): common.LOG.info("Benchmarking Unit initialization") benchmarking_unit.initialize() common.LOG.info("Benchmarking Unit Running") - benchmarking_unit.run_benchmarks() + results = benchmarking_unit.run_benchmarks() finally: common.LOG.info("Benchmarking Unit Finalization") benchmarking_unit.finalize() + return results diff --git a/yardstick/vTC/apexlake/experimental_framework/benchmarks/benchmark_base_class.py b/yardstick/vTC/apexlake/experimental_framework/benchmarks/benchmark_base_class.py index 756962714..41235635c 100644 --- a/yardstick/vTC/apexlake/experimental_framework/benchmarks/benchmark_base_class.py +++ b/yardstick/vTC/apexlake/experimental_framework/benchmarks/benchmark_base_class.py @@ -44,6 +44,9 @@ class BenchmarkBaseClass(object): def get_name(self): return self.name + def get_params(self): + return self.params + def get_features(self): features = dict() features['description'] = 'Please implement the method ' \ diff --git a/yardstick/vTC/apexlake/experimental_framework/benchmarks/instantiation_validation_benchmark.py b/yardstick/vTC/apexlake/experimental_framework/benchmarks/instantiation_validation_benchmark.py index 29a87f2ee..049912305 100644 --- a/yardstick/vTC/apexlake/experimental_framework/benchmarks/instantiation_validation_benchmark.py +++ b/yardstick/vTC/apexlake/experimental_framework/benchmarks/instantiation_validation_benchmark.py @@ -36,8 +36,9 @@ class InstantiationValidationBenchmark(base.BenchmarkBaseClass): def __init__(self, name, params): base.BenchmarkBaseClass.__init__(self, name, params) - self.base_dir = common.get_base_dir() + \ - fp.EXPERIMENTAL_FRAMEWORK_DIR + fp.DPDK_PKTGEN_DIR + self.base_dir = "{}{}{}".format( + common.get_base_dir(), fp.EXPERIMENTAL_FRAMEWORK_DIR, + fp.DPDK_PKTGEN_DIR) self.results_file = self.base_dir + PACKETS_FILE_NAME self.lua_file = self.base_dir + 'constant_traffic.lua' self.res_dir = '' @@ -143,7 +144,7 @@ class InstantiationValidationBenchmark(base.BenchmarkBaseClass): if self.res_dir: packet_checker_res = \ int(common.get_file_first_line(self.res_dir + - '/packet_checker.res')) + 'packet_checker.res')) pkt_gen_res = int(common.get_file_first_line(self.results_file)) if pkt_gen_res <= packet_checker_res or \ (float(pkt_gen_res - packet_checker_res) / pkt_gen_res) <= 0.1: @@ -158,7 +159,7 @@ class InstantiationValidationBenchmark(base.BenchmarkBaseClass): :return: """ # Kill any other process running from previous failed execution - self.res_dir = os.getcwd() + self.res_dir = common.get_result_dir() pids = self._get_pids() for pid in pids: os.kill(pid, signal.SIGTERM) @@ -192,6 +193,9 @@ class InstantiationValidationBenchmark(base.BenchmarkBaseClass): common.run_command(command) # Start the packet checker + # TODO: Compile "make" the packet sniffer + command = "chmod +x {}".format(self.pkt_checker_command) + common.run_command(command) command = self.pkt_checker_command command += self.interface_name + '.' + self.params[VLAN_RECEIVER] command += ' 128' diff --git a/yardstick/vTC/apexlake/experimental_framework/benchmarks/instantiation_validation_noisy_neighbors_benchmark.py b/yardstick/vTC/apexlake/experimental_framework/benchmarks/instantiation_validation_noisy_neighbors_benchmark.py index 4e3b640d8..9610bc165 100644 --- a/yardstick/vTC/apexlake/experimental_framework/benchmarks/instantiation_validation_noisy_neighbors_benchmark.py +++ b/yardstick/vTC/apexlake/experimental_framework/benchmarks/instantiation_validation_noisy_neighbors_benchmark.py @@ -45,11 +45,11 @@ class InstantiationValidationNoisyNeighborsBenchmark( features['allowed_values'][NUMBER_OF_CORES] = \ ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10'] features['allowed_values'][AMOUNT_OF_RAM] = \ - ['250M', '1G', '2G', '3G', '4G', '5G', '6G', '7G', '8G', '9G', + ['256M', '1G', '2G', '3G', '4G', '5G', '6G', '7G', '8G', '9G', '10G'] features['default_values'][NUM_OF_NEIGHBORS] = '1' features['default_values'][NUMBER_OF_CORES] = '1' - features['default_values'][AMOUNT_OF_RAM] = '250M' + features['default_values'][AMOUNT_OF_RAM] = '256M' return features def init(self): diff --git a/yardstick/vTC/apexlake/experimental_framework/benchmarks/multi_tenancy_throughput_benchmark.py b/yardstick/vTC/apexlake/experimental_framework/benchmarks/multi_tenancy_throughput_benchmark.py index ba1e0cc81..3182837c5 100644 --- a/yardstick/vTC/apexlake/experimental_framework/benchmarks/multi_tenancy_throughput_benchmark.py +++ b/yardstick/vTC/apexlake/experimental_framework/benchmarks/multi_tenancy_throughput_benchmark.py @@ -40,11 +40,11 @@ class MultiTenancyThroughputBenchmark(base.RFC2544ThroughputBenchmark): features['allowed_values']['number_of_cores'] = \ ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10'] features['allowed_values']['amount_of_ram'] = \ - ['250M', '1G', '2G', '3G', '4G', '5G', '6G', '7G', '8G', '9G', + ['256M', '1G', '2G', '3G', '4G', '5G', '6G', '7G', '8G', '9G', '10G'] features['default_values']['num_of_neighbours'] = '1' features['default_values']['number_of_cores'] = '1' - features['default_values']['amount_of_ram'] = '250M' + features['default_values']['amount_of_ram'] = '256M' return features def init(self): diff --git a/yardstick/vTC/apexlake/experimental_framework/benchmarks/rfc2544_throughput_benchmark.py b/yardstick/vTC/apexlake/experimental_framework/benchmarks/rfc2544_throughput_benchmark.py index 2ac3ea9c4..e026fa377 100644 --- a/yardstick/vTC/apexlake/experimental_framework/benchmarks/rfc2544_throughput_benchmark.py +++ b/yardstick/vTC/apexlake/experimental_framework/benchmarks/rfc2544_throughput_benchmark.py @@ -1,3 +1,4 @@ + # Copyright (c) 2015 Intel Research and Development Ireland Ltd. # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -74,9 +75,7 @@ class RFC2544ThroughputBenchmark(benchmark_base_class.BenchmarkBaseClass): to measure the throughput of the workload :return: Results of the testcase (type: dict) """ - ret_val = dict() packet_size = self._extract_packet_size_from_params() - ret_val[PACKET_SIZE] = packet_size # Packetgen management packetgen = dpdk.DpdkPacketGenerator() @@ -93,12 +92,7 @@ class RFC2544ThroughputBenchmark(benchmark_base_class.BenchmarkBaseClass): packetgen.send_traffic() common.LOG.debug('Stop the packet generator') - # Result Collection - results = self._get_results() - for metric_name in results.keys(): - ret_val[metric_name] = results[metric_name] - self._reset_lua_file() - return ret_val + return self._get_results() def _extract_packet_size_from_params(self): """ diff --git a/yardstick/vTC/apexlake/experimental_framework/benchmarks/test_benchmark.py b/yardstick/vTC/apexlake/experimental_framework/benchmarks/test_benchmark.py index d530168da..cbb930d21 100644 --- a/yardstick/vTC/apexlake/experimental_framework/benchmarks/test_benchmark.py +++ b/yardstick/vTC/apexlake/experimental_framework/benchmarks/test_benchmark.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import time from experimental_framework.benchmarks import benchmark_base_class as base @@ -33,4 +34,5 @@ class TestBenchmark(base.BenchmarkBaseClass): return features def run(self): + time.sleep(10) return dict() diff --git a/yardstick/vTC/apexlake/experimental_framework/common.py b/yardstick/vTC/apexlake/experimental_framework/common.py index 97f5bee93..6b5f932ce 100644 --- a/yardstick/vTC/apexlake/experimental_framework/common.py +++ b/yardstick/vTC/apexlake/experimental_framework/common.py @@ -44,7 +44,10 @@ PKTGEN_COREMASK = None PKTGEN_MEMCHANNEL = None PKTGEN_BUS_SLOT_NIC_1 = None PKTGEN_BUS_SLOT_NIC_2 = None +PKTGEN_NAME_NIC_1 = None +PKTGEN_NAME_NIC_2 = None +# TODO: remove Influx INFLUXDB_IP = None INFLUXDB_PORT = None INFLUXDB_DB_NAME = None @@ -56,14 +59,15 @@ INFLUXDB_DB_NAME = None def init(api=False): global BASE_DIR - BASE_DIR = os.getcwd() + # BASE_DIR = os.getcwd() + BASE_DIR = os.path.dirname(os.path.abspath(__file__)) BASE_DIR = BASE_DIR.replace('/experimental_framework', '') BASE_DIR = InputValidation.validate_directory_exist_and_format( BASE_DIR, "Error 000001") init_conf_file(api) - init_general_vars() init_log() + init_general_vars(api) if len(CONF_FILE.get_variable_list(cf.CFS_PKTGEN)) > 0: init_pktgen() @@ -71,12 +75,14 @@ def init(api=False): def init_conf_file(api=False): global CONF_FILE if api: - CONF_FILE = ConfigurationFile(cf.get_sections_api()) + CONF_FILE = ConfigurationFile(cf.get_sections_api(), + '/etc/apexlake/apexlake.conf') else: - CONF_FILE = ConfigurationFile(cf.get_sections()) + CONF_FILE = ConfigurationFile(cf.get_sections(), + '/etc/apexlake/apexlake.conf') -def init_general_vars(): +def init_general_vars(api=False): global TEMPLATE_FILE_EXTENSION global TEMPLATE_NAME global TEMPLATE_DIR @@ -92,22 +98,27 @@ def init_general_vars(): "Section " + cf.CFS_GENERAL + "is not present in configuration file") - TEMPLATE_DIR = BASE_DIR + 'heat_templates/' - - # Validate template name - InputValidation.\ - validate_configuration_file_parameter( - cf.CFS_GENERAL, - cf.CFSG_TEMPLATE_NAME, - "Parameter " + cf.CFSG_TEMPLATE_NAME + - "is not present in configuration file") + TEMPLATE_DIR = '/tmp/apexlake/heat_templates/' + if not os.path.exists(TEMPLATE_DIR): + os.makedirs(TEMPLATE_DIR) + cmd = "cp /etc/apexlake/heat_templates/*.yaml {}".format(TEMPLATE_DIR) + run_command(cmd) + + if not api: + # Validate template name + InputValidation.\ + validate_configuration_file_parameter( + cf.CFS_GENERAL, + cf.CFSG_TEMPLATE_NAME, + "Parameter " + cf.CFSG_TEMPLATE_NAME + + "is not present in configuration file") + TEMPLATE_NAME = CONF_FILE.get_variable(cf.CFS_GENERAL, + cf.CFSG_TEMPLATE_NAME) + InputValidation.validate_file_exist( + TEMPLATE_DIR + TEMPLATE_NAME, + "The provided template file does not exist") - TEMPLATE_NAME = CONF_FILE.get_variable(cf.CFS_GENERAL, - cf.CFSG_TEMPLATE_NAME) - InputValidation.validate_file_exist( - TEMPLATE_DIR + TEMPLATE_NAME, - "The provided template file does not exist") - RESULT_DIR = BASE_DIR + 'results/' + RESULT_DIR = "/tmp/apexlake/results/" # Validate and assign Iterations if cf.CFSG_ITERATIONS in CONF_FILE.get_variable_list(cf.CFS_GENERAL): @@ -119,13 +130,8 @@ def init_general_vars(): def init_log(): global LOG - if cf.CFSG_DEBUG in CONF_FILE.get_variable_list(cf.CFS_GENERAL) and \ - CONF_FILE.get_variable(cf.CFS_GENERAL, cf.CFSG_DEBUG): - logging.basicConfig(level=logging.DEBUG) - else: - logging.basicConfig(level=logging.INFO) - LOG = logging.getLogger() + LOG.setLevel(level=logging.INFO) log_formatter = logging.Formatter("%(asctime)s --- %(message)s") file_handler = logging.FileHandler("{0}/{1}.log".format("./", "benchmark")) file_handler.setFormatter(log_formatter) @@ -159,6 +165,8 @@ def init_pktgen(): global PKTGEN_BUS_SLOT_NIC_1 global PKTGEN_BUS_SLOT_NIC_2 global PKTGEN_DPDK_DIRECTORY + global PKTGEN_NAME_NIC_1 + global PKTGEN_NAME_NIC_2 msg = "Section {} is not present in the configuration file".\ format(cf.CFS_PKTGEN) @@ -231,6 +239,22 @@ def init_pktgen(): PKTGEN_BUS_SLOT_NIC_2 = CONF_FILE.get_variable( cf.CFS_PKTGEN, cf.CFSP_DPDK_BUS_SLOT_NIC_2) + # Validation of the DPDK NIC 1 + msg = "Parameter {} is not present in section {}".format( + cf.CFSP_DPDK_NAME_IF_1, cf.CFS_PKTGEN) + InputValidation.validate_configuration_file_parameter( + cf.CFS_PKTGEN, cf.CFSP_DPDK_NAME_IF_1, msg) + PKTGEN_NAME_NIC_1 = CONF_FILE.get_variable( + cf.CFS_PKTGEN, cf.CFSP_DPDK_NAME_IF_1) + + # Validation of the DPDK NIC 2 + msg = "Parameter {} is not present in section {}".format( + cf.CFSP_DPDK_NAME_IF_2, cf.CFS_PKTGEN) + InputValidation.validate_configuration_file_parameter( + cf.CFS_PKTGEN, cf.CFSP_DPDK_NAME_IF_2, msg) + PKTGEN_NAME_NIC_2 = CONF_FILE.get_variable( + cf.CFS_PKTGEN, cf.CFSP_DPDK_NAME_IF_2) + # Validation of DPDK directory parameter msg = "Parameter {} is not present in section {}".format( cf.CFSP_DPDK_DPDK_DIRECTORY, cf.CFS_PKTGEN) @@ -264,7 +288,7 @@ class ConfigurationFile: """ InputValidation.validate_string( config_file, "The configuration file name must be a string") - config_file = BASE_DIR + config_file + # config_file = BASE_DIR + config_file InputValidation.validate_file_exist( config_file, 'The provided configuration file does not exist') self.config = ConfigParser.ConfigParser() @@ -304,8 +328,8 @@ class ConfigurationFile: sect = getattr(self, section) return sect[variable_name] else: - exc_msg = 'Parameter {} is not in the {} section of the conf file' - exc_msg.format(variable_name, section) + exc_msg = 'Parameter {} is not in the {} section of the ' \ + 'conf file'.format(variable_name, section) raise ValueError(exc_msg) def get_variable_list(self, section): @@ -420,7 +444,7 @@ def replace_in_file(file, text_to_search, text_to_replace): # Shell interaction # ------------------------------------------------------ def run_command(command): - LOG.info("Running command: " + command) + LOG.info("Running command: {}".format(command)) return os.system(command) @@ -445,17 +469,23 @@ def get_template_dir(): return TEMPLATE_DIR +def get_result_dir(): + return RESULT_DIR + + def get_dpdk_pktgen_vars(): if not (PKTGEN == 'dpdk_pktgen'): return dict() ret_val = dict() ret_val[cf.CFSP_DPDK_PKTGEN_DIRECTORY] = PKTGEN_DIR + ret_val[cf.CFSP_DPDK_DPDK_DIRECTORY] = PKTGEN_DPDK_DIRECTORY ret_val[cf.CFSP_DPDK_PROGRAM_NAME] = PKTGEN_PROGRAM ret_val[cf.CFSP_DPDK_COREMASK] = PKTGEN_COREMASK ret_val[cf.CFSP_DPDK_MEMORY_CHANNEL] = PKTGEN_MEMCHANNEL ret_val[cf.CFSP_DPDK_BUS_SLOT_NIC_1] = PKTGEN_BUS_SLOT_NIC_1 ret_val[cf.CFSP_DPDK_BUS_SLOT_NIC_2] = PKTGEN_BUS_SLOT_NIC_2 - ret_val[cf.CFSP_DPDK_DPDK_DIRECTORY] = PKTGEN_DPDK_DIRECTORY + ret_val[cf.CFSP_DPDK_NAME_IF_1] = PKTGEN_NAME_NIC_1 + ret_val[cf.CFSP_DPDK_NAME_IF_2] = PKTGEN_NAME_NIC_2 return ret_val diff --git a/yardstick/vTC/apexlake/experimental_framework/heat_manager.py b/yardstick/vTC/apexlake/experimental_framework/heat_manager.py index 41fc585f7..607fa77f3 100644 --- a/yardstick/vTC/apexlake/experimental_framework/heat_manager.py +++ b/yardstick/vTC/apexlake/experimental_framework/heat_manager.py @@ -19,7 +19,7 @@ from keystoneclient.v2_0 import client as keystoneClient from heatclient import client as heatClient from heatclient.common import template_utils -from experimental_framework import common +import experimental_framework.common as common class HeatManager: @@ -33,15 +33,14 @@ class HeatManager: self.project_id = credentials['project'] self.heat = None - # TODO: verify that init_heat is useless in the constructor - # self.init_heat() - def init_heat(self): keystone = keystoneClient.Client(username=self.user, password=self.password, tenant_name=self.project_id, auth_url=self.auth_uri) auth_token = keystone.auth_token + self.heat_url = keystone.service_catalog.url_for( + service_type='orchestration') self.heat = heatClient.Client('1', endpoint=self.heat_url, token=auth_token) diff --git a/yardstick/vTC/apexlake/experimental_framework/heat_template_generation.py b/yardstick/vTC/apexlake/experimental_framework/heat_template_generation.py index 15c4eff36..e0c1a667f 100644 --- a/yardstick/vTC/apexlake/experimental_framework/heat_template_generation.py +++ b/yardstick/vTC/apexlake/experimental_framework/heat_template_generation.py @@ -14,8 +14,7 @@ ''' -This file contains the code to Generate the heat templates from the base -template +Generation of the heat templates from the base template ''' import json @@ -160,7 +159,8 @@ def generates_templates(base_heat_template, deployment_configuration): # Delete the templates eventually generated in previous running of the # framework common.LOG.info("Removing the heat templates previously generated") - os.system("rm " + template_dir + template_name + "_*") + command = "rm {}{}_*".format(template_dir, template_name) + os.system(command) # Creation of the tree with all the new configurations common.LOG.info("Creation of the tree with all the new configurations") @@ -188,10 +188,7 @@ def generates_templates(base_heat_template, deployment_configuration): base_template = template_base_name else: base_template = template_dir + template_base_name - if os.path.isabs(template_name): - new_template = template_name - else: - new_template = template_dir + template_name + new_template = template_dir + template_name new_template += "_" + str(counter) + template_file_extension shutil.copy(base_template, new_template) diff --git a/yardstick/vTC/apexlake/experimental_framework/libraries/packet_checker/test_sniff.c b/yardstick/vTC/apexlake/experimental_framework/libraries/packet_checker/test_sniff.c index f85acfa11..a4eda3cff 100644 --- a/yardstick/vTC/apexlake/experimental_framework/libraries/packet_checker/test_sniff.c +++ b/yardstick/vTC/apexlake/experimental_framework/libraries/packet_checker/test_sniff.c @@ -135,7 +135,7 @@ int main(int argc,char **argv) int write_file() { - FILE *f = fopen("packet_checker.res", "w"); + FILE *f = fopen("/tmp/apexlake/results/packet_checker.res", "w"); if (f == NULL) { printf("Error opening file!\n"); diff --git a/yardstick/vTC/apexlake/experimental_framework/packet_generators/dpdk_packet_generator.py b/yardstick/vTC/apexlake/experimental_framework/packet_generators/dpdk_packet_generator.py index ae54502e9..347d51af3 100644 --- a/yardstick/vTC/apexlake/experimental_framework/packet_generators/dpdk_packet_generator.py +++ b/yardstick/vTC/apexlake/experimental_framework/packet_generators/dpdk_packet_generator.py @@ -15,6 +15,7 @@ import os import base_packet_generator import experimental_framework.common as common +import time from experimental_framework.constants import conf_file_sections as conf_file from experimental_framework.constants import framework_parameters as fp @@ -141,6 +142,8 @@ class DpdkPacketGenerator(base_packet_generator.BasePacketGenerator): def _change_vlan(pcap_directory, pcap_file, vlan): common.LOG.info("Changing VLAN Tag on Packet: " + pcap_file + ". New VLAN Tag is " + vlan) + command = "chmod +x {}{}".format(pcap_directory, 'vlan_tag.sh') + common.run_command(command) command = pcap_directory + 'vlan_tag.sh ' command += pcap_directory + pcap_file + ' ' + vlan common.run_command(command) @@ -244,6 +247,7 @@ class DpdkPacketGenerator(base_packet_generator.BasePacketGenerator): common.run_command(dpdk_vars[conf_file.CFSP_DPDK_DPDK_DIRECTORY] + 'tools/dpdk_nic_bind.py --unbind ' + dpdk_vars[conf_file.CFSP_DPDK_BUS_SLOT_NIC_1]) + time.sleep(5) common.run_command(dpdk_vars[conf_file.CFSP_DPDK_DPDK_DIRECTORY] + 'tools/dpdk_nic_bind.py --bind=ixgbe ' + dpdk_vars[conf_file.CFSP_DPDK_BUS_SLOT_NIC_1]) @@ -255,6 +259,7 @@ class DpdkPacketGenerator(base_packet_generator.BasePacketGenerator): common.run_command(dpdk_vars[conf_file.CFSP_DPDK_DPDK_DIRECTORY] + 'tools/dpdk_nic_bind.py --unbind ' + dpdk_vars[conf_file.CFSP_DPDK_BUS_SLOT_NIC_2]) + time.sleep(5) common.run_command(dpdk_vars[conf_file.CFSP_DPDK_DPDK_DIRECTORY] + 'tools/dpdk_nic_bind.py --bind=ixgbe ' + dpdk_vars[conf_file.CFSP_DPDK_BUS_SLOT_NIC_2]) |