Feature to know the time it takes to update OVS 07/24507/1
authorManuel Buil <manuel.buil@ericsson.com>
Tue, 8 Nov 2016 17:16:35 +0000 (18:16 +0100)
committerGeorge Paraskevopoulos <geopar@intracom-telecom.com>
Thu, 17 Nov 2016 14:06:23 +0000 (16:06 +0200)
ODL takes too much time to update the classification rules and we would like
to measure it to use it as a proof point that it is not acceptable.
This feature allows to measure it.

Change-Id: I00ade7e4aee7c9c81843077104727b98ad9bfea3
Signed-off-by: Manuel Buil <manuel.buil@ericsson.com>
testcases/features/sfc/ovs_utils.py
testcases/features/sfc/sfc.py

index 20ab5a7..af1f232 100644 (file)
@@ -11,6 +11,7 @@ import functest.utils.functest_logger as rl
 import os
 import time
 import shutil
+import re
 
 logger = rl.Logger('ovs_utils').getLogger()
 
@@ -115,3 +116,22 @@ class OVSLogger(object):
             dumpdir = os.path.join(self.ovs_dir, timestamp)
             with open(os.path.join(dumpdir, 'error'), 'w') as f:
                 f.write(related_error)
+
+    def ofctl_time_counter(self, ssh_conn):
+        try:
+            # We get the flows from table 11
+            table = 11
+            br = "br-int"
+            output = self.ofctl_dump_flows(ssh_conn, br, table)
+            pattern = "NXM_NX_NSP"
+            rsps = []
+            lines = output.split(",")
+            for line in lines:
+                is_there = re.findall(pattern, line)
+                if is_there:
+                    value = line.split(":")[1].split("-")[0]
+                    rsps.append(value)
+            return rsps
+        except Exception, e:
+            logger.error('Error when countering %s' % e)
+            return None
index 0b83ab7..9de5928 100755 (executable)
@@ -10,6 +10,7 @@ import re
 import json
 import SSHUtils as ssh_utils
 import ovs_utils
+import thread
 
 parser = argparse.ArgumentParser()
 
@@ -401,6 +402,31 @@ def check_ssh(ips, retries=100):
 
     return False
 
+# Measure the time it takes to update the classification rules
+
+
+def capture_time_log(compute_clients):
+    ovs_logger = ovs_utils.OVSLogger(
+        os.path.join(os.getcwd(), 'ovs-logs'),
+        "test")
+    i = 0
+    first_RSP = ""
+    start_time = time.time()
+    while True:
+        rsps = ovs_logger.ofctl_time_counter(compute_clients[0])
+        if not i:
+            first_RSP = rsps[0]
+            i = i + 1
+        if(first_RSP != rsps[0]):
+            if (rsps[0] == rsps[1]):
+                stop_time = time.time()
+                logger.info("classification rules updated")
+                difference = stop_time - start_time
+                logger.info("It took %s seconds" % difference)
+                break
+        time.sleep(1)
+    return
+
 
 def main():
     installer_type = os.environ.get("INSTALLER_TYPE")
@@ -444,6 +470,13 @@ def main():
         nova_client, SERVER, FLAVOR, image_id, network_id, sg_id)
 
     subprocess.call(TACKER_SCRIPT, shell=True)
+
+    # Start measuring the time it takes to implement the classification rules
+    try:
+        thread.start_new_thread(capture_time_log, (compute_clients,))
+    except Exception, e:
+        logger.error("Unable to start the thread that counts time %s" % e)
+
     server_ip, client_ip, sf1, sf2 = get_floating_ips(
         nova_client, neutron_client)
 
@@ -487,6 +520,13 @@ def main():
 
     logger.info("Changing the classification")
     subprocess.call(TACKER_CHANGECLASSI, shell=True)
+
+    # Start measuring the time it takes to implement the classification rules
+    try:
+        thread.start_new_thread(capture_time_log, (compute_clients,))
+    except Exception, e:
+        logger.error("Unable to start the thread that counts time %s" % e)
+
     logger.info("Wait for ODL to update the classification rules in OVS")
     time.sleep(100)