diff options
Diffstat (limited to 'yardstick/network_services/vnf_generic/vnf/tg_rfc2544_ixia.py')
-rw-r--r-- | yardstick/network_services/vnf_generic/vnf/tg_rfc2544_ixia.py | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/yardstick/network_services/vnf_generic/vnf/tg_rfc2544_ixia.py b/yardstick/network_services/vnf_generic/vnf/tg_rfc2544_ixia.py new file mode 100644 index 000000000..07bbdae95 --- /dev/null +++ b/yardstick/network_services/vnf_generic/vnf/tg_rfc2544_ixia.py @@ -0,0 +1,165 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# 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 +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# 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. + +from __future__ import absolute_import +import time +import os +import logging +import sys + +from yardstick.common.utils import ErrorClass +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 Rfc2544ResourceHelper + +try: + from IxNet import IxNextgen +except ImportError: + IxNextgen = ErrorClass + +LOG = logging.getLogger(__name__) + +WAIT_AFTER_CFG_LOAD = 10 +WAIT_FOR_TRAFFIC = 30 +IXIA_LIB = os.path.dirname(os.path.realpath(__file__)) +IXNET_LIB = os.path.join(IXIA_LIB, "../../libs/ixia_libs/IxNet") +sys.path.append(IXNET_LIB) + + +class IxiaRfc2544Helper(Rfc2544ResourceHelper): + + pass + + +class IxiaResourceHelper(ClientResourceHelper): + + def __init__(self, setup_helper, rfc_helper_type=None): + super(IxiaResourceHelper, self).__init__(setup_helper) + self.scenario_helper = setup_helper.scenario_helper + + self.client = IxNextgen() + + if rfc_helper_type is None: + rfc_helper_type = IxiaRfc2544Helper + + self.rfc_helper = rfc_helper_type(self.scenario_helper) + self.tg_port_pairs = [] + self.priv_ports = None + self.pub_ports = None + + def _connect(self, client=None): + self.client.connect(self.vnfd_helper) + + def _build_ports(self): + # self.generate_port_pairs(self.topology) + self.priv_ports = [int(x[0][-1]) for x in self.tg_port_pairs] + self.pub_ports = [int(x[1][-1]) for x in self.tg_port_pairs] + self.my_ports = list(set(self.priv_ports).union(set(self.pub_ports))) + + def get_stats(self, *args, **kwargs): + return self.client.ix_get_statistics()[1] + + def stop_collect(self): + self._terminated.value = 0 + if self.client: + self.client.ix_stop_traffic() + + def generate_samples(self, key=None, default=None): + last_result = self.get_stats() + + samples = {} + for vpci_idx, interface in enumerate(self.vnfd_helper.interfaces): + name = "xe{0}".format(vpci_idx) + samples[name] = { + "rx_throughput_kps": float(last_result["Rx_Rate_Kbps"][vpci_idx]), + "tx_throughput_kps": float(last_result["Tx_Rate_Kbps"][vpci_idx]), + "rx_throughput_mbps": float(last_result["Rx_Rate_Mbps"][vpci_idx]), + "tx_throughput_mbps": float(last_result["Tx_Rate_Mbps"][vpci_idx]), + "in_packets": int(last_result["Valid_Frames_Rx"][vpci_idx]), + "out_packets": int(last_result["Frames_Tx"][vpci_idx]), + "RxThroughput": int(last_result["Valid_Frames_Rx"][vpci_idx]) / 30, + "TxThroughput": int(last_result["Frames_Tx"][vpci_idx]) / 30, + } + + return samples + + def run_traffic(self, traffic_profile): + min_tol = self.rfc_helper.tolerance_low + max_tol = self.rfc_helper.tolerance_high + + self._build_ports() + self._connect() + + # we don't know client_file_name until runtime as instantiate + client_file_name = self.scenario_helper.scenario_cfg['ixia_profile'] + self.client.ix_load_config(client_file_name) + time.sleep(WAIT_AFTER_CFG_LOAD) + + self.client.ix_assign_ports() + + mac = {} + for index, interface in enumerate(self.vnfd_helper.interfaces): + virt_intf = interface["virtual-interface"] + mac.update({ + "src_mac_{}".format(index): virt_intf["local_mac"], + "dst_mac_{}".format(index): virt_intf["dst_mac"], + }) + + samples = {} + ixia_file = os.path.join(os.getcwd(), "ixia_traffic.cfg") + # Generate ixia traffic config... + while not self._terminated.value: + traffic_profile.execute(self, self.client, mac, ixia_file) + self.client_started.value = 1 + time.sleep(WAIT_FOR_TRAFFIC) + self.client.ix_stop_traffic() + samples = self.generate_samples() + self._queue.put(samples) + status, samples = traffic_profile.get_drop_percentage(self, samples, min_tol, + max_tol, self.client, mac, + ixia_file) + + current = samples['CurrentDropPercentage'] + if min_tol <= current <= max_tol or status == 'Completed': + self._terminated.value = 1 + + self.client.ix_stop_traffic() + self._queue.put(samples) + + +class IxiaTrafficGen(SampleVNFTrafficGen): + + def __init__(self, name, vnfd, setup_env_helper_type=None, resource_helper_type=None): + if resource_helper_type is None: + resource_helper_type = IxiaResourceHelper + + super(IxiaTrafficGen, self).__init__(name, vnfd, setup_env_helper_type, + resource_helper_type) + self._ixia_traffic_gen = None + self.ixia_file_name = '' + self.tg_port_pairs = [] + self.vnf_port_pairs = [] + + def _check_status(self): + pass + + def scale(self, flavor=""): + pass + + def listen_traffic(self, traffic_profile): + pass + + def terminate(self): + self.resource_helper.stop_collect() + super(IxiaTrafficGen, self).terminate() |