X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=yardstick%2Fnetwork_services%2Fvnf_generic%2Fvnf%2Ftg_rfc2544_ixia.py;h=630c8b9c0e7c0a9dbaeaf4b03d48bf04b8caca06;hb=f105602bfb6049b91d8e86aa396c1725755c2a96;hp=93e496969f80453432ac14bd8c0036c3ead4577f;hpb=3016786696b9e5a26b364cb5bd4cb5676420fe58;p=yardstick.git diff --git a/yardstick/network_services/vnf_generic/vnf/tg_rfc2544_ixia.py b/yardstick/network_services/vnf_generic/vnf/tg_rfc2544_ixia.py index 93e496969..630c8b9c0 100644 --- a/yardstick/network_services/vnf_generic/vnf/tg_rfc2544_ixia.py +++ b/yardstick/network_services/vnf_generic/vnf/tg_rfc2544_ixia.py @@ -13,6 +13,7 @@ # limitations under the License. from __future__ import absolute_import + import time import os import logging @@ -58,8 +59,9 @@ class IxiaResourceHelper(ClientResourceHelper): rfc_helper_type = IxiaRfc2544Helper self.rfc_helper = rfc_helper_type(self.scenario_helper) - self.priv_ports = None - self.pub_ports = None + self.uplink_ports = None + self.downlink_ports = None + self._connect() def _connect(self, client=None): self.client._connect(self.vnfd_helper) @@ -68,8 +70,8 @@ class IxiaResourceHelper(ClientResourceHelper): return self.client.ix_get_statistics() def stop_collect(self): - self._terminated.value = 0 - if self.client and self.client.ixnet: + self._terminated.value = 1 + if self.client: self.client.ix_stop_traffic() def generate_samples(self, ports, key=None, default=None): @@ -78,31 +80,31 @@ class IxiaResourceHelper(ClientResourceHelper): latency = stats[0] samples = {} - for interface in self.vnfd_helper.interfaces: + # this is not DPDK port num, but this is whatever number we gave + # when we selected ports and programmed the profile + for port_num in ports: try: - name = interface["name"] - # this is not DPDK port num, but this is whatever number we gave - # when we selected ports and programmed the profile - port = self.vnfd_helper.port_num(name) - if port in ports: - samples[name] = { - "rx_throughput_kps": float(last_result["Rx_Rate_Kbps"][port]), - "tx_throughput_kps": float(last_result["Tx_Rate_Kbps"][port]), - "rx_throughput_mbps": float(last_result["Rx_Rate_Mbps"][port]), - "tx_throughput_mbps": float(last_result["Tx_Rate_Mbps"][port]), - "in_packets": int(last_result["Valid_Frames_Rx"][port]), - "out_packets": int(last_result["Frames_Tx"][port]), - "RxThroughput": int(last_result["Valid_Frames_Rx"][port]) / 30, - "TxThroughput": int(last_result["Frames_Tx"][port]) / 30, - } - if key: - avg_latency = latency["Store-Forward_Avg_latency_ns"][port] - min_latency = latency["Store-Forward_Min_latency_ns"][port] - max_latency = latency["Store-Forward_Max_latency_ns"][port] - samples[name][key] = \ - {"Store-Forward_Avg_latency_ns": avg_latency, - "Store-Forward_Min_latency_ns": min_latency, - "Store-Forward_Max_latency_ns": max_latency} + # reverse lookup port name from port_num so the stats dict is descriptive + intf = self.vnfd_helper.find_interface_by_port(port_num) + port_name = intf["name"] + samples[port_name] = { + "rx_throughput_kps": float(last_result["Rx_Rate_Kbps"][port_num]), + "tx_throughput_kps": float(last_result["Tx_Rate_Kbps"][port_num]), + "rx_throughput_mbps": float(last_result["Rx_Rate_Mbps"][port_num]), + "tx_throughput_mbps": float(last_result["Tx_Rate_Mbps"][port_num]), + "in_packets": int(last_result["Valid_Frames_Rx"][port_num]), + "out_packets": int(last_result["Frames_Tx"][port_num]), + "RxThroughput": int(last_result["Valid_Frames_Rx"][port_num]) / 30, + "TxThroughput": int(last_result["Frames_Tx"][port_num]) / 30, + } + if key: + avg_latency = latency["Store-Forward_Avg_latency_ns"][port_num] + min_latency = latency["Store-Forward_Min_latency_ns"][port_num] + max_latency = latency["Store-Forward_Max_latency_ns"][port_num] + samples[port_name][key] = \ + {"Store-Forward_Avg_latency_ns": avg_latency, + "Store-Forward_Min_latency_ns": min_latency, + "Store-Forward_Max_latency_ns": max_latency} except IndexError: pass @@ -117,7 +119,6 @@ class IxiaResourceHelper(ClientResourceHelper): default = "00:00:00:00:00:00" self._build_ports() - self._connect() # we don't know client_file_name until runtime as instantiate client_file_name = \ @@ -129,53 +130,53 @@ class IxiaResourceHelper(ClientResourceHelper): self.client.ix_assign_ports() mac = {} - # TODO: shouldn't this index map to port number we used to generate the profile - for index, interface in enumerate(self.vnfd_helper.interfaces, 1): - virt_intf = interface["virtual-interface"] - mac.update({ - "src_mac_{}".format(index): virt_intf.get("local_mac", default), - "dst_mac_{}".format(index): virt_intf.get("dst_mac", default), - }) + for port_name in self.vnfd_helper.port_pairs.all_ports: + intf = self.vnfd_helper.find_interface(name=port_name) + virt_intf = intf["virtual-interface"] + # we only know static traffic id by reading the json + # this is used by _get_ixia_trafficrofile + port_num = self.vnfd_helper.port_num(intf) + mac["src_mac_{}".format(port_num)] = virt_intf.get("local_mac", default) + mac["dst_mac_{}".format(port_num)] = virt_intf.get("dst_mac", default) samples = {} - - ixia_file = find_relative_file("ixia_traffic.cfg", - self.scenario_helper.scenario_cfg["task_path"]) # Generate ixia traffic config... - while not self._terminated.value: - traffic_profile.execute_traffic(self, self.client, mac, ixia_file) - self.client_started.value = 1 - time.sleep(WAIT_FOR_TRAFFIC) + try: + while not self._terminated.value: + traffic_profile.execute_traffic(self, self.client, mac) + self.client_started.value = 1 + time.sleep(WAIT_FOR_TRAFFIC) + self.client.ix_stop_traffic() + samples = self.generate_samples(traffic_profile.ports) + self._queue.put(samples) + status, samples = traffic_profile.get_drop_percentage(self, samples, min_tol, + max_tol, self.client, mac) + + current = samples['CurrentDropPercentage'] + if min_tol <= current <= max_tol or status == 'Completed': + self._terminated.value = 1 + self.client.ix_stop_traffic() - samples = self.generate_samples(traffic_profile.ports) 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' or \ - self.rfc_helper.is_done(): - break + if not self.rfc_helper.is_done(): + self._terminated.value = 1 + return - self.client.ix_stop_traffic() - self._queue.put(samples) - - if not self.rfc_helper.is_done(): - self._terminated.value = 1 - return + traffic_profile.execute_traffic(self, self.client, mac) + for _ in range(5): + time.sleep(self.LATENCY_TIME_SLEEP) + self.client.ix_stop_traffic() + samples = self.generate_samples(traffic_profile.ports, 'latency', {}) + self._queue.put(samples) + traffic_profile.start_ixia_latency(self, self.client, mac) + if self._terminated.value: + break - traffic_profile.execute_traffic(self, self.client, mac, ixia_file) - for _ in range(5): - time.sleep(self.LATENCY_TIME_SLEEP) self.client.ix_stop_traffic() - samples = self.generate_samples(traffic_profile.ports, 'latency', {}) - self._queue.put(samples) - traffic_profile.start_ixia_latency(self, self.client, mac, ixia_file) - if self._terminated.value: - break + except Exception: # pylint: disable=broad-except + LOG.exception("Run Traffic terminated") - self.client.ix_stop_traffic() self._terminated.value = 1 def collect_kpi(self): @@ -200,16 +201,6 @@ class IxiaTrafficGen(SampleVNFTrafficGen): 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() - - def wait_for_instantiate(self): - # not needed for IxNet - pass