Adopt TestcaseBase for ONOS and ONOS SFC
authorhelenyao <yaohelan@huawei.com>
Mon, 27 Feb 2017 02:27:05 +0000 (21:27 -0500)
committerjose.lausuch <jose.lausuch@ericsson.com>
Wed, 1 Mar 2017 13:27:36 +0000 (14:27 +0100)
1. Adopted TestcaseBase for ONOS and ONOS SFC
2. Removed the ONOS testcase from exec_test.sh

This patch is not meant to refactor the code which can
be improved in a later patch.

Change-Id: Ib8ac47742f598648c7575c9a8968477307629d42
Signed-off-by: helenyao <yaohelan@huawei.com>
functest/ci/config_functest.yaml
functest/ci/exec_test.sh
functest/ci/testcases.yaml
functest/opnfv_tests/sdn/onos/__init__.py [new file with mode: 0644]
functest/opnfv_tests/sdn/onos/onos.py [new file with mode: 0644]
functest/opnfv_tests/sdn/onos/teston/onos.py [deleted file]
functest/utils/functest_constants.py

index 7beb9d4..a3eebab 100755 (executable)
@@ -5,8 +5,8 @@ general:
         dir_odl:           functest/opnfv_tests/sdn/odl
         rally:             functest/opnfv_tests/openstack/rally
         tempest_cases:     functest/opnfv_tests/openstack/tempest/custom_tests
-        dir_onos:          functest/opnfv_tests/sdn/onos/teston
-        dir_onos_sfc:      functest/opnfv_tests/sdn/onos/sfc
+        onos:              functest/opnfv_tests/sdn/onos/teston
+        onos_sfc:          functest/opnfv_tests/sdn/onos/sfc
 
         # Absolute path
         home:               /home/opnfv
@@ -18,7 +18,7 @@ general:
         repo_vims_test:     /home/opnfv/repos/vnfs/vims-test
         repo_sdnvpn:        /home/opnfv/repos/sdnvpn
         repo_sfc:           /home/opnfv/repos/sfc
-        dir_repo_onos:      /home/opnfv/repos/onos
+        repo_onos:          /home/opnfv/repos/onos
         repo_promise:       /home/opnfv/repos/promise
         repo_netready:      /home/opnfv/repos/netready
         repo_barometer:     /home/opnfv/repos/barometer
index aa0cfaf..6f77610 100755 (executable)
@@ -94,12 +94,6 @@ function run_test(){
                 --osusername ${OS_USERNAME} \
                 ${args}
         ;;
-        "onos")
-            python ${FUNCTEST_TEST_DIR}/sdn/onos/teston/onos.py
-        ;;
-        "onos_sfc")
-            python ${FUNCTEST_TEST_DIR}/sdn/onos/teston/onos.py -t sfc
-        ;;
         "ovno")
             # suite under rewritting for colorado
             # no need to run anything until refactoring done
index ccf9bae..1e5ba75 100755 (executable)
@@ -174,7 +174,9 @@ tiers:
                 dependencies:
                     installer: ''
                     scenario: 'onos'
-
+                run:
+                    module: 'functest.opnfv_tests.sdn.onos.onos'
+                    class: 'Onos'
 
             -
                 name: snaps_smoke
@@ -300,6 +302,9 @@ tiers:
                 dependencies:
                     installer: ''
                     scenario: 'onos-sfc'
+                run:
+                    module: 'functest.opnfv_tests.sdn.onos.onos'
+                    class: 'OnosSfc'
             -
                 name: parser
                 criteria: 'ret == 0'
diff --git a/functest/opnfv_tests/sdn/onos/__init__.py b/functest/opnfv_tests/sdn/onos/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/functest/opnfv_tests/sdn/onos/onos.py b/functest/opnfv_tests/sdn/onos/onos.py
new file mode 100644 (file)
index 0000000..8bc7383
--- /dev/null
@@ -0,0 +1,225 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2017 HUAWEI TECHNOLOGIES CO.,LTD and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+
+import os
+import re
+import subprocess
+import shutil
+import time
+import urlparse
+
+from functest.core import testcase_base
+from functest.utils.constants import CONST
+import functest.utils.functest_logger as ft_logger
+import functest.utils.functest_utils as ft_utils
+import functest.utils.openstack_utils as openstack_utils
+
+
+logger = ft_logger.Logger(__name__).getLogger()
+
+
+class OnosBase(testcase_base.TestcaseBase):
+    onos_repo_path = CONST.dir_repo_onos
+    onos_sfc_image_name = CONST.onos_sfc_image_name
+    onos_sfc_image_path = os.path.join(CONST.dir_functest_data,
+                                       CONST.onos_sfc_image_file_name)
+    onos_sfc_path = os.path.join(CONST.dir_repo_functest,
+                                 CONST.dir_onos_sfc)
+
+    def __init__(self):
+        super(OnosBase, self).__init__()
+
+    def run(self):
+        self.start_time = time.time()
+        try:
+            self._run()
+            res = testcase_base.TestcaseBase.EX_OK
+        except Exception as e:
+            logger.error('Error with run: %s', e)
+            res = testcase_base.TestcaseBase.EX_RUN_ERROR
+
+        self.stop_time = time.time()
+        return res
+
+    def _run(self):
+        raise NotImplementedError('_run is not implemented')
+
+
+class Onos(OnosBase):
+    def __init__(self):
+        super(Onos, self).__init__()
+        self.case_name = 'onos'
+        self.log_path = os.path.join(self.onos_repo_path, 'TestON/logs')
+
+    def set_onos_ip(self):
+        if (CONST.INSTALLER_TYPE and
+                CONST.INSTALLER_TYPE.lower() == 'joid'):
+            sdn_controller_env = os.getenv('SDN_CONTROLLER')
+            OC1 = re.search(r"\d+\.\d+\.\d+\.\d+", sdn_controller_env).group()
+        else:
+            neutron_url = openstack_utils.get_endpoint(service_type='network')
+            OC1 = urlparse.urlparse(neutron_url).hostname
+        os.environ['OC1'] = OC1
+        logger.debug("ONOS IP is %s" % OC1)
+
+    def run_onos_script(self, testname):
+        cli_dir = os.path.join(self.onos_repo_path, 'TestON/bin/cli.py')
+        cmd = '{0} run {1}'.format(cli_dir, testname)
+        logger.debug("Run script: %s" % testname)
+        ft_utils.execute_command_raise(
+            cmd,
+            error_msg=('Error when running ONOS script: %s'
+                       % (testname)))
+
+    def clean_existing_logs(self):
+        log_dir = [f for f in os.listdir(self.log_path)]
+        for log in log_dir:
+            try:
+                if os.path.isdir(log):
+                    shutil.rmtree(log)
+                elif os.path.isfile(log):
+                    os.remove(log)
+            except OSError as e:
+                logger.error('Error with deleting file %s: %s',
+                             log, e.strerror)
+
+    def get_result(self):
+        cmd = 'grep -rnh Fail {0}'.format(self.log_path)
+        p = subprocess.Popen(cmd,
+                             shell=True,
+                             stdout=subprocess.PIPE,
+                             stderr=subprocess.STDOUT)
+
+        for line in p.stdout:
+            logger.debug(line)
+            if re.search("\s+[1-9]+\s+", line):
+                logger.debug("Testcase Fails\n" + line)
+
+        cmd = "grep -rnh 'Execution Time' {0}".format(self.log_path)
+        result_buffer = os.popen(cmd).read()
+        time1 = result_buffer[114:128]
+        time2 = result_buffer[28:42]
+        cmd = "grep -rnh 'Success Percentage' {0}".format(
+            os.path.join(self.log_path, "FUNCvirNetNB_*"))
+        result_buffer = os.popen(cmd).read()
+        if result_buffer.find('100%') >= 0:
+            result1 = 'Success'
+        else:
+            result1 = 'Failed'
+        cmd = "grep -rnh 'Success Percentage' {0}".format(
+            os.path.join(self.log_path, "FUNCvirNetNBL3*"))
+        result_buffer = os.popen(cmd).read()
+        if result_buffer.find('100%') >= 0:
+            result2 = 'Success'
+        else:
+            result2 = 'Failed'
+        status1 = []
+        status2 = []
+        cmd = "grep -rnh 'h3' {0}".format(
+            os.path.join(self.log_path, "FUNCvirNetNB_*"))
+        result_buffer = os.popen(cmd).read()
+        pattern = re.compile("<h3>([^-]+) - ([^-]+) - (\S*)</h3>")
+        # res = pattern.search(result_buffer).groups()
+        res = pattern.findall(result_buffer)
+        i = 0
+        for index in range(len(res)):
+            status1.append({'Case name:': res[i][0] + res[i][1],
+                            'Case result': res[i][2]})
+            i = i + 1
+        cmd = "grep -rnh 'h3' {0}".format(
+            os.path.join(self.log_path, "FUNCvirNetNBL3*"))
+        result_buffer = os.popen(cmd).read()
+        pattern = re.compile("<h3>([^-]+) - ([^-]+) - (\S*)</h3>")
+        res = pattern.findall(result_buffer)
+        i = 0
+        for index in range(len(res)):
+            status2.append({'Case name:': res[i][0] + res[i][1],
+                            'Case result': res[i][2]})
+            i = i + 1
+        payload = {'FUNCvirNet': {'duration': time1,
+                                  'result': result1,
+                                  'status': status1},
+                   'FUNCvirNetL3': {'duration': time2,
+                                    'result': result2,
+                                    'status': status2}}
+        return payload
+
+    def parse_result(self):
+        result = self.get_result()
+        status = "FAIL"
+        try:
+            if (result['FUNCvirNet']['result'] == "Success" and
+                    result['FUNCvirNetL3']['result'] == "Success"):
+                status = "PASS"
+        except:
+            logger.error("Unable to set ONOS criteria")
+
+        self.criteria = status
+        self.details = result
+
+    def _run(self):
+        self.clean_existing_logs()
+        self.set_onos_ip()
+        self.run_onos_script('FUNCvirNetNB')
+        self.run_onos_script('FUNCvirNetNBL3')
+        self.parse_result()
+
+
+class OnosSfc(OnosBase):
+    def __init__(self):
+        super(OnosSfc, self).__init__()
+        self.case_name = 'onos_sfc'
+
+    def get_ip(type):
+        url = openstack_utils.get_endpoint(service_type=type)
+        logger.debug('get_ip for %s: %s' % (type, url))
+        return urlparse.urlparse(url).hostname
+
+    def update_sfc_onos_file(self, before, after):
+        file_dir = os.path.join(self.onos_sfc_path, "sfc_onos.py")
+        cmd = "sed -i 's/{0}/{1}/g' {2}".format(before,
+                                                after,
+                                                file_dir)
+        ft_utils.execute_command_raise(
+            cmd,
+            error_msg=('Error with replacing %s with %s'
+                       % (before, after)))
+
+    def create_image(self):
+        glance_client = openstack_utils.get_glance_client()
+        image_id = openstack_utils.create_glance_image(
+            glance_client,
+            self.onos_sfc_image_name,
+            self.onos_sfc_image_path)
+        if image_id is None:
+            raise Exception('Failed to create image')
+
+        logger.debug("Image '%s' with ID=%s is created successfully."
+                     % (self.onos_sfc_image_name, image_id))
+
+    def set_sfc_conf(self):
+        self.update_sfc_onos_file("keystone_ip", self.get_ip("keystone"))
+        self.update_sfc_onos_file("neutron_ip", self.get_ip("neutron"))
+        self.update_sfc_onos_file("nova_ip", self.get_ip("nova"))
+        self.update_sfc_onos_file("glance_ip", self.get_ip("glance"))
+        self.update_sfc_onos_file("console", CONST.OS_PASSWORD)
+        neutron_client = openstack_utils.get_neutron_client()
+        ext_net = openstack_utils.get_external_net(neutron_client)
+        self.update_sfc_onos_file("admin_floating_net", ext_net)
+        logger.debug("SFC configuration is modified")
+
+    def sfc_test(self):
+        cmd = 'python {0}'.format(os.path.join(self.onos_sfc_path, 'sfc.py'))
+        ft_utils.execute_command_raise(cmd,
+                                       error_msg='Error with testing SFC')
+
+    def _run(self):
+        self.create_image()
+        self.set_sfc_conf()
+        self.sfc_test()
diff --git a/functest/opnfv_tests/sdn/onos/teston/onos.py b/functest/opnfv_tests/sdn/onos/teston/onos.py
deleted file mode 100755 (executable)
index 2537e18..0000000
+++ /dev/null
@@ -1,261 +0,0 @@
-"""
-Description: This test is to run onos Teston VTN scripts
-
-List of test cases:
-CASE1 - Northbound NBI test network/subnet/ports
-CASE2 - Ovsdb test&Default configuration&Vm go online
-
-lanqinglong@huawei.com
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-"""
-
-import datetime
-import os
-import re
-import time
-import urlparse
-
-import argparse
-from neutronclient.v2_0 import client as neutronclient
-
-import functest.utils.functest_constants as ft_constants
-import functest.utils.functest_logger as ft_logger
-import functest.utils.functest_utils as ft_utils
-import functest.utils.openstack_utils as openstack_utils
-
-
-parser = argparse.ArgumentParser()
-parser.add_argument("-t", "--testcase", help="Testcase name")
-args = parser.parse_args()
-
-
-""" logging configuration """
-logger = ft_logger.Logger("onos").getLogger()
-
-# onos parameters
-ONOSCI_PATH = ft_constants.REPOS_DIR + "/"
-starttime = datetime.datetime.now()
-
-INSTALLER_TYPE = ft_constants.CI_INSTALLER_TYPE
-ONOS_SFC_IMAGE_NAME = ft_constants.ONOS_SFC_IMAGE_NAME
-ONOS_SFC_IMAGE_PATH = os.path.join(ft_constants.FUNCTEST_DATA_DIR,
-                                   ft_constants.ONOS_SFC_IMAGE_FILENAME)
-ONOS_SFC_PATH = os.path.join(ft_constants.FUNCTEST_REPO_DIR,
-                             ft_constants.ONOS_SFC_RELATIVE_PATH)
-
-
-def RunScript(testname):
-    """
-    Run ONOS Test Script
-    Parameters:
-    testname: ONOS Testcase Name
-    """
-    runtest = ONOSCI_PATH + "onos/TestON/bin/cli.py run " + testname
-    logger.debug("Run script " + testname)
-    os.system(runtest)
-
-
-def DownloadCodes(url="https://github.com/wuwenbin2/OnosSystemTest.git"):
-    """
-    Download Onos Teston codes
-    Parameters:
-    url: github url
-    """
-    downloadcode = "git clone " + url + " " + ONOSCI_PATH + "OnosSystemTest"
-    logger.debug("Download Onos Teston codes " + url)
-    os.system(downloadcode)
-
-
-def GetResult():
-    LOGPATH = ONOSCI_PATH + "onos/TestON/logs"
-    cmd = "grep -rnh " + "Fail" + " " + LOGPATH
-    Resultbuffer = os.popen(cmd).read()
-    # duration = datetime.datetime.now() - starttime
-    time.sleep(2)
-
-    if re.search("\s+[1-9]+\s+", Resultbuffer):
-        logger.debug("Testcase Fails\n" + Resultbuffer)
-        # Result = "Failed"
-    else:
-        logger.debug("Testcases Success")
-        # Result = "Success"
-    # payload={'timestart': str(starttime),
-    #          'duration': str(duration),
-    #            'status': Result}
-    cmd = "grep -rnh 'Execution Time' " + LOGPATH
-    Resultbuffer = os.popen(cmd).read()
-    time1 = Resultbuffer[114:128]
-    time2 = Resultbuffer[28:42]
-    cmd = "grep -rnh 'Success Percentage' " + LOGPATH + "/FUNCvirNetNB_*"
-    Resultbuffer = os.popen(cmd).read()
-    if Resultbuffer.find('100%') >= 0:
-        result1 = 'Success'
-    else:
-        result1 = 'Failed'
-    cmd = "grep -rnh 'Success Percentage' " + LOGPATH + "/FUNCvirNetNBL3*"
-    Resultbuffer = os.popen(cmd).read()
-    if Resultbuffer.find('100%') >= 0:
-        result2 = 'Success'
-    else:
-        result2 = 'Failed'
-    status1 = []
-    status2 = []
-    cmd = "grep -rnh 'h3' " + LOGPATH + "/FUNCvirNetNB_*"
-    Resultbuffer = os.popen(cmd).read()
-    pattern = re.compile("<h3>([^-]+) - ([^-]+) - (\S*)</h3>")
-    # res = pattern.search(Resultbuffer).groups()
-    res = pattern.findall(Resultbuffer)
-    i = 0
-    for index in range(len(res)):
-        status1.append({'Case name:': res[i][0] + res[i][1],
-                        'Case result': res[i][2]})
-        i = i + 1
-    cmd = "grep -rnh 'h3' " + LOGPATH + "/FUNCvirNetNBL3*"
-    Resultbuffer = os.popen(cmd).read()
-    pattern = re.compile("<h3>([^-]+) - ([^-]+) - (\S*)</h3>")
-    # res = pattern.search(Resultbuffer).groups()
-    res = pattern.findall(Resultbuffer)
-    i = 0
-    for index in range(len(res)):
-        status2.append({'Case name:': res[i][0] + res[i][1],
-                        'Case result': res[i][2]})
-        i = i + 1
-    payload = {'timestart': str(starttime),
-               'FUNCvirNet': {'duration': time1,
-                              'result': result1,
-                              'status': status1},
-               'FUNCvirNetL3': {'duration': time2,
-                                'result': result2,
-                                'status': status2}}
-    return payload
-
-
-def SetOnosIp():
-    # cmd = "openstack catalog show network | grep publicURL"
-    neutron_url = openstack_utils.get_endpoint(service_type='network')
-    OC1 = urlparse.urlparse(neutron_url).hostname
-    os.environ['OC1'] = OC1
-    time.sleep(2)
-    logger.debug("ONOS IP is " + OC1)
-
-
-def SetOnosIpForJoid():
-    cmd = "env | grep SDN_CONTROLLER"
-    cmd_output = os.popen(cmd).read()
-    OC1 = re.search(r"\d+\.\d+\.\d+\.\d+", cmd_output).group()
-    os.environ['OC1'] = OC1
-    time.sleep(2)
-    logger.debug("ONOS IP is " + OC1)
-
-
-def CleanOnosTest():
-    TESTONPATH = ONOSCI_PATH + "onos/"
-    cmd = "rm -rf " + TESTONPATH
-    os.system(cmd)
-    time.sleep(2)
-    logger.debug("Clean ONOS Teston")
-
-
-def CreateImage():
-    glance_client = openstack_utils.get_glance_client()
-    image_id = openstack_utils.create_glance_image(glance_client,
-                                                   ONOS_SFC_IMAGE_NAME,
-                                                   ONOS_SFC_IMAGE_PATH)
-    EXIT_CODE = -1
-    if not image_id:
-        logger.error("Failed to create a Glance image...")
-        return(EXIT_CODE)
-    logger.debug("Image '%s' with ID=%s created successfully."
-                 % (ONOS_SFC_IMAGE_NAME, image_id))
-
-
-def SfcTest():
-    cmd = "python " + ONOS_SFC_PATH + "/sfc.py"
-    logger.debug("Run sfc tests")
-    os.system(cmd)
-
-
-def GetIp(type):
-    # cmd = "openstack catalog show " + type + " | grep publicURL"
-    url = openstack_utils.get_endpoint(service_type=type)
-    return urlparse.urlparse(url).hostname
-
-
-def Replace(before, after):
-    file = "/sfc_onos.py"
-    cmd = "sed -i 's/" + before + "/" + after + "/g' " + ONOS_SFC_PATH + file
-    os.system(cmd)
-
-
-def SetSfcConf():
-    Replace("keystone_ip", GetIp("keystone"))
-    Replace("neutron_ip", GetIp("neutron"))
-    Replace("nova_ip", GetIp("nova"))
-    Replace("glance_ip", GetIp("glance"))
-    pwd = ft_constants.OS_PASSWORD
-    Replace("console", pwd)
-    creds_neutron = openstack_utils.get_credentials()
-    neutron_client = neutronclient.Client(**creds_neutron)
-    ext_net = openstack_utils.get_external_net(neutron_client)
-    Replace("admin_floating_net", ext_net)
-    logger.info("Modify configuration for SFC")
-
-
-def OnosTest():
-    start_time = time.time()
-    stop_time = start_time
-    if INSTALLER_TYPE == "joid":
-        logger.debug("Installer is Joid")
-        SetOnosIpForJoid()
-    else:
-        SetOnosIp()
-    RunScript("FUNCvirNetNB")
-    RunScript("FUNCvirNetNBL3")
-    try:
-        logger.debug("Push ONOS results into DB")
-        # TODO check path result for the file
-        result = GetResult()
-        stop_time = time.time()
-
-        # ONOS success criteria = all tests OK
-        # i.e. FUNCvirNet & FUNCvirNetL3
-        status = "FAIL"
-        try:
-            if (result['FUNCvirNet']['result'] == "Success" and
-                    result['FUNCvirNetL3']['result'] == "Success"):
-                    status = "PASS"
-        except:
-            logger.error("Unable to set ONOS criteria")
-
-        ft_utils.push_results_to_db("functest",
-                                    "onos",
-                                    start_time,
-                                    stop_time,
-                                    status,
-                                    result)
-
-    except:
-        logger.error("Error pushing results into Database")
-
-    if status == "FAIL":
-        EXIT_CODE = -1
-        exit(EXIT_CODE)
-
-
-def main():
-
-    if args.testcase == "sfc":
-        CreateImage()
-        SetSfcConf()
-        SfcTest()
-    else:
-        OnosTest()
-
-
-if __name__ == '__main__':
-    main()
index 0a9a03b..9fae9a9 100644 (file)
@@ -94,15 +94,6 @@ SDNVPN_REPO_DIR = get_value('general.dir.repo_sdnvpn',
                             'SDNVPN_REPO_DIR')
 SFC_REPO_DIR = get_value('general.dir.repo_sfc',
                          'SFC_REPO_DIR')
-
-ONOS_SFC_IMAGE_NAME = get_value('onos_sfc.image_name',
-                                'ONOS_SFC_IMAGE_NAME')
-ONOS_SFC_IMAGE_FILENAME = get_value('onos_sfc.image_file_name',
-                                    'ONOS_SFC_IMAGE_FILENAME')
-ONOS_SFC_RELATIVE_PATH = get_value('general.dir.dir_onos_sfc',
-                                   'ONOS_SFC_RELATIVE_PATH')
-ONOS_SFC_IMAGE_BASE_URL = get_value('onos_sfc.image_base_url',
-                                    'ONOS_SFC_IMAGE_BASE_URL')
 RALLY_RELATIVE_PATH = get_value('general.dir.rally',
                                 'RALLY_RELATIVE_PATH')
 RALLY_PRIVATE_NET_NAME = get_value('rally.network_name',