Merge "Bugfix: pylint fix for yardstick/orchestrator/heat.py (no-value-for-parameter)"
[yardstick.git] / yardstick / network_services / traffic_profile / ixia_rfc2544.py
index 3933678..26dc1fe 100644 (file)
 
 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 __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_ixia_traffic_profile(self, profile_data, mac=None):
-        if mac is None:
-            mac = {}
+    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)):
@@ -48,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)],
                     },
@@ -70,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
@@ -83,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):
@@ -114,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(
@@ -141,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')
 
@@ -150,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