Complete OVS logging for sfc testcases 97/24497/1
authorGeorge Paraskevopoulos <geopar@intracom-telecom.com>
Mon, 24 Oct 2016 09:47:09 +0000 (12:47 +0300)
committerGeorge Paraskevopoulos <geopar@intracom-telecom.com>
Thu, 17 Nov 2016 13:34:34 +0000 (15:34 +0200)
- Add archiving capability in ovs_utils
- Refactor common code into a single method
- Add logging for compute nodes
- Rename jumphost to proxy to avoid confusion

Change-Id: I332bcb537d914c25febae53d5d48943e666da4f9
Signed-off-by: George Paraskevopoulos <geopar@intracom-telecom.com>
testcases/features/sfc/SSHUtils.py
testcases/features/sfc/sfc.py
testcases/features/sfc/sfc_colorado1.py

index 55cc510..9c8c2c7 100644 (file)
@@ -16,16 +16,16 @@ import os
 logger = rl.Logger('SSHUtils').getLogger()
 
 
-def get_ssh_client(hostname, username, password=None, jumphost=None):
+def get_ssh_client(hostname, username, password=None, proxy=None):
     client = None
     try:
-        if jumphost is None:
+        if proxy is None:
             client = paramiko.SSHClient()
         else:
-            client = JumpHostHopClient()
-            client.configure_jump_host(jumphost['ip'],
-                                       jumphost['username'],
-                                       jumphost['password'])
+            client = ProxyHopClient()
+            client.configure_jump_host(proxy['ip'],
+                                       proxy['username'],
+                                       proxy['password'])
 
         if client is None:
             raise Exception('Could not connect to client')
@@ -62,30 +62,30 @@ def put_file(ssh_conn, src, dest):
         return None
 
 
-class JumpHostHopClient(paramiko.SSHClient):
+class ProxyHopClient(paramiko.SSHClient):
     '''
-    Connect to a remote server using a jumphost hop
+    Connect to a remote server using a proxy hop
     '''
     def __init__(self, *args, **kwargs):
-        self.logger = rl.Logger("JumpHostHopClient").getLogger()
-        self.jumphost_ssh = None
-        self.jumphost_transport = None
-        self.jumphost_channel = None
-        self.jumphost_ip = None
-        self.jumphost_ssh_key = None
+        self.logger = rl.Logger("ProxyHopClient").getLogger()
+        self.proxy_ssh = None
+        self.proxy_transport = None
+        self.proxy_channel = None
+        self.proxy_ip = None
+        self.proxy_ssh_key = None
         self.local_ssh_key = os.path.join(os.getcwd(), 'id_rsa')
-        super(JumpHostHopClient, self).__init__(*args, **kwargs)
+        super(ProxyHopClient, self).__init__(*args, **kwargs)
 
     def configure_jump_host(self, jh_ip, jh_user, jh_pass,
                             jh_ssh_key='/root/.ssh/id_rsa'):
-        self.jumphost_ip = jh_ip
-        self.jumphost_ssh_key = jh_ssh_key
-        self.jumphost_ssh = paramiko.SSHClient()
-        self.jumphost_ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
-        self.jumphost_ssh.connect(jh_ip,
-                                  username=jh_user,
-                                  password=jh_pass)
-        self.jumphost_transport = self.jumphost_ssh.get_transport()
+        self.proxy_ip = jh_ip
+        self.proxy_ssh_key = jh_ssh_key
+        self.proxy_ssh = paramiko.SSHClient()
+        self.proxy_ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+        self.proxy_ssh.connect(jh_ip,
+                               username=jh_user,
+                               password=jh_pass)
+        self.proxy_transport = self.proxy_ssh.get_transport()
 
     def connect(self, hostname, port=22, username='root', password=None,
                 pkey=None, key_filename=None, timeout=None, allow_agent=True,
@@ -93,28 +93,28 @@ class JumpHostHopClient(paramiko.SSHClient):
                 gss_kex=False, gss_deleg_creds=True, gss_host=None,
                 banner_timeout=None):
         try:
-            if self.jumphost_ssh is None:
+            if self.proxy_ssh is None:
                 raise Exception('You must configure the jump '
                                 'host before calling connect')
 
-            get_file_res = get_file(self.jumphost_ssh,
-                                    self.jumphost_ssh_key,
+            get_file_res = get_file(self.proxy_ssh,
+                                    self.proxy_ssh_key,
                                     self.local_ssh_key)
             if get_file_res is None:
                 raise Exception('Could\'t fetch SSH key from jump host')
-            jumphost_key = (paramiko.RSAKey
-                            .from_private_key_file(self.local_ssh_key))
+            proxy_key = (paramiko.RSAKey
+                         .from_private_key_file(self.local_ssh_key))
 
-            self.jumphost_channel = self.jumphost_transport.open_channel(
+            self.proxy_channel = self.proxy_transport.open_channel(
                 "direct-tcpip",
                 (hostname, 22),
-                (self.jumphost_ip, 22))
+                (self.proxy_ip, 22))
 
             self.set_missing_host_key_policy(paramiko.AutoAddPolicy())
-            super(JumpHostHopClient, self).connect(hostname,
-                                                   username=username,
-                                                   pkey=jumphost_key,
-                                                   sock=self.jumphost_channel)
+            super(ProxyHopClient, self).connect(hostname,
+                                                username=username,
+                                                pkey=proxy_key,
+                                                sock=self.proxy_channel)
             os.remove(self.local_ssh_key)
         except Exception, e:
             self.logger.error(e)
index 3c71106..0259d33 100755 (executable)
@@ -2,13 +2,14 @@ import os
 import subprocess
 import sys
 import time
-
 import argparse
 import paramiko
 
 import functest.utils.functest_logger as ft_logger
 import functest.utils.functest_utils as ft_utils
 import functest.utils.openstack_utils as os_utils
+import SSHUtils as ssh_utils
+import ovs_utils
 
 parser = argparse.ArgumentParser()
 
@@ -21,7 +22,7 @@ args = parser.parse_args()
 """ logging configuration """
 logger = ft_logger.Logger("ODL_SFC").getLogger()
 
-FUNCTEST_RESULTS_DIR = '/home/opnfv/functest/results/'
+FUNCTEST_RESULTS_DIR = '/home/opnfv/functest/results/odl-sfc'
 FUNCTEST_REPO = ft_utils.FUNCTEST_REPO
 
 HOME = os.environ['HOME'] + "/"
@@ -55,6 +56,12 @@ TACKER_CHANGECLASSI = "sfc_change_classi.bash"
 
 ssh_options = '-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'
 
+PROXY = {
+    'ip': '10.20.0.2',
+    'username': 'root',
+    'password': 'r00tme'
+}
+
 
 def check_ssh(ip):
     cmd = "sshpass -p opnfv ssh " + ssh_options + " -q " + ip + " exit"
@@ -83,6 +90,15 @@ def main():
                                stderr=subprocess.PIPE)
     ip_server = process.stdout.readline().rstrip()
 
+    comp_cmd = ("sshpass -p r00tme ssh " + ssh_options + " root@10.20.0.2"
+                " 'fuel node'|grep compute|awk '{print $10}'")
+    logger.info("Executing script to get compute IPs: '%s'" % comp_cmd)
+    process = subprocess.Popen(comp_cmd,
+                               shell=True,
+                               stdout=subprocess.PIPE,
+                               stderr=subprocess.PIPE)
+    ip_computes = [ip.strip() for ip in process.stdout.readlines()]
+
     iptable_cmd1 = ("sshpass -p r00tme ssh " + ssh_options + " root@10.20.0.2"
                     " ssh " + ip_server + " iptables -P INPUT ACCEPT ")
     iptable_cmd2 = ("sshpass -p r00tme ssh " + ssh_options + " root@10.20.0.2"
@@ -107,6 +123,20 @@ def main():
     neutron_client = os_utils.get_neutron_client()
     glance_client = os_utils.get_glance_client()
 
+    ovs_logger = ovs_utils.OVSLogger(
+        os.path.join(os.getcwd(), 'ovs-logs'),
+        FUNCTEST_RESULTS_DIR)
+
+    controller_clients = [ssh_utils.get_ssh_client(ip_server,
+                                                   'root',
+                                                   proxy=PROXY)]
+    compute_clients = []
+    for c_ip in ip_computes:
+        c_client = ssh_utils.get_ssh_client(c_ip,
+                                            'root',
+                                            proxy=PROXY)
+        compute_clients.append(c_client)
+
 # Download the image
 
     if not os.path.isfile(IMAGE_PATH):
@@ -384,8 +414,14 @@ def main():
             i = i + 1
             json_results.update({"Test 1: SSH Blocked": "Passed"})
         else:
-            logger.error('\033[91m' + "TEST 1 [FAILED] "
-                         "==> SSH NOT BLOCKED" + '\033[0m')
+            timestamp = time.strftime("%Y%m%d-%H%M%S")
+            error = ('\033[91m' + "TEST 1 [FAILED] "
+                     "==> SSH NOT BLOCKED" + '\033[0m')
+            logger.error(error)
+            ovs_logger.dump_ovs_logs(controller_clients,
+                                     compute_clients,
+                                     related_error=error,
+                                     timestamp=timestamp)
             status = "FAIL"
             json_results.update({"Test 1: SSH Blocked": "Failed"})
             failures += 1
@@ -407,8 +443,14 @@ def main():
             i = i + 1
             json_results.update({"Test 2: HTTP works": "Passed"})
         else:
-            logger.error('\033[91m' + "TEST 2 [FAILED] "
-                         "==> HTTP BLOCKED" + '\033[0m')
+            timestamp = time.strftime("%Y%m%d-%H%M%S")
+            error = ('\033[91m' + "TEST 2 [FAILED] "
+                     "==> HTTP BLOCKED" + '\033[0m')
+            logger.error(error)
+            ovs_logger.dump_ovs_logs(controller_clients,
+                                     compute_clients,
+                                     related_error=error,
+                                     timestamp=timestamp)
             status = "FAIL"
             json_results.update({"Test 2: HTTP works": "Failed"})
             failures += 1
@@ -440,8 +482,14 @@ def main():
             i = i + 1
             json_results.update({"Test 3: HTTP Blocked": "Passed"})
         else:
-            logger.error('\033[91m' + "TEST 3 [FAILED] "
-                         "==> HTTP NOT BLOCKED" + '\033[0m')
+            timestamp = time.strftime("%Y%m%d-%H%M%S")
+            error = ('\033[91m' + "TEST 3 [FAILED] "
+                     "==> HTTP NOT BLOCKED" + '\033[0m')
+            logger.error(error)
+            ovs_logger.dump_ovs_logs(controller_clients,
+                                     compute_clients,
+                                     related_error=error,
+                                     timestamp=timestamp)
             status = "FAIL"
             json_results.update({"Test 3: HTTP Blocked": "Failed"})
             failures += 1
@@ -463,8 +511,14 @@ def main():
             i = i + 1
             json_results.update({"Test 4: SSH works": "Passed"})
         else:
-            logger.error('\033[91m' + "TEST 4 [FAILED] "
-                         "==> SSH BLOCKED" + '\033[0m')
+            timestamp = time.strftime("%Y%m%d-%H%M%S")
+            error = ('\033[91m' + "TEST 4 [FAILED] "
+                     "==> SSH BLOCKED" + '\033[0m')
+            logger.error(error)
+            ovs_logger.dump_ovs_logs(controller_clients,
+                                     compute_clients,
+                                     related_error=error,
+                                     timestamp=timestamp)
             status = "FAIL"
             json_results.update({"Test 4: SSH works": "Failed"})
             failures += 1
@@ -473,6 +527,8 @@ def main():
         time.sleep(6)
         # timeout -= 1
 
+    ovs_logger.create_artifact_archive()
+
     if i == 4:
         for x in range(0, 5):
             logger.info('\033[92m' + "SFC TEST WORKED"
index f40d9cc..5f8b668 100755 (executable)
@@ -22,7 +22,7 @@ args = parser.parse_args()
 """ logging configuration """
 logger = ft_logger.Logger("ODL_SFC").getLogger()
 
-FUNCTEST_RESULTS_DIR = '/home/opnfv/functest/results/'
+FUNCTEST_RESULTS_DIR = '/home/opnfv/functest/results/odl-sfc'
 FUNCTEST_REPO = ft_utils.FUNCTEST_REPO
 
 HOME = os.environ['HOME'] + "/"
@@ -56,6 +56,12 @@ TACKER_CHANGECLASSI = "sfc_change_classi.bash"
 
 ssh_options = '-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'
 
+PROXY = {
+    'ip': '10.20.0.2',
+    'username': 'root',
+    'password': 'r00tme'
+}
+
 
 def check_ssh(ip):
     cmd = "sshpass -p opnfv ssh " + ssh_options + " -q " + ip + " exit"
@@ -84,6 +90,15 @@ def main():
                                stderr=subprocess.PIPE)
     ip_server = process.stdout.readline().rstrip()
 
+    comp_cmd = ("sshpass -p r00tme ssh " + ssh_options + " root@10.20.0.2"
+                " 'fuel node'|grep compute|awk '{print $10}'")
+    logger.info("Executing script to get compute IPs: '%s'" % comp_cmd)
+    process = subprocess.Popen(comp_cmd,
+                               shell=True,
+                               stdout=subprocess.PIPE,
+                               stderr=subprocess.PIPE)
+    ip_computes = [ip.strip() for ip in process.stdout.readlines()]
+
     iptable_cmd1 = ("sshpass -p r00tme ssh " + ssh_options + " root@10.20.0.2"
                     " ssh " + ip_server + " iptables -P INPUT ACCEPT ")
     iptable_cmd2 = ("sshpass -p r00tme ssh " + ssh_options + " root@10.20.0.2"
@@ -108,15 +123,19 @@ def main():
     neutron_client = os_utils.get_neutron_client()
     glance_client = os_utils.get_glance_client()
 
-    ovs_logger = ovs_utils.OVSLogger(FUNCTEST_RESULTS_DIR)
-    jumphost = {
-        'ip': '10.20.0.2',
-        'username': 'root',
-        'password': 'r00tme'
-    }
-    controller_client = ssh_utils.get_ssh_client(ip_server,
-                                                 'root',
-                                                 jumphost=jumphost)
+    ovs_logger = ovs_utils.OVSLogger(
+        os.path.join(os.getcwd(), 'ovs-logs'),
+        FUNCTEST_RESULTS_DIR)
+
+    controller_clients = [ssh_utils.get_ssh_client(ip_server,
+                                                   'root',
+                                                   proxy=PROXY)]
+    compute_clients = []
+    for c_ip in ip_computes:
+        c_client = ssh_utils.get_ssh_client(c_ip,
+                                            'root',
+                                            proxy=PROXY)
+        compute_clients.append(c_client)
 
 # Download the image
 
@@ -422,14 +441,10 @@ def main():
                 error = ('\033[91m' + "TEST 1 [FAILED] "
                          "==> SSH NOT BLOCKED" + '\033[0m')
                 logger.error(error)
-                ovs_logger.ofctl_dump_flows(controller_client,
-                                            timestamp=timestamp)
-                ovs_logger.vsctl_show(controller_client,
-                                      timestamp=timestamp)
-
-                dumpdir = os.path.join(ovs_logger.ovs_dir, timestamp)
-                with open(os.path.join(dumpdir, 'error'), 'w') as f:
-                    f.write(error)
+                ovs_logger.dump_ovs_logs(controller_clients,
+                                         compute_clients,
+                                         related_error=error,
+                                         timestamp=timestamp)
                 status = "FAIL"
                 json_results.update({"Test 1: SSH Blocked": "Failed"})
                 failures += 1
@@ -451,17 +466,14 @@ def main():
                 i = i + 1
                 json_results.update({"Test 2: HTTP works": "Passed"})
             else:
+                timestamp = time.strftime("%Y%m%d-%H%M%S")
                 error = ('\033[91m' + "TEST 2 [FAILED] "
                          "==> HTTP BLOCKED" + '\033[0m')
                 logger.error(error)
-                ovs_logger.ofctl_dump_flows(controller_client,
-                                            timestamp=timestamp)
-                ovs_logger.vsctl_show(controller_client,
-                                      timestamp=timestamp)
-
-                dumpdir = os.path.join(ovs_logger.ovs_dir, timestamp)
-                with open(os.path.join(dumpdir, 'error'), 'w') as f:
-                    f.write(error)
+                ovs_logger.dump_ovs_logs(controller_clients,
+                                         compute_clients,
+                                         related_error=error,
+                                         timestamp=timestamp)
                 status = "FAIL"
                 json_results.update({"Test 2: HTTP works": "Failed"})
                 failures += 1
@@ -493,17 +505,14 @@ def main():
                 i = i + 1
                 json_results.update({"Test 3: HTTP Blocked": "Passed"})
             else:
+                timestamp = time.strftime("%Y%m%d-%H%M%S")
                 error = ('\033[91m' + "TEST 3 [FAILED] "
                          "==> HTTP NOT BLOCKED" + '\033[0m')
                 logger.error(error)
-                ovs_logger.ofctl_dump_flows(controller_client,
-                                            timestamp=timestamp)
-                ovs_logger.vsctl_show(controller_client,
-                                      timestamp=timestamp)
-
-                dumpdir = os.path.join(ovs_logger.ovs_dir, timestamp)
-                with open(os.path.join(dumpdir, 'error'), 'w') as f:
-                    f.write(error)
+                ovs_logger.dump_ovs_logs(controller_clients,
+                                         compute_clients,
+                                         related_error=error,
+                                         timestamp=timestamp)
                 status = "FAIL"
                 json_results.update({"Test 3: HTTP Blocked": "Failed"})
                 failures += 1
@@ -525,17 +534,14 @@ def main():
                 i = i + 1
                 json_results.update({"Test 4: SSH works": "Passed"})
             else:
+                timestamp = time.strftime("%Y%m%d-%H%M%S")
                 error = ('\033[91m' + "TEST 4 [FAILED] "
                          "==> SSH BLOCKED" + '\033[0m')
                 logger.error(error)
-                ovs_logger.ofctl_dump_flows(controller_client,
-                                            timestamp=timestamp)
-                ovs_logger.vsctl_show(controller_client,
-                                      timestamp=timestamp)
-
-                dumpdir = os.path.join(ovs_logger.ovs_dir, timestamp)
-                with open(os.path.join(dumpdir, 'error'), 'w') as f:
-                    f.write(error)
+                ovs_logger.dump_ovs_logs(controller_clients,
+                                         compute_clients,
+                                         related_error=error,
+                                         timestamp=timestamp)
                 status = "FAIL"
                 json_results.update({"Test 4: SSH works": "Failed"})
                 failures += 1
@@ -544,6 +550,8 @@ def main():
             time.sleep(6)
             # timeout -= 1
 
+        ovs_logger.create_artifact_archive()
+
         iterator += 1
         if i == 4:
             for x in range(0, 5):