1 # Copyright (c) 2016-2017 Intel Corporation
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
23 from oslo_serialization import jsonutils
25 from yardstick.common import utils
26 from yardstick.network_services.vnf_generic.vnf import sample_vnf
30 LOG = logging.getLogger(__name__)
32 VNF_PATH = os.path.dirname(os.path.realpath(__file__))
35 mount.cifs //{0[ip]}/Results {1.RESULTS_MOUNT} \
36 -o username={0[user]},password={0[password]}\
39 IXLOAD_CONFIG_TEMPLATE = '''\
46 "remote_server": "%s",
48 "ixload_cfg": "C:/Results/%s",
52 IXLOAD_CMD = "{ixloadpy} {http_ixload} {args}"
55 class ResourceDataHelper(list):
57 def get_aggregates(self):
61 "avg": sum(self) / len(self),
65 class IxLoadResourceHelper(sample_vnf.ClientResourceHelper):
67 RESULTS_MOUNT = "/mnt/Results"
69 KPI_LIST = collections.OrderedDict((
70 ('http_throughput', 'HTTP Total Throughput (Kbps)'),
71 ('simulated_users', 'HTTP Simulated Users'),
72 ('concurrent_connections', 'HTTP Concurrent Connections'),
73 ('connection_rate', 'HTTP Connection Rate'),
74 ('transaction_rate', 'HTTP Transaction Rate'),
77 def __init__(self, setup_helper):
78 super(IxLoadResourceHelper, self).__init__(setup_helper)
79 self.result = collections.OrderedDict((key, ResourceDataHelper())
80 for key in self.KPI_LIST)
81 self.resource_file_name = ''
84 def parse_csv_read(self, reader):
87 new_data = {key_left: int(row[key_right])
88 for key_left, key_right in self.KPI_LIST.items()}
89 except (TypeError, ValueError):
92 for key, value in new_data.items():
93 self.result[key].append(value)
96 # NOTE: fixup scenario_helper to hanlde ixia
97 self.resource_file_name = \
98 utils.find_relative_file(
99 self.scenario_helper.scenario_cfg['ixia_profile'],
100 self.scenario_helper.scenario_cfg["task_path"])
101 utils.makedirs(self.RESULTS_MOUNT)
102 cmd = MOUNT_CMD.format(self.vnfd_helper.mgmt_interface, self)
105 if not os.path.ismount(self.RESULTS_MOUNT):
106 subprocess.call(cmd, shell=True)
108 shutil.rmtree(self.RESULTS_MOUNT, ignore_errors=True)
109 utils.makedirs(self.RESULTS_MOUNT)
110 shutil.copy(self.resource_file_name, self.RESULTS_MOUNT)
112 def make_aggregates(self):
113 return {key_right: self.result[key_left].get_aggregates()
114 for key_left, key_right in self.KPI_LIST.items()}
116 def collect_kpi(self):
118 self._result.update(self.data)
119 LOG.info("Collect %s KPIs %s", self.RESOURCE_WORD, self._result)
123 for key in self.KPI_LIST:
124 LOG.debug(self.result[key])
127 class IxLoadTrafficGen(sample_vnf.SampleVNFTrafficGen):
129 def __init__(self, name, vnfd, setup_env_helper_type=None, resource_helper_type=None):
130 if resource_helper_type is None:
131 resource_helper_type = IxLoadResourceHelper
133 super(IxLoadTrafficGen, self).__init__(name, vnfd, setup_env_helper_type,
134 resource_helper_type)
137 def update_gateways(self, links):
140 gateway = next(intf["virtual-interface"]["dst_ip"] for intf in
141 self.setup_helper.vnfd_helper["vdu"][0][
142 "external-interface"] if
143 intf["virtual-interface"]["vld_id"] == name)
145 links[name]["ip"]["gateway"] = gateway
146 except StopIteration:
147 LOG.debug("Cant find gateway for link %s", name)
148 links[name]["ip"]["gateway"] = "0.0.0.0"
152 def run_traffic(self, traffic_profile):
155 for interface in self.vnfd_helper.interfaces:
156 vpci_list = interface['virtual-interface']["vpci"].split(":")
158 ports.append(str(vpci_list[1]))
160 for csv_file in glob.iglob(self.ssh_helper.join_bin_path('*.csv')):
163 links_param = self.update_gateways(
164 traffic_profile.get_links_param())
166 ixia_config = self.vnfd_helper.mgmt_interface["tg-config"]
167 ixload_config = IXLOAD_CONFIG_TEMPLATE % (
168 ixia_config["ixchassis"], ports, card,
169 self.vnfd_helper.mgmt_interface["ip"], self.ssh_helper.bin_path,
170 os.path.basename(self.resource_helper.resource_file_name),
171 jsonutils.dumps(links_param)
174 http_ixload_path = os.path.join(VNF_PATH, "../../traffic_profile")
176 cmd = IXLOAD_CMD.format(
177 ixloadpy=os.path.join(ixia_config["py_bin_path"], "ixloadpython"),
178 http_ixload=os.path.join(http_ixload_path, "http_ixload.py"),
179 args="'%s'" % ixload_config)
182 subprocess.call(cmd, shell=True)
184 with open(self.ssh_helper.join_bin_path("ixLoad_HTTP_Client.csv")) as csv_file:
185 lines = csv_file.readlines()[10:]
186 with open(self.ssh_helper.join_bin_path("http_result.csv"), 'wb+') as result_file:
187 result_file.writelines(lines[:-1])
190 reader = csv.DictReader(result_file)
191 self.resource_helper.parse_csv_read(reader)
193 self.resource_helper.log()
194 self.resource_helper.data = self.resource_helper.make_aggregates()
197 subprocess.call(["pkill", "-9", "http_ixload.py"])
198 super(IxLoadTrafficGen, self).terminate()