diff options
46 files changed, 253 insertions, 157 deletions
diff --git a/.gitignore b/.gitignore index 341cf2811..f6e406203 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ nosetests.xml functest.egg-info *venv .tox +*.out @@ -13,7 +13,7 @@ Repository: functest Committers: Morgan Richomme <morgan.richomme@orange.com> Jose Lausuch <jose.lausuch@ericsson.com> -Cedric Ollivier <ollivier.cedric@gmail.com> +Cedric Ollivier <cedric.ollivier@orange.com> Helen Yao <yaohelan@huawei.com> Serena Feng <feng.xiaowei@zte.com.cn> Juha Kosonen <juha.kosonen@nokia.com> diff --git a/docs/api/Makefile b/api/Makefile index ca9cfdc0b..ca9cfdc0b 100644 --- a/docs/api/Makefile +++ b/api/Makefile diff --git a/docs/api/_static/.gitkeep b/api/_static/.gitkeep index e69de29bb..e69de29bb 100644 --- a/docs/api/_static/.gitkeep +++ b/api/_static/.gitkeep diff --git a/docs/api/_templates/.gitkeep b/api/_templates/.gitkeep index e69de29bb..e69de29bb 100644 --- a/docs/api/_templates/.gitkeep +++ b/api/_templates/.gitkeep diff --git a/docs/api/apidoc/functest.core.feature.rst b/api/apidoc/functest.core.feature.rst index a80e38daa..a80e38daa 100644 --- a/docs/api/apidoc/functest.core.feature.rst +++ b/api/apidoc/functest.core.feature.rst diff --git a/docs/api/apidoc/functest.core.rst b/api/apidoc/functest.core.rst index 27b2ed1fb..55c795be0 100644 --- a/docs/api/apidoc/functest.core.rst +++ b/api/apidoc/functest.core.rst @@ -14,4 +14,5 @@ Submodules functest.core.feature functest.core.testcase functest.core.vnf + functest.core.unit diff --git a/docs/api/apidoc/functest.core.testcase.rst b/api/apidoc/functest.core.testcase.rst index 2f947a1bf..2f947a1bf 100644 --- a/docs/api/apidoc/functest.core.testcase.rst +++ b/api/apidoc/functest.core.testcase.rst diff --git a/api/apidoc/functest.core.unit.rst b/api/apidoc/functest.core.unit.rst new file mode 100644 index 000000000..5dd6880ed --- /dev/null +++ b/api/apidoc/functest.core.unit.rst @@ -0,0 +1,7 @@ +functest.core.unit module +========================= + +.. automodule:: functest.core.unit + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/api/apidoc/functest.core.vnf.rst b/api/apidoc/functest.core.vnf.rst index 9fd6b375c..9fd6b375c 100644 --- a/docs/api/apidoc/functest.core.vnf.rst +++ b/api/apidoc/functest.core.vnf.rst diff --git a/docs/api/apidoc/functest.opnfv_tests.rst b/api/apidoc/functest.opnfv_tests.rst index 52c2d4598..52c2d4598 100644 --- a/docs/api/apidoc/functest.opnfv_tests.rst +++ b/api/apidoc/functest.opnfv_tests.rst diff --git a/docs/api/apidoc/functest.opnfv_tests.sdn.odl.odl.rst b/api/apidoc/functest.opnfv_tests.sdn.odl.odl.rst index e6f8c7367..e6f8c7367 100644 --- a/docs/api/apidoc/functest.opnfv_tests.sdn.odl.odl.rst +++ b/api/apidoc/functest.opnfv_tests.sdn.odl.odl.rst diff --git a/docs/api/apidoc/functest.opnfv_tests.sdn.odl.rst b/api/apidoc/functest.opnfv_tests.sdn.odl.rst index 60659a1e3..60659a1e3 100644 --- a/docs/api/apidoc/functest.opnfv_tests.sdn.odl.rst +++ b/api/apidoc/functest.opnfv_tests.sdn.odl.rst diff --git a/docs/api/apidoc/functest.opnfv_tests.sdn.rst b/api/apidoc/functest.opnfv_tests.sdn.rst index ca8ae77da..ca8ae77da 100644 --- a/docs/api/apidoc/functest.opnfv_tests.sdn.rst +++ b/api/apidoc/functest.opnfv_tests.sdn.rst diff --git a/docs/api/apidoc/functest.rst b/api/apidoc/functest.rst index 63860f8f3..63860f8f3 100644 --- a/docs/api/apidoc/functest.rst +++ b/api/apidoc/functest.rst diff --git a/docs/api/apidoc/modules.rst b/api/apidoc/modules.rst index b8f33304a..b8f33304a 100644 --- a/docs/api/apidoc/modules.rst +++ b/api/apidoc/modules.rst diff --git a/docs/api/conf.py b/api/conf.py index 746a90fe0..746a90fe0 100644 --- a/docs/api/conf.py +++ b/api/conf.py diff --git a/docs/api/index.rst b/api/index.rst index db2234370..db2234370 100644 --- a/docs/api/index.rst +++ b/api/index.rst diff --git a/docs/com/pres/framework/framework.md b/docs/com/pres/framework/framework.md index 3c1aae1b8..1b07a8e0b 100644 --- a/docs/com/pres/framework/framework.md +++ b/docs/com/pres/framework/framework.md @@ -252,6 +252,62 @@ run: +## class Suite +bases: TestCase + +base model for running unittest.TestSuite + + +### run(**kwargs) + +- allows running any unittest.TestSuite +- sets the following attributes required to push the results to DB: + - result + - start_time + - stop_time + - details + + + +## Your fourth test case + + +### fourth.py + +```python +#!/usr/bin/env python + +import unittest + +class TestStringMethods(unittest.TestCase): + + def test_upper(self): + self.assertEqual('Hello World'.upper(), + 'HELLO WORLD') +``` + + +### functest/ci/testcases.yaml + +``` +case_name: fourth +project_name: functest +criteria: 100 +blocking: true +clean_flag: false +description: '' +dependencies: + installer: '' + scenario: '' +run: + module: 'functest.core.unit' + class: 'Suite' + args: + name: 'fourth' +``` + + + ## Euphrates diff --git a/docs/com/pres/framework/framework.html b/docs/com/pres/framework/index.html index 950c2bebf..950c2bebf 100644 --- a/docs/com/pres/framework/framework.html +++ b/docs/com/pres/framework/index.html diff --git a/docs/testing/user/configguide/configguide.rst b/docs/testing/user/configguide/configguide.rst index 9a1749789..12dfd1059 100644 --- a/docs/testing/user/configguide/configguide.rst +++ b/docs/testing/user/configguide/configguide.rst @@ -74,7 +74,7 @@ executing the following sequence #. Log in to container and execute the following command. Replace the IP with installer address after the "-a" parameter:: - $REPOS_DIR/releng/utils/fetch_os_creds.sh \ + fetch_os_creds.sh \ -d /home/opnfv/functest/conf/openstack.creds \ -i fuel \ -a 10.20.0.2 \ diff --git a/functest/ci/download_images.sh b/functest/ci/download_images.sh index f3fdef2e3..f3fdef2e3 100644..100755 --- a/functest/ci/download_images.sh +++ b/functest/ci/download_images.sh diff --git a/functest/ci/run_tests.py b/functest/ci/run_tests.py index 95353c87a..9b64a0ce5 100755 --- a/functest/ci/run_tests.py +++ b/functest/ci/run_tests.py @@ -1,4 +1,4 @@ -#!/usr/bin/python -u +#!/usr/bin/env python # # Author: Jose Lausuch (jose.lausuch@ericsson.com) # @@ -221,7 +221,7 @@ class Runner(object): try: if kwargs['test']: self.source_rc_file() - logger.error(kwargs['test']) + logger.debug("Test args: %s", kwargs['test']) if _tiers.get_tier(kwargs['test']): self.run_tier(_tiers.get_tier(kwargs['test'])) elif _tiers.get_test(kwargs['test']): diff --git a/functest/ci/testcases.yaml b/functest/ci/testcases.yaml index 10587f269..8222df102 100644 --- a/functest/ci/testcases.yaml +++ b/functest/ci/testcases.yaml @@ -266,7 +266,6 @@ tiers: testcases: - case_name: promise - enabled: false project_name: promise criteria: 100 blocking: false diff --git a/functest/cli/commands/cli_os.py b/functest/cli/commands/cli_os.py index e54eb423a..5e6e1109a 100644 --- a/functest/cli/commands/cli_os.py +++ b/functest/cli/commands/cli_os.py @@ -67,9 +67,8 @@ class CliOpenStack(object): if installer_ip is None: click.echo("The environment variable 'INSTALLER_IP' is not" "defined. Please export it") - cmd = ("%s/releng/utils/fetch_os_creds.sh -d %s -i %s -a %s" - % (CONST.__getattribute__('dir_repos'), - self.openstack_creds, + cmd = ("fetch_os_creds.sh -d %s -i %s -a %s" + % (self.openstack_creds, installer_type, installer_ip)) click.echo("Fetching credentials from installer node '%s' with IP=%s.." diff --git a/functest/core/feature.py b/functest/core/feature.py index 140c9bb2e..d53eb7d0e 100644 --- a/functest/core/feature.py +++ b/functest/core/feature.py @@ -7,7 +7,7 @@ # which accompanies this distribution, and is available at # http://www.apache.org/licenses/LICENSE-2.0 -"""Define the parent class of all Functest Features. +"""Define the parent classes of all Functest Features. Feature is considered as TestCase offered by Third-party. It offers helpers to run any python method or any bash command. diff --git a/functest/core/pytest_suite_runner.py b/functest/core/pytest_suite_runner.py deleted file mode 100644 index efcef7b66..000000000 --- a/functest/core/pytest_suite_runner.py +++ /dev/null @@ -1,61 +0,0 @@ -# Copyright (c) 2015 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 - -# pylint: disable=missing-docstring - -from __future__ import division - -import logging -import time -import unittest - -import six - -from functest.core import testcase - - -class PyTestSuiteRunner(testcase.TestCase): - """ - This superclass is designed to execute pre-configured unittest.TestSuite() - objects - """ - - def __init__(self, **kwargs): - super(PyTestSuiteRunner, self).__init__(**kwargs) - self.suite = None - self.logger = logging.getLogger(__name__) - - def run(self, **kwargs): - """ - Starts test execution from the functest framework - """ - try: - name = kwargs["name"] - try: - self.suite = unittest.TestLoader().loadTestsFromName(name) - except ImportError: - self.logger.error("Can not import %s", name) - return testcase.TestCase.EX_RUN_ERROR - except KeyError: - pass - self.start_time = time.time() - stream = six.StringIO() - result = unittest.TextTestRunner( - stream=stream, verbosity=2).run(self.suite) - self.logger.debug("\n\n%s", stream.getvalue()) - self.stop_time = time.time() - self.details = {"failures": result.failures, - "errors": result.errors} - try: - self.result = 100 * ( - (result.testsRun - (len(result.failures) + - len(result.errors))) / - result.testsRun) - return testcase.TestCase.EX_OK - except ZeroDivisionError: - self.logger.error("No test has been run") - return testcase.TestCase.EX_RUN_ERROR diff --git a/functest/core/unit.py b/functest/core/unit.py new file mode 100644 index 000000000..515a20806 --- /dev/null +++ b/functest/core/unit.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python + +# Copyright (c) 2016 Cable Television Laboratories, Inc. 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 + +"""Define the parent class to run unittest.TestSuite as TestCase.""" + +from __future__ import division + +import logging +import time +import unittest + +import six + +from functest.core import testcase + +__author__ = ("Steven Pisarski <s.pisarski@cablelabs.com>, " + "Cedric Ollivier <cedric.ollivier@orange.com>") + + +class Suite(testcase.TestCase): + """Base model for running unittest.TestSuite.""" + + __logger = logging.getLogger(__name__) + + def __init__(self, **kwargs): + super(Suite, self).__init__(**kwargs) + self.suite = None + + def run(self, **kwargs): + """Run the test suite. + + It allows running any unittest.TestSuite and getting its + execution status. + + By default, it runs the suite defined as instance attribute. + It can be overriden by passing name as arg. It must + conform with TestLoader.loadTestsFromName(). + + It sets the following attributes required to push the results + to DB: + + * result, + * start_time, + * stop_time, + * details. + + Args: + kwargs: Arbitrary keyword arguments. + + Returns: + TestCase.EX_OK if any TestSuite has been run, + TestCase.EX_RUN_ERROR otherwise. + """ + try: + name = kwargs["name"] + try: + self.suite = unittest.TestLoader().loadTestsFromName(name) + except ImportError: + self.__logger.error("Can not import %s", name) + return testcase.TestCase.EX_RUN_ERROR + except KeyError: + pass + try: + assert self.suite + self.start_time = time.time() + stream = six.StringIO() + result = unittest.TextTestRunner( + stream=stream, verbosity=2).run(self.suite) + self.__logger.debug("\n\n%s", stream.getvalue()) + self.stop_time = time.time() + self.details = {"failures": result.failures, + "errors": result.errors} + self.result = 100 * ( + (result.testsRun - (len(result.failures) + + len(result.errors))) / + result.testsRun) + return testcase.TestCase.EX_OK + except AssertionError: + self.__logger.error("No suite is defined") + return testcase.TestCase.EX_RUN_ERROR + except ZeroDivisionError: + self.__logger.error("No test has been run") + return testcase.TestCase.EX_RUN_ERROR diff --git a/functest/opnfv_tests/features/barometer.py b/functest/opnfv_tests/features/barometer.py index cbfe7d9a8..e210f333c 100644 --- a/functest/opnfv_tests/features/barometer.py +++ b/functest/opnfv_tests/features/barometer.py @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/functest/opnfv_tests/mano/orchestra.py b/functest/opnfv_tests/mano/orchestra.py index dea26efc3..955f82ce1 100644 --- a/functest/opnfv_tests/mano/orchestra.py +++ b/functest/opnfv_tests/mano/orchestra.py @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/functest/opnfv_tests/openstack/rally/rally.py b/functest/opnfv_tests/openstack/rally/rally.py index 86ec35584..e362fd4d0 100644 --- a/functest/opnfv_tests/openstack/rally/rally.py +++ b/functest/opnfv_tests/openstack/rally/rally.py @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python # # Copyright (c) 2015 All rights reserved # This program and the accompanying materials diff --git a/functest/opnfv_tests/openstack/snaps/snaps_test_runner.py b/functest/opnfv_tests/openstack/snaps/snaps_test_runner.py index be0e5fe67..5e39946d4 100644 --- a/functest/opnfv_tests/openstack/snaps/snaps_test_runner.py +++ b/functest/opnfv_tests/openstack/snaps/snaps_test_runner.py @@ -7,7 +7,7 @@ import logging -from functest.core.pytest_suite_runner import PyTestSuiteRunner +from functest.core import unit from functest.opnfv_tests.openstack.snaps import snaps_utils from functest.utils import functest_utils from functest.utils.constants import CONST @@ -16,7 +16,7 @@ from snaps.openstack import create_flavor from snaps.openstack.tests import openstack_tests -class SnapsTestRunner(PyTestSuiteRunner): +class SnapsTestRunner(unit.Suite): """ This test executes the SNAPS Python Tests """ diff --git a/functest/opnfv_tests/openstack/tempest/conf_utils.py b/functest/opnfv_tests/openstack/tempest/conf_utils.py index 556a41d4c..15365ccff 100644 --- a/functest/opnfv_tests/openstack/tempest/conf_utils.py +++ b/functest/opnfv_tests/openstack/tempest/conf_utils.py @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python # # Copyright (c) 2015 All rights reserved # This program and the accompanying materials diff --git a/functest/opnfv_tests/openstack/tempest/tempest.py b/functest/opnfv_tests/openstack/tempest/tempest.py index 233ceb485..65d9f1fa2 100644 --- a/functest/opnfv_tests/openstack/tempest/tempest.py +++ b/functest/opnfv_tests/openstack/tempest/tempest.py @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python # # Copyright (c) 2015 All rights reserved # This program and the accompanying materials @@ -148,7 +148,7 @@ class TempestCommon(testcase.TestCase): first_pos = line.index("UUID=") + len("UUID=") last_pos = line.index(") for deployment") self.VERIFICATION_ID = line[first_pos:last_pos] - logger.debug('Verication UUID: %s' % self.VERIFICATION_ID) + logger.debug('Verification UUID: %s', self.VERIFICATION_ID) f_stdout.write(line) p.wait() diff --git a/functest/opnfv_tests/openstack/vping/vping_base.py b/functest/opnfv_tests/openstack/vping/vping_base.py index 42fcebf45..7f568821b 100644 --- a/functest/opnfv_tests/openstack/vping/vping_base.py +++ b/functest/opnfv_tests/openstack/vping/vping_base.py @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python # # Copyright (c) 2015 All rights reserved # This program and the accompanying materials diff --git a/functest/opnfv_tests/openstack/vping/vping_ssh.py b/functest/opnfv_tests/openstack/vping/vping_ssh.py index 0ad77402e..6ac0d6764 100755 --- a/functest/opnfv_tests/openstack/vping/vping_ssh.py +++ b/functest/opnfv_tests/openstack/vping/vping_ssh.py @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python # # Copyright (c) 2015 All rights reserved # This program and the accompanying materials diff --git a/functest/opnfv_tests/openstack/vping/vping_userdata.py b/functest/opnfv_tests/openstack/vping/vping_userdata.py index 8ea9be84b..b69b39554 100755 --- a/functest/opnfv_tests/openstack/vping/vping_userdata.py +++ b/functest/opnfv_tests/openstack/vping/vping_userdata.py @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python # # Copyright (c) 2015 All rights reserved # This program and the accompanying materials diff --git a/functest/opnfv_tests/sdn/onos/sfc/sfc.py b/functest/opnfv_tests/sdn/onos/sfc/sfc.py index 0155d24d7..a2dd7e9a0 100755 --- a/functest/opnfv_tests/sdn/onos/sfc/sfc.py +++ b/functest/opnfv_tests/sdn/onos/sfc/sfc.py @@ -1,4 +1,4 @@ -# !/usr/bin/python +#!/usr/bin/env python # # Copyright (c) CREATED5 All rights reserved # This program and the accompanying materials diff --git a/functest/opnfv_tests/sdn/onos/sfc/sfc_onos.py b/functest/opnfv_tests/sdn/onos/sfc/sfc_onos.py index 1101f2394..4e93c1337 100644 --- a/functest/opnfv_tests/sdn/onos/sfc/sfc_onos.py +++ b/functest/opnfv_tests/sdn/onos/sfc/sfc_onos.py @@ -100,8 +100,10 @@ class SfcOnos(object): self.ip_pool = 0 self.vm_public_ip = [] self.vm_public_id = [] - self.cirros_username = CONST.openstack_image_username - self.cirros_password = CONST.openstack_image_password + self.cirros_username = CONST.__getattribute__( + 'openstack_image_username') + self.cirros_password = CONST.__getattribute__( + 'openstack_image_password') self.net_id1 = 0 self.vm = [] self.address = 0 @@ -115,7 +117,7 @@ class SfcOnos(object): data = ('{"auth": {"tenantName": "admin", "passwordCredentials":' '{ "username": "admin", "password": "console"}}}') headers = {"Accept": "application/json"} - response = requests.post(url, headers=headers, data=data) + response = requests.post(url, headers=headers, data=data) if (response.status_code == OK): json1_data = json.loads(response.content) self.logger.debug(response.status_code) @@ -135,12 +137,12 @@ class SfcOnos(object): if self.admin_state_up != '': Dicdata['admin_state_up'] = self.admin_state_up Dicdata = {'network': Dicdata} - data = json.dumps(Dicdata, indent=4) + data = json.dumps(Dicdata, indent=4) url = 'http://%s:9696/%s/networks' % (self.neutron_hostname, self.osver) headers = {"Accept": "application/json", "X-Auth-Token": self.token_id} - response = requests.post(url, headers=headers, data=data) + response = requests.post(url, headers=headers, data=data) if (response.status_code == CREATED): self.logger.debug(response.status_code) self.logger.debug(response.content) @@ -170,7 +172,7 @@ class SfcOnos(object): self.osver) headers = {"Accept": "application/json", "X-Auth-Token": self.token_id} - response = requests.post(url, headers=headers, data=data) + response = requests.post(url, headers=headers, data=data) if (response.status_code == CREATED): self.logger.debug(response.status_code) @@ -203,7 +205,7 @@ class SfcOnos(object): self.osver) headers = {"Accept": "application/json", "X-Auth-Token": self.token_id} - response = requests.post(url, headers=headers, data=data) + response = requests.post(url, headers=headers, data=data) if (response.status_code == CREATED): self.logger.debug(response.status_code) @@ -222,8 +224,9 @@ class SfcOnos(object): """Creation of Instance, using firewall image.""" url = ("http://%s:9292/v2/images?" "name=TestSfcVm" % (self.glance_hostname)) - headers = {"Accept": "application/json", "Content-Type": "application/\ - octet-stream", "X-Auth-Token": self.token_id} + headers = {"Accept": "application/json", + "Content-Type": "application/octet-stream", + "X-Auth-Token": self.token_id} response = requests.get(url, headers=headers) if (response.status_code == OK): self.logger.debug(response.status_code) @@ -273,7 +276,7 @@ class SfcOnos(object): self.tenant_id) headers = {"Accept": "application/json", "Content-Type": "application/json", "X-Auth-Token": self.token_id} - response = requests.post(url, headers=headers, data=data) + response = requests.post(url, headers=headers, data=data) if (response.status_code == ACCEPTED): self.logger.debug(response.status_code) self.logger.debug(response.content) @@ -295,8 +298,8 @@ class SfcOnos(object): for y in range(0, 3): url = ("http://%s:8774/v2.1/servers/" "detail?name=vm" + str(y)) % (self.neutron_hostname) - headers = {"Accept": "application/json", "X-Auth-Token": - self.token_id} + headers = {"Accept": "application/json", + "X-Auth-Token": self.token_id} response = requests.get(url, headers=headers) if (response.status_code == OK): self.logger.debug(response.status_code) @@ -332,7 +335,7 @@ class SfcOnos(object): self.osver) headers = {"Accept": "application/json", "X-Auth-Token": self.token_id} - response = requests.post(url, headers=headers, data=data) + response = requests.post(url, headers=headers, data=data) if (response.status_code == CREATED): info = ("Creation of Port Pair PP" + str(p) + " is successful") @@ -380,7 +383,7 @@ class SfcOnos(object): self.osver)) headers = {"Accept": "application/json", "X-Auth-Token": self.token_id} - response = requests.post(url, headers=headers, data=data) + response = requests.post(url, headers=headers, data=data) if (response.status_code == CREATED): info = ("Creation of Port Group PG" + str(p) + "is successful") @@ -431,7 +434,7 @@ class SfcOnos(object): self.osver)) headers = {"Accept": "application/json", "X-Auth-Token": self.token_id} - response = requests.post(url, headers=headers, data=data) + response = requests.post(url, headers=headers, data=data) if (response.status_code == CREATED): json1_data = json.loads(response.content) self.flow_class_if = json1_data['flow_classifier']['id'] @@ -462,7 +465,7 @@ class SfcOnos(object): headers = {"Accept": "application/json", "Content-Type": "application/json", "X-Auth-Token": self.token_id} - response = requests.post(url, headers=headers, data=data) + response = requests.post(url, headers=headers, data=data) if (response.status_code == CREATED): self.logger.debug("Creation of PORT CHAIN is successful") json1_data = json.loads(response.content) @@ -476,7 +479,7 @@ class SfcOnos(object): time.sleep(5) response = requests.get('http://' + self.onos_hostname + ':8181/onos/v1/flows', - auth=("karaf", "karaf")) + auth=("karaf", "karaf")) if (response.status_code == OK): self.logger.debug("Flow is successfully Queries") json1_data = json.loads(response.content) @@ -505,7 +508,7 @@ class SfcOnos(object): self.osver) headers = {"Accept": "application/json", "X-Auth-Token": self.token_id} - response = requests.post(url, headers=headers, data=data) + response = requests.post(url, headers=headers, data=data) if (response.status_code == CREATED): self.logger.debug(response.status_code) self.logger.debug(response.content) @@ -548,7 +551,7 @@ class SfcOnos(object): self.router_id)) headers = {"Accept": "application/json", "X-Auth-Token": self.token_id} - response = requests.put(url, headers=headers, data=data) + response = requests.put(url, headers=headers, data=data) if (response.status_code == OK): self.logger.debug(response.status_code) self.logger.debug(response.content) @@ -570,7 +573,7 @@ class SfcOnos(object): self.router_id) headers = {"Accept": "application/json", "X-Auth-Token": self.token_id} - response = requests.put(url, headers=headers, data=data) + response = requests.put(url, headers=headers, data=data) if (response.status_code == OK): self.logger.debug(response.status_code) self.logger.debug(response.content) @@ -590,7 +593,7 @@ class SfcOnos(object): "os-floating-ips" % (self.nova_hostname)) headers = {"Accept": "application/json", "X-Auth-Token": self.token_id} - response = requests.post(url, headers=headers, data=data) + response = requests.post(url, headers=headers, data=data) if (response.status_code == OK): self.logger.debug(response.status_code) self.logger.debug(response.content) @@ -614,7 +617,7 @@ class SfcOnos(object): headers = {"Accept": "application/json", "X-Auth-Token": self.token_id} - response = requests.post(url, headers=headers, data=data) + response = requests.post(url, headers=headers, data=data) if(response.status_code == ACCEPTED): self.logger.debug(response.status_code) self.logger.debug(response.content) @@ -631,12 +634,12 @@ class SfcOnos(object): s = pxssh.pxssh() hostname = self.vm_public_ip[0] - s.login(hostname, self.cirros_username, self.cirros_password) + s.login(hostname, self.cirros_username, self.cirros_password) s.sendline("ping -c 5 " + str(self.port_ip[2])) s.prompt() # match the prompt - ping_re = re.search("transmitted.*received", s.before).group() - x = re.split('\s+', ping_re) + ping_re = re.search("transmitted.*received", s.before).group() + x = re.split('\s+', ping_re) if (x[1] >= "1"): self.logger.info("Ping is Successfull") else: @@ -645,7 +648,7 @@ class SfcOnos(object): def vm1(queue1): s = pxssh.pxssh() hostname = self.vm_public_ip[1] - s.login(hostname, self.cirros_username, self.cirros_password) + s.login(hostname, self.cirros_username, self.cirros_password) s.sendline('sudo ./firewall') s.prompt() output_pack = s.before @@ -676,7 +679,7 @@ class SfcOnos(object): if result0 == 0 and result1 == 0: time.sleep(300) queue1 = Queue() - p1 = Process(target=vm1, args=(queue1, )) + p1 = Process(target=vm1, args=(queue1, )) p1.start() p2 = Process(target=vm0) p2.start() @@ -703,7 +706,7 @@ class SfcOnos(object): """Check the PC SF Map Stats in the ONOS.""" response = requests.get('http://' + self.onos_hostname + ':8181/onos/vtn/portChainSfMap/' + - self.PC_id, auth=("karaf", "karaf")) + self.PC_id, auth=("karaf", "karaf")) if (response.status_code == OK): self.logger.info("portChainSfMap is successfully Queries") return(response.status_code) @@ -761,7 +764,7 @@ class SfcOnos(object): def deletePortPair(self): """Deletion of Portpair.""" - for p in range(1, 2): + for p in range(1, 2): url = ("http://%s:9696/%s/sfc/" "port_pairs/%s" % (self.neutron_hostname, self.osver, @@ -819,7 +822,7 @@ class SfcOnos(object): self.router_id)) headers = {"Accept": "application/json", "X-Auth-Token": self.token_id} - response = requests.put(url, headers=headers, data=data) + response = requests.put(url, headers=headers, data=data) if (response.status_code == OK): self.logger.debug(response.status_code) self.logger.debug(response.content) @@ -833,14 +836,14 @@ class SfcOnos(object): self.router_id)) headers = {"Accept": "application/json", "X-Auth-Token": self.token_id} - response = requests.put(url, headers=headers, data=data) + response = requests.put(url, headers=headers, data=data) if (response.status_code == OK): url = ("http://%s:9696/%s/" "routers/%s" % (self.neutron_hostname, self.osver, self.router_id)) - headers = {"Accept": "application/json", "X-Auth-Token": - self.token_id} + headers = {"Accept": "application/json", + "X-Auth-Token": self.token_id} response = requests.delete(url, headers=headers) if (response.status_code == NO_CONTENT): self.logger.debug(response.status_code) diff --git a/functest/opnfv_tests/sdn/onos/teston/adapters/foundation.py b/functest/opnfv_tests/sdn/onos/teston/adapters/foundation.py index 25421d400..f9eee7af6 100644 --- a/functest/opnfv_tests/sdn/onos/teston/adapters/foundation.py +++ b/functest/opnfv_tests/sdn/onos/teston/adapters/foundation.py @@ -26,7 +26,8 @@ class Foundation(object): def __init__(self): # currentpath = os.getcwd() - currentpath = '%s/sdn/onos/teston/ci' % CONST.dir_functest_data + currentpath = ('{0}/sdn/onos/teston/ci' + .format(CONST.__getattribute__('dir_functest_data'))) self.cipath = currentpath self.logdir = os.path.join(currentpath, 'log') self.workhome = currentpath[0: currentpath.rfind('opnfv_tests') - 1] @@ -55,22 +56,25 @@ class Foundation(object): Get Default Parameters value """ self.Result_DB = ft_utils.get_db_url() - self.masterusername = CONST.ONOS_onosbench_username - self.masterpassword = CONST.ONOS_onosbench_password - self.agentusername = CONST.ONOS_onoscli_username - self.agentpassword = CONST.ONOS_onoscli_password - self.runtimeout = CONST.ONOS_runtimeout - self.OCT = CONST.ONOS_environment_OCT - self.OC1 = CONST.ONOS_environment_OC1 - self.OC2 = CONST.ONOS_environment_OC2 - self.OC3 = CONST.ONOS_environment_OC3 - self.OCN = CONST.ONOS_environment_OCN - self.OCN2 = CONST.ONOS_environment_OCN2 - self.installer_master = CONST.ONOS_environment_installer_master + self.masterusername = CONST.__getattribute__('ONOS_onosbench_username') + self.masterpassword = CONST.__getattribute__('ONOS_onosbench_password') + self.agentusername = CONST.__getattribute__('ONOS_onoscli_username') + self.agentpassword = CONST.__getattribute__('ONOS_onoscli_password') + self.runtimeout = CONST.__getattribute__('ONOS_runtimeout') + self.OCT = CONST.__getattribute__('ONOS_environment_OCT') + self.OC1 = CONST.__getattribute__('ONOS_environment_OC1') + self.OC2 = CONST.__getattribute__('ONOS_environment_OC2') + self.OC3 = CONST.__getattribute__('ONOS_environment_OC3') + self.OCN = CONST.__getattribute__('ONOS_environment_OCN') + self.OCN2 = CONST.__getattribute__('ONOS_environment_OCN2') + self.installer_master = CONST.__getattribute__( + 'ONOS_environment_installer_master') self.installer_master_username = ( - CONST.ONOS_environment_installer_master_username) + CONST.__getattribute__( + 'ONOS_environment_installer_master_username')) self.installer_master_password = ( - CONST.ONOS_environment_installer_master_password) + CONST.__getattribute__( + 'ONOS_environment_installer_master_password')) self.hosts = [self.OC1, self.OCN, self.OCN2] self.localhost = self.OCT diff --git a/functest/opnfv_tests/vnf/ims/clearwater.py b/functest/opnfv_tests/vnf/ims/clearwater.py index 32c6dc5c9..33ed352dc 100644 --- a/functest/opnfv_tests/vnf/ims/clearwater.py +++ b/functest/opnfv_tests/vnf/ims/clearwater.py @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python # coding: utf8 ####################################################################### # diff --git a/functest/opnfv_tests/vnf/ims/orchestrator_cloudify.py b/functest/opnfv_tests/vnf/ims/orchestrator_cloudify.py index 4ceeb25f8..0cdfcb3f1 100644 --- a/functest/opnfv_tests/vnf/ims/orchestrator_cloudify.py +++ b/functest/opnfv_tests/vnf/ims/orchestrator_cloudify.py @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python # coding: utf8 ####################################################################### # diff --git a/functest/tests/unit/cli/commands/test_cli_os.py b/functest/tests/unit/cli/commands/test_cli_os.py index 7ab4ddc3b..b551ee4d2 100644 --- a/functest/tests/unit/cli/commands/test_cli_os.py +++ b/functest/tests/unit/cli/commands/test_cli_os.py @@ -70,9 +70,8 @@ class CliOpenStackTesting(unittest.TestCase): mock_ftutils_execute): CONST.__setattr__('INSTALLER_TYPE', self.installer_type) CONST.__setattr__('INSTALLER_IP', self.installer_ip) - cmd = ("%s/releng/utils/fetch_os_creds.sh -d %s -i %s -a %s" - % (CONST.__getattribute__('dir_repos'), - self.openstack_creds, + cmd = ("fetch_os_creds.sh -d %s -i %s -a %s" + % (self.openstack_creds, self.installer_type, self.installer_ip)) self.cli_os.openstack_creds = self.openstack_creds @@ -93,9 +92,8 @@ class CliOpenStackTesting(unittest.TestCase): mock_ftutils_execute): CONST.__setattr__('INSTALLER_TYPE', None) CONST.__setattr__('INSTALLER_IP', self.installer_ip) - cmd = ("%s/releng/utils/fetch_os_creds.sh -d %s -i %s -a %s" - % (CONST.__getattribute__('dir_repos'), - self.openstack_creds, + cmd = ("fetch_os_creds.sh -d %s -i %s -a %s" + % (self.openstack_creds, None, self.installer_ip)) self.cli_os.openstack_creds = self.openstack_creds @@ -121,9 +119,8 @@ class CliOpenStackTesting(unittest.TestCase): installer_ip = None CONST.__setattr__('INSTALLER_TYPE', installer_type) CONST.__setattr__('INSTALLER_IP', installer_ip) - cmd = ("%s/releng/utils/fetch_os_creds.sh -d %s -i %s -a %s" - % (CONST.__getattribute__('dir_repos'), - self.openstack_creds, + cmd = ("fetch_os_creds.sh -d %s -i %s -a %s" + % (self.openstack_creds, installer_type, installer_ip)) self.cli_os.openstack_creds = self.openstack_creds diff --git a/functest/tests/unit/core/test_pytest_suite_runner.py b/functest/tests/unit/core/test_unit.py index f317cdea2..79c4e7d7a 100644 --- a/functest/tests/unit/core/test_pytest_suite_runner.py +++ b/functest/tests/unit/core/test_unit.py @@ -12,26 +12,29 @@ import unittest import mock -from functest.core import pytest_suite_runner +from functest.core import unit from functest.core import testcase class PyTestSuiteRunnerTesting(unittest.TestCase): def setUp(self): - self.psrunner = pytest_suite_runner.PyTestSuiteRunner() + self.psrunner = unit.Suite() + self.psrunner.suite = "foo" @mock.patch('unittest.TestLoader') def _test_run(self, mock_class=None, result=mock.Mock(), status=testcase.TestCase.EX_OK): - with mock.patch('functest.core.pytest_suite_runner.' - 'unittest.TextTestRunner.run', + with mock.patch('functest.core.unit.unittest.TextTestRunner.run', return_value=result): self.assertEqual(self.psrunner.run(), status) mock_class.assert_not_called() def test_check_suite_null(self): - self.assertEqual(self.psrunner.suite, None) + self.assertEqual(unit.Suite().suite, None) + self.psrunner.suite = None + self._test_run(result=mock.Mock(), + status=testcase.TestCase.EX_RUN_ERROR) def test_run_no_ut(self): mock_result = mock.Mock(testsRun=0, errors=[], failures=[]) @@ -78,8 +81,7 @@ class PyTestSuiteRunnerTesting(unittest.TestCase): failures=[]) mock_obj = mock.Mock() mock_class.side_effect = mock_obj - with mock.patch('functest.core.pytest_suite_runner.' - 'unittest.TextTestRunner.run', + with mock.patch('functest.core.unit.unittest.TextTestRunner.run', return_value=mock_result): self.assertEqual(self.psrunner.run(name='foo'), testcase.TestCase.EX_OK) diff --git a/functest/tests/unit/utils/test_functest_utils.py b/functest/tests/unit/utils/test_functest_utils.py index 218f7f727..12604c1a0 100644 --- a/functest/tests/unit/utils/test_functest_utils.py +++ b/functest/tests/unit/utils/test_functest_utils.py @@ -452,9 +452,8 @@ class FunctestUtilsTesting(unittest.TestCase): mock_logger_info.assert_called_once_with(msg_exec) mopen.assert_called_once_with(self.output_file, "w") - @mock.patch('functest.utils.functest_utils.logger.info') - def test_execute_command_args_missing_with_success(self, mock_logger_info, - ): + @mock.patch('sys.stdout') + def test_execute_command_args_missing_with_success(self, stdout=None): with mock.patch('functest.utils.functest_utils.subprocess.Popen') \ as mock_subproc_open: @@ -476,9 +475,8 @@ class FunctestUtilsTesting(unittest.TestCase): output_file=None) self.assertEqual(resp, 0) - @mock.patch('functest.utils.functest_utils.logger.error') - def test_execute_command_args_missing_with_error(self, mock_logger_error, - ): + @mock.patch('sys.stdout') + def test_execute_command_args_missing_with_error(self, stdout=None): with mock.patch('functest.utils.functest_utils.subprocess.Popen') \ as mock_subproc_open: @@ -16,7 +16,7 @@ commands = nosetests --with-xunit \ [testenv:docs] basepython = python2.7 -commands = sphinx-build -W -b html docs/api/ docs/api/_build +commands = sphinx-build -W -b html api/ api/_build [testenv:pep8] basepython = python2.7 @@ -29,8 +29,9 @@ basepython = python2.7 deps = {[testenv]deps} whitelist_externals = bash -commands = bash -c \ - "pylint --persistent=n functest | sed -ne '/Raw metrics/,//p'" +commands = bash -c "\ + pylint -f parseable --disable=locally-disabled functest | \ + tee pylint.out | sed -ne '/Raw metrics/,//p'" [testenv:py35] dirs = |