diff --git a/devstack/plugin.sh b/devstack/plugin.sh index aea3c274a..e0a7ca3d5 100644 --- a/devstack/plugin.sh +++ b/devstack/plugin.sh @@ -28,9 +28,6 @@ function neutron_lbaas_configure_common { die $LINENO "Do not enable both Version 1 and Version 2 of LBaaS." fi - # Uses oslo config generator to generate LBaaS sample configuration files - (cd $NEUTRON_LBAAS_DIR && exec ./tools/generate_config_file_samples.sh) - cp $NEUTRON_LBAAS_DIR/etc/neutron_lbaas.conf.sample $NEUTRON_LBAAS_CONF if is_service_enabled $LBAAS_V1; then @@ -69,21 +66,29 @@ function neutron_lbaas_configure_common { } function neutron_lbaas_configure_agent { - mkdir -p $LBAAS_AGENT_CONF_PATH - cp $NEUTRON_LBAAS_DIR/etc/lbaas_agent.ini.sample $LBAAS_AGENT_CONF_FILENAME + if [ -z "$1" ]; then + mkdir -p $LBAAS_AGENT_CONF_PATH + fi + conf=${1:-$LBAAS_AGENT_CONF_FILENAME} + cp $NEUTRON_LBAAS_DIR/etc/lbaas_agent.ini.sample $conf # ovs_use_veth needs to be set before the plugin configuration # occurs to allow plugins to override the setting. - iniset $LBAAS_AGENT_CONF_FILENAME DEFAULT ovs_use_veth $Q_OVS_USE_VETH + iniset $conf DEFAULT ovs_use_veth $Q_OVS_USE_VETH - neutron_plugin_setup_interface_driver $LBAAS_AGENT_CONF_FILENAME + neutron_plugin_setup_interface_driver $conf if is_fedora; then - iniset $LBAAS_AGENT_CONF_FILENAME DEFAULT user_group "nobody" - iniset $LBAAS_AGENT_CONF_FILENAME haproxy user_group "nobody" + iniset $conf DEFAULT user_group "nobody" + iniset $conf haproxy user_group "nobody" fi } +function neutron_lbaas_generate_config_files { + # Uses oslo config generator to generate LBaaS sample configuration files + (cd $NEUTRON_LBAAS_DIR && exec ./tools/generate_config_file_samples.sh) +} + function neutron_lbaas_start { local is_run_process=True @@ -134,6 +139,7 @@ if is_service_enabled $LBAAS_ANY; then elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then # Configure after the other layer 1 and 2 services have been configured echo_summary "Configuring neutron-lbaas" + neutron_lbaas_generate_config_files neutron_lbaas_configure_common neutron_lbaas_configure_agent diff --git a/neutron_lbaas/db/models/head.py b/neutron_lbaas/db/models/head.py index fb59d3363..158ad242f 100644 --- a/neutron_lbaas/db/models/head.py +++ b/neutron_lbaas/db/models/head.py @@ -14,8 +14,11 @@ from neutron.db.migration.models import head +import neutron_lbaas.agent_scheduler # noqa import neutron_lbaas.db.loadbalancer.loadbalancer_db # noqa import neutron_lbaas.db.loadbalancer.models # noqa +import neutron_lbaas.services.loadbalancer.agent_scheduler # noqa +import neutron_lbaas.services.loadbalancer.drivers.vmware.models # noqa def get_metadata(): diff --git a/neutron_lbaas/tests/contrib/decode_args.sh b/neutron_lbaas/tests/contrib/decode_args.sh index ca9a34306..55faf0a30 100644 --- a/neutron_lbaas/tests/contrib/decode_args.sh +++ b/neutron_lbaas/tests/contrib/decode_args.sh @@ -27,32 +27,39 @@ testtype="$1" lbaasversion="$2" lbaastest="$3" -lbaasenv=$(echo "$lbaastest" | perl -ne '/^(.*)-([^-]+)$/ && print "$1";') -if [ -z "$lbaasenv" ]; then - lbaasenv=$lbaastest -fi -lbaasdriver=$(echo "$lbaastest" | perl -ne '/^(.*)-([^-]+)$/ && print "$2";') -if [ -z "$lbaasdriver" ]; then - lbaasdriver='octavia' -fi -testenv=${lbaastest:-"apiv2"} +case $testtype in + "dsvm-functional") + testenv=$testtype + ;; -if [ "$lbaasversion" = "lbaasv1" ]; then - testenv="apiv1" -elif [ "$lbaasversion" = "lbaasv2" ]; then - case "$lbaasenv" in - "api"|"healthmonitor"|"listener"|"loadbalancer"|"member"|"minimal"|"pool") - testenv="apiv2" - ;; - "scenario") - testenv="scenario" - ;; - *) - echo "Unrecognized env $lbaasenv". - exit 1 - ;; - esac -fi + "tempest") + lbaasenv=$(echo "$lbaastest" | perl -ne '/^(.*)-([^-]+)$/ && print "$1";') + if [ -z "$lbaasenv" ]; then + lbaasenv=$lbaastest + fi + lbaasdriver=$(echo "$lbaastest" | perl -ne '/^(.*)-([^-]+)$/ && print "$2";') + if [ -z "$lbaasdriver" ]; then + lbaasdriver='octavia' + fi + testenv=${lbaastest:-"apiv2"} + if [ "$lbaasversion" = "lbaasv1" ]; then + testenv="apiv1" + elif [ "$lbaasversion" = "lbaasv2" ]; then + case "$lbaasenv" in + "api"|"healthmonitor"|"listener"|"loadbalancer"|"member"|"minimal"|"pool") + testenv="apiv2" + ;; + "scenario") + testenv="scenario" + ;; + *) + echo "Unrecognized env $lbaasenv". + exit 1 + ;; + esac + fi + ;; +esac diff --git a/neutron_lbaas/tests/contrib/gate_hook.sh b/neutron_lbaas/tests/contrib/gate_hook.sh index 1ca7d8b63..608f07301 100755 --- a/neutron_lbaas/tests/contrib/gate_hook.sh +++ b/neutron_lbaas/tests/contrib/gate_hook.sh @@ -50,6 +50,21 @@ EOF case "$testtype" in + "dsvm-functional") + PROJECT_NAME=neutron-lbaas + NEUTRON_LBAAS_PATH=$GATE_DEST/$PROJECT_NAME + DEVSTACK_PATH=$GATE_DEST/devstack + IS_GATE=True + USE_CONSTRAINT_ENV=False + export LOG_COLOR=False + source "$NEUTRON_LBAAS_PATH"/tools/configure_for_lbaas_func_testing.sh + + # Make the workspace owned by the stack user + sudo chown -R "$STACK_USER":"$STACK_USER" "$BASE" + + configure_host_for_lbaas_func_testing + ;; + "tempest") # These are not needed with either v1 or v2 ENABLED_SERVICES+="-c-api,-c-bak,-c-sch,-c-vol,-cinder," @@ -83,6 +98,7 @@ case "$testtype" in fi export ENABLED_SERVICES + "$GATE_DEST"/devstack-gate/devstack-vm-gate.sh ;; *) @@ -90,6 +106,3 @@ case "$testtype" in exit 1 ;; esac - - -"$GATE_DEST"/devstack-gate/devstack-vm-gate.sh diff --git a/neutron_lbaas/tests/contrib/post_test_hook.sh b/neutron_lbaas/tests/contrib/post_test_hook.sh index 3bc56904e..4942201d9 100755 --- a/neutron_lbaas/tests/contrib/post_test_hook.sh +++ b/neutron_lbaas/tests/contrib/post_test_hook.sh @@ -48,7 +48,7 @@ function generate_testr_results { sudo -H -u "$owner" chmod o+rw . sudo -H -u "$owner" chmod o+rw -R .testrepository if [ -f ".testrepository/0" ] ; then - subunit-1to2 < .testrepository/0 > ./testrepository.subunit + .tox/"$testenv"/bin/subunit-1to2 < .testrepository/0 > ./testrepository.subunit $SCRIPTS_DIR/subunit2html ./testrepository.subunit testr_results.html gzip -9 ./testrepository.subunit gzip -9 ./testr_results.html @@ -56,9 +56,17 @@ function generate_testr_results { fi } -owner=tempest -# Configure the api and scenario tests to use the tempest.conf set by devstack -sudo_env="TEMPEST_CONFIG_DIR=$TEMPEST_CONFIG_DIR" +case $testtype in + "dsvm-functional") + owner=stack + sudo_env= + ;; + "tempest") + owner=tempest + # Configure the api and scenario tests to use the tempest.conf set by devstack + sudo_env="TEMPEST_CONFIG_DIR=$TEMPEST_CONFIG_DIR" + ;; +esac # Set owner permissions according to job's requirements. cd "$NEUTRON_LBAAS_DIR" diff --git a/neutron_lbaas/tests/functional/__init__.py b/neutron_lbaas/tests/functional/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/neutron_lbaas/tests/functional/requirements.txt b/neutron_lbaas/tests/functional/requirements.txt new file mode 100644 index 000000000..2f9131d0b --- /dev/null +++ b/neutron_lbaas/tests/functional/requirements.txt @@ -0,0 +1,9 @@ +# Additional requirements for functional tests + +# The order of packages is significant, because pip processes them in the order +# of appearance. Changing the order has an impact on the overall integration +# process, which may cause wedges in the gate later. + +psutil>=1.1.1,<2.0.0 +psycopg2 +PyMySQL>=0.6.2 # MIT License diff --git a/neutron_lbaas/tests/unit/db/loadbalancer/test_migrations.py b/neutron_lbaas/tests/functional/test_migrations.py similarity index 100% rename from neutron_lbaas/tests/unit/db/loadbalancer/test_migrations.py rename to neutron_lbaas/tests/functional/test_migrations.py diff --git a/test-requirements.txt b/test-requirements.txt index 9bc881df7..3cdcdad7a 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -19,6 +19,4 @@ testscenarios>=0.4 # Apache-2.0/BSD WebOb>=1.2.3 # MIT WebTest>=2.0 # MIT reno>=1.8.0 # Apache2 -# Needed to run DB commands in virtualenvs -PyMySQL>=0.6.2 # MIT License tempest>=12.1.0 # Apache-2.0 diff --git a/tools/configure_for_lbaas_func_testing.sh b/tools/configure_for_lbaas_func_testing.sh new file mode 100644 index 000000000..e67566c21 --- /dev/null +++ b/tools/configure_for_lbaas_func_testing.sh @@ -0,0 +1,51 @@ +#!/usr/bin/env bash + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +set -e + + +IS_GATE=${IS_GATE:-False} +USE_CONSTRAINT_ENV=${USE_CONSTRAINT_ENV:-False} +PROJECT_NAME=${PROJECT_NAME:-neutron-lbaas} +REPO_BASE=${GATE_DEST:-$(cd $(dirname "$BASH_SOURCE")/../.. && pwd)} + +source $REPO_BASE/neutron/tools/configure_for_func_testing.sh + + +function configure_host_for_lbaas_func_testing { + echo_summary "Configuring for LBaaS functional testing" + if [ "$IS_GATE" == "True" ]; then + configure_host_for_func_testing + fi + + source $REPO_BASE/neutron-lbaas/devstack/settings + source $NEUTRON_LBAAS_DIR/devstack/plugin.sh + + local temp_ini=$(mktemp) + + # Note(pc_m): Need to ensure this is installed so we have + # oslo-config-generator present (as this script runs before tox.ini). + sudo pip install --force oslo.config + neutron_lbaas_generate_config_files + neutron_agent_lbaas_install_agent_packages + neutron_lbaas_configure_agent $temp_ini + + sudo install -d -o $STACK_USER $LBAAS_AGENT_CONF_PATH + sudo install -m 644 -o $STACK_USER $temp_ini $LBAAS_AGENT_CONF_FILENAME +} + + +if [ "$IS_GATE" != "True" ]; then + configure_host_for_lbaas_func_testing +fi diff --git a/tox.ini b/tox.ini index 40189d7e2..edb26f563 100644 --- a/tox.ini +++ b/tox.ini @@ -63,6 +63,27 @@ exclude = .venv,.git,.tox,dist,doc,*lib/python*,*egg,build,tools,.ropeproject,ra import_exceptions = neutron_lbaas._i18n local-check-factory = neutron_lib.hacking.checks.factory +[testenv:functional] +basepython = python2.7 +setenv = {[testenv]setenv} + OS_TEST_PATH={toxinidir}/neutron_lbaas/tests/functional + OS_LOG_PATH={env:OS_LOG_PATH:/opt/stack/logs} +deps = + {[testenv]deps} + -r{toxinidir}/neutron_lbaas/tests/functional/requirements.txt + +[testenv:dsvm-functional] +setenv = {[testenv]setenv} + {[testenv:functional]setenv} + OS_SUDO_TESTING=1 + OS_ROOTWRAP_CMD=sudo {envdir}/bin/neutron-rootwrap {envdir}/etc/neutron/rootwrap.conf + OS_ROOTWRAP_DAEMON_CMD=sudo {envdir}/bin/neutron-rootwrap-daemon {envdir}/etc/neutron/rootwrap.conf + OS_FAIL_ON_MISSING_DEPS=1 +deps = + {[testenv:functional]deps} +commands = + sh tools/pretty_tox.sh '{posargs}' + # If you are running the tests locally you should set the env variable # TEMPEST_CONFIG_DIR=/opt/stack/tempest/etc [testenv:apiv1]