diff options
Diffstat (limited to 'yardstick/network_services/vnf_generic/vnf/tg_ixload.py')
-rw-r--r-- | yardstick/network_services/vnf_generic/vnf/tg_ixload.py | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/yardstick/network_services/vnf_generic/vnf/tg_ixload.py b/yardstick/network_services/vnf_generic/vnf/tg_ixload.py new file mode 100644 index 000000000..c15f7b954 --- /dev/null +++ b/yardstick/network_services/vnf_generic/vnf/tg_ixload.py @@ -0,0 +1,176 @@ +# 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 csv +import glob +import logging +import os +import shutil + +from collections import OrderedDict +from subprocess import call + +import six + +from yardstick.common.utils import makedirs +from yardstick.network_services.vnf_generic.vnf.sample_vnf import SampleVNFTrafficGen +from yardstick.network_services.vnf_generic.vnf.sample_vnf import ClientResourceHelper + +LOG = logging.getLogger(__name__) + +VNF_PATH = os.path.dirname(os.path.realpath(__file__)) + +MOUNT_CMD = """\ +mount.cifs //{0[ip]}/Results {1.RESULTS_MOUNT} \ +-o username={0[user]},password={0[password]}\ +""" + +IXLOAD_CONFIG_TEMPLATE = '''\ +{ + "ixia_chassis": "%s", + "IXIA": { + "ports": %s, + "card": %s + }, + "remote_server": "%s", + "result_dir": "%s", + "ixload_cfg": '"C:/Results/%s" +}''' + +IXLOAD_CMD = "{ixloadpy} {http_ixload} {args}" + + +class ResourceDataHelper(list): + + def get_aggregates(self): + return { + "min": min(self), + "max": max(self), + "avg": sum(self) / len(self), + } + + +class IxLoadResourceHelper(ClientResourceHelper): + + RESULTS_MOUNT = "/mnt/Results" + + KPI_LIST = OrderedDict(( + ('http_throughput', 'HTTP Total Throughput (Kbps)'), + ('simulated_users', 'HTTP Simulated Users'), + ('concurrent_connections', 'HTTP Concurrent Connections'), + ('connection_rate', 'HTTP Connection Rate'), + ('transaction_rate', 'HTTP Transaction Rate'), + )) + + def __init__(self, setup_helper): + super(IxLoadResourceHelper, self).__init__(setup_helper) + self.result = OrderedDict((key, ResourceDataHelper()) for key in self.KPI_LIST) + self.resource_file_name = '' + + def parse_csv_read(self, reader): + for row in reader: + try: + new_data = {key_left: int(row[key_right]) + for key_left, key_right in self.KPI_LIST.items()} + except (TypeError, ValueError): + continue + else: + for key, value in new_data.items(): + self.result[key].append(value) + + def setup(self): + # TODO: fixupt scenario_helper to hanlde ixia + self.resource_file_name = str(self.scenario_helper.scenario_cfg['ixia_profile']) + makedirs(self.RESULTS_MOUNT) + cmd = MOUNT_CMD.format(self.vnfd_helper.mgmt_interface, self) + LOG.debug(cmd) + + if not os.path.ismount(self.RESULTS_MOUNT): + call(cmd, shell=True) + + shutil.rmtree(self.RESULTS_MOUNT, ignore_errors=True) + makedirs(self.RESULTS_MOUNT) + shutil.copy(self.resource_file_name, self.RESULTS_MOUNT) + + def make_aggregates(self): + return {key_right: self.result[key_left].get_aggregates() + for key_left, key_right in self.KPI_LIST.items()} + + def log(self): + for key in self.KPI_LIST: + LOG.debug(self.result[key]) + + +class IxLoadTrafficGen(SampleVNFTrafficGen): + + def __init__(self, name, vnfd, setup_env_helper_type=None, resource_helper_type=None): + if resource_helper_type is None: + resource_helper_type = IxLoadResourceHelper + + super(IxLoadTrafficGen, self).__init__(name, vnfd, setup_env_helper_type, + resource_helper_type) + self._result = {} + self.done = False + self.data = None + + def run_traffic(self, traffic_profile): + ports = [] + card = None + for interface in self.vnfd_helper.interfaces: + vpci_list = interface['virtual-interface']["vpci"].split(":") + card = vpci_list[0] + ports.append(vpci_list[1]) + + for csv_file in glob.iglob(self.ssh_helper.join_bin_path('*.csv')): + os.unlink(csv_file) + + ixia_config = self.vnfd_helper.mgmt_interface["tg-config"] + ixload_config = IXLOAD_CONFIG_TEMPLATE % ( + ixia_config["ixchassis"], ports, card, + self.vnfd_helper.mgmt_interface["ip"], self.ssh_helper.bin_path, + os.path.basename(self.resource_helper.resource_file_name)) + + http_ixload_path = os.path.join(VNF_PATH, "../../traffic_profile") + cmd = IXLOAD_CMD.format( + ixloadpy=os.path.join(ixia_config["py_bin_path"], "ixloadpython"), + http_ixload=os.path.join(http_ixload_path, "http_ixload.py"), + args="'%s'" % ixload_config) + + LOG.debug(cmd) + call(cmd, shell=True) + + with open(self.ssh_helper.join_bin_path("ixLoad_HTTP_Client.csv")) as csv_file: + lines = csv_file.readlines()[10:] + + with open(self.ssh_helper.join_bin_path("http_result.csv"), 'wb+') as result_file: + result_file.writelines(six.text_type(lines[:-1])) + result_file.flush() + result_file.seek(0) + reader = csv.DictReader(result_file) + self.resource_helper.parse_csv_read(reader) + + self.resource_helper.log() + self.data = self.resource_helper.make_aggregates() + + def listen_traffic(self, traffic_profile): + pass + + def instantiate(self, scenario_cfg, context_cfg): + super(IxLoadTrafficGen, self).instantiate(scenario_cfg, context_cfg) + self.done = False + + def terminate(self): + call(["pkill", "-9", "http_ixload.py"]) + super(IxLoadTrafficGen, self).terminate() |