Merge "Fixed document for Grafana Port usage"
[yardstick.git] / yardstick / network_services / traffic_profile / traffic_profile.py
index 3feb92b..3b19ff9 100644 (file)
@@ -19,6 +19,7 @@ import socket
 import logging
 from random import SystemRandom
 import six
+import ipaddress
 
 from yardstick.network_services.traffic_profile.base import TrafficProfile
 from trex_stl_lib.trex_stl_client import STLStream
@@ -44,6 +45,8 @@ SRC_PORT = 'sport'
 DST_PORT = 'dport'
 TYPE_OF_SERVICE = 'tos'
 
+LOG = logging.getLogger(__name__)
+
 
 class TrexProfile(TrafficProfile):
     """ This class handles Trex Traffic profile generation and execution """
@@ -66,7 +69,8 @@ class TrexProfile(TrafficProfile):
         return f
 
     def _ethernet_range_action_partial(self, direction, _):
-        def partial(min_value, max_value):
+        def partial(min_value, max_value, count):
+            # pylint: disable=unused-argument
             stl_vm_flow_var = STLVmFlowVar(name="mac_{}".format(direction),
                                            min_value=1,
                                            max_value=30,
@@ -80,7 +84,16 @@ class TrexProfile(TrafficProfile):
         return partial
 
     def _ip_range_action_partial(self, direction, count=1):
-        def partial(min_value, max_value):
+        # pylint: disable=unused-argument
+        def partial(min_value, max_value, count):
+            ip1 = int(ipaddress.IPv4Address(min_value))
+            ip2 = int(ipaddress.IPv4Address(max_value))
+            actual_count = (ip2 - ip1)
+            if not actual_count:
+                count = 1
+            elif actual_count < int(count):
+                count = actual_count
+
             stl_vm_flow_var = STLVmFlowVarRepeatableRandom(name="ip4_{}".format(direction),
                                                            min_value=min_value,
                                                            max_value=max_value,
@@ -96,7 +109,8 @@ class TrexProfile(TrafficProfile):
         return partial
 
     def _ip6_range_action_partial(self, direction, _):
-        def partial(min_value, max_value):
+        def partial(min_value, max_value, count):
+            # pylint: disable=unused-argument
             min_value, max_value = self._get_start_end_ipv6(min_value, max_value)
             stl_vm_flow_var = STLVmFlowVar(name="ip6_{}".format(direction),
                                            min_value=min_value,
@@ -112,7 +126,8 @@ class TrexProfile(TrafficProfile):
         return partial
 
     def _dscp_range_action_partial(self, *_):
-        def partial(min_value, max_value):
+        def partial(min_value, max_value, count):
+            # pylint: disable=unused-argument
             stl_vm_flow_var = STLVmFlowVar(name="dscp",
                                            min_value=min_value,
                                            max_value=max_value,
@@ -123,9 +138,17 @@ class TrexProfile(TrafficProfile):
             stl_vm_wr_flow_var = STLVmWrFlowVar(fv_name='dscp',
                                                 pkt_offset='IP.tos')
             self.vm_flow_vars.append(stl_vm_wr_flow_var)
+        return partial
 
     def _udp_range_action_partial(self, field, count=1):
-        def partial(min_value, max_value):
+        # pylint: disable=unused-argument
+        def partial(min_value, max_value, count):
+            actual_count = int(max_value) - int(min_value)
+            if not actual_count:
+                count = 1
+            elif int(count) > actual_count:
+                count = actual_count
+
             stl_vm_flow_var = STLVmFlowVarRepeatableRandom(name="port_{}".format(field),
                                                            min_value=min_value,
                                                            max_value=max_value,
@@ -205,13 +228,14 @@ class TrexProfile(TrafficProfile):
         except StopIteration:
             single_action(min_value)
         else:
-            range_action(min_value=min_value, max_value=max_value)
+            range_action(min_value=min_value, max_value=max_value, count=count)
 
     def _set_proto_addr(self, protocol, field, address, count=1):
         single_action, range_action, to_int = self._map_proto_actions[protocol]
         self._call_on_range(address,
                             single_action(field),
                             range_action(field, count),
+                            count=count,
                             to_int=to_int,
                             )