X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=yardstick%2Fnetwork_services%2Ftraffic_profile%2Fixia_rfc2544.py;h=7f047226b74436b7fee5527b01287f0168823fce;hb=b38a0ef766ca5025a09b85573e770c34b389ea17;hp=36a464e2f5e818a4d24ad7d118f61dbe72c37cb3;hpb=b171392f75b2e2f9abb1834c84e752931afaace9;p=yardstick.git diff --git a/yardstick/network_services/traffic_profile/ixia_rfc2544.py b/yardstick/network_services/traffic_profile/ixia_rfc2544.py index 36a464e2f..7f047226b 100644 --- a/yardstick/network_services/traffic_profile/ixia_rfc2544.py +++ b/yardstick/network_services/traffic_profile/ixia_rfc2544.py @@ -14,65 +14,75 @@ from __future__ import absolute_import import logging -import json -from yardstick.network_services.traffic_profile.traffic_profile import \ +from yardstick.network_services.traffic_profile.trex_traffic_profile import \ TrexProfile LOG = logging.getLogger(__name__) class IXIARFC2544Profile(TrexProfile): - def _get_ixia_traffic_profile(self, profile_data, mac={}, - xfile=None, static_traffic={}): + + UPLINK = 'uplink' + DOWNLINK = 'downlink' + + def _get_ixia_traffic_profile(self, profile_data, mac=None): + if mac is None: + mac = {} + result = {} - if xfile: - with open(xfile, 'r') as stream: + for traffickey, values in profile_data.items(): + if not traffickey.startswith((self.UPLINK, self.DOWNLINK)): + continue + + try: + # values should be single-item dict, so just grab the first item + try: + key, value = next(iter(values.items())) + except StopIteration: + result[traffickey] = {} + continue + + port_id = value.get('id', 1) + port_index = port_id - 1 try: - static_traffic = json.load(stream) - except Exception as exc: - LOG.debug(exc) - - for traffickey, trafficvalue in static_traffic.items(): - traffic = static_traffic[traffickey] - # outer_l2 - index = 0 - for key, value in profile_data[traffickey].items(): - framesize = value['outer_l2']['framesize'] - traffic['outer_l2']['framesize'] = framesize - traffic['framesPerSecond'] = True - traffic['bidir'] = False - traffic['outer_l2']['srcmac'] = \ - mac["src_mac_{}".format(traffic['id'])] - traffic['outer_l2']['dstmac'] = \ - mac["dst_mac_{}".format(traffic['id'])] - # outer_l3 - if "outer_l3v6" in list(value.keys()): - traffic['outer_l3'] = value['outer_l3v6'] - srcip4 = value['outer_l3v6']['srcip6'] - traffic['outer_l3']['srcip4'] = srcip4.split("-")[0] - dstip4 = value['outer_l3v6']['dstip6'] - traffic['outer_l3']['dstip4'] = dstip4.split("-")[0] + ip = value['outer_l3v6'] + except KeyError: + ip = value['outer_l3v4'] + src_key, dst_key = 'srcip4', 'dstip4' else: - traffic['outer_l3'] = value['outer_l3v4'] - srcip4 = value['outer_l3v4']['srcip4'] - traffic['outer_l3']['srcip4'] = srcip4.split("-")[0] - dstip4 = value['outer_l3v4']['dstip4'] - traffic['outer_l3']['dstip4'] = dstip4.split("-")[0] - - traffic['outer_l3']['type'] = key - traffic['outer_l3']['count'] = value['outer_l3v4']['count'] - # outer_l4 - traffic['outer_l4'] = value['outer_l4'] - index = index + 1 - result.update({traffickey: traffic}) + src_key, dst_key = 'srcip6', 'dstip6' + + result[traffickey] = { + 'bidir': False, + 'iload': '100', + 'id': port_id, + 'outer_l2': { + 'framesize': value['outer_l2']['framesize'], + 'framesPerSecond': True, + 'srcmac': mac['src_mac_{}'.format(port_index)], + 'dstmac': mac['dst_mac_{}'.format(port_index)], + }, + 'outer_l3': { + 'count': ip['count'], + 'dscp': ip['dscp'], + 'ttl': ip['ttl'], + src_key: ip[src_key].split("-")[0], + dst_key: ip[dst_key].split("-")[0], + 'type': key, + 'proto': ip['proto'], + }, + 'outer_l4': value['outer_l4'], + } + except KeyError: + continue return result - def _ixia_traffic_generate(self, traffic_generator, traffic, ixia_obj): + def _ixia_traffic_generate(self, traffic, ixia_obj): for key, value in traffic.items(): - if "public" in key or "private" in key: - traffic[key]["iload"] = str(self.rate) + if key.startswith((self.UPLINK, self.DOWNLINK)): + value["iload"] = str(self.rate) ixia_obj.ix_update_frame(traffic) ixia_obj.ix_update_ether(traffic) ixia_obj.add_ip_header(traffic, 4) @@ -80,36 +90,53 @@ class IXIARFC2544Profile(TrexProfile): self.tmp_drop = 0 self.tmp_throughput = 0 - def execute(self, traffic_generator, ixia_obj, mac={}, xfile=None): + def update_traffic_profile(self, traffic_generator): + def port_generator(): + for vld_id, intfs in sorted(traffic_generator.networks.items()): + if not vld_id.startswith((self.UPLINK, self.DOWNLINK)): + continue + profile_data = self.params.get(vld_id) + if not profile_data: + continue + self.profile_data = profile_data + self.get_streams(self.profile_data) + self.full_profile.update({vld_id: self.profile_data}) + for intf in intfs: + yield traffic_generator.vnfd_helper.port_num(intf) + + self.ports = [port for port in port_generator()] + + def execute_traffic(self, traffic_generator, ixia_obj, mac=None): + if mac is None: + mac = {} if self.first_run: self.full_profile = {} self.pg_id = 0 - self.profile = 'private_1' - for key, value in self.params.items(): - if "private" in key or "public" in key: - self.profile_data = self.params[key] - self.get_streams(self.profile_data) - self.full_profile.update({key: self.profile_data}) + self.update_traffic_profile(traffic_generator) traffic = \ - self._get_ixia_traffic_profile(self.full_profile, mac, xfile) + self._get_ixia_traffic_profile(self.full_profile, mac) self.max_rate = self.rate self.min_rate = 0 self.get_multiplier() - self._ixia_traffic_generate(traffic_generator, traffic, ixia_obj) + self._ixia_traffic_generate(traffic, ixia_obj) def get_multiplier(self): self.rate = round((self.max_rate + self.min_rate) / 2.0, 2) multiplier = round(self.rate / self.pps, 2) return str(multiplier) - def start_ixia_latency(self, traffic_generator, ixia_obj, - mac={}, xfile=None): - traffic = self._get_ixia_traffic_profile(self.full_profile, mac) - self._ixia_traffic_generate(traffic_generator, traffic, - ixia_obj, xfile) + def start_ixia_latency(self, traffic_generator, ixia_obj, mac=None): + if mac is None: + mac = {} + self.update_traffic_profile(traffic_generator) + traffic = \ + self._get_ixia_traffic_profile(self.full_profile, mac) + self._ixia_traffic_generate(traffic, ixia_obj) - def get_drop_percentage(self, traffic_generator, samples, tol_min, - tolerance, ixia_obj, mac={}, xfile=None): + def get_drop_percentage(self, samples, tol_min, tolerance, ixia_obj, + mac=None): + if mac is None: + mac = {} status = 'Running' drop_percent = 100 in_packets = sum([samples[iface]['in_packets'] for iface in samples]) @@ -151,6 +178,6 @@ class IXIARFC2544Profile(TrexProfile): samples['DropPercentage'] = drop_percent return status, samples self.get_multiplier() - traffic = self._get_ixia_traffic_profile(self.full_profile, mac, xfile) - self._ixia_traffic_generate(traffic_generator, traffic, ixia_obj) + traffic = self._get_ixia_traffic_profile(self.full_profile, mac) + self._ixia_traffic_generate(traffic, ixia_obj) return status, samples