aboutsummaryrefslogtreecommitdiffstats
path: root/functest/opnfv_tests/sdn/onos/onos.py
blob: fe496c1f3de4ea95f0597c3fd2629f449173d71c (plain)
1
2
3
4
5
6
7
8

@media only all and (prefers-color-scheme: dark) {
.highlight .hll { background-color: #49483e }
.highlight .c { color: #75715e } /* Comment */
.highlight .err { color: #960050; background-color: #1e0010 } /* Error */
.highlight .k { color: #66d9ef } /* Keyword */
.highlight .l { color: #ae81ff } /* Literal */
.highlight .n { color: #f8f8f2 } /* Name */
.highlight .o { color: #f92672 } /* Operator */
.highlight .p { color: #f8f8f2 } /* Punctuation */
.highlight .ch { color: #75715e } /* Comment.Hashbang */
.highlight .cm { color: #75715e } /* Comment.Multiline */
.highlight .cp { color: #75715e } /* Comment.Preproc */
.highlight .cpf { color: #75715e } /* Comment.PreprocFile */
.highlight .c1 { color: #75715e } /* Comment.Single */
.highlight .cs { color: #75715e } /* Comment.Special */
.highlight .gd { color: #f92672 } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gi { color: #a6e22e } /* Generic.Inserted */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #75715e } /* Generic.Subheading */
.highlight .kc { color: #66d9ef } /* Keyword.Constant */
.highlight .kd { color: #66d9ef } /* Keyword.Declaration */
.highlight .kn { color: #f92672 } /* Keyword.Namespace */
.highlight .kp { color: #66d9ef } /* Keyword.Pseudo */
.highlight .kr { color: #66d9ef } /* Keyword.Reserved */
.highlight .kt { color: #66d9ef } /* Keyword.Type */
.highlight .ld { color: #e6db74 } /* Literal.Date */
.highlight .m { color: #ae81ff } /* Literal.Number */
.highlight .s { color: #e6db74 } /* Literal.String */
.highlight .na { color: #a6e22e } /* Name.Attribute */
.highlight .nb { color: #f8f8f2 } /* Name.Builtin */
.highlight .nc { color: #a6e22e } /* Name.Class */
.highlight .no { color: #66d9ef } /* Name.Constant */
.highlight .nd { color: #a6e22e } /* Name.Decorator */
.highlight .ni { color: #f8f8f2 } /* Name.Entity */
.highlight .ne { color: #a6e22e } /* Name.Exception */
.highlight .nf { color: #a6e22e } /* Name.Function */
.highlight .nl { color: #f8f8f2 } /* Name.Label */
.highlight .nn { color: #f8f8f2 } /* Name.Namespace */
.highlight .nx { color: #a6e22e } /* Name.Other */
.highlight .py { color: #f8f8f2 } /* Name.Property */
.highlight .nt { color: #f92672 } /* Name.Tag */
.highlight .nv { color: #f8f8f2 } /* Name.Variable */
.highlight .ow { color: #f92672 } /* Operator.Word */
.highlight .w { color: #f8f8f2 } /* Text.Whitespace */
.highlight .mb { color: #ae81ff } /* Literal.Number.Bin */
.highlight .mf { color: #ae81ff } /* Literal.Number.Float */
.highlight .mh { color: #ae81ff } /* Literal.Number.Hex */
.highlight .mi { color: #ae81ff } /* Literal.Number.Integer */
.highlight .mo { color: #ae81ff } /* Literal.Number.Oct */
.highlight .sa { color: #e6db74 } /* Literal.String.Affix */
.highlight .sb { color: #e6db74 } /* Literal.String.Backtick */
.highlight .sc { color: #e6db74 } /* Literal.String.Char */
.highlight .dl { color: #e6db74 } /* Literal.String.Delimiter */
.highlight .sd { color: #e6db74 } /* Literal.String.Doc */
.highlight .s2 { color: #e6db74 } /* Literal.String.Double */
.highlight .se { color: #ae81ff } /* Literal.String.Escape */
.highlight .sh { color: #e6db74 } /* Literal.String.Heredoc */
.highlight .si { color: #e6db74 } /* Literal.String.Interpol */
.highlight .sx { color: #e6db74 } /* Literal.String.Other */
.highlight .sr { color: #e6db74 } /* Literal.String.Regex */
.highlight .s1 { color: #e6db74 } /* Literal.String.Single */
.highlight .ss { color: #e6db74 } /* Literal.String.Symbol */
.highlight .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #a6e22e } /* Name.Function.Magic */
.highlight .vc { color: #f8f8f2 } /* Name.Variable.Class */
.highlight .vg { color: #f8f8f2 } /* Name.Variable.Global */
.highlight .vi { color: #f8f8f2 } /* Name.Variable.Instance */
.highlight .vm { color: #f8f8f2 } /* Name.Variable.Magic */
.highlight .il { color: #ae81ff } /* Literal.Number.Integer.Long */
}
@media (prefers-color-scheme: light) {
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bol
#!/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
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.TestCase):
    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 run(self):
        self.start_time = time.time()
        try:
            self._run()
            res = testcase.TestCase.EX_OK
        except Exception as e:
            logger.error('Error with run: %s', e)
            res = testcase.TestCase.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, **kwargs):
        if "case_name" not in kwargs:
            kwargs["case_name"] = "onos"
        super(Onos, self).__init__(**kwargs)
        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()