Migrate functional test jobs to zuul v3

Something are introduced in this patch:
* As devstack-gate/devstack-vm-gate-wrap.sh is not really zuul v3
native, we move all configs in to `devstack/lib/heat` and .zuul.yaml.

* Remove extra configs process in devstack. Like setup tempest(which
is well covered by tempest itself.) or overlapping heat test configs setup.
Use tempest config for all heat_integration tests. Also remove
heat_integrationtests/common/configs since they're no longer required.

* copy post.yaml for grenade jobs. As we migrate to zuul v3 for
functional tests but not grenade (not yet), the post.yaml should exists
under grenade dir. since it's only required by grenade jobs.

* Use post.yaml in functional tests for cleanup test environments.

Story: #2007056
Task: #37908

Depends-On: https://review.opendev.org/701105
Change-Id: I4f531161a7222e2c2a21f8d483f9c2a1d91dc38d
This commit is contained in:
ricolin 2019-12-27 18:10:58 +08:00
parent 28ce9f3ad4
commit c8d1a9f901
14 changed files with 208 additions and 407 deletions

View File

@ -1,26 +1,106 @@
- job: - job:
name: heat-functional-devstack-base name: heat-functional-base
parent: legacy-dsvm-base parent: devstack
abstract: true
run: playbooks/devstack/functional/run.yaml run: playbooks/devstack/functional/run.yaml
post-run: playbooks/devstack/functional/post.yaml post-run: playbooks/devstack/functional/post.yaml
description: Base heat functional test job
timeout: 7800 timeout: 7800
roles:
- zuul: opendev.org/openstack/devstack
- zuul: opendev.org/openstack/tempest
required-projects: required-projects:
- openstack/devstack-gate - openstack/devstack-gate
- openstack/aodh - openstack/aodh
- openstack/barbican - openstack/barbican
- openstack/barbican-tempest-plugin
- openstack/ceilometer - openstack/ceilometer
- openstack/devstack-plugin-amqp1
- openstack/heat - openstack/heat
- openstack/heat-templates
- openstack/heat-tempest-plugin - openstack/heat-tempest-plugin
- openstack/neutron
- openstack/octavia - openstack/octavia
- openstack/neutron
- openstack/oslo.messaging - openstack/oslo.messaging
- openstack/python-barbicanclient - openstack/python-barbicanclient
- openstack/python-heatclient - openstack/python-heatclient
- openstack/heat-agents - openstack/heat-agents
- openstack/python-zaqarclient - openstack/python-zaqarclient
- openstack/zaqar - openstack/zaqar
- openstack/tempest
vars:
gabbi_tempest_path: heat_tempest_plugin.tests.api.gabbits
tempest_plugins:
- heat-tempest-plugin
devstack_localrc:
TEMPEST_PLUGINS: '/opt/stack/heat-tempest-plugin'
HEAT_USE_MOD_WSGI: True
CEILOMETER_PIPELINE_INTERVAL: 60
devstack_services:
tls-proxy: false
s-account: false
s-container: false
s-object: false
s-proxy: false
tempest: true
devstack_plugins:
barbican: https://opendev.org/openstack/barbican
ceilometer: https://opendev.org/openstack/ceilometer
aodh: https://opendev.org/openstack/aodh
zaqar: https://opendev.org/openstack/zaqar
heat: https://opendev.org/openstack/heat
octavia: https://opendev.org/openstack/octavia
devstack_local_conf:
post-config:
$HEAT_CONF:
DEFAULT:
convergence_engine: true
stack_scheduler_hints: true
hidden_stack_tags: hidden
encrypt_parameters_and_properties: True
logging_exception_prefix: "%(asctime)s.%(msecs)03d %(process)d TRACE %(name)s %(instance)s"
enable_stack_adopt: true
enable_stack_abandon: true
heat_api:
workers: 2
heat_api_cfn:
workers: 2
cache:
enabled: True
eventlet_opts:
client_socket_timeout: 120
oslo_messaging_notifications:
driver: messagingv2
test-config:
$TEMPEST_CONFIG:
service_available:
heat: True
heat_plugin:
convergence_engine_enabled: true
minimal_image_ref: ${DEFAULT_IMAGE_NAME:-cirros-0.3.6-x86_64-disk}
instance_type: m1.heat_int
minimal_instance_type: m1.heat_micro
image_ref: Fedora-Cloud-Base-29-1.2.x86_64
hidden_stack_tag: hidden
heat_config_notify_script: /opt/stack/heat-agents/heat-config/bin/heat-config-notify
boot_config_env: /opt/stack/heat-templates/hot/software-config/boot-config/test_image_env.yaml
credential_secret_id: $OS_CREDENTIAL_SECRET_ID
heat_features_enabled:
multi_cloud: True
# disable cinder backup feature
volume-feature-enabled:
backup: False
test_results_stage_name: test_results
zuul_copy_output:
'{{ devstack_base_dir }}/tempest/etc/tempest.conf': logs
'{{ devstack_base_dir }}/tempest/etc/accounts.yaml': logs
'{{ devstack_base_dir }}/tempest/tempest.log': logs
'{{ stage_dir }}/{{ test_results_stage_name }}.subunit': logs
'{{ stage_dir }}/{{ test_results_stage_name }}.html': logs
'{{ stage_dir }}/stackviz': logs
extensions_to_txt:
conf: true
log: true
yaml: true
yml: true
irrelevant-files: irrelevant-files:
- ^.*\.rst$ - ^.*\.rst$
- ^api-ref/.*$ - ^api-ref/.*$
@ -28,44 +108,31 @@
- ^heat/locale/.*$ - ^heat/locale/.*$
- ^heat/tests/.*$ - ^heat/tests/.*$
- ^releasenotes/.*$ - ^releasenotes/.*$
vars:
disable_convergence: 'false'
sql: mysql
use_amqp1: 0
use_apache: 1
use_python3: 1
branch_override: default
- job:
name: heat-functional-legacy
parent: heat-functional-devstack-base
vars:
disable_convergence: 'true'
- job: - job:
name: heat-functional name: heat-functional
parent: heat-functional-devstack-base parent: heat-functional-base
- job: - job:
name: heat-functional-amqp1 name: heat-functional-legacy
parent: heat-functional-devstack-base parent: heat-functional-base
voting: false
branches: master
vars: vars:
use_amqp1: 1 devstack_local_conf:
post-config:
- job: $HEAT_CONF:
name: heat-functional-non-apache DEFAULT:
parent: heat-functional-devstack-base convergence_engine: false
voting: false test-config:
vars: $TEMPEST_CONFIG:
use_apache: 0 heat_plugin:
convergence_engine_enabled: false
- job: - job:
name: grenade-heat name: grenade-heat
parent: legacy-dsvm-base parent: legacy-dsvm-base
run: playbooks/devstack/grenade/run.yaml run: playbooks/devstack/grenade/run.yaml
post-run: playbooks/devstack/functional/post.yaml post-run: playbooks/devstack/grenade/post.yaml
timeout: 7800 timeout: 7800
required-projects: required-projects:
- openstack/grenade - openstack/grenade
@ -110,8 +177,6 @@
- grenade-heat-multinode - grenade-heat-multinode
- heat-functional - heat-functional
- heat-functional-legacy - heat-functional-legacy
- heat-functional-amqp1
- heat-functional-non-apache
gate: gate:
queue: heat queue: heat
jobs: jobs:

View File

@ -441,15 +441,56 @@ function create_heat_accounts {
# NOTE (gmann): Configure all the Tempest setting for Heat service in # NOTE (gmann): Configure all the Tempest setting for Heat service in
# this function. # this function.
function configure_tempest_for_heat { function configure_tempest_for_heat {
if is_service_enabled tempest; then # Skip SoftwareConfigIntegrationTest because it requires a custom image
iniset $TEMPEST_CONFIG service_available heat True # Skip AutoscalingLoadBalancerTest and AutoscalingLoadBalancerv2Test as deprecated neutron-lbaas service is not enabled
iniset $TEMPEST_CONFIG heat_plugin skip_scenario_test_list 'AutoscalingLoadBalancerTest, AutoscalingLoadBalancerv2Test, SoftwareConfigIntegrationTest'
# Skip LoadBalancerv2Test as deprecated neutron-lbaas service is not enabled
iniset $TEMPEST_CONFIG heat_plugin skip_functional_test_list 'LoadBalancerv2Test, NotificationTest'
openstack flavor show m1.heat_int || openstack flavor create m1.heat_int --ram 512 --disk 4
openstack flavor show m1.heat_micro || openstack flavor create m1.heat_micro --ram 128 --disk 1
source $TOP_DIR/openrc demo demo
openstack network show heat-net || openstack network create heat-net
openstack subnet show heat-subnet || openstack subnet create heat-subnet --network heat-net --subnet-range 10.0.5.0/24
openstack router add subnet router1 heat-subnet
iniset $TEMPEST_CONFIG heat_plugin username $OS_USERNAME
iniset $TEMPEST_CONFIG heat_plugin password $OS_PASSWORD
iniset $TEMPEST_CONFIG heat_plugin project_name $OS_PROJECT_NAME
iniset $TEMPEST_CONFIG heat_plugin auth_url $OS_AUTH_URL
iniset $TEMPEST_CONFIG heat_plugin user_domain_id $OS_USER_DOMAIN_ID
iniset $TEMPEST_CONFIG heat_plugin project_domain_id $OS_PROJECT_DOMAIN_ID
iniset $TEMPEST_CONFIG heat_plugin user_domain_name $OS_USER_DOMAIN_NAME
iniset $TEMPEST_CONFIG heat_plugin project_domain_name $OS_PROJECT_DOMAIN_NAME
iniset $TEMPEST_CONFIG heat_plugin region $OS_REGION_NAME
iniset $TEMPEST_CONFIG heat_plugin auth_version $OS_IDENTITY_API_VERSION
source $TOP_DIR/openrc admin admin
iniset $TEMPEST_CONFIG heat_plugin admin_username $OS_USERNAME
iniset $TEMPEST_CONFIG heat_plugin admin_password $OS_PASSWORD
if [[ -e /etc/ci/mirror_info.sh ]]; then
source /etc/ci/mirror_info.sh
fi fi
export HEAT_TEST_FEDORA_IMAGE=${NODEPOOL_FEDORA_MIRROR:-https://download.fedoraproject.org/pub/fedora/linux}/releases/29/Cloud/x86_64/images/Fedora-Cloud-Base-29-1.2.x86_64.qcow2
TOKEN=$(openstack token issue -c id -f value)
local image_exists=$( openstack image list | grep "Fedora-Cloud-Base-29-1.2.x86_64" )
if [[ -z $image_exists ]]; then
if is_service_enabled g-reg; then
upload_image $HEAT_TEST_FEDORA_IMAGE $TOKEN
fi
fi
if is_service_enabled tls-proxy; then
iniset $TEMPEST_CONFIG heat_plugin ca_file $SSL_BUNDLE_FILE
fi
# add application credential and secret to support test multi-cloud
app_cred_id=$(openstack application credential show heat_multicloud || openstack application credential create heat_multicloud \
--secret secret --unrestricted -c id -f value)
export OS_CREDENTIAL_SECRET_ID=$(openstack secret store -n heat-multi-cloud-test-cred --payload \
'{"auth_type": "v3applicationcredential", "auth": {"auth_url": $OS_AUTH_URL, "application_credential_id": $app_cred_id, "application_credential_secret": "secret"}}'\
-c "Secret href" -f value)
} }
# Restore xtrace # Restore xtrace
$_XTRACE_HEAT $_XTRACE_HEAT
# Tell emacs to use shell-script-mode
## Local variables:
## mode: shell-script
## End:

View File

@ -18,7 +18,8 @@ if is_heat_enabled; then
elif [[ "$1" == "stack" && "$2" == "test-config" ]]; then elif [[ "$1" == "stack" && "$2" == "test-config" ]]; then
if is_service_enabled tempest; then if is_service_enabled tempest; then
setup_develop $TEMPEST_DIR echo_summary "Configuring Tempest for Heat"
configure_tempest_for_heat
fi fi
elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then
@ -35,10 +36,6 @@ if is_heat_enabled; then
# Start the heat API and heat taskmgr components # Start the heat API and heat taskmgr components
echo_summary "Starting heat" echo_summary "Starting heat"
start_heat start_heat
elif [[ "$1" == "stack" && "$2" == "test-config" ]]; then
echo_summary "Configuring Tempest for Heat"
configure_tempest_for_heat
fi fi
if [[ "$1" == "unstack" ]]; then if [[ "$1" == "unstack" ]]; then

View File

@ -14,16 +14,14 @@
import os import os
import unittest import unittest
from heat_integrationtests.common import config
from oslo_log import log as logging from oslo_log import log as logging
from tempest import config
LOG = logging.getLogger(__name__, project=__name__) LOG = logging.getLogger(__name__, project=__name__)
def load_tests(loader, standard_tests, pattern): def load_tests(loader, standard_tests, pattern):
logging.setup(config.init_conf(), __name__) logging.setup(config.CONF, __name__)
suite = unittest.TestSuite() suite = unittest.TestSuite()
heat_integration_dir = os.path.dirname(os.path.abspath(__file__)) heat_integration_dir = os.path.dirname(os.path.abspath(__file__))

View File

@ -12,7 +12,7 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
# This script is executed inside post_test_hook function in devstack gate. # This script is executed in devstack gate.
set -ex set -ex

View File

@ -1,147 +0,0 @@
# 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.
import os
from oslo_config import cfg
from oslo_log import log as logging
import heat_integrationtests
_CONF = None
heat_group = cfg.OptGroup(name="heat_plugin",
title="Heat Service Options")
HeatGroup = [
cfg.StrOpt("catalog_type",
default="orchestration",
help="Catalog type of the orchestration service."),
cfg.StrOpt('username',
help="Username to use for non admin API requests."),
cfg.StrOpt('password',
help="Non admin API key to use when authenticating.",
secret=True),
cfg.StrOpt('admin_username',
help="Username to use for admin API requests."),
cfg.StrOpt('admin_password',
help="Admin API key to use when authentication.",
secret=True),
cfg.StrOpt('project_name',
help="Project name to use for API requests.",
deprecated_opts=[cfg.DeprecatedOpt('tenant_name',
group='heat_plugin')]),
cfg.StrOpt('admin_project_name',
default='admin',
help="Admin project name to use for admin API requests.",
deprecated_opts=[cfg.DeprecatedOpt('admin_tenant_name',
group='heat_plugin')]),
cfg.StrOpt('auth_url',
help="Full URI of the OpenStack Identity API (Keystone)."),
cfg.StrOpt('auth_version',
help="OpenStack Identity API version."),
cfg.StrOpt('user_domain_name',
help="User domain name, if keystone v3 auth_url "
"is used"),
cfg.StrOpt('project_domain_name',
help="Project domain name, if keystone v3 auth_url "
"is used"),
cfg.StrOpt('user_domain_id',
help="User domain id, if keystone v3 auth_url "
"is used"),
cfg.StrOpt('project_domain_id',
help="Project domain id, if keystone v3 auth_url "
"is used"),
cfg.StrOpt('region',
help="The region name to use"),
cfg.StrOpt('instance_type',
help="Instance type for tests. Needs to be big enough for a "
"full OS plus the test workload"),
cfg.StrOpt('minimal_instance_type',
help="Instance type enough for simplest cases."),
cfg.StrOpt('image_ref',
help="Name of image to use for tests which boot servers."),
cfg.StrOpt('keypair_name',
help="Name of existing keypair to launch servers with."),
cfg.StrOpt('minimal_image_ref',
help="Name of minimal (e.g cirros) image to use when "
"launching test instances."),
cfg.BoolOpt('disable_ssl_certificate_validation',
default=False,
help="Set to True if using self-signed SSL certificates."),
cfg.StrOpt('ca_file',
help="CA certificate to pass for servers that have "
"https endpoint."),
cfg.IntOpt('build_interval',
default=4,
help="Time in seconds between build status checks."),
cfg.IntOpt('build_timeout',
default=1200,
help="Timeout in seconds to wait for a stack to build."),
cfg.StrOpt('network_for_ssh',
default='heat-net',
help="Network used for SSH connections."),
cfg.StrOpt('fixed_network_name',
default='heat-net',
help="Visible fixed network name "),
cfg.StrOpt('floating_network_name',
default='public',
help="Visible floating network name "),
cfg.StrOpt('fixed_subnet_name',
default='heat-subnet',
help="Visible fixed sub-network name "),
cfg.BoolOpt('skip_functional_tests',
default=False,
help="Skip all functional tests"),
cfg.ListOpt('skip_functional_test_list',
help="List of functional test class or class.method "
"names to skip ex. AutoscalingGroupTest, "
"InstanceGroupBasicTest.test_size_updates_work"),
cfg.ListOpt('skip_test_stack_action_list',
help="List of stack actions in tests to skip "
"ex. ABANDON, ADOPT, SUSPEND, RESUME"),
cfg.BoolOpt('convergence_engine_enabled',
default=True,
help="Test features that are only present for stacks with "
"convergence enabled."),
cfg.IntOpt('connectivity_timeout',
default=120,
help="Timeout in seconds to wait for connectivity to "
"server."),
]
def init_conf(read_conf=True):
global _CONF
if _CONF is not None:
return _CONF
default_config_files = None
if read_conf:
confpath = os.path.join(
os.path.dirname(os.path.realpath(heat_integrationtests.__file__)),
'heat_integrationtests.conf')
if os.path.isfile(confpath):
default_config_files = [confpath]
_CONF = cfg.ConfigOpts()
logging.register_options(_CONF)
_CONF(args=[], project='heat_integrationtests',
default_config_files=default_config_files)
for group, opts in list_opts():
_CONF.register_opts(opts, group=group)
return _CONF
def list_opts():
yield heat_group.name, HeatGroup

View File

@ -23,11 +23,11 @@ from oslo_log import log as logging
from oslo_utils import timeutils from oslo_utils import timeutils
import six import six
from six.moves import urllib from six.moves import urllib
from tempest import config
import testscenarios import testscenarios
import testtools import testtools
from heat_integrationtests.common import clients from heat_integrationtests.common import clients
from heat_integrationtests.common import config
from heat_integrationtests.common import exceptions from heat_integrationtests.common import exceptions
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
@ -71,8 +71,7 @@ def requires_convergence(test_method):
The decorated test will be skipped when convergence is disabled. The decorated test will be skipped when convergence is disabled.
''' '''
convergence_enabled = config.init_conf( convergence_enabled = config.CONF.heat_plugin.convergence_engine_enabled
).heat_plugin.convergence_engine_enabled
skipper = testtools.skipUnless(convergence_enabled, skipper = testtools.skipUnless(convergence_enabled,
"Convergence-only tests are disabled") "Convergence-only tests are disabled")
return skipper(test_method) return skipper(test_method)
@ -84,7 +83,7 @@ class HeatIntegrationTest(testscenarios.WithScenarios,
def setUp(self): def setUp(self):
super(HeatIntegrationTest, self).setUp() super(HeatIntegrationTest, self).setUp()
self.conf = config.init_conf().heat_plugin self.conf = config.CONF.heat_plugin
self.assertIsNotNone(self.conf.auth_url, self.assertIsNotNone(self.conf.auth_url,
'No auth_url configured') 'No auth_url configured')

View File

@ -1,27 +0,0 @@
#!/bin/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.
# This script is executed inside post_test_hook function in devstack gate.
set -ex
export DEST=${DEST:-/opt/stack/new}
export TOP_DIR=${TOP_DIR:-/opt/stack/new/devstack}
sudo -E $DEST/heat/heat_integrationtests/prepare_test_env.sh
sudo -E $DEST/heat/heat_integrationtests/prepare_test_network.sh
cd $DEST/tempest
sudo tox -evenv-tempest -- stestr --test-path=$DEST/heat/heat_integrationtests --top-dir=$DEST/heat --group_regex='heat_tempest_plugin\.tests\.api\.test_heat_api[._]([^_]+)' run
sudo -E $DEST/heat/heat_integrationtests/cleanup_test_env.sh

View File

@ -1,53 +0,0 @@
#!/bin/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.
# This script is executed inside pre_test_hook function in devstack gate.
set -x
localconf=$BASE/new/devstack/local.conf
echo -e '[[post-config|$HEAT_CONF]]\n[DEFAULT]\n' >> $localconf
if [ "$DISABLE_CONVERGENCE" == "true" ] ; then
echo -e 'convergence_engine=false\n' >> $localconf
fi
echo -e 'stack_scheduler_hints=true\n' >> $localconf
echo -e 'hidden_stack_tags=hidden\n' >> $localconf
echo -e 'encrypt_parameters_and_properties=True\n' >> $localconf
echo -e 'logging_exception_prefix=%(asctime)s.%(msecs)03d %(process)d TRACE %(name)s %(instance)s\n' >> $localconf
echo -e '[heat_api]\nworkers=2\n' >> $localconf
echo -e '[heat_api_cfn]\nworkers=2\n' >> $localconf
echo -e '[cache]\nenabled=True\n' >> $localconf
echo -e '[eventlet_opts]\nclient_socket_timeout=120\n' >> $localconf
echo -e '[oslo_messaging_notifications]\ndriver=messagingv2\n' >> $localconf
echo "[[local|localrc]]" >> $localconf
# NOTE(mnaser): This will use the region local mirrors to avoid going out
# to network
if [[ -e /etc/ci/mirror_info.sh ]]; then
source /etc/ci/mirror_info.sh
echo "IMAGE_URLS+=${NODEPOOL_FEDORA_MIRROR}/releases/29/Cloud/x86_64/images/Fedora-Cloud-Base-29-1.2.x86_64.qcow2" >> $localconf
else
echo "IMAGE_URLS+=https://download.fedoraproject.org/pub/fedora/linux/releases/29/Cloud/x86_64/images/Fedora-Cloud-Base-29-1.2.x86_64.qcow2" >> $localconf
fi
echo "CEILOMETER_PIPELINE_INTERVAL=60" >> $localconf
echo "HEAT_ENABLE_ADOPT_ABANDON=True" >> $localconf

View File

@ -1,15 +1,19 @@
- hosts: primary - hosts: primary
name: Clear test env
tasks: tasks:
- name: clear test env
shell:
cmd: |
/opt/stack/heat/heat_integrationtests/cleanup_test_env.sh
executable: /bin/bash
chdir: "{{ zuul.project.src_dir }}"
environment:
DEVSTACK_BASE_DIR: "{{ devstack_base_dir }}"
become: true
- name: Copy files from {{ ansible_user_dir }}/workspace/ on node - hosts: tempest
synchronize: become: true
src: '{{ ansible_user_dir }}/workspace/' roles:
dest: '{{ zuul.executor.log_root }}' - role: fetch-subunit-output
mode: pull zuul_work_dir: '{{ devstack_base_dir }}/tempest'
copy_links: true - role: process-stackviz
verify_host: true
rsync_opts:
- --include=/logs/**
- --include=*/
- --exclude=*
- --prune-empty-dirs

View File

@ -1,116 +1,15 @@
- hosts: all - hosts: all
name: Job for functional tests roles:
tasks: - orchestrate-devstack
- name: Ensure legacy workspace directory - hosts: tempest
file: environment:
path: '{{ ansible_user_dir }}/workspace' # This enviroment variable is used by the optional tempest-gabbi
state: directory # job provided by the gabbi-tempest plugin. It can be safely ignored
# if that plugin is not being used.
- shell: GABBI_TEMPEST_PATH: "{{ gabbi_tempest_path | default('') }}"
cmd: | roles:
set -e - setup-tempest-run-dir
set -x - setup-tempest-data-dir
cat > clonemap.yaml << EOF - acl-devstack-files
clonemap: - run-heat-tests
- name: openstack/devstack-gate
dest: devstack-gate
EOF
/usr/zuul-env/bin/zuul-cloner -m clonemap.yaml --cache-dir /opt/git \
https://opendev.org \
openstack/devstack-gate
executable: /bin/bash
chdir: '{{ ansible_user_dir }}/workspace'
- shell:
cmd: |
set -e
set -x
export PYTHONUNBUFFERED=true
services=rabbit,tempest,mysql,dstat,key
services+=,n-api,n-api-meta,n-cpu,n-cond,n-sch,n-crt
services+=,placement-api,placement-client
services+=,g-api,g-reg
services+=,c-sch,c-api,c-vol,c-bak
services+=,neutron-api,neutron-dhcp,neutron-metadata-agent,neutron-agent,neutron-l3,neutron-trunk
if [ "{{ use_python3 }}" -eq 1 ] ; then
export DEVSTACK_GATE_USE_PYTHON3=True
# Swift does not work so skip s-* for python3x for now
else
export DEVSTACK_GATE_USE_PYTHON3=False
services+=,s-proxy,s-object,s-container,s-account
fi
export DEVSTACK_GATE_NEUTRON=1
export DEVSTACK_GATE_TEMPEST=1
export DEVSTACK_GATE_TEMPEST_NOTESTS=1
export DEVSTACK_GATE_INSTALL_TESTONLY=1
export DEVSTACK_PROJECT_FROM_GIT=python-heatclient
export KEEP_LOCALRC=1
export PROJECTS="openstack/ceilometer $PROJECTS"
export PROJECTS="openstack/aodh $PROJECTS"
export PROJECTS="openstack/zaqar $PROJECTS"
export PROJECTS="openstack/heat-agents $PROJECTS"
export PROJECTS="openstack/python-zaqarclient $PROJECTS"
export PROJECTS="openstack/neutron $PROJECTS"
export DEVSTACK_LOCAL_CONFIG+=$'\n'"enable_plugin ceilometer https://opendev.org/openstack/ceilometer"
export DEVSTACK_LOCAL_CONFIG+=$'\n'"enable_plugin aodh https://opendev.org/openstack/aodh"
export DEVSTACK_LOCAL_CONFIG+=$'\n'"enable_plugin zaqar https://opendev.org/openstack/zaqar"
export DEVSTACK_LOCAL_CONFIG+=$'\n'"enable_plugin neutron https://opendev.org/openstack/neutron"
export DEVSTACK_LOCAL_CONFIG+=$'\n'"enable_plugin heat https://opendev.org/openstack/heat"
# Enable octavia plugin and services
export DEVSTACK_LOCAL_CONFIG+=$'\n'"enable_plugin octavia https://opendev.org/openstack/octavia"
export DEVSTACK_LOCAL_CONFIG+=$'\n'"OCTAVIA_AMP_IMAGE_FILE=/tmp/test-only-amphora-x64-haproxy-ubuntu-bionic.qcow2"
export DEVSTACK_LOCAL_CONFIG+=$'\n'"OCTAVIA_AMP_IMAGE_SIZE=3"
export DEVSTACK_LOCAL_CONFIG+=$'\n'"OCTAVIA_AMP_IMAGE_NAME=test-only-amphora-x64-haproxy-ubuntu-bionic"
export DEVSTACK_LOCAL_CONFIG+=$'\n'"OCTAVIA_AMPHORA_DRIVER=amphora_noop_driver"
export DEVSTACK_LOCAL_CONFIG+=$'\n'"OCTAVIA_COMPUTE_DRIVER=compute_noop_driver"
export DEVSTACK_LOCAL_CONFIG+=$'\n'"OCTAVIA_NETWORK_DRIVER=network_noop_driver"
export DEVSTACK_LOCAL_CONFIG+=$'\n'"DISABLE_AMP_IMAGE_BUILD=True"
services+=,octavia,o-cw,o-hk,o-hm,o-api
export PROJECTS="openstack/octavia $PROJECTS"
export PROJECTS="openstack/barbican $PROJECTS"
export PROJECTS="openstack/python-barbicanclient $PROJECTS"
export PROJECTS="openstack/barbican-tempest-plugin $PROJECTS"
export DEVSTACK_LOCAL_CONFIG+=$'\n'"enable_plugin barbican https://opendev.org/openstack/barbican"
# use heat-tempest-plugin
export PROJECTS="openstack/heat-tempest-plugin $PROJECTS"
export DEVSTACK_LOCAL_CONFIG+=$'\n'"TEMPEST_PLUGINS+=' /opt/stack/new/heat-tempest-plugin'"
export OVERRIDE_ENABLED_SERVICES=$services
if [ "{{ branch_override }}" != "default" ] ; then
export OVERRIDE_ZUUL_BRANCH=$BRANCH_OVERRIDE
fi
if [ "{{ use_apache }}" -eq 0 ] ; then
export DEVSTACK_LOCAL_CONFIG+=$'\n'"HEAT_USE_MOD_WSGI=False"
fi
if [ "{{ use_amqp1 }}" -eq 1 ] ; then
export PROJECTS="openstack/devstack-plugin-amqp1 $PROJECTS"
export DEVSTACK_LOCAL_CONFIG+=$'\n'"export AMQP1_SERVICE=qpid-hybrid"
export DEVSTACK_LOCAL_CONFIG+=$'\n'"enable_plugin devstack-plugin-amqp1 https://opendev.org/openstack/devstack-plugin-amqp1"
export DEVSTACK_LOCAL_CONFIG+=$'\n'"export CELLSV2_SETUP=singleconductor"
export DEVSTACK_PROJECT_FROM_GIT="oslo.messaging,$DEVSTACK_PROJECT_FROM_GIT"
fi
export DISABLE_CONVERGENCE="{{ disable_convergence }}"
function pre_test_hook {
cd /opt/stack/new/heat/heat_integrationtests
source ./pre_test_hook.sh
}
export -f pre_test_hook
function post_test_hook {
cd /opt/stack/new/heat/heat_integrationtests
source ./post_test_hook.sh
}
export -f post_test_hook
cp devstack-gate/devstack-vm-gate-wrap.sh ./safe-devstack-vm-gate-wrap.sh
./safe-devstack-vm-gate-wrap.sh
executable: /bin/bash
chdir: '{{ ansible_user_dir }}/workspace'
environment: '{{ zuul | zuul_legacy_vars }}'

View File

@ -0,0 +1,14 @@
- hosts: primary
tasks:
- name: Copy files from {{ ansible_user_dir }}/workspace/ on node
synchronize:
src: '{{ ansible_user_dir }}/workspace/'
dest: '{{ zuul.executor.log_root }}'
mode: pull
copy_links: true
verify_host: true
rsync_opts:
- --include=/logs/**
- --include=*/
- --exclude=*
- --prune-empty-dirs

View File

@ -0,0 +1,2 @@
devstack_base_dir: /opt/stack
tempest_test_timeout: ''

View File

@ -0,0 +1,9 @@
- name: Run heat tests
command: tox -evenv-tempest -- stestr --test-path={{devstack_base_dir}}/heat/heat_integrationtests \
--top-dir={{devstack_base_dir}}/heat \
--group_regex='heat_tempest_plugin\.tests\.api\.test_heat_api[._]([^_]+)' run
args:
chdir: "{{devstack_base_dir}}/tempest"
become: true
become_user: tempest
environment: '{{ {"OS_TEST_TIMEOUT": tempest_test_timeout} if tempest_test_timeout else {} }}'