diff options
author | Martin Banszel <martinx.banszel@intel.com> | 2017-07-19 19:35:02 +0000 |
---|---|---|
committer | Ross Brattain <ross.b.brattain@intel.com> | 2017-09-05 17:48:02 -0700 |
commit | d3ee35dc0015e073b7138f3b02508b40fc6288b1 (patch) | |
tree | d5350f427a7ba6dcea8d36b00ae217d0074f0511 /yardstick/network_services/vnf_generic/vnf | |
parent | 79e811f096f8640189fc75862535f1f0cc4773c5 (diff) |
Add fixes for heat deployed UDP_Replay and TRex
- Added a PROTOCOL_MAP to map the protocol names to codes -- the scapy
requires the code, it fails if the proto is set e.g. to 'udp'
- ip addresses must be str, not unicode -- explicit conversion to str
added
- removed unittest for setup_vnf_environment in test_tg_trex.py as
it is the same function as already tested in test_sample_vnf.py
- traffic_profile refactored -- code repetition decreased, unittest
adapted
Known issues:
- there is a an attempt to stop already stopped trex. It fires an
exception that stop command is issued on the disconnected client.
Change-Id: I87e9029630f48b30e8f5b4f9d88ab3b25fd65f03
Signed-off-by: Martin Banszel <martinx.banszel@intel.com>
Diffstat (limited to 'yardstick/network_services/vnf_generic/vnf')
3 files changed, 69 insertions, 25 deletions
diff --git a/yardstick/network_services/vnf_generic/vnf/sample_vnf.py b/yardstick/network_services/vnf_generic/vnf/sample_vnf.py index 9a7d39913..1b2533aad 100644 --- a/yardstick/network_services/vnf_generic/vnf/sample_vnf.py +++ b/yardstick/network_services/vnf_generic/vnf/sample_vnf.py @@ -680,19 +680,19 @@ class ScenarioHelper(object): @property def task_path(self): - return self.scenario_cfg["task_path"] + return self.scenario_cfg['task_path'] @property def nodes(self): - return self.scenario_cfg['nodes'] + return self.scenario_cfg.get('nodes') @property def all_options(self): - return self.scenario_cfg["options"] + return self.scenario_cfg.get('options', {}) @property def options(self): - return self.all_options[self.name] + return self.all_options.get(self.name, {}) @property def vnf_cfg(self): @@ -742,7 +742,6 @@ class SampleVNF(GenericVNF): self.q_out = Queue() self.queue_wrapper = None self.run_kwargs = {} - self.scenario_cfg = None self.tg_port_pairs = None self.used_drivers = {} self.vnf_port_pairs = None @@ -937,7 +936,6 @@ class SampleVNFTrafficGen(GenericTrafficGen): def instantiate(self, scenario_cfg, context_cfg): self.scenario_helper.scenario_cfg = scenario_cfg self.resource_helper.generate_cfg() - self.setup_helper.setup_vnf_environment() self.resource_helper.setup() LOG.info("Starting %s server...", self.APP_NAME) diff --git a/yardstick/network_services/vnf_generic/vnf/tg_trex.py b/yardstick/network_services/vnf_generic/vnf/tg_trex.py index 616b331ba..1fe790f08 100644 --- a/yardstick/network_services/vnf_generic/vnf/tg_trex.py +++ b/yardstick/network_services/vnf_generic/vnf/tg_trex.py @@ -25,10 +25,19 @@ from yardstick.common.utils import mac_address_to_hex_list from yardstick.network_services.utils import get_nsb_option from yardstick.network_services.vnf_generic.vnf.sample_vnf import SampleVNFTrafficGen from yardstick.network_services.vnf_generic.vnf.sample_vnf import ClientResourceHelper +from yardstick.network_services.vnf_generic.vnf.sample_vnf import DpdkVnfSetupEnvHelper LOG = logging.getLogger(__name__) +class TrexDpdkVnfSetupEnvHelper(DpdkVnfSetupEnvHelper): + APP_NAME = "t-rex-64" + CFG_CONFIG = "" + CFG_SCRIPT = "" + PIPELINE_COMMAND = "" + VNF_TYPE = "TG" + + class TrexResourceHelper(ClientResourceHelper): CONF_FILE = '/tmp/trex_cfg.yaml' @@ -36,16 +45,14 @@ class TrexResourceHelper(ClientResourceHelper): RESOURCE_WORD = 'trex' RUN_DURATION = 0 - SYNC_PORT = 4500 - ASYNC_PORT = 4501 + ASYNC_PORT = 4500 + SYNC_PORT = 4501 def generate_cfg(self): ext_intf = self.vnfd_helper.interfaces vpci_list = [] port_list = [] trex_cfg = { - 'port_limit': 0, - 'version': '2', 'interfaces': vpci_list, 'port_info': port_list, "port_limit": len(ext_intf), @@ -79,6 +86,7 @@ class TrexResourceHelper(ClientResourceHelper): DISABLE_DEPLOY = True def setup(self): + super(TrexResourceHelper, self).setup() if self.DISABLE_DEPLOY: return @@ -130,6 +138,9 @@ class TrexTrafficGen(SampleVNFTrafficGen): if resource_helper_type is None: resource_helper_type = TrexResourceHelper + if setup_env_helper_type is None: + setup_env_helper_type = TrexDpdkVnfSetupEnvHelper + super(TrexTrafficGen, self).__init__(name, vnfd, setup_env_helper_type, resource_helper_type) diff --git a/yardstick/network_services/vnf_generic/vnf/udp_replay.py b/yardstick/network_services/vnf_generic/vnf/udp_replay.py index 6e206f2b2..a9bc204d5 100644 --- a/yardstick/network_services/vnf_generic/vnf/udp_replay.py +++ b/yardstick/network_services/vnf_generic/vnf/udp_replay.py @@ -16,6 +16,8 @@ from __future__ import absolute_import import logging from yardstick.network_services.vnf_generic.vnf.sample_vnf import SampleVNF +from yardstick.network_services.vnf_generic.vnf.sample_vnf import DpdkVnfSetupEnvHelper +from yardstick.network_services.vnf_generic.vnf.sample_vnf import ClientResourceHelper LOG = logging.getLogger(__name__) @@ -27,38 +29,65 @@ REPLAY_PIPELINE_COMMAND = ( # {tool_path} -p {ports_len_hex} -f {cfg_file} -s {script}' +class UdpReplaySetupEnvHelper(DpdkVnfSetupEnvHelper): + + APP_NAME = "UDP_Replay" + + +class UdpReplayResourceHelper(ClientResourceHelper): + pass + + class UdpReplayApproxVnf(SampleVNF): APP_NAME = "UDP_Replay" APP_WORD = "UDP_Replay" - PIPELINE_COMMAND = REPLAY_PIPELINE_COMMAND VNF_PROMPT = 'Replay>' - CSUM_MAP = { - 'baremetal': '', - 'sriov': '', - } + VNF_TYPE = 'UdpReplay' + + HW_OFFLOADING_NFVI_TYPES = {'baremetal', 'sriov'} + + PIPELINE_COMMAND = REPLAY_PIPELINE_COMMAND + + def __init__(self, name, vnfd, setup_env_helper_type=None, resource_helper_type=None): + if resource_helper_type is None: + resource_helper_type = UdpReplayResourceHelper + + if setup_env_helper_type is None: + setup_env_helper_type = UdpReplaySetupEnvHelper + + super(UdpReplayApproxVnf, self).__init__(name, vnfd, setup_env_helper_type, + resource_helper_type) + + def _start_server(self): + super(UdpReplayApproxVnf, self)._start_server() + self.resource_helper.start() def scale(self, flavor=""): """ scale vnfbased on flavor input """ raise NotImplementedError - def _build_config(self): - pass - def _deploy(self): self.generate_port_pairs() super(UdpReplayApproxVnf, self)._deploy() def _build_pipeline_kwargs(self): - tool_path = self.ssh_helper.provision_tool(self.APP_NAME) - ports_mask = 2 ** len(self.all_ports) - 1 + all_ports = [i for i, _ in enumerate(self.vnfd_helper.interfaces)] + number_of_ports = len(all_ports) + + tool_path = self.ssh_helper.provision_tool(tool_file=self.APP_NAME) + ports_mask = 2 ** number_of_ports - 1 ports_mask_hex = hex(ports_mask) - cpu_mask_hex = hex(ports_mask * 2) - hw_csum = self.CSUM_MAP.get(self.nfvi_type, "--no-hw-csum") - config_value = "".join(str((port, 0, port + 1)) for port in self.all_ports) + cpu_mask_hex = hex(2 ** (number_of_ports + 1) - 1) + hw_csum = "" + if (not self.scenario_helper.options.get('hw_csum', False) or + self.nfvi_context.attrs.get('nfvi_type') not in self.HW_OFFLOADING_NFVI_TYPES): + hw_csum = '--no-hw-csum' + + config_value = "".join(str((port, 0, port + 1)) for port in all_ports) - whitelist = " -w ".join(self.bound_pci) + whitelist = " -w ".join(self.setup_helper.bound_pci) self.pipeline_kwargs = { 'ports_len_hex': ports_mask_hex, 'tool_path': tool_path, @@ -68,13 +97,19 @@ class UdpReplayApproxVnf(SampleVNF): 'config': config_value, } + def _build_config(self): + self._build_pipeline_kwargs() + return self.PIPELINE_COMMAND.format(**self.pipeline_kwargs) + def collect_kpi(self): def get_sum(offset): return sum(int(i) for i in split_stats[offset::5]) + number_of_ports = len(self.vnfd_helper.interfaces) + stats = self.get_stats() stats_words = stats.split() - split_stats = stats_words[stats_words.index('0'):][:len(self.all_ports) * 5] + split_stats = stats_words[stats_words.index('0'):][:number_of_ports * 5] result = { "packets_in": get_sum(1), "packets_fwd": get_sum(2), |