Add a gate-specific tox env for functional tests
The functional gate jobs (*-neutron-dsvm-functional) need special configuration (e.g. OS_SUDO_TESTING, OS_ROOTWRAP_CMD) to run tests. This patch adds a new gate-specific tox env (tox -e dsvm-functional) that sets the appropriate values and allows easy duplication of the results of the upstream job on a host that has successfully run devstack with neutron enabled. A new configuration option, OS_FAIL_ON_MISSING_DEPS, is also set by the dsvm-functional tox env to ensure that dependency failures will result in failures rather than skips when run in the gate. Change-Id: Idbfef1ba72ed129a3021509c7969e2685b8a6d09 Partial-bug: #1336172
This commit is contained in:
parent
798824cab0
commit
37086a8f17
28
TESTING.rst
28
TESTING.rst
@ -4,16 +4,16 @@ Testing Neutron
|
|||||||
Overview
|
Overview
|
||||||
--------
|
--------
|
||||||
|
|
||||||
The unit tests are meant to cover as much code as possible and should
|
The unit tests (neutron/test/unit/) are meant to cover as much code as
|
||||||
be executed without the service running. They are designed to test
|
possible and should be executed without the service running. They are
|
||||||
the various pieces of the neutron tree to make sure any new changes
|
designed to test the various pieces of the neutron tree to make sure
|
||||||
don't break existing functionality.
|
any new changes don't break existing functionality.
|
||||||
|
|
||||||
The functional tests are intended to validate actual system
|
The functional tests (neutron/tests/functional/) are intended to
|
||||||
interaction. Mocks should be used sparingly, if at all. Care
|
validate actual system interaction. Mocks should be used sparingly,
|
||||||
should be taken to ensure that existing system resources are not
|
if at all. Care should be taken to ensure that existing system
|
||||||
modified and that resources created in tests are properly cleaned
|
resources are not modified and that resources created in tests are
|
||||||
up.
|
properly cleaned up.
|
||||||
|
|
||||||
Development process
|
Development process
|
||||||
-------------------
|
-------------------
|
||||||
@ -100,6 +100,16 @@ Neutron source code::
|
|||||||
|
|
||||||
tox
|
tox
|
||||||
|
|
||||||
|
To run functional tests that do not require sudo privileges or
|
||||||
|
specific-system dependencies::
|
||||||
|
|
||||||
|
tox -e functional
|
||||||
|
|
||||||
|
To run all the functional tests in an environment that has been configured
|
||||||
|
by devstack to support sudo and system-specific dependencies::
|
||||||
|
|
||||||
|
tox -e dsvm-functional
|
||||||
|
|
||||||
For more information on the standard Tox-based test infrastructure used by
|
For more information on the standard Tox-based test infrastructure used by
|
||||||
OpenStack and how to do some common test/debugging procedures with Testr,
|
OpenStack and how to do some common test/debugging procedures with Testr,
|
||||||
see this wiki page:
|
see this wiki page:
|
||||||
|
@ -29,7 +29,7 @@ class BaseLinuxTestCase(functional_base.BaseSudoTestCase):
|
|||||||
try:
|
try:
|
||||||
utils.execute(cmd, root_helper=root_helper)
|
utils.execute(cmd, root_helper=root_helper)
|
||||||
except RuntimeError as e:
|
except RuntimeError as e:
|
||||||
if error_text in str(e):
|
if error_text in str(e) and not self.fail_on_missing_deps:
|
||||||
self.skipTest(skip_msg)
|
self.skipTest(skip_msg)
|
||||||
raise
|
raise
|
||||||
|
|
||||||
|
@ -47,8 +47,6 @@ class BaseMonitorTest(linux_base.BaseOVSLinuxTestCase):
|
|||||||
|
|
||||||
def _check_test_requirements(self):
|
def _check_test_requirements(self):
|
||||||
self.check_sudo_enabled()
|
self.check_sudo_enabled()
|
||||||
self.check_command(['which', 'ovsdb-client'],
|
|
||||||
'Exit code: 1', 'ovsdb-client is not installed')
|
|
||||||
self.check_command(['ovsdb-client', 'list-dbs'],
|
self.check_command(['ovsdb-client', 'list-dbs'],
|
||||||
'Exit code: 1',
|
'Exit code: 1',
|
||||||
'password-less sudo not granted for ovsdb-client',
|
'password-less sudo not granted for ovsdb-client',
|
||||||
|
@ -46,8 +46,12 @@ class BaseSudoTestCase(base.BaseTestCase):
|
|||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(BaseSudoTestCase, self).setUp()
|
super(BaseSudoTestCase, self).setUp()
|
||||||
self.root_helper = os.environ.get('OS_ROOTWRAP_CMD', SUDO_CMD)
|
env = os.environ
|
||||||
|
self.sudo_enabled = env.get('OS_SUDO_TESTING') in base.TRUE_STRING
|
||||||
|
self.root_helper = env.get('OS_ROOTWRAP_CMD', SUDO_CMD)
|
||||||
|
self.fail_on_missing_deps = (
|
||||||
|
env.get('OS_FAIL_ON_MISSING_DEPS') in base.TRUE_STRING)
|
||||||
|
|
||||||
def check_sudo_enabled(self):
|
def check_sudo_enabled(self):
|
||||||
if os.environ.get('OS_SUDO_TESTING') not in base.TRUE_STRING:
|
if not self.sudo_enabled:
|
||||||
self.skipTest('testing with sudo is not enabled')
|
self.skipTest('testing with sudo is not enabled')
|
||||||
|
8
tox.ini
8
tox.ini
@ -18,6 +18,14 @@ setenv = OS_TEST_PATH=./neutron/tests/functional
|
|||||||
commands =
|
commands =
|
||||||
python setup.py testr --slowest --testr-args='{posargs}'
|
python setup.py testr --slowest --testr-args='{posargs}'
|
||||||
|
|
||||||
|
[testenv:dsvm-functional]
|
||||||
|
setenv = OS_TEST_PATH=./neutron/tests/functional
|
||||||
|
OS_SUDO_TESTING=1
|
||||||
|
OS_ROOTWRAP_CMD=sudo /usr/local/bin/neutron-rootwrap /etc/neutron/rootwrap.conf
|
||||||
|
OS_FAIL_ON_MISSING_DEPS=1
|
||||||
|
commands =
|
||||||
|
python setup.py testr --slowest --testr-args='{posargs}'
|
||||||
|
|
||||||
[tox:jenkins]
|
[tox:jenkins]
|
||||||
sitepackages = True
|
sitepackages = True
|
||||||
downloadcache = ~/cache/pip
|
downloadcache = ~/cache/pip
|
||||||
|
Loading…
Reference in New Issue
Block a user