Merge "trex_learning: Add learning packet option to T-Rex testing"
[vswitchperf.git] / tools / pkt_gen / testcenter / testcenter.py
index c242269..9980ae7 100644 (file)
@@ -95,8 +95,6 @@ def get_rfc2544_common_settings():
             settings.getValue("TRAFFICGEN_STC_WEST_INTF_ADDR"),
             "--west_intf_gateway_addr",
             settings.getValue("TRAFFICGEN_STC_WEST_INTF_GATEWAY_ADDR"),
-            "--num_trials",
-            settings.getValue("TRAFFICGEN_STC_NUMBER_OF_TRIALS"),
             "--trial_duration_sec",
             settings.getValue("TRAFFICGEN_STC_TRIAL_DURATION_SEC"),
             "--traffic_pattern",
@@ -104,14 +102,65 @@ def get_rfc2544_common_settings():
     return args
 
 
-def get_rfc2544_custom_settings(framesize, custom_tr):
+def get_rfc2544_custom_settings(framesize, custom_tr, tests):
     """
     Return RFC2544 Custom Settings
     """
     args = ["--frame_size_list",
             str(framesize),
             "--traffic_custom",
-            str(custom_tr)]
+            str(custom_tr),
+            "--num_trials",
+            str(tests)]
+    return args
+
+
+def get_rfc2889_common_settings(framesize, tests, metric):
+    """
+    Return RFC2889 common Settings
+    """
+    new_metric = metric.replace('rfc2889_', '')
+    args = [settings.getValue("TRAFFICGEN_STC_PYTHON2_PATH"),
+            os.path.join(
+                settings.getValue("TRAFFICGEN_STC_TESTCENTER_PATH"),
+                settings.getValue(
+                    "TRAFFICGEN_STC_RFC2889_TEST_FILE_NAME")),
+            "--lab_server_addr",
+            settings.getValue("TRAFFICGEN_STC_LAB_SERVER_ADDR"),
+            "--license_server_addr",
+            settings.getValue("TRAFFICGEN_STC_LICENSE_SERVER_ADDR"),
+            "--location_list",
+            settings.getValue("TRAFFICGEN_STC_RFC2889_LOCATIONS"),
+            "--test_session_name",
+            settings.getValue("TRAFFICGEN_STC_TEST_SESSION_NAME"),
+            "--results_dir",
+            settings.getValue("TRAFFICGEN_STC_RESULTS_DIR"),
+            "--csv_results_file_prefix",
+            settings.getValue("TRAFFICGEN_STC_CSV_RESULTS_FILE_PREFIX"),
+            "--frame_size_list",
+            str(framesize),
+            "--metric",
+            str(new_metric),
+            "--num_trials",
+            str(tests)]
+
+    return args
+
+
+def get_rfc2889_custom_settings():
+    """
+    Return RFC2889 Custom Settings
+    """
+    args = ["--min_learning_rate",
+            settings.getValue("TRAFFICGEN_STC_RFC2889_MIN_LR"),
+            "--max_learning_rate",
+            settings.getValue("TRAFFICGEN_STC_RFC2889_MAX_LR"),
+            "--min_num_addrs",
+            settings.getValue("TRAFFICGEN_STC_RFC2889_MIN_ADDRS"),
+            "--max_num_addrs",
+            settings.getValue("TRAFFICGEN_STC_RFC2889_MAX_ADDRS"),
+            "--ac_learning_rate",
+            settings.getValue("TRAFFICGEN_STC_RFC2889_AC_LR")]
     return args
 
 
@@ -139,6 +188,149 @@ class TestCenter(trafficgen.ITrafficGenerator):
         """
         return None
 
+    def get_rfc2889_addr_learning_results(self, filename):
+        """
+        Reads the CSV file and return the results
+        """
+        result = {}
+        with open(filename, "r") as csvfile:
+            csvreader = csv.DictReader(csvfile)
+            for row in csvreader:
+                self._logger.info("Row: %s", row)
+                learn_rate = float(row["OptimalLearningRate"])
+                result[ResultsConstants.OPTIMAL_LEARNING_RATE_FPS] = learn_rate
+        return result
+
+    def get_rfc2889_addr_caching_results(self, filename):
+        """
+        Reads the CSV file and return the results
+        """
+        result = {}
+        with open(filename, "r") as csvfile:
+            csvreader = csv.DictReader(csvfile)
+            for row in csvreader:
+                self._logger.info("Row: %s", row)
+                caching_cap = float(row["RxFrameCount"])
+                learn_per = (100.0 - (float(row["PercentFrameLoss(%)"])))
+                result[ResultsConstants.CACHING_CAPACITY_ADDRS] = caching_cap
+                result[ResultsConstants.ADDR_LEARNED_PERCENT] = learn_per
+        return result
+
+    def get_rfc2889_forwarding_results(self, filename):
+        """
+        Reads the CSV file and return the results
+        """
+        result = {}
+        with open(filename, "r") as csvfile:
+            csvreader = csv.DictReader(csvfile)
+            for row in csvreader:
+                self._logger.info("Row: %s", row)
+                duration = int((float(row["TxSignatureFrameCount"])) /
+                               (float(row["OfferedLoad(fps)"])))
+                tx_fps = (float(row["OfferedLoad(fps)"]))
+                rx_fps = float((float(row["RxFrameCount"])) /
+                               float(duration))
+                tx_mbps = ((tx_fps * float(row["FrameSize"])) /
+                           (1000000.0))
+                rx_mbps = ((rx_fps * float(row["FrameSize"])) /
+                           (1000000.0))
+                result[ResultsConstants.TX_RATE_FPS] = tx_fps
+                result[ResultsConstants.THROUGHPUT_RX_FPS] = rx_fps
+                result[ResultsConstants.TX_RATE_MBPS] = tx_mbps
+                result[ResultsConstants.THROUGHPUT_RX_MBPS] = rx_mbps
+                result[ResultsConstants.TX_RATE_PERCENT] = float(
+                    row["OfferedLoad(%)"])
+                result[ResultsConstants.FRAME_LOSS_PERCENT] = float(
+                    row["PercentFrameLoss(%)"])
+                result[ResultsConstants.FORWARDING_RATE_FPS] = float(
+                    row["ForwardingRate(fps)"])
+        return result
+
+    # pylint: disable=unused-argument
+    def send_rfc2889_forwarding(self, traffic=None, tests=1, duration=20):
+        """
+        Send traffic per RFC2889 Forwarding test specifications.
+        """
+        framesize = settings.getValue("TRAFFICGEN_STC_FRAME_SIZE")
+        if traffic and 'l2' in traffic:
+            if 'framesize' in traffic['l2']:
+                framesize = traffic['l2']['framesize']
+        args = get_rfc2889_common_settings(framesize, tests,
+                                           traffic['traffic_type'])
+        if settings.getValue("TRAFFICGEN_STC_VERBOSE") is "True":
+            args.append("--verbose")
+            verbose = True
+            self._logger.debug("Arguments used to call test: %s", args)
+        subprocess.check_call(args)
+
+        filec = os.path.join(settings.getValue("TRAFFICGEN_STC_RESULTS_DIR"),
+                             settings.getValue(
+                                 "TRAFFICGEN_STC_CSV_RESULTS_FILE_PREFIX") +
+                             ".csv")
+
+        if verbose:
+            self._logger.info("file: %s", filec)
+
+        return self.get_rfc2889_forwarding_results(filec)
+
+    def send_rfc2889_caching(self, traffic=None, tests=1, duration=20):
+        """
+        Send as per RFC2889 Addr-Caching test specifications.
+        """
+        framesize = settings.getValue("TRAFFICGEN_STC_FRAME_SIZE")
+        if traffic and 'l2' in traffic:
+            if 'framesize' in traffic['l2']:
+                framesize = traffic['l2']['framesize']
+        common_args = get_rfc2889_common_settings(framesize, tests,
+                                                  traffic['traffic_type'])
+        custom_args = get_rfc2889_custom_settings()
+        args = common_args + custom_args
+
+        if settings.getValue("TRAFFICGEN_STC_VERBOSE") is "True":
+            args.append("--verbose")
+            verbose = True
+            self._logger.debug("Arguments used to call test: %s", args)
+        subprocess.check_call(args)
+
+        filec = os.path.join(settings.getValue("TRAFFICGEN_STC_RESULTS_DIR"),
+                             settings.getValue(
+                                 "TRAFFICGEN_STC_CSV_RESULTS_FILE_PREFIX") +
+                             ".csv")
+
+        if verbose:
+            self._logger.info("file: %s", filec)
+
+        return self.get_rfc2889_addr_caching_results(filec)
+
+    def send_rfc2889_learning(self, traffic=None, tests=1, duration=20):
+        """
+        Send traffic per RFC2889 Addr-Learning test specifications.
+        """
+        framesize = settings.getValue("TRAFFICGEN_STC_FRAME_SIZE")
+        if traffic and 'l2' in traffic:
+            if 'framesize' in traffic['l2']:
+                framesize = traffic['l2']['framesize']
+        common_args = get_rfc2889_common_settings(framesize, tests,
+                                                  traffic['traffic_type'])
+        custom_args = get_rfc2889_custom_settings()
+        args = common_args + custom_args
+
+        if settings.getValue("TRAFFICGEN_STC_VERBOSE") is "True":
+            args.append("--verbose")
+            verbose = True
+            self._logger.debug("Arguments used to call test: %s", args)
+        subprocess.check_call(args)
+
+        filec = os.path.join(settings.getValue("TRAFFICGEN_STC_RESULTS_DIR"),
+                             settings.getValue(
+                                 "TRAFFICGEN_STC_CSV_RESULTS_FILE_PREFIX") +
+                             ".csv")
+
+        if verbose:
+            self._logger.info("file: %s", filec)
+
+        return self.get_rfc2889_addr_learning_results(filec)
+
     def get_rfc2544_results(self, filename):
         """
         Reads the CSV file and return the results
@@ -192,8 +384,8 @@ class TestCenter(trafficgen.ITrafficGenerator):
         stc_common_args = get_stc_common_settings()
         rfc2544_common_args = get_rfc2544_common_settings()
         rfc2544_custom_args = get_rfc2544_custom_settings(framesize,
-                                                          custom)
-        args = stc_common_args + rfc2544_common_args + rfc2544_custom_args
+                                                          custom, 1)
+        args = rfc2544_common_args + stc_common_args + rfc2544_custom_args
 
         if settings.getValue("TRAFFICGEN_STC_VERBOSE") is "True":
             args.append("--verbose")
@@ -224,8 +416,9 @@ class TestCenter(trafficgen.ITrafficGenerator):
 
         stc_common_args = get_stc_common_settings()
         rfc2544_common_args = get_rfc2544_common_settings()
-        rfc2544_custom_args = get_rfc2544_custom_settings(framesize, '')
-        args = stc_common_args + rfc2544_common_args + rfc2544_custom_args
+        rfc2544_custom_args = get_rfc2544_custom_settings(framesize, '',
+                                                          tests)
+        args = rfc2544_common_args + stc_common_args + rfc2544_custom_args
 
         if settings.getValue("TRAFFICGEN_STC_VERBOSE") is "True":
             args.append("--verbose")
@@ -256,8 +449,9 @@ class TestCenter(trafficgen.ITrafficGenerator):
 
         stc_common_args = get_stc_common_settings()
         rfc2544_common_args = get_rfc2544_common_settings()
-        rfc2544_custom_args = get_rfc2544_custom_settings(framesize, '')
-        args = stc_common_args + rfc2544_common_args + rfc2544_custom_args
+        rfc2544_custom_args = get_rfc2544_custom_settings(framesize, '',
+                                                          tests)
+        args = rfc2544_common_args + stc_common_args + rfc2544_custom_args
 
         if settings.getValue("TRAFFICGEN_STC_VERBOSE") is "True":
             args.append("--verbose")
@@ -274,6 +468,26 @@ class TestCenter(trafficgen.ITrafficGenerator):
 
         return self.get_rfc2544_results(filecs)
 
+    def start_cont_traffic(self, traffic=None, duration=30):
+        raise NotImplementedError('TestCenter start_cont_traffic not implement.')
+
+    def stop_cont_traffic(self):
+        raise NotImplementedError('TestCenter stop_cont_traffic not implement.')
+
+    def start_rfc2544_back2back(self, traffic=None, tests=1, duration=20,
+                                lossrate=0.0):
+        raise NotImplementedError('TestCenter start_rfc2544_back2back not implement.')
+
+    def wait_rfc2544_back2back(self):
+        raise NotImplementedError('TestCenter wait_rfc2544_back2back not implement.')
+
+    def start_rfc2544_throughput(self, traffic=None, tests=1, duration=20,
+                                 lossrate=0.0):
+        raise NotImplementedError('TestCenter start_rfc2544_throughput not implement.')
+
+    def wait_rfc2544_throughput(self):
+        raise NotImplementedError('TestCenter wait_rfc2544_throughput not implement.')
+
 if __name__ == '__main__':
     TRAFFIC = {
         'l3': {