X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=yardstick%2Fnetwork_services%2Ftraffic_profile%2Fixia_rfc2544.py;h=26dc1fe04f967c4754153665586317c521db264e;hb=799a7d36587b14cbc0a9e24da5ba627b7ccb935c;hp=e105c2f5594bd5016418a589b7c772a0938e1753;hpb=8d3eedf007d338a032d106842cb66baa3a8eb8b7;p=yardstick.git diff --git a/yardstick/network_services/traffic_profile/ixia_rfc2544.py b/yardstick/network_services/traffic_profile/ixia_rfc2544.py index e105c2f55..26dc1fe04 100644 --- a/yardstick/network_services/traffic_profile/ixia_rfc2544.py +++ b/yardstick/network_services/traffic_profile/ixia_rfc2544.py @@ -14,21 +14,43 @@ import logging -from yardstick.network_services.traffic_profile.trex_traffic_profile import \ - TrexProfile +from yardstick.common import utils +from yardstick.network_services.traffic_profile import base as tp_base +from yardstick.network_services.traffic_profile import trex_traffic_profile + LOG = logging.getLogger(__name__) -class IXIARFC2544Profile(TrexProfile): +class IXIARFC2544Profile(trex_traffic_profile.TrexProfile): UPLINK = 'uplink' DOWNLINK = 'downlink' + DROP_PERCENT_ROUND = 6 + RATE_ROUND = 5 - def _get_ixia_traffic_profile(self, profile_data, mac=None): - if mac is None: - mac = {} + def __init__(self, yaml_data): + super(IXIARFC2544Profile, self).__init__(yaml_data) + self.rate = self.config.frame_rate + self.rate_unit = self.config.rate_unit + + def _get_ip_and_mask(self, ip_range): + _ip_range = ip_range.split('-') + if len(_ip_range) == 1: + return _ip_range[0], None + + mask = utils.get_mask_from_ip_range(_ip_range[0], _ip_range[1]) + return _ip_range[0], mask + def _get_fixed_and_mask(self, port_range): + _port_range = str(port_range).split('-') + if len(_port_range) == 1: + return int(_port_range[0]), 0 + + return int(_port_range[0]), int(_port_range[1]) + + def _get_ixia_traffic_profile(self, profile_data, mac=None): + mac = {} if mac is None else mac result = {} for traffickey, values in profile_data.items(): if not traffickey.startswith((self.UPLINK, self.DOWNLINK)): @@ -44,21 +66,29 @@ class IXIARFC2544Profile(TrexProfile): port_id = value.get('id', 1) port_index = port_id - 1 - try: - ip = value['outer_l3v6'] - except KeyError: + + if value.get('outer_l3v4'): ip = value['outer_l3v4'] src_key, dst_key = 'srcip4', 'dstip4' else: + ip = value['outer_l3v6'] src_key, dst_key = 'srcip6', 'dstip6' + srcip, srcmask = self._get_ip_and_mask(ip[src_key]) + dstip, dstmask = self._get_ip_and_mask(ip[dst_key]) + + outer_l4 = value.get('outer_l4') + src_port, src_port_mask = self._get_fixed_and_mask(outer_l4['srcport']) + dst_port, dst_port_mask = self._get_fixed_and_mask(outer_l4['dstport']) result[traffickey] = { 'bidir': False, - 'iload': '100', 'id': port_id, + 'rate': self.rate, + 'rate_unit': self.rate_unit, 'outer_l2': { 'framesize': value['outer_l2']['framesize'], 'framesPerSecond': True, + 'QinQ': value['outer_l2'].get('QinQ'), 'srcmac': mac['src_mac_{}'.format(port_index)], 'dstmac': mac['dst_mac_{}'.format(port_index)], }, @@ -66,12 +96,23 @@ class IXIARFC2544Profile(TrexProfile): 'count': ip['count'], 'dscp': ip['dscp'], 'ttl': ip['ttl'], - src_key: ip[src_key].split("-")[0], - dst_key: ip[dst_key].split("-")[0], + 'seed': ip['seed'], + 'srcip': srcip, + 'dstip': dstip, + 'srcmask': srcmask, + 'dstmask': dstmask, 'type': key, 'proto': ip['proto'], }, - 'outer_l4': value['outer_l4'], + 'outer_l4': { + 'srcport': src_port, + 'dstport': dst_port, + 'srcportmask': src_port_mask, + 'dstportmask': dst_port_mask, + 'count': outer_l4['count'], + 'seed': outer_l4['seed'], + } + } except KeyError: continue @@ -79,11 +120,9 @@ class IXIARFC2544Profile(TrexProfile): return result def _ixia_traffic_generate(self, traffic, ixia_obj): - for key, value in traffic.items(): - if key.startswith((self.UPLINK, self.DOWNLINK)): - value['iload'] = str(self.rate) - ixia_obj.update_frame(traffic) + ixia_obj.update_frame(traffic, self.config.duration) ixia_obj.update_ip_packet(traffic) + ixia_obj.update_l4(traffic) ixia_obj.start_traffic() def update_traffic_profile(self, traffic_generator): @@ -110,19 +149,21 @@ class IXIARFC2544Profile(TrexProfile): self.pg_id = 0 self.update_traffic_profile(traffic_generator) self.max_rate = self.rate - self.min_rate = 0 + self.min_rate = 0.0 else: - self.rate = round(float(self.max_rate + self.min_rate) / 2.0, 2) + self.rate = round(float(self.max_rate + self.min_rate) / 2.0, + self.RATE_ROUND) traffic = self._get_ixia_traffic_profile(self.full_profile, mac) self._ixia_traffic_generate(traffic, ixia_obj) return first_run - def get_drop_percentage(self, samples, tol_min, tolerance, duration=30.0, + def get_drop_percentage(self, samples, tol_min, tolerance, first_run=False): completed = False drop_percent = 100 num_ifaces = len(samples) + duration = self.config.duration in_packets_sum = sum( [samples[iface]['in_packets'] for iface in samples]) out_packets_sum = sum( @@ -137,7 +178,8 @@ class IXIARFC2544Profile(TrexProfile): try: drop_percent = round( - (packet_drop / float(out_packets_sum)) * 100, 2) + (packet_drop / float(out_packets_sum)) * 100, + self.DROP_PERCENT_ROUND) except ZeroDivisionError: LOG.info('No traffic is flowing') @@ -146,8 +188,10 @@ class IXIARFC2544Profile(TrexProfile): samples['DropPercentage'] = drop_percent if first_run: - self.rate = out_packets_sum / duration / num_ifaces completed = True if drop_percent <= tolerance else False + if (first_run and + self.rate_unit == tp_base.TrafficProfileConfig.RATE_FPS): + self.rate = float(out_packets_sum) / duration / num_ifaces if drop_percent > tolerance: self.max_rate = self.rate