load_gen: Supporting loading of load_gen via loader.
[vswitchperf.git] / core / traffic_controller_rfc2889.py
index a97a47d..01aaa72 100644 (file)
@@ -1,15 +1,24 @@
+# Copyright 2016-2017 Spirent Communications, Intel Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
 """RFC2889 Traffic Controller implementation.
 """
-import logging
-
-from core.traffic_controller import ITrafficController
-from core.results.results_constants import ResultsConstants
+from core.traffic_controller import TrafficController
 from core.results.results import IResults
 from conf import settings
-from conf import get_test_param
 
 
-class TrafficControllerRFC2889(ITrafficController, IResults):
+class TrafficControllerRFC2889(TrafficController, IResults):
     """Traffic controller for RFC2889 traffic
 
     Used to setup and control a traffic generator for an RFC2889 deployment
@@ -21,59 +30,21 @@ class TrafficControllerRFC2889(ITrafficController, IResults):
 
         :param traffic_gen_class: The traffic generator class to be used.
         """
-        self._logger = logging.getLogger(__name__)
-        self._logger.debug("__init__")
-        self._traffic_gen_class = traffic_gen_class()
-        self._traffic_started = False
-        self._traffic_started_call_count = 0
-        self._trials = int(get_test_param('rfc2889_trials', 1))
-        self._duration = int(get_test_param('duration', 30))
-        self._results = []
-
-        # If set, comma separated packet_sizes value from --test_params
-        # on cli takes precedence over value in settings file.
-        self._packet_sizes = None
-        packet_sizes_cli = get_test_param('pkt_sizes')
-        if packet_sizes_cli:
-            self._packet_sizes = [int(x.strip())
-                                  for x in packet_sizes_cli.split(',')]
-        else:
-            self._packet_sizes = settings.getValue('TRAFFICGEN_PKT_SIZES')
-
-    def __enter__(self):
-        """Call initialisation function.
-        """
-        self._traffic_gen_class.connect()
-
-    def __exit__(self, type_, value, traceback):
-        """Stop traffic, clean up.
-        """
-        if self._traffic_started:
-            self.stop_traffic()
-
-    @staticmethod
-    def _append_results(result_dict, packet_size):
-        """Adds common values to traffic generator results.
-
-        :param result_dict: Dictionary containing results from trafficgen
-        :param packet_size: Packet size value.
-
-        :returns: dictionary of results with additional entries.
-        """
-
-        ret_value = result_dict
-
-        ret_value[ResultsConstants.TYPE] = 'rfc2889'
-        ret_value[ResultsConstants.PACKET_SIZE] = str(packet_size)
-
-        return ret_value
+        super(TrafficControllerRFC2889, self).__init__(traffic_gen_class)
+        self._type = 'rfc2889'
+        self._trials = int(settings.getValue('TRAFFICGEN_RFC2889_TRIALS'))
 
     def send_traffic(self, traffic):
-        """See ITrafficController for description
+        """See TrafficController for description
         """
+        if not self.traffic_required():
+            return
         self._logger.debug('send_traffic with ' +
                            str(self._traffic_gen_class))
 
+        # update type with detailed traffic value
+        self._type = traffic['traffic_type']
+
         for packet_size in self._packet_sizes:
             # Merge framesize with the default traffic definition
             if 'l2' in traffic:
@@ -82,26 +53,30 @@ class TrafficControllerRFC2889(ITrafficController, IResults):
             else:
                 traffic['l2'] = {'framesize': packet_size}
 
-            if traffic['traffic_type'] == 'caching':
+            if traffic['traffic_type'] == 'rfc2889_caching':
                 result = self._traffic_gen_class.send_rfc2889_caching(
-                    traffic, trials=self._trials, duration=self._duration)
-            elif traffic['traffic_type'] == 'congestion':
-                result = self._traffic_gen_class.send_rfc2889_congestion(
-                    traffic, duration=self._duration)
-            else:
+                    traffic, tests=self._trials, duration=self._duration)
+            elif traffic['traffic_type'] == 'rfc2889_learning':
+                result = self._traffic_gen_class.send_rfc2889_learning(
+                    traffic, tests=self._trials, duration=self._duration)
+            elif traffic['traffic_type'] == 'rfc2889_forwarding':
                 result = self._traffic_gen_class.send_rfc2889_forwarding(
                     traffic, tests=self._trials, duration=self._duration)
 
-            result = TrafficControllerRFC2889._append_results(result,
-                                                              packet_size)
+            result = self._append_results(result, packet_size)
             self._results.append(result)
 
     def send_traffic_async(self, traffic, function):
-        """See ITrafficController for description
+        """See TrafficController for description
         """
+        if not self.traffic_required():
+            return
         self._logger.debug('send_traffic_async with ' +
                            str(self._traffic_gen_class))
 
+        # update type with detailed traffic value
+        self._type = traffic['traffic_type']
+
         for packet_size in self._packet_sizes:
             traffic['l2'] = {'framesize': packet_size}
             self._traffic_gen_class.start_rfc2889_forwarding(
@@ -114,33 +89,6 @@ class TrafficControllerRFC2889(ITrafficController, IResults):
             else:
                 function['function']()
             result = self._traffic_gen_class.wait_rfc2889_forwarding(
-                        traffic, trials=self._trials, duration=self._duration)
-            result = TrafficControllerRFC2889._append_results(result,
-                                                              packet_size)
+                traffic, trials=self._trials, duration=self._duration)
+            result = self._append_results(result, packet_size)
             self._results.append(result)
-
-    def stop_traffic(self):
-        """Kills traffic being sent from the traffic generator.
-        """
-        self._logger.debug("stop_traffic()")
-
-    def print_results(self):
-        """IResult interface implementation.
-        """
-        counter = 0
-        for item in self._results:
-            logging.info("Record: " + str(counter))
-            counter += 1
-            for(key, value) in list(item.items()):
-                logging.info("         Key: " + str(key) +
-                             ", Value: " + str(value))
-
-    def get_results(self):
-        """IResult interface implementation.
-        """
-        return self._results
-
-    def validate_send_traffic(self, result, traffic):
-        """Verify that send traffic has succeeded
-        """
-        return True